Mercurial > cpython-lru_cache-weakref
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 |
| 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 } |
