Mercurial > cpython-lru_cache-weakref
annotate Objects/dictobject.c @ 78069:a8aa77458e12 3.2
Add c_size_t and c_ssize_t to the ctypes summary table.
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Thu, 12 Jul 2012 20:31:50 +0200 |
| parents | 90572ccda12c |
| children | a965eac352ec 3dfa98cf2e26 |
| rev | line source |
|---|---|
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 |
|
10461
4abc5abaec9a
Vladimir Marangozov contributed updated comments.
Guido van Rossum <guido@python.org>
parents:
9487
diff
changeset
|
2 /* Dictionary object implementation using a hash table */ |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1256
diff
changeset
|
3 |
|
28946
dbdeb734ff97
Add a reference to dictnotes.txt. It does no good if you don't know it's
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
4 /* The distribution includes a separate file, Objects/dictnotes.txt, |
|
36164
50886d42b444
Fixed English in a comment; trimmed trailing whitespace;
Tim Peters <tim.peters@gmail.com>
parents:
35636
diff
changeset
|
5 describing explorations into dictionary design and optimization. |
|
28946
dbdeb734ff97
Add a reference to dictnotes.txt. It does no good if you don't know it's
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
6 It covers typical dictionary use patterns, the parameters for |
|
dbdeb734ff97
Add a reference to dictnotes.txt. It does no good if you don't know it's
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
7 tuning dictionaries, and several ideas for possible optimizations. |
|
dbdeb734ff97
Add a reference to dictnotes.txt. It does no good if you don't know it's
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
8 */ |
|
dbdeb734ff97
Add a reference to dictnotes.txt. It does no good if you don't know it's
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
9 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
10 #include "Python.h" |
|
44252
444da08f78a4
Fixed issue #1564: The set implementation should special-case PyUnicode instead of PyString
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
11 #include "stringlib/eq.h" |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
12 |
|
5053
219bdd8afb38
Changed the lookup algorithm again, based on Reimer Behrends's post.
Guido van Rossum <guido@python.org>
parents:
5038
diff
changeset
|
13 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39657
diff
changeset
|
14 /* Set a key error with the specified argument, wrapping it in a |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39657
diff
changeset
|
15 * tuple automatically so that tuple keys are not unpacked as the |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39657
diff
changeset
|
16 * exception arguments. */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39657
diff
changeset
|
17 static void |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39657
diff
changeset
|
18 set_key_error(PyObject *arg) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39657
diff
changeset
|
19 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
20 PyObject *tup; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
21 tup = PyTuple_Pack(1, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
22 if (!tup) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
23 return; /* caller will expect error to be set anyway */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
24 PyErr_SetObject(PyExc_KeyError, tup); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
25 Py_DECREF(tup); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39657
diff
changeset
|
26 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39657
diff
changeset
|
27 |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
28 /* Define this out if you don't want conversion statistics on exit. */ |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
29 #undef SHOW_CONVERSION_COUNTS |
|
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
30 |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
31 /* See large comment block below. This must be >= 1. */ |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
32 #define PERTURB_SHIFT 5 |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
33 |
|
5053
219bdd8afb38
Changed the lookup algorithm again, based on Reimer Behrends's post.
Guido van Rossum <guido@python.org>
parents:
5038
diff
changeset
|
34 /* |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
35 Major subtleties ahead: Most hash schemes depend on having a "good" hash |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
36 function, in the sense of simulating randomness. Python doesn't: its most |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
37 important hash functions (for strings and ints) are very regular in common |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
38 cases: |
|
17973
2f2ee5daa60d
Implement an old idea of Christian Tismer's: use polynomial division
Tim Peters <tim.peters@gmail.com>
parents:
17964
diff
changeset
|
39 |
|
39657
ebad59c7233e
Got test_mutants.py working. One set of changes was straightforward:
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
40 >>> map(hash, (0, 1, 2, 3)) |
|
ebad59c7233e
Got test_mutants.py working. One set of changes was straightforward:
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
41 [0, 1, 2, 3] |
|
ebad59c7233e
Got test_mutants.py working. One set of changes was straightforward:
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
42 >>> map(hash, ("namea", "nameb", "namec", "named")) |
|
ebad59c7233e
Got test_mutants.py working. One set of changes was straightforward:
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
43 [-1658398457, -1658398460, -1658398459, -1658398462] |
|
ebad59c7233e
Got test_mutants.py working. One set of changes was straightforward:
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
44 >>> |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
45 |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
46 This isn't necessarily bad! To the contrary, in a table of size 2**i, taking |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
47 the low-order i bits as the initial table index is extremely fast, and there |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
48 are no collisions at all for dicts indexed by a contiguous range of ints. |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
49 The same is approximately true when keys are "consecutive" strings. So this |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
50 gives better-than-random behavior in common cases, and that's very desirable. |
|
17973
2f2ee5daa60d
Implement an old idea of Christian Tismer's: use polynomial division
Tim Peters <tim.peters@gmail.com>
parents:
17964
diff
changeset
|
51 |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
52 OTOH, when collisions occur, the tendency to fill contiguous slices of the |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
53 hash table makes a good collision resolution strategy crucial. Taking only |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
54 the last i bits of the hash code is also vulnerable: for example, consider |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
55 the list [i << 16 for i in range(20000)] as a set of keys. Since ints are |
|
39657
ebad59c7233e
Got test_mutants.py working. One set of changes was straightforward:
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
56 their own hash codes, and this fits in a dict of size 2**15, the last 15 bits |
|
ebad59c7233e
Got test_mutants.py working. One set of changes was straightforward:
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
57 of every hash code are all 0: they *all* map to the same table index. |
|
17973
2f2ee5daa60d
Implement an old idea of Christian Tismer's: use polynomial division
Tim Peters <tim.peters@gmail.com>
parents:
17964
diff
changeset
|
58 |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
59 But catering to unusual cases should not slow the usual ones, so we just take |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
60 the last i bits anyway. It's up to collision resolution to do the rest. If |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
61 we *usually* find the key we're looking for on the first try (and, it turns |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
62 out, we usually do -- the table load factor is kept under 2/3, so the odds |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
63 are solidly in our favor), then it makes best sense to keep the initial index |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
64 computation dirt cheap. |
|
17973
2f2ee5daa60d
Implement an old idea of Christian Tismer's: use polynomial division
Tim Peters <tim.peters@gmail.com>
parents:
17964
diff
changeset
|
65 |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
66 The first half of collision resolution is to visit table indices via this |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
67 recurrence: |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
68 |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
69 j = ((5*j) + 1) mod 2**i |
|
17973
2f2ee5daa60d
Implement an old idea of Christian Tismer's: use polynomial division
Tim Peters <tim.peters@gmail.com>
parents:
17964
diff
changeset
|
70 |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
71 For any initial j in range(2**i), repeating that 2**i times generates each |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
72 int in range(2**i) exactly once (see any text on random-number generation for |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
73 proof). By itself, this doesn't help much: like linear probing (setting |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
74 j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
75 order. This would be bad, except that's not the only thing we do, and it's |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
76 actually *good* in the common cases where hash keys are consecutive. In an |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
77 example that's really too small to make this entirely clear, for a table of |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
78 size 2**3 the order of indices is: |
|
17973
2f2ee5daa60d
Implement an old idea of Christian Tismer's: use polynomial division
Tim Peters <tim.peters@gmail.com>
parents:
17964
diff
changeset
|
79 |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
80 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating] |
|
17973
2f2ee5daa60d
Implement an old idea of Christian Tismer's: use polynomial division
Tim Peters <tim.peters@gmail.com>
parents:
17964
diff
changeset
|
81 |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
82 If two things come in at index 5, the first place we look after is index 2, |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
83 not 6, so if another comes in at index 6 the collision at 5 didn't hurt it. |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
84 Linear probing is deadly in this case because there the fixed probe order |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
85 is the *same* as the order consecutive keys are likely to arrive. But it's |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
86 extremely unlikely hash codes will follow a 5*j+1 recurrence by accident, |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
87 and certain that consecutive hash codes do not. |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
88 |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
89 The other half of the strategy is to get the other bits of the hash code |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
90 into play. This is done by initializing a (unsigned) vrbl "perturb" to the |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
91 full hash code, and changing the recurrence to: |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
92 |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
93 j = (5*j) + 1 + perturb; |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
94 perturb >>= PERTURB_SHIFT; |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
95 use j % 2**i as the next table index; |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
96 |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
97 Now the probe sequence depends (eventually) on every bit in the hash code, |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
98 and the pseudo-scrambling property of recurring on 5*j+1 is more valuable, |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
99 because it quickly magnifies small differences in the bits that didn't affect |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
100 the initial index. Note that because perturb is unsigned, if the recurrence |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
101 is executed often enough perturb eventually becomes and remains 0. At that |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
102 point (very rarely reached) the recurrence is on (just) 5*j+1 again, and |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
103 that's certain to find an empty slot eventually (since it generates every int |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
104 in range(2**i), and we make sure there's always at least one empty slot). |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
105 |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
106 Selecting a good value for PERTURB_SHIFT is a balancing act. You want it |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
107 small so that the high bits of the hash code continue to affect the probe |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
108 sequence across iterations; but you want it large so that in really bad cases |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
109 the high-order hash bits have an effect on early iterations. 5 was "the |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
110 best" in minimizing total collisions across experiments Tim Peters ran (on |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
111 both normal and pathological cases), but 4 and 6 weren't significantly worse. |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
112 |
|
39657
ebad59c7233e
Got test_mutants.py working. One set of changes was straightforward:
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
113 Historical: Reimer Behrends contributed the idea of using a polynomial-based |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
114 approach, using repeated multiplication by x in GF(2**n) where an irreducible |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
115 polynomial for each table size was chosen such that x was a primitive root. |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
116 Christian Tismer later extended that to use division by x instead, as an |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
117 efficient way to get the high bits of the hash code into play. This scheme |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
118 also gave excellent collision statistics, but was more expensive: two |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
119 if-tests were required inside the loop; computing "the next" index took about |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
120 the same number of operations but without as much potential parallelism |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
121 (e.g., computing 5*j can go on at the same time as computing 1+perturb in the |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
122 above, and then shifting perturb can be done while the table index is being |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
123 masked); and the PyDictObject struct required a member to hold the table's |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
124 polynomial. In Tim's experiments the current scheme ran faster, produced |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
125 equally good collision statistics, needed less code & used less memory. |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
126 |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
127 */ |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
128 |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
129 /* Object used as dummy key to fill deleted entries */ |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
130 static PyObject *dummy = NULL; /* Initialized by first call to newPyDictObject() */ |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
131 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36657
diff
changeset
|
132 #ifdef Py_REF_DEBUG |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36657
diff
changeset
|
133 PyObject * |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36657
diff
changeset
|
134 _PyDict_Dummy(void) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36657
diff
changeset
|
135 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
136 return dummy; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36657
diff
changeset
|
137 } |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36657
diff
changeset
|
138 #endif |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36657
diff
changeset
|
139 |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
140 /* forward declarations */ |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
141 static PyDictEntry * |
| 65498 | 142 lookdict_unicode(PyDictObject *mp, PyObject *key, Py_hash_t hash); |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
143 |
|
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
144 #ifdef SHOW_CONVERSION_COUNTS |
|
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
145 static long created = 0L; |
|
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
146 static long converted = 0L; |
|
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
147 |
|
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
148 static void |
|
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
149 show_counts(void) |
|
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
150 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
151 fprintf(stderr, "created %ld string dicts\n", created); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
152 fprintf(stderr, "converted %ld to normal dicts\n", converted); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
153 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created); |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
154 } |
|
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
155 #endif |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
156 |
|
45244
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
157 /* Debug statistic to compare allocations with reuse through the free list */ |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
158 #undef SHOW_ALLOC_COUNT |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
159 #ifdef SHOW_ALLOC_COUNT |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
160 static size_t count_alloc = 0; |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
161 static size_t count_reuse = 0; |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
162 |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
163 static void |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
164 show_alloc(void) |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
165 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
166 fprintf(stderr, "Dict allocations: %" PY_FORMAT_SIZE_T "d\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
167 count_alloc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
168 fprintf(stderr, "Dict reuse through freelist: %" PY_FORMAT_SIZE_T |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
169 "d\n", count_reuse); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
170 fprintf(stderr, "%.2f%% reuse rate\n\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
171 (100.0*count_reuse/(count_alloc+count_reuse))); |
|
45244
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
172 } |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
173 #endif |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
174 |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
175 /* Debug statistic to count GC tracking of dicts */ |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
176 #ifdef SHOW_TRACK_COUNT |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
177 static Py_ssize_t count_untracked = 0; |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
178 static Py_ssize_t count_tracked = 0; |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
179 |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
180 static void |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
181 show_track(void) |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
182 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
183 fprintf(stderr, "Dicts created: %" PY_FORMAT_SIZE_T "d\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
184 count_tracked + count_untracked); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
185 fprintf(stderr, "Dicts tracked by the GC: %" PY_FORMAT_SIZE_T |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
186 "d\n", count_tracked); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
187 fprintf(stderr, "%.2f%% dict tracking rate\n\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
188 (100.0*count_tracked/(count_untracked+count_tracked))); |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
189 } |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
190 #endif |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
191 |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
192 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
193 /* Initialization macros. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
194 There are two ways to create a dict: PyDict_New() is the main C API |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
195 function, and the tp_new slot maps to dict_new(). In the latter case we |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
196 can save a little time over what PyDict_New does because it's guaranteed |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
197 that the PyDictObject struct is already zeroed out. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
198 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
199 an excellent reason not to). |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
200 */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
201 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
202 #define INIT_NONZERO_DICT_SLOTS(mp) do { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
203 (mp)->ma_table = (mp)->ma_smalltable; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
204 (mp)->ma_mask = PyDict_MINSIZE - 1; \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
205 } while(0) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
206 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
207 #define EMPTY_TO_MINSIZE(mp) do { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
208 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
209 (mp)->ma_used = (mp)->ma_fill = 0; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
210 INIT_NONZERO_DICT_SLOTS(mp); \ |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
211 } while(0) |
|
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
212 |
|
31677
7bb030066ea4
Dictionary optimizations:
Raymond Hettinger <python@rcn.com>
parents:
31620
diff
changeset
|
213 /* Dictionary reuse scheme to save calls to malloc, free, and memset */ |
|
45192
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44999
diff
changeset
|
214 #ifndef PyDict_MAXFREELIST |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44999
diff
changeset
|
215 #define PyDict_MAXFREELIST 80 |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44999
diff
changeset
|
216 #endif |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44999
diff
changeset
|
217 static PyDictObject *free_list[PyDict_MAXFREELIST]; |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44999
diff
changeset
|
218 static int numfree = 0; |
|
31677
7bb030066ea4
Dictionary optimizations:
Raymond Hettinger <python@rcn.com>
parents:
31620
diff
changeset
|
219 |
|
45244
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
220 void |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
221 PyDict_Fini(void) |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
222 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
223 PyDictObject *op; |
|
45244
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
224 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
225 while (numfree) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
226 op = free_list[--numfree]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
227 assert(PyDict_CheckExact(op)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
228 PyObject_GC_Del(op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
229 } |
|
45244
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
230 } |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
231 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
232 PyObject * |
|
13660
a1ce07218781
Miscelaneous ANSIfications. I'm assuming here 'main' should take (int,
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
233 PyDict_New(void) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
234 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
235 register PyDictObject *mp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
236 if (dummy == NULL) { /* Auto-initialize dummy */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
237 dummy = PyUnicode_FromString("<dummy key>"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
238 if (dummy == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
239 return NULL; |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
240 #ifdef SHOW_CONVERSION_COUNTS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
241 Py_AtExit(show_counts); |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
242 #endif |
|
45244
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
243 #ifdef SHOW_ALLOC_COUNT |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
244 Py_AtExit(show_alloc); |
|
45244
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
245 #endif |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
246 #ifdef SHOW_TRACK_COUNT |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
247 Py_AtExit(show_track); |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
248 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
249 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
250 if (numfree) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
251 mp = free_list[--numfree]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
252 assert (mp != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
253 assert (Py_TYPE(mp) == &PyDict_Type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
254 _Py_NewReference((PyObject *)mp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
255 if (mp->ma_fill) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
256 EMPTY_TO_MINSIZE(mp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
257 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
258 /* At least set ma_table and ma_mask; these are wrong |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
259 if an empty but presized dict is added to freelist */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
260 INIT_NONZERO_DICT_SLOTS(mp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
261 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
262 assert (mp->ma_used == 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
263 assert (mp->ma_table == mp->ma_smalltable); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
264 assert (mp->ma_mask == PyDict_MINSIZE - 1); |
|
45244
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
265 #ifdef SHOW_ALLOC_COUNT |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
266 count_reuse++; |
|
45244
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
267 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
268 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
269 mp = PyObject_GC_New(PyDictObject, &PyDict_Type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
270 if (mp == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
271 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
272 EMPTY_TO_MINSIZE(mp); |
|
45244
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
273 #ifdef SHOW_ALLOC_COUNT |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
274 count_alloc++; |
|
45244
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
275 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
276 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
277 mp->ma_lookup = lookdict_unicode; |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
278 #ifdef SHOW_TRACK_COUNT |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
279 count_untracked++; |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
280 #endif |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
281 #ifdef SHOW_CONVERSION_COUNTS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
282 ++created; |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
283 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
284 return (PyObject *)mp; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
285 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
286 |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
287 /* |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
288 The basic lookup function used by all operations. |
|
5053
219bdd8afb38
Changed the lookup algorithm again, based on Reimer Behrends's post.
Guido van Rossum <guido@python.org>
parents:
5038
diff
changeset
|
289 This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4. |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
290 Open addressing is preferred over chaining since the link overhead for |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
291 chaining would be substantial (100% with typical malloc overhead). |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
292 |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
293 The initial probe index is computed as hash mod the table size. Subsequent |
|
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
294 probe indices are computed as explained earlier. |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
295 |
|
10461
4abc5abaec9a
Vladimir Marangozov contributed updated comments.
Guido van Rossum <guido@python.org>
parents:
9487
diff
changeset
|
296 All arithmetic on hash should ignore overflow. |
|
5053
219bdd8afb38
Changed the lookup algorithm again, based on Reimer Behrends's post.
Guido van Rossum <guido@python.org>
parents:
5038
diff
changeset
|
297 |
|
39657
ebad59c7233e
Got test_mutants.py working. One set of changes was straightforward:
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
298 The details in this version are due to Tim Peters, building on many past |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
299 contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and |
|
39657
ebad59c7233e
Got test_mutants.py working. One set of changes was straightforward:
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
300 Christian Tismer. |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
301 |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
302 lookdict() is general-purpose, and may return NULL if (and only if) a |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
303 comparison raises an exception (this was new in Python 2.5). |
|
43392
ef223546b4bd
Switch dict lookup around to optimizing for unicode.
Guido van Rossum <guido@python.org>
parents:
43389
diff
changeset
|
304 lookdict_unicode() below is specialized to string keys, comparison of which can |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
305 never raise an exception; that function can never return NULL. For both, when |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
306 the key isn't found a PyDictEntry* is returned for which the me_value field is |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
307 NULL; this is the slot in the dict at which the key would have been found, and |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
308 the caller can (if it wishes) add the <key, value> pair to the returned |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
309 PyDictEntry*. |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
310 */ |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
311 static PyDictEntry * |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
312 lookdict(PyDictObject *mp, PyObject *key, register Py_hash_t hash) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
313 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
314 register size_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
315 register size_t perturb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
316 register PyDictEntry *freeslot; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
317 register size_t mask = (size_t)mp->ma_mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
318 PyDictEntry *ep0 = mp->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
319 register PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
320 register int cmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
321 PyObject *startkey; |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
322 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
323 i = (size_t)hash & mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
324 ep = &ep0[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
325 if (ep->me_key == NULL || ep->me_key == key) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
326 return ep; |
|
18022
bd1c4fe977cb
lookdict: Reduce obfuscating code duplication with a judicious goto.
Tim Peters <tim.peters@gmail.com>
parents:
18019
diff
changeset
|
327 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
328 if (ep->me_key == dummy) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
329 freeslot = ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
330 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
331 if (ep->me_hash == hash) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
332 startkey = ep->me_key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
333 Py_INCREF(startkey); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
334 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
335 Py_DECREF(startkey); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
336 if (cmp < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
337 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
338 if (ep0 == mp->ma_table && ep->me_key == startkey) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
339 if (cmp > 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
340 return ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
341 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
342 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
343 /* The compare did major nasty stuff to the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
344 * dict: start over. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
345 * XXX A clever adversary could prevent this |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
346 * XXX from terminating. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
347 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
348 return lookdict(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
349 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
350 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
351 freeslot = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
352 } |
|
17973
2f2ee5daa60d
Implement an old idea of Christian Tismer's: use polynomial division
Tim Peters <tim.peters@gmail.com>
parents:
17964
diff
changeset
|
353 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
354 /* In the loop, me_key == dummy is by far (factor of 100s) the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
355 least likely outcome, so test for that last. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
356 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
357 i = (i << 2) + i + perturb + 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
358 ep = &ep0[i & mask]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
359 if (ep->me_key == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
360 return freeslot == NULL ? ep : freeslot; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
361 if (ep->me_key == key) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
362 return ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
363 if (ep->me_hash == hash && ep->me_key != dummy) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
364 startkey = ep->me_key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
365 Py_INCREF(startkey); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
366 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
367 Py_DECREF(startkey); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
368 if (cmp < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
369 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
370 if (ep0 == mp->ma_table && ep->me_key == startkey) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
371 if (cmp > 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
372 return ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
373 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
374 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
375 /* The compare did major nasty stuff to the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
376 * dict: start over. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
377 * XXX A clever adversary could prevent this |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
378 * XXX from terminating. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
379 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
380 return lookdict(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
381 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
382 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
383 else if (ep->me_key == dummy && freeslot == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
384 freeslot = ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
385 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
386 assert(0); /* NOT REACHED */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
387 return 0; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
388 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
389 |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
390 /* |
|
43392
ef223546b4bd
Switch dict lookup around to optimizing for unicode.
Guido van Rossum <guido@python.org>
parents:
43389
diff
changeset
|
391 * Hacked up version of lookdict which can assume keys are always |
|
ef223546b4bd
Switch dict lookup around to optimizing for unicode.
Guido van Rossum <guido@python.org>
parents:
43389
diff
changeset
|
392 * unicodes; this assumption allows testing for errors during |
|
ef223546b4bd
Switch dict lookup around to optimizing for unicode.
Guido van Rossum <guido@python.org>
parents:
43389
diff
changeset
|
393 * PyObject_RichCompareBool() to be dropped; unicode-unicode |
|
ef223546b4bd
Switch dict lookup around to optimizing for unicode.
Guido van Rossum <guido@python.org>
parents:
43389
diff
changeset
|
394 * comparisons never raise exceptions. This also means we don't need |
|
ef223546b4bd
Switch dict lookup around to optimizing for unicode.
Guido van Rossum <guido@python.org>
parents:
43389
diff
changeset
|
395 * to go through PyObject_RichCompareBool(); we can always use |
|
ef223546b4bd
Switch dict lookup around to optimizing for unicode.
Guido van Rossum <guido@python.org>
parents:
43389
diff
changeset
|
396 * unicode_eq() directly. |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
397 * |
|
43392
ef223546b4bd
Switch dict lookup around to optimizing for unicode.
Guido van Rossum <guido@python.org>
parents:
43389
diff
changeset
|
398 * This is valuable because dicts with only unicode keys are very common. |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
399 */ |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
400 static PyDictEntry * |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
401 lookdict_unicode(PyDictObject *mp, PyObject *key, register Py_hash_t hash) |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
402 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
403 register size_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
404 register size_t perturb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
405 register PyDictEntry *freeslot; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
406 register size_t mask = (size_t)mp->ma_mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
407 PyDictEntry *ep0 = mp->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
408 register PyDictEntry *ep; |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
409 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
410 /* Make sure this function doesn't have to handle non-unicode keys, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
411 including subclasses of str; e.g., one reason to subclass |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
412 unicodes is to override __eq__, and for speed we don't cater to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
413 that here. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
414 if (!PyUnicode_CheckExact(key)) { |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
415 #ifdef SHOW_CONVERSION_COUNTS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
416 ++converted; |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
417 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
418 mp->ma_lookup = lookdict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
419 return lookdict(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
420 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
421 i = hash & mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
422 ep = &ep0[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
423 if (ep->me_key == NULL || ep->me_key == key) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
424 return ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
425 if (ep->me_key == dummy) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
426 freeslot = ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
427 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
428 if (ep->me_hash == hash && unicode_eq(ep->me_key, key)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
429 return ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
430 freeslot = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
431 } |
|
17973
2f2ee5daa60d
Implement an old idea of Christian Tismer's: use polynomial division
Tim Peters <tim.peters@gmail.com>
parents:
17964
diff
changeset
|
432 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
433 /* In the loop, me_key == dummy is by far (factor of 100s) the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
434 least likely outcome, so test for that last. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
435 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
436 i = (i << 2) + i + perturb + 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
437 ep = &ep0[i & mask]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
438 if (ep->me_key == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
439 return freeslot == NULL ? ep : freeslot; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
440 if (ep->me_key == key |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
441 || (ep->me_hash == hash |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
442 && ep->me_key != dummy |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
443 && unicode_eq(ep->me_key, key))) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
444 return ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
445 if (ep->me_key == dummy && freeslot == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
446 freeslot = ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
447 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
448 assert(0); /* NOT REACHED */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
449 return 0; |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
450 } |
|
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
451 |
|
60931
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
59224
diff
changeset
|
452 int |
|
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
59224
diff
changeset
|
453 _PyDict_HasOnlyStringKeys(PyObject *dict) |
|
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
59224
diff
changeset
|
454 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
455 Py_ssize_t pos = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
456 PyObject *key, *value; |
|
66220
379029714e24
handle dict subclasses gracefully in PyArg_ValidateKeywordArguments
Benjamin Peterson <benjamin@python.org>
parents:
65753
diff
changeset
|
457 assert(PyDict_Check(dict)); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
458 /* Shortcut */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
459 if (((PyDictObject *)dict)->ma_lookup == lookdict_unicode) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
460 return 1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
461 while (PyDict_Next(dict, &pos, &key, &value)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
462 if (!PyUnicode_Check(key)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
463 return 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
464 return 1; |
|
60931
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
59224
diff
changeset
|
465 } |
|
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
59224
diff
changeset
|
466 |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
467 #ifdef SHOW_TRACK_COUNT |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
468 #define INCREASE_TRACK_COUNT \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
469 (count_tracked++, count_untracked--); |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
470 #define DECREASE_TRACK_COUNT \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
471 (count_tracked--, count_untracked++); |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
472 #else |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
473 #define INCREASE_TRACK_COUNT |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
474 #define DECREASE_TRACK_COUNT |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
475 #endif |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
476 |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
477 #define MAINTAIN_TRACKING(mp, key, value) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
478 do { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
479 if (!_PyObject_GC_IS_TRACKED(mp)) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
480 if (_PyObject_GC_MAY_BE_TRACKED(key) || \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
481 _PyObject_GC_MAY_BE_TRACKED(value)) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
482 _PyObject_GC_TRACK(mp); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
483 INCREASE_TRACK_COUNT \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
484 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
485 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
486 } while(0) |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
487 |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
488 void |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
489 _PyDict_MaybeUntrack(PyObject *op) |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
490 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
491 PyDictObject *mp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
492 PyObject *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
493 Py_ssize_t mask, i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
494 PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
495 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
496 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
497 return; |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
498 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
499 mp = (PyDictObject *) op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
500 ep = mp->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
501 mask = mp->ma_mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
502 for (i = 0; i <= mask; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
503 if ((value = ep[i].me_value) == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
504 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
505 if (_PyObject_GC_MAY_BE_TRACKED(value) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
506 _PyObject_GC_MAY_BE_TRACKED(ep[i].me_key)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
507 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
508 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
509 DECREASE_TRACK_COUNT |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
510 _PyObject_GC_UNTRACK(op); |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
511 } |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
512 |
|
14310
2db807f345bc
Slight performance hack that also avoids requiring the existence of thread
Fred Drake <fdrake@acm.org>
parents:
14307
diff
changeset
|
513 /* |
|
75302
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
514 Internal routine to insert a new item into the table when you have entry object. |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
515 Used by insertdict. |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
516 */ |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
517 static int |
|
75302
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
518 insertdict_by_entry(register PyDictObject *mp, PyObject *key, Py_hash_t hash, |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
519 PyDictEntry *ep, PyObject *value) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
520 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
521 PyObject *old_value; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
522 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
523 MAINTAIN_TRACKING(mp, key, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
524 if (ep->me_value != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
525 old_value = ep->me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
526 ep->me_value = value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
527 Py_DECREF(old_value); /* which **CAN** re-enter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
528 Py_DECREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
529 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
530 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
531 if (ep->me_key == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
532 mp->ma_fill++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
533 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
534 assert(ep->me_key == dummy); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
535 Py_DECREF(dummy); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
536 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
537 ep->me_key = key; |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
538 ep->me_hash = hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
539 ep->me_value = value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
540 mp->ma_used++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
541 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
542 return 0; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
543 } |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
544 |
|
75302
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
545 |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
546 /* |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
547 Internal routine to insert a new item into the table. |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
548 Used both by the internal resize routine and by the public insert routine. |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
549 Eats a reference to key and one to value. |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
550 Returns -1 if an error occurred, or 0 on success. |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
551 */ |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
552 static int |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
553 insertdict(register PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
554 { |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
555 register PyDictEntry *ep; |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
556 |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
557 assert(mp->ma_lookup != NULL); |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
558 ep = mp->ma_lookup(mp, key, hash); |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
559 if (ep == NULL) { |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
560 Py_DECREF(key); |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
561 Py_DECREF(value); |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
562 return -1; |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
563 } |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
564 return insertdict_by_entry(mp, key, hash, ep, value); |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
565 } |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
566 |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
567 /* |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
568 Internal routine used by dictresize() to insert an item which is |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
569 known to be absent from the dict. This routine also assumes that |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
570 the dict contains no deleted entries. Besides the performance benefit, |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
571 using insertdict() in dictresize() is dangerous (SF bug #1456209). |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
572 Note that no refcounts are changed by this routine; if needed, the caller |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
573 is responsible for incref'ing `key` and `value`. |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
574 */ |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
575 static void |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
576 insertdict_clean(register PyDictObject *mp, PyObject *key, Py_hash_t hash, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
577 PyObject *value) |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
578 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
579 register size_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
580 register size_t perturb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
581 register size_t mask = (size_t)mp->ma_mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
582 PyDictEntry *ep0 = mp->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
583 register PyDictEntry *ep; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
584 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
585 MAINTAIN_TRACKING(mp, key, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
586 i = hash & mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
587 ep = &ep0[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
588 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
589 i = (i << 2) + i + perturb + 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
590 ep = &ep0[i & mask]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
591 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
592 assert(ep->me_value == NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
593 mp->ma_fill++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
594 ep->me_key = key; |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
595 ep->me_hash = hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
596 ep->me_value = value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
597 mp->ma_used++; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
598 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
599 |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
600 /* |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
601 Restructure the table by allocating a new table and reinserting all |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
602 items again. When entries have been deleted, the new table may |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
603 actually be smaller than the old one. |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
604 */ |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
605 static int |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
606 dictresize(PyDictObject *mp, Py_ssize_t minused) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
607 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
608 Py_ssize_t newsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
609 PyDictEntry *oldtable, *newtable, *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
610 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
611 int is_oldtable_malloced; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
612 PyDictEntry small_copy[PyDict_MINSIZE]; |
| 17861 | 613 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
614 assert(minused >= 0); |
|
17962
d86b245e0858
Jack Jansen hit a bug in the new dict code, reported on python-dev.
Tim Peters <tim.peters@gmail.com>
parents:
17930
diff
changeset
|
615 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
616 /* Find the smallest table size > minused. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
617 for (newsize = PyDict_MINSIZE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
618 newsize <= minused && newsize > 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
619 newsize <<= 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
620 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
621 if (newsize <= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
622 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
623 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
624 } |
|
17962
d86b245e0858
Jack Jansen hit a bug in the new dict code, reported on python-dev.
Tim Peters <tim.peters@gmail.com>
parents:
17930
diff
changeset
|
625 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
626 /* Get space for a new table. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
627 oldtable = mp->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
628 assert(oldtable != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
629 is_oldtable_malloced = oldtable != mp->ma_smalltable; |
|
17962
d86b245e0858
Jack Jansen hit a bug in the new dict code, reported on python-dev.
Tim Peters <tim.peters@gmail.com>
parents:
17930
diff
changeset
|
630 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
631 if (newsize == PyDict_MINSIZE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
632 /* A large table is shrinking, or we can't get any smaller. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
633 newtable = mp->ma_smalltable; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
634 if (newtable == oldtable) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
635 if (mp->ma_fill == mp->ma_used) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
636 /* No dummies, so no point doing anything. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
637 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
638 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
639 /* We're not going to resize it, but rebuild the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
640 table anyway to purge old dummy entries. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
641 Subtle: This is *necessary* if fill==size, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
642 as lookdict needs at least one virgin slot to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
643 terminate failing searches. If fill < size, it's |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
644 merely desirable, as dummies slow searches. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
645 assert(mp->ma_fill > mp->ma_used); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
646 memcpy(small_copy, oldtable, sizeof(small_copy)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
647 oldtable = small_copy; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
648 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
649 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
650 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
651 newtable = PyMem_NEW(PyDictEntry, newsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
652 if (newtable == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
653 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
654 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
655 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
656 } |
|
17962
d86b245e0858
Jack Jansen hit a bug in the new dict code, reported on python-dev.
Tim Peters <tim.peters@gmail.com>
parents:
17930
diff
changeset
|
657 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
658 /* Make the dict empty, using the new table. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
659 assert(newtable != oldtable); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
660 mp->ma_table = newtable; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
661 mp->ma_mask = newsize - 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
662 memset(newtable, 0, sizeof(PyDictEntry) * newsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
663 mp->ma_used = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
664 i = mp->ma_fill; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
665 mp->ma_fill = 0; |
|
2053
de49d49044d7
Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents:
1848
diff
changeset
|
666 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
667 /* Copy the data over; this is refcount-neutral for active entries; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
668 dummy entries aren't copied over, of course */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
669 for (ep = oldtable; i > 0; ep++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
670 if (ep->me_value != NULL) { /* active entry */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
671 --i; |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
672 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
673 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
674 else if (ep->me_key != NULL) { /* dummy entry */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
675 --i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
676 assert(ep->me_key == dummy); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
677 Py_DECREF(ep->me_key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
678 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
679 /* else key == value == NULL: nothing to do */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
680 } |
|
2053
de49d49044d7
Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents:
1848
diff
changeset
|
681 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
682 if (is_oldtable_malloced) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
683 PyMem_DEL(oldtable); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
684 return 0; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
685 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
686 |
|
44349
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44252
diff
changeset
|
687 /* Create a new dictionary pre-sized to hold an estimated number of elements. |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44252
diff
changeset
|
688 Underestimates are okay because the dictionary will resize as necessary. |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44252
diff
changeset
|
689 Overestimates just mean the dictionary will be more sparse than usual. |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44252
diff
changeset
|
690 */ |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44252
diff
changeset
|
691 |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44252
diff
changeset
|
692 PyObject * |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44252
diff
changeset
|
693 _PyDict_NewPresized(Py_ssize_t minused) |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44252
diff
changeset
|
694 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
695 PyObject *op = PyDict_New(); |
|
44349
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44252
diff
changeset
|
696 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
697 if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
698 Py_DECREF(op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
699 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
700 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
701 return op; |
|
44349
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44252
diff
changeset
|
702 } |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44252
diff
changeset
|
703 |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
704 /* Note that, for historical reasons, PyDict_GetItem() suppresses all errors |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
705 * that may occur (originally dicts supported only string keys, and exceptions |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
706 * weren't possible). So, while the original intent was that a NULL return |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
707 * meant the key wasn't present, in reality it can mean that, or that an error |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
708 * (suppressed) occurred while computing the key's hash, or that some error |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
709 * (suppressed) occurred when comparing keys in the dict's internal probe |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
710 * sequence. A nasty example of the latter is when a Python-coded comparison |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
711 * function hits a stack-depth error, which can cause this to return NULL |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
712 * even if the key is present. |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
713 */ |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
714 PyObject * |
|
13341
3f1bd4782628
Removed Py_PROTO and switched to ANSI C declarations in the dict
Tim Peters <tim.peters@gmail.com>
parents:
13265
diff
changeset
|
715 PyDict_GetItem(PyObject *op, PyObject *key) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
716 { |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
717 Py_hash_t hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
718 PyDictObject *mp = (PyDictObject *)op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
719 PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
720 PyThreadState *tstate; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
721 if (!PyDict_Check(op)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
722 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
723 if (!PyUnicode_CheckExact(key) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
724 (hash = ((PyUnicodeObject *) key)->hash) == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
725 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
726 hash = PyObject_Hash(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
727 if (hash == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
728 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
729 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
730 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
731 } |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
732 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
733 /* We can arrive here with a NULL tstate during initialization: try |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
734 running "python -Wi" for an example related to string interning. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
735 Let's just hope that no exception occurs then... This must be |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
736 _PyThreadState_Current and not PyThreadState_GET() because in debug |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
737 mode, the latter complains if tstate is NULL. */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
738 tstate = (PyThreadState*)_Py_atomic_load_relaxed( |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
739 &_PyThreadState_Current); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
740 if (tstate != NULL && tstate->curexc_type != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
741 /* preserve the existing exception */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
742 PyObject *err_type, *err_value, *err_tb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
743 PyErr_Fetch(&err_type, &err_value, &err_tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
744 ep = (mp->ma_lookup)(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
745 /* ignore errors */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
746 PyErr_Restore(err_type, err_value, err_tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
747 if (ep == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
748 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
749 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
750 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
751 ep = (mp->ma_lookup)(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
752 if (ep == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
753 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
754 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
755 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
756 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
757 return ep->me_value; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
758 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
759 |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39575
diff
changeset
|
760 /* Variant of PyDict_GetItem() that doesn't suppress exceptions. |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39575
diff
changeset
|
761 This returns NULL *with* an exception set if an exception occurred. |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39575
diff
changeset
|
762 It returns NULL *without* an exception set if the key wasn't present. |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39575
diff
changeset
|
763 */ |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39575
diff
changeset
|
764 PyObject * |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39575
diff
changeset
|
765 PyDict_GetItemWithError(PyObject *op, PyObject *key) |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39575
diff
changeset
|
766 { |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
767 Py_hash_t hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
768 PyDictObject*mp = (PyDictObject *)op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
769 PyDictEntry *ep; |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39575
diff
changeset
|
770 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
771 if (!PyDict_Check(op)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
772 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
773 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
774 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
775 if (!PyUnicode_CheckExact(key) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
776 (hash = ((PyUnicodeObject *) key)->hash) == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
777 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
778 hash = PyObject_Hash(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
779 if (hash == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
780 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
781 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
782 } |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39575
diff
changeset
|
783 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
784 ep = (mp->ma_lookup)(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
785 if (ep == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
786 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
787 return ep->me_value; |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39575
diff
changeset
|
788 } |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39575
diff
changeset
|
789 |
|
75302
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
790 static int |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
791 dict_set_item_by_hash_or_entry(register PyObject *op, PyObject *key, |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
792 Py_hash_t hash, PyDictEntry *ep, PyObject *value) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
793 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
794 register PyDictObject *mp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
795 register Py_ssize_t n_used; |
|
17535
83c7b4b75668
Tentative fix for a problem that Tim discovered at the last moment,
Guido van Rossum <guido@python.org>
parents:
17115
diff
changeset
|
796 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
797 mp = (PyDictObject *)op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
798 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
799 n_used = mp->ma_used; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
800 Py_INCREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
801 Py_INCREF(key); |
|
75302
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
802 if (ep == NULL) { |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
803 if (insertdict(mp, key, hash, value) != 0) |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
804 return -1; |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
805 } |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
806 else { |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
807 if (insertdict_by_entry(mp, key, hash, ep, value) != 0) |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
808 return -1; |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
809 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
810 /* If we added a key, we can safely resize. Otherwise just return! |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
811 * If fill >= 2/3 size, adjust size. Normally, this doubles or |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
812 * quaduples the size, but it's also possible for the dict to shrink |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
813 * (if ma_fill is much larger than ma_used, meaning a lot of dict |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
814 * keys have been * deleted). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
815 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
816 * Quadrupling the size improves average dictionary sparseness |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
817 * (reducing collisions) at the cost of some memory and iteration |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
818 * speed (which loops over every possible entry). It also halves |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
819 * the number of expensive resize operations in a growing dictionary. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
820 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
821 * Very large dictionaries (over 50K items) use doubling instead. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
822 * This may help applications with severe memory constraints. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
823 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
824 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
825 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
826 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used); |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
827 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
828 |
|
75302
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
829 /* CAUTION: PyDict_SetItem() must guarantee that it won't resize the |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
830 * dictionary if it's merely replacing the value for an existing key. |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
831 * This means that it's safe to loop over a dictionary with PyDict_Next() |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
832 * and occasionally replace a value -- but you can't insert new keys or |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
833 * remove them. |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
834 */ |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
835 int |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
836 PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value) |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
837 { |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
838 register Py_hash_t hash; |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
839 |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
840 if (!PyDict_Check(op)) { |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
841 PyErr_BadInternalCall(); |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
842 return -1; |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
843 } |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
844 assert(key); |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
845 assert(value); |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
846 if (PyUnicode_CheckExact(key)) { |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
847 hash = ((PyUnicodeObject *) key)->hash; |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
848 if (hash == -1) |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
849 hash = PyObject_Hash(key); |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
850 } |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
851 else { |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
852 hash = PyObject_Hash(key); |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
853 if (hash == -1) |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
854 return -1; |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
855 } |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
856 return dict_set_item_by_hash_or_entry(op, key, hash, NULL, value); |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
857 } |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
858 |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
859 int |
|
13341
3f1bd4782628
Removed Py_PROTO and switched to ANSI C declarations in the dict
Tim Peters <tim.peters@gmail.com>
parents:
13265
diff
changeset
|
860 PyDict_DelItem(PyObject *op, PyObject *key) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
861 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
862 register PyDictObject *mp; |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
863 register Py_hash_t hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
864 register PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
865 PyObject *old_value, *old_key; |
|
2053
de49d49044d7
Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents:
1848
diff
changeset
|
866 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
867 if (!PyDict_Check(op)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
868 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
869 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
870 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
871 assert(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
872 if (!PyUnicode_CheckExact(key) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
873 (hash = ((PyUnicodeObject *) key)->hash) == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
874 hash = PyObject_Hash(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
875 if (hash == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
876 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
877 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
878 mp = (PyDictObject *)op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
879 ep = (mp->ma_lookup)(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
880 if (ep == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
881 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
882 if (ep->me_value == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
883 set_key_error(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
884 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
885 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
886 old_key = ep->me_key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
887 Py_INCREF(dummy); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
888 ep->me_key = dummy; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
889 old_value = ep->me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
890 ep->me_value = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
891 mp->ma_used--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
892 Py_DECREF(old_value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
893 Py_DECREF(old_key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
894 return 0; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
895 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
896 |
|
1288
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
897 void |
|
13341
3f1bd4782628
Removed Py_PROTO and switched to ANSI C declarations in the dict
Tim Peters <tim.peters@gmail.com>
parents:
13265
diff
changeset
|
898 PyDict_Clear(PyObject *op) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
899 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
900 PyDictObject *mp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
901 PyDictEntry *ep, *table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
902 int table_is_malloced; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
903 Py_ssize_t fill; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
904 PyDictEntry small_copy[PyDict_MINSIZE]; |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
905 #ifdef Py_DEBUG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
906 Py_ssize_t i, n; |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
907 #endif |
|
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
908 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
909 if (!PyDict_Check(op)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
910 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
911 mp = (PyDictObject *)op; |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
912 #ifdef Py_DEBUG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
913 n = mp->ma_mask + 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
914 i = 0; |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
915 #endif |
|
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
916 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
917 table = mp->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
918 assert(table != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
919 table_is_malloced = table != mp->ma_smalltable; |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
920 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
921 /* This is delicate. During the process of clearing the dict, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
922 * decrefs can cause the dict to mutate. To avoid fatal confusion |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
923 * (voice of experience), we have to make the dict empty before |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
924 * clearing the slots, and never refer to anything via mp->xxx while |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
925 * clearing. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
926 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
927 fill = mp->ma_fill; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
928 if (table_is_malloced) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
929 EMPTY_TO_MINSIZE(mp); |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
930 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
931 else if (fill > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
932 /* It's a small table with something that needs to be cleared. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
933 * Afraid the only safe way is to copy the dict entries into |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
934 * another small table first. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
935 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
936 memcpy(small_copy, table, sizeof(small_copy)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
937 table = small_copy; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
938 EMPTY_TO_MINSIZE(mp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
939 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
940 /* else it's a small table that's already empty */ |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
941 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
942 /* Now we can finally clear things. If C had refcounts, we could |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
943 * assert that the refcount on table is 1 now, i.e. that this function |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
944 * has unique access to it, so decref side-effects can't alter it. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
945 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
946 for (ep = table; fill > 0; ++ep) { |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
947 #ifdef Py_DEBUG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
948 assert(i < n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
949 ++i; |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
950 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
951 if (ep->me_key) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
952 --fill; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
953 Py_DECREF(ep->me_key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
954 Py_XDECREF(ep->me_value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
955 } |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
956 #ifdef Py_DEBUG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
957 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
958 assert(ep->me_value == NULL); |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
959 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
960 } |
|
17920
16005b285576
SF patch #425242: Patch which "inlines" small dictionaries.
Tim Peters <tim.peters@gmail.com>
parents:
17861
diff
changeset
|
961 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
962 if (table_is_malloced) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
963 PyMem_DEL(table); |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
964 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
965 |
|
27901
55adf08a213a
cPickle.c, load_build(): Taught cPickle how to pick apart
Tim Peters <tim.peters@gmail.com>
parents:
26818
diff
changeset
|
966 /* |
|
55adf08a213a
cPickle.c, load_build(): Taught cPickle how to pick apart
Tim Peters <tim.peters@gmail.com>
parents:
26818
diff
changeset
|
967 * Iterate over a dict. Use like so: |
|
55adf08a213a
cPickle.c, load_build(): Taught cPickle how to pick apart
Tim Peters <tim.peters@gmail.com>
parents:
26818
diff
changeset
|
968 * |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
969 * Py_ssize_t i; |
|
27901
55adf08a213a
cPickle.c, load_build(): Taught cPickle how to pick apart
Tim Peters <tim.peters@gmail.com>
parents:
26818
diff
changeset
|
970 * PyObject *key, *value; |
|
55adf08a213a
cPickle.c, load_build(): Taught cPickle how to pick apart
Tim Peters <tim.peters@gmail.com>
parents:
26818
diff
changeset
|
971 * i = 0; # important! i should not otherwise be changed by you |
|
27902
81b2bcbfe39b
Add closing ) in comment
Neal Norwitz <nnorwitz@gmail.com>
parents:
27901
diff
changeset
|
972 * while (PyDict_Next(yourdict, &i, &key, &value)) { |
|
27901
55adf08a213a
cPickle.c, load_build(): Taught cPickle how to pick apart
Tim Peters <tim.peters@gmail.com>
parents:
26818
diff
changeset
|
973 * Refer to borrowed references in key and value. |
|
55adf08a213a
cPickle.c, load_build(): Taught cPickle how to pick apart
Tim Peters <tim.peters@gmail.com>
parents:
26818
diff
changeset
|
974 * } |
|
55adf08a213a
cPickle.c, load_build(): Taught cPickle how to pick apart
Tim Peters <tim.peters@gmail.com>
parents:
26818
diff
changeset
|
975 * |
|
55adf08a213a
cPickle.c, load_build(): Taught cPickle how to pick apart
Tim Peters <tim.peters@gmail.com>
parents:
26818
diff
changeset
|
976 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that |
|
17115
e1214f9e12a3
Make PyDict_Next safe to use for loops that merely modify the values
Tim Peters <tim.peters@gmail.com>
parents:
15974
diff
changeset
|
977 * mutates the dict. One exception: it is safe if the loop merely changes |
|
e1214f9e12a3
Make PyDict_Next safe to use for loops that merely modify the values
Tim Peters <tim.peters@gmail.com>
parents:
15974
diff
changeset
|
978 * the values associated with the keys (but doesn't insert new keys or |
|
e1214f9e12a3
Make PyDict_Next safe to use for loops that merely modify the values
Tim Peters <tim.peters@gmail.com>
parents:
15974
diff
changeset
|
979 * delete keys), via PyDict_SetItem(). |
|
e1214f9e12a3
Make PyDict_Next safe to use for loops that merely modify the values
Tim Peters <tim.peters@gmail.com>
parents:
15974
diff
changeset
|
980 */ |
|
1288
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
981 int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
982 PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
983 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
984 register Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
985 register Py_ssize_t mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
986 register PyDictEntry *ep; |
|
31677
7bb030066ea4
Dictionary optimizations:
Raymond Hettinger <python@rcn.com>
parents:
31620
diff
changeset
|
987 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
988 if (!PyDict_Check(op)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
989 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
990 i = *ppos; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
991 if (i < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
992 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
993 ep = ((PyDictObject *)op)->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
994 mask = ((PyDictObject *)op)->ma_mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
995 while (i <= mask && ep[i].me_value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
996 i++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
997 *ppos = i+1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
998 if (i > mask) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
999 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1000 if (pkey) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1001 *pkey = ep[i].me_key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1002 if (pvalue) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1003 *pvalue = ep[i].me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1004 return 1; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1005 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1006 |
|
40893
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40823
diff
changeset
|
1007 /* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/ |
|
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40823
diff
changeset
|
1008 int |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
1009 _PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, Py_hash_t *phash) |
|
40893
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40823
diff
changeset
|
1010 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1011 register Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1012 register Py_ssize_t mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1013 register PyDictEntry *ep; |
|
40893
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40823
diff
changeset
|
1014 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1015 if (!PyDict_Check(op)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1016 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1017 i = *ppos; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1018 if (i < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1019 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1020 ep = ((PyDictObject *)op)->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1021 mask = ((PyDictObject *)op)->ma_mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1022 while (i <= mask && ep[i].me_value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1023 i++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1024 *ppos = i+1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1025 if (i > mask) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1026 return 0; |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
1027 *phash = ep[i].me_hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1028 if (pkey) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1029 *pkey = ep[i].me_key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1030 if (pvalue) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1031 *pvalue = ep[i].me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1032 return 1; |
|
40893
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40823
diff
changeset
|
1033 } |
|
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40823
diff
changeset
|
1034 |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1035 /* Methods */ |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1036 |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1037 static void |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1038 dict_dealloc(register PyDictObject *mp) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1039 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1040 register PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1041 Py_ssize_t fill = mp->ma_fill; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1042 PyObject_GC_UnTrack(mp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1043 Py_TRASHCAN_SAFE_BEGIN(mp) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1044 for (ep = mp->ma_table; fill > 0; ep++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1045 if (ep->me_key) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1046 --fill; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1047 Py_DECREF(ep->me_key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1048 Py_XDECREF(ep->me_value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1049 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1050 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1051 if (mp->ma_table != mp->ma_smalltable) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1052 PyMem_DEL(mp->ma_table); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1053 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1054 free_list[numfree++] = mp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1055 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1056 Py_TYPE(mp)->tp_free((PyObject *)mp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1057 Py_TRASHCAN_SAFE_END(mp) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1058 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1059 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
1060 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1061 dict_repr(PyDictObject *mp) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1062 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1063 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1064 PyObject *s, *temp, *colon = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1065 PyObject *pieces = NULL, *result = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1066 PyObject *key, *value; |
|
7985
ab4f64561fba
Use Py_Repr{Enter,Leave} to display recursive dictionaries in finite space.
Guido van Rossum <guido@python.org>
parents:
6490
diff
changeset
|
1067 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1068 i = Py_ReprEnter((PyObject *)mp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1069 if (i != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1070 return i > 0 ? PyUnicode_FromString("{...}") : NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1071 } |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
18032
diff
changeset
|
1072 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1073 if (mp->ma_used == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1074 result = PyUnicode_FromString("{}"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1075 goto Done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1076 } |
|
7985
ab4f64561fba
Use Py_Repr{Enter,Leave} to display recursive dictionaries in finite space.
Guido van Rossum <guido@python.org>
parents:
6490
diff
changeset
|
1077 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1078 pieces = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1079 if (pieces == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1080 goto Done; |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
18032
diff
changeset
|
1081 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1082 colon = PyUnicode_FromString(": "); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1083 if (colon == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1084 goto Done; |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
18032
diff
changeset
|
1085 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1086 /* Do repr() on each key+value pair, and insert ": " between them. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1087 Note that repr may mutate the dict. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1088 i = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1089 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1090 int status; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1091 /* Prevent repr from deleting value during key format. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1092 Py_INCREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1093 s = PyObject_Repr(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1094 PyUnicode_Append(&s, colon); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1095 PyUnicode_AppendAndDel(&s, PyObject_Repr(value)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1096 Py_DECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1097 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1098 goto Done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1099 status = PyList_Append(pieces, s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1100 Py_DECREF(s); /* append created a new ref */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1101 if (status < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1102 goto Done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1103 } |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
18032
diff
changeset
|
1104 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1105 /* Add "{}" decorations to the first and last items. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1106 assert(PyList_GET_SIZE(pieces) > 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1107 s = PyUnicode_FromString("{"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1108 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1109 goto Done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1110 temp = PyList_GET_ITEM(pieces, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1111 PyUnicode_AppendAndDel(&s, temp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1112 PyList_SET_ITEM(pieces, 0, s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1113 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1114 goto Done; |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
18032
diff
changeset
|
1115 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1116 s = PyUnicode_FromString("}"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1117 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1118 goto Done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1119 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1120 PyUnicode_AppendAndDel(&temp, s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1121 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1122 if (temp == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1123 goto Done; |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
18032
diff
changeset
|
1124 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1125 /* Paste them all together with ", " between. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1126 s = PyUnicode_FromString(", "); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1127 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1128 goto Done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1129 result = PyUnicode_Join(s, pieces); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1130 Py_DECREF(s); |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
18032
diff
changeset
|
1131 |
|
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
18032
diff
changeset
|
1132 Done: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1133 Py_XDECREF(pieces); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1134 Py_XDECREF(colon); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1135 Py_ReprLeave((PyObject *)mp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1136 return result; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1137 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1138 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1139 static Py_ssize_t |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1140 dict_length(PyDictObject *mp) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1141 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1142 return mp->ma_used; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1143 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1144 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
1145 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1146 dict_subscript(PyDictObject *mp, register PyObject *key) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1147 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1148 PyObject *v; |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
1149 Py_hash_t hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1150 PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1151 assert(mp->ma_table != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1152 if (!PyUnicode_CheckExact(key) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1153 (hash = ((PyUnicodeObject *) key)->hash) == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1154 hash = PyObject_Hash(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1155 if (hash == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1156 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1157 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1158 ep = (mp->ma_lookup)(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1159 if (ep == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1160 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1161 v = ep->me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1162 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1163 if (!PyDict_CheckExact(mp)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1164 /* Look up __missing__ method if we're a subclass. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1165 PyObject *missing, *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1166 static PyObject *missing_str = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1167 missing = _PyObject_LookupSpecial((PyObject *)mp, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1168 "__missing__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1169 &missing_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1170 if (missing != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1171 res = PyObject_CallFunctionObjArgs(missing, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1172 key, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1173 Py_DECREF(missing); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1174 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1175 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1176 else if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1177 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1178 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1179 set_key_error(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1180 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1181 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1182 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1183 Py_INCREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1184 return v; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1185 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1186 |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1187 static int |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1188 dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1189 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1190 if (w == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1191 return PyDict_DelItem((PyObject *)mp, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1192 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1193 return PyDict_SetItem((PyObject *)mp, v, w); |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1194 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1195 |
|
5505
47fa00877924
Renamed from mappingobject.c to dictobject.c.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
1196 static PyMappingMethods dict_as_mapping = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1197 (lenfunc)dict_length, /*mp_length*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1198 (binaryfunc)dict_subscript, /*mp_subscript*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1199 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/ |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1200 }; |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1201 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
1202 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1203 dict_keys(register PyDictObject *mp) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1204 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1205 register PyObject *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1206 register Py_ssize_t i, j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1207 PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1208 Py_ssize_t mask, n; |
|
17535
83c7b4b75668
Tentative fix for a problem that Tim discovered at the last moment,
Guido van Rossum <guido@python.org>
parents:
17115
diff
changeset
|
1209 |
|
83c7b4b75668
Tentative fix for a problem that Tim discovered at the last moment,
Guido van Rossum <guido@python.org>
parents:
17115
diff
changeset
|
1210 again: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1211 n = mp->ma_used; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1212 v = PyList_New(n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1213 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1214 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1215 if (n != mp->ma_used) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1216 /* Durnit. The allocations caused the dict to resize. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1217 * Just start over, this shouldn't normally happen. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1218 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1219 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1220 goto again; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1221 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1222 ep = mp->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1223 mask = mp->ma_mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1224 for (i = 0, j = 0; i <= mask; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1225 if (ep[i].me_value != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1226 PyObject *key = ep[i].me_key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1227 Py_INCREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1228 PyList_SET_ITEM(v, j, key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1229 j++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1230 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1231 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1232 assert(j == n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1233 return v; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1234 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1235 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
1236 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1237 dict_values(register PyDictObject *mp) |
|
1288
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1238 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1239 register PyObject *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1240 register Py_ssize_t i, j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1241 PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1242 Py_ssize_t mask, n; |
|
17535
83c7b4b75668
Tentative fix for a problem that Tim discovered at the last moment,
Guido van Rossum <guido@python.org>
parents:
17115
diff
changeset
|
1243 |
|
83c7b4b75668
Tentative fix for a problem that Tim discovered at the last moment,
Guido van Rossum <guido@python.org>
parents:
17115
diff
changeset
|
1244 again: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1245 n = mp->ma_used; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1246 v = PyList_New(n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1247 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1248 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1249 if (n != mp->ma_used) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1250 /* Durnit. The allocations caused the dict to resize. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1251 * Just start over, this shouldn't normally happen. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1252 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1253 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1254 goto again; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1255 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1256 ep = mp->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1257 mask = mp->ma_mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1258 for (i = 0, j = 0; i <= mask; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1259 if (ep[i].me_value != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1260 PyObject *value = ep[i].me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1261 Py_INCREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1262 PyList_SET_ITEM(v, j, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1263 j++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1264 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1265 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1266 assert(j == n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1267 return v; |
|
1288
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1268 } |
|
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1269 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
1270 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1271 dict_items(register PyDictObject *mp) |
|
1288
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1272 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1273 register PyObject *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1274 register Py_ssize_t i, j, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1275 Py_ssize_t mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1276 PyObject *item, *key, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1277 PyDictEntry *ep; |
|
17535
83c7b4b75668
Tentative fix for a problem that Tim discovered at the last moment,
Guido van Rossum <guido@python.org>
parents:
17115
diff
changeset
|
1278 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1279 /* Preallocate the list of tuples, to avoid allocations during |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1280 * the loop over the items, which could trigger GC, which |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1281 * could resize the dict. :-( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1282 */ |
|
17535
83c7b4b75668
Tentative fix for a problem that Tim discovered at the last moment,
Guido van Rossum <guido@python.org>
parents:
17115
diff
changeset
|
1283 again: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1284 n = mp->ma_used; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1285 v = PyList_New(n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1286 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1287 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1288 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1289 item = PyTuple_New(2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1290 if (item == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1291 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1292 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1293 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1294 PyList_SET_ITEM(v, i, item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1295 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1296 if (n != mp->ma_used) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1297 /* Durnit. The allocations caused the dict to resize. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1298 * Just start over, this shouldn't normally happen. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1299 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1300 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1301 goto again; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1302 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1303 /* Nothing we do below makes any function calls. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1304 ep = mp->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1305 mask = mp->ma_mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1306 for (i = 0, j = 0; i <= mask; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1307 if ((value=ep[i].me_value) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1308 key = ep[i].me_key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1309 item = PyList_GET_ITEM(v, j); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1310 Py_INCREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1311 PyTuple_SET_ITEM(item, 0, key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1312 Py_INCREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1313 PyTuple_SET_ITEM(item, 1, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1314 j++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1315 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1316 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1317 assert(j == n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1318 return v; |
|
1288
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1319 } |
|
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1320 |
|
5658
1265ca44f04b
Added dict.absorb() and dict.copy().
Guido van Rossum <guido@python.org>
parents:
5609
diff
changeset
|
1321 static PyObject * |
|
26583
8991f78817c7
SF 548651: Fix the METH_CLASS implementation.
Tim Peters <tim.peters@gmail.com>
parents:
26562
diff
changeset
|
1322 dict_fromkeys(PyObject *cls, PyObject *args) |
|
26437
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
1323 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1324 PyObject *seq; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1325 PyObject *value = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1326 PyObject *it; /* iter(seq) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1327 PyObject *key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1328 PyObject *d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1329 int status; |
|
26437
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
1330 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1331 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1332 return NULL; |
|
26437
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
1333 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1334 d = PyObject_CallObject(cls, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1335 if (d == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1336 return NULL; |
|
26437
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
1337 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1338 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1339 PyDictObject *mp = (PyDictObject *)d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1340 PyObject *oldvalue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1341 Py_ssize_t pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1342 PyObject *key; |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
1343 Py_hash_t hash; |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1344 |
|
73103
df24a8b57148
Issue #13018: Fix reference leaks in error paths in dictobject.c.
Petri Lehtinen <petri@digip.org>
parents:
68586
diff
changeset
|
1345 if (dictresize(mp, Py_SIZE(seq))) { |
|
df24a8b57148
Issue #13018: Fix reference leaks in error paths in dictobject.c.
Petri Lehtinen <petri@digip.org>
parents:
68586
diff
changeset
|
1346 Py_DECREF(d); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1347 return NULL; |
|
73103
df24a8b57148
Issue #13018: Fix reference leaks in error paths in dictobject.c.
Petri Lehtinen <petri@digip.org>
parents:
68586
diff
changeset
|
1348 } |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1349 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1350 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1351 Py_INCREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1352 Py_INCREF(value); |
|
73103
df24a8b57148
Issue #13018: Fix reference leaks in error paths in dictobject.c.
Petri Lehtinen <petri@digip.org>
parents:
68586
diff
changeset
|
1353 if (insertdict(mp, key, hash, value)) { |
|
df24a8b57148
Issue #13018: Fix reference leaks in error paths in dictobject.c.
Petri Lehtinen <petri@digip.org>
parents:
68586
diff
changeset
|
1354 Py_DECREF(d); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1355 return NULL; |
|
73103
df24a8b57148
Issue #13018: Fix reference leaks in error paths in dictobject.c.
Petri Lehtinen <petri@digip.org>
parents:
68586
diff
changeset
|
1356 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1357 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1358 return d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1359 } |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1360 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1361 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1362 PyDictObject *mp = (PyDictObject *)d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1363 Py_ssize_t pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1364 PyObject *key; |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
1365 Py_hash_t hash; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40962
diff
changeset
|
1366 |
|
73103
df24a8b57148
Issue #13018: Fix reference leaks in error paths in dictobject.c.
Petri Lehtinen <petri@digip.org>
parents:
68586
diff
changeset
|
1367 if (dictresize(mp, PySet_GET_SIZE(seq))) { |
|
df24a8b57148
Issue #13018: Fix reference leaks in error paths in dictobject.c.
Petri Lehtinen <petri@digip.org>
parents:
68586
diff
changeset
|
1368 Py_DECREF(d); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1369 return NULL; |
|
73103
df24a8b57148
Issue #13018: Fix reference leaks in error paths in dictobject.c.
Petri Lehtinen <petri@digip.org>
parents:
68586
diff
changeset
|
1370 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40962
diff
changeset
|
1371 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1372 while (_PySet_NextEntry(seq, &pos, &key, &hash)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1373 Py_INCREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1374 Py_INCREF(value); |
|
73103
df24a8b57148
Issue #13018: Fix reference leaks in error paths in dictobject.c.
Petri Lehtinen <petri@digip.org>
parents:
68586
diff
changeset
|
1375 if (insertdict(mp, key, hash, value)) { |
|
df24a8b57148
Issue #13018: Fix reference leaks in error paths in dictobject.c.
Petri Lehtinen <petri@digip.org>
parents:
68586
diff
changeset
|
1376 Py_DECREF(d); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1377 return NULL; |
|
73103
df24a8b57148
Issue #13018: Fix reference leaks in error paths in dictobject.c.
Petri Lehtinen <petri@digip.org>
parents:
68586
diff
changeset
|
1378 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1379 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1380 return d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1381 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40962
diff
changeset
|
1382 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1383 it = PyObject_GetIter(seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1384 if (it == NULL){ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1385 Py_DECREF(d); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1386 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1387 } |
|
26437
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
1388 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1389 if (PyDict_CheckExact(d)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1390 while ((key = PyIter_Next(it)) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1391 status = PyDict_SetItem(d, key, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1392 Py_DECREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1393 if (status < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1394 goto Fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1395 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1396 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1397 while ((key = PyIter_Next(it)) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1398 status = PyObject_SetItem(d, key, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1399 Py_DECREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1400 if (status < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1401 goto Fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1402 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1403 } |
|
26437
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
1404 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1405 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1406 goto Fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1407 Py_DECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1408 return d; |
|
26437
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
1409 |
|
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
1410 Fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1411 Py_DECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1412 Py_DECREF(d); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1413 return NULL; |
|
26437
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
1414 } |
|
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
1415 |
|
31616
5b3898d9ba59
SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents:
31545
diff
changeset
|
1416 static int |
|
5b3898d9ba59
SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents:
31545
diff
changeset
|
1417 dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname) |
|
5b3898d9ba59
SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents:
31545
diff
changeset
|
1418 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1419 PyObject *arg = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1420 int result = 0; |
|
31616
5b3898d9ba59
SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents:
31545
diff
changeset
|
1421 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1422 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1423 result = -1; |
|
31616
5b3898d9ba59
SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents:
31545
diff
changeset
|
1424 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1425 else if (arg != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1426 if (PyObject_HasAttrString(arg, "keys")) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1427 result = PyDict_Merge(self, arg, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1428 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1429 result = PyDict_MergeFromSeq2(self, arg, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1430 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
1431 if (result == 0 && kwds != NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
1432 if (PyArg_ValidateKeywordArguments(kwds)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
1433 result = PyDict_Merge(self, kwds, 1); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
1434 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
1435 result = -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
1436 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1437 return result; |
|
31616
5b3898d9ba59
SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents:
31545
diff
changeset
|
1438 } |
|
5b3898d9ba59
SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents:
31545
diff
changeset
|
1439 |
|
26437
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
1440 static PyObject * |
|
31616
5b3898d9ba59
SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents:
31545
diff
changeset
|
1441 dict_update(PyObject *self, PyObject *args, PyObject *kwds) |
|
5658
1265ca44f04b
Added dict.absorb() and dict.copy().
Guido van Rossum <guido@python.org>
parents:
5609
diff
changeset
|
1442 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1443 if (dict_update_common(self, args, kwds, "update") != -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1444 Py_RETURN_NONE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1445 return NULL; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
1446 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
1447 |
|
19150
3f34f724f014
Add PyDict_Merge(a, b, override):
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1448 /* Update unconditionally replaces existing items. |
|
3f34f724f014
Add PyDict_Merge(a, b, override):
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1449 Merge has a 3rd argument 'override'; if set, it acts like Update, |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1450 otherwise it leaves existing items unchanged. |
|
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1451 |
|
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1452 PyDict_{Update,Merge} update/merge from a mapping object. |
|
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1453 |
|
21348
12310d643d8d
SF bug #491415 PyDict_UpdateFromSeq2() unused
Tim Peters <tim.peters@gmail.com>
parents:
21155
diff
changeset
|
1454 PyDict_MergeFromSeq2 updates/merges from any iterable object |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1455 producing iterable objects of length 2. |
|
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1456 */ |
|
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1457 |
|
21348
12310d643d8d
SF bug #491415 PyDict_UpdateFromSeq2() unused
Tim Peters <tim.peters@gmail.com>
parents:
21155
diff
changeset
|
1458 int |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1459 PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override) |
|
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1460 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1461 PyObject *it; /* iter(seq2) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1462 Py_ssize_t i; /* index into seq2 of current element */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1463 PyObject *item; /* seq2[i] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1464 PyObject *fast; /* item as a 2-tuple or 2-list */ |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1465 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1466 assert(d != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1467 assert(PyDict_Check(d)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1468 assert(seq2 != NULL); |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1469 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1470 it = PyObject_GetIter(seq2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1471 if (it == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1472 return -1; |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1473 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1474 for (i = 0; ; ++i) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1475 PyObject *key, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1476 Py_ssize_t n; |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1477 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1478 fast = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1479 item = PyIter_Next(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1480 if (item == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1481 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1482 goto Fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1483 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1484 } |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1485 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1486 /* Convert item to sequence, and verify length 2. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1487 fast = PySequence_Fast(item, ""); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1488 if (fast == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1489 if (PyErr_ExceptionMatches(PyExc_TypeError)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1490 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1491 "cannot convert dictionary update " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1492 "sequence element #%zd to a sequence", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1493 i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1494 goto Fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1495 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1496 n = PySequence_Fast_GET_SIZE(fast); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1497 if (n != 2) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1498 PyErr_Format(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1499 "dictionary update sequence element #%zd " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1500 "has length %zd; 2 is required", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1501 i, n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1502 goto Fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1503 } |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1504 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1505 /* Update/merge with this (key, value) pair. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1506 key = PySequence_Fast_GET_ITEM(fast, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1507 value = PySequence_Fast_GET_ITEM(fast, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1508 if (override || PyDict_GetItem(d, key) == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1509 int status = PyDict_SetItem(d, key, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1510 if (status < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1511 goto Fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1512 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1513 Py_DECREF(fast); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1514 Py_DECREF(item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1515 } |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1516 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1517 i = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1518 goto Return; |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1519 Fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1520 Py_XDECREF(item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1521 Py_XDECREF(fast); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1522 i = -1; |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1523 Return: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1524 Py_DECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1525 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int); |
|
20683
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1526 } |
|
505dd34e0eeb
Generalize dictionary() to accept a sequence of 2-sequences. At the
Tim Peters <tim.peters@gmail.com>
parents:
20277
diff
changeset
|
1527 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
1528 int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
1529 PyDict_Update(PyObject *a, PyObject *b) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
1530 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1531 return PyDict_Merge(a, b, 1); |
|
19150
3f34f724f014
Add PyDict_Merge(a, b, override):
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1532 } |
|
3f34f724f014
Add PyDict_Merge(a, b, override):
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1533 |
|
3f34f724f014
Add PyDict_Merge(a, b, override):
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1534 int |
|
3f34f724f014
Add PyDict_Merge(a, b, override):
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1535 PyDict_Merge(PyObject *a, PyObject *b, int override) |
|
3f34f724f014
Add PyDict_Merge(a, b, override):
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1536 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1537 register PyDictObject *mp, *other; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1538 register Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1539 PyDictEntry *entry; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
1540 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1541 /* We accept for the argument either a concrete dictionary object, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1542 * or an abstract "mapping" object. For the former, we can do |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1543 * things quite efficiently. For the latter, we only require that |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1544 * PyMapping_Keys() and PyObject_GetItem() be supported. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1545 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1546 if (a == NULL || !PyDict_Check(a) || b == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1547 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1548 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1549 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1550 mp = (PyDictObject*)a; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1551 if (PyDict_Check(b)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1552 other = (PyDictObject*)b; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1553 if (other == mp || other->ma_used == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1554 /* a.update(a) or a.update({}); nothing to do */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1555 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1556 if (mp->ma_used == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1557 /* Since the target dict is empty, PyDict_GetItem() |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1558 * always returns NULL. Setting override to 1 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1559 * skips the unnecessary test. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1560 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1561 override = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1562 /* Do one big resize at the start, rather than |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1563 * incrementally resizing as we insert new items. Expect |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1564 * that there will be no (or few) overlapping keys. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1565 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1566 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1567 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1568 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1569 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1570 for (i = 0; i <= other->ma_mask; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1571 entry = &other->ma_table[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1572 if (entry->me_value != NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1573 (override || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1574 PyDict_GetItem(a, entry->me_key) == NULL)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1575 Py_INCREF(entry->me_key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1576 Py_INCREF(entry->me_value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1577 if (insertdict(mp, entry->me_key, |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
1578 entry->me_hash, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1579 entry->me_value) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1580 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1581 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1582 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1583 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1584 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1585 /* Do it the generic, slower way */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1586 PyObject *keys = PyMapping_Keys(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1587 PyObject *iter; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1588 PyObject *key, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1589 int status; |
|
18283
1f1d2c50b3c7
dict_update(): Generalize this method so {}.update() accepts any
Barry Warsaw <barry@python.org>
parents:
18131
diff
changeset
|
1590 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1591 if (keys == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1592 /* Docstring says this is equivalent to E.keys() so |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1593 * if E doesn't have a .keys() method we want |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1594 * AttributeError to percolate up. Might as well |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1595 * do the same for any other error. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1596 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1597 return -1; |
|
18283
1f1d2c50b3c7
dict_update(): Generalize this method so {}.update() accepts any
Barry Warsaw <barry@python.org>
parents:
18131
diff
changeset
|
1598 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1599 iter = PyObject_GetIter(keys); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1600 Py_DECREF(keys); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1601 if (iter == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1602 return -1; |
|
18283
1f1d2c50b3c7
dict_update(): Generalize this method so {}.update() accepts any
Barry Warsaw <barry@python.org>
parents:
18131
diff
changeset
|
1603 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1604 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1605 if (!override && PyDict_GetItem(a, key) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1606 Py_DECREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1607 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1608 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1609 value = PyObject_GetItem(b, key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1610 if (value == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1611 Py_DECREF(iter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1612 Py_DECREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1613 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1614 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1615 status = PyDict_SetItem(a, key, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1616 Py_DECREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1617 Py_DECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1618 if (status < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1619 Py_DECREF(iter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1620 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1621 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1622 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1623 Py_DECREF(iter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1624 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1625 /* Iterator completed, via error */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1626 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1627 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1628 return 0; |
|
5658
1265ca44f04b
Added dict.absorb() and dict.copy().
Guido van Rossum <guido@python.org>
parents:
5609
diff
changeset
|
1629 } |
|
1265ca44f04b
Added dict.absorb() and dict.copy().
Guido van Rossum <guido@python.org>
parents:
5609
diff
changeset
|
1630 |
|
1265ca44f04b
Added dict.absorb() and dict.copy().
Guido van Rossum <guido@python.org>
parents:
5609
diff
changeset
|
1631 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1632 dict_copy(register PyDictObject *mp) |
|
5658
1265ca44f04b
Added dict.absorb() and dict.copy().
Guido van Rossum <guido@python.org>
parents:
5609
diff
changeset
|
1633 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1634 return PyDict_Copy((PyObject*)mp); |
|
12126
e6214ad2a60c
Add PyDict_Copy() function to C API for dicts. It returns a new
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11999
diff
changeset
|
1635 } |
|
e6214ad2a60c
Add PyDict_Copy() function to C API for dicts. It returns a new
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11999
diff
changeset
|
1636 |
|
e6214ad2a60c
Add PyDict_Copy() function to C API for dicts. It returns a new
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11999
diff
changeset
|
1637 PyObject * |
|
13341
3f1bd4782628
Removed Py_PROTO and switched to ANSI C declarations in the dict
Tim Peters <tim.peters@gmail.com>
parents:
13265
diff
changeset
|
1638 PyDict_Copy(PyObject *o) |
|
12126
e6214ad2a60c
Add PyDict_Copy() function to C API for dicts. It returns a new
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11999
diff
changeset
|
1639 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1640 PyObject *copy; |
|
12126
e6214ad2a60c
Add PyDict_Copy() function to C API for dicts. It returns a new
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11999
diff
changeset
|
1641 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1642 if (o == NULL || !PyDict_Check(o)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1643 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1644 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1645 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1646 copy = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1647 if (copy == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1648 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1649 if (PyDict_Merge(copy, o, 1) == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1650 return copy; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1651 Py_DECREF(copy); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1652 return NULL; |
|
5658
1265ca44f04b
Added dict.absorb() and dict.copy().
Guido van Rossum <guido@python.org>
parents:
5609
diff
changeset
|
1653 } |
|
1265ca44f04b
Added dict.absorb() and dict.copy().
Guido van Rossum <guido@python.org>
parents:
5609
diff
changeset
|
1654 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1655 Py_ssize_t |
|
13341
3f1bd4782628
Removed Py_PROTO and switched to ANSI C declarations in the dict
Tim Peters <tim.peters@gmail.com>
parents:
13265
diff
changeset
|
1656 PyDict_Size(PyObject *mp) |
|
1398
1d841587aede
Added getmappingsize(). (Needed by previous checkin of posixmodule.c)
Guido van Rossum <guido@python.org>
parents:
1356
diff
changeset
|
1657 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1658 if (mp == NULL || !PyDict_Check(mp)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1659 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1660 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1661 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1662 return ((PyDictObject *)mp)->ma_used; |
|
1398
1d841587aede
Added getmappingsize(). (Needed by previous checkin of posixmodule.c)
Guido van Rossum <guido@python.org>
parents:
1356
diff
changeset
|
1663 } |
|
1d841587aede
Added getmappingsize(). (Needed by previous checkin of posixmodule.c)
Guido van Rossum <guido@python.org>
parents:
1356
diff
changeset
|
1664 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
1665 PyObject * |
|
13341
3f1bd4782628
Removed Py_PROTO and switched to ANSI C declarations in the dict
Tim Peters <tim.peters@gmail.com>
parents:
13265
diff
changeset
|
1666 PyDict_Keys(PyObject *mp) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1667 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1668 if (mp == NULL || !PyDict_Check(mp)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1669 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1670 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1671 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1672 return dict_keys((PyDictObject *)mp); |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1673 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1674 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
1675 PyObject * |
|
13341
3f1bd4782628
Removed Py_PROTO and switched to ANSI C declarations in the dict
Tim Peters <tim.peters@gmail.com>
parents:
13265
diff
changeset
|
1676 PyDict_Values(PyObject *mp) |
|
1288
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1677 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1678 if (mp == NULL || !PyDict_Check(mp)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1679 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1680 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1681 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1682 return dict_values((PyDictObject *)mp); |
|
1288
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1683 } |
|
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1684 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
1685 PyObject * |
|
13341
3f1bd4782628
Removed Py_PROTO and switched to ANSI C declarations in the dict
Tim Peters <tim.peters@gmail.com>
parents:
13265
diff
changeset
|
1686 PyDict_Items(PyObject *mp) |
|
1288
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1687 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1688 if (mp == NULL || !PyDict_Check(mp)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1689 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1690 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1691 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1692 return dict_items((PyDictObject *)mp); |
|
1288
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1693 } |
|
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1694 |
|
17704
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1695 /* Return 1 if dicts equal, 0 if not, -1 if error. |
|
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1696 * Gets out as soon as any difference is detected. |
|
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1697 * Uses only Py_EQ comparison. |
|
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1698 */ |
|
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1699 static int |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1700 dict_equal(PyDictObject *a, PyDictObject *b) |
|
17704
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1701 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1702 Py_ssize_t i; |
|
17704
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1703 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1704 if (a->ma_used != b->ma_used) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1705 /* can't be equal if # of entries differ */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1706 return 0; |
|
18014
9f97167f1643
New collision resolution scheme: no polynomials, simpler, faster, less
Tim Peters <tim.peters@gmail.com>
parents:
17973
diff
changeset
|
1707 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1708 /* Same # of entries -- check all of 'em. Exit early on any diff. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1709 for (i = 0; i <= a->ma_mask; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1710 PyObject *aval = a->ma_table[i].me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1711 if (aval != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1712 int cmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1713 PyObject *bval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1714 PyObject *key = a->ma_table[i].me_key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1715 /* temporarily bump aval's refcount to ensure it stays |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1716 alive until we're done with it */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1717 Py_INCREF(aval); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1718 /* ditto for key */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1719 Py_INCREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1720 bval = PyDict_GetItemWithError((PyObject *)b, key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1721 Py_DECREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1722 if (bval == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1723 Py_DECREF(aval); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1724 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1725 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1726 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1727 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1728 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1729 Py_DECREF(aval); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1730 if (cmp <= 0) /* error or not equal */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1731 return cmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1732 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1733 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1734 return 1; |
|
17704
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1735 } |
|
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1736 |
|
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1737 static PyObject * |
|
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1738 dict_richcompare(PyObject *v, PyObject *w, int op) |
|
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1739 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1740 int cmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1741 PyObject *res; |
|
17704
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1742 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1743 if (!PyDict_Check(v) || !PyDict_Check(w)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1744 res = Py_NotImplemented; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1745 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1746 else if (op == Py_EQ || op == Py_NE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1747 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1748 if (cmp < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1749 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1750 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1751 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1752 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1753 res = Py_NotImplemented; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1754 Py_INCREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1755 return res; |
|
17704
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1756 } |
|
b41f6ef6ea8f
SF patch #421922: Implement rich comparison for dicts.
Tim Peters <tim.peters@gmail.com>
parents:
17656
diff
changeset
|
1757 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
1758 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1759 dict_contains(register PyDictObject *mp, PyObject *key) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1760 { |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
1761 Py_hash_t hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1762 PyDictEntry *ep; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
1763 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1764 if (!PyUnicode_CheckExact(key) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1765 (hash = ((PyUnicodeObject *) key)->hash) == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1766 hash = PyObject_Hash(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1767 if (hash == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1768 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1769 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1770 ep = (mp->ma_lookup)(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1771 if (ep == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1772 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1773 return PyBool_FromLong(ep->me_value != NULL); |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1774 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1775 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
1776 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1777 dict_get(register PyDictObject *mp, PyObject *args) |
|
6395
22dae2637e08
dict_get(): New method for item access with different semantics than
Barry Warsaw <barry@python.org>
parents:
6351
diff
changeset
|
1778 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1779 PyObject *key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1780 PyObject *failobj = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1781 PyObject *val = NULL; |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
1782 Py_hash_t hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1783 PyDictEntry *ep; |
|
6395
22dae2637e08
dict_get(): New method for item access with different semantics than
Barry Warsaw <barry@python.org>
parents:
6351
diff
changeset
|
1784 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1785 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1786 return NULL; |
|
6395
22dae2637e08
dict_get(): New method for item access with different semantics than
Barry Warsaw <barry@python.org>
parents:
6351
diff
changeset
|
1787 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1788 if (!PyUnicode_CheckExact(key) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1789 (hash = ((PyUnicodeObject *) key)->hash) == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1790 hash = PyObject_Hash(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1791 if (hash == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1792 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1793 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1794 ep = (mp->ma_lookup)(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1795 if (ep == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1796 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1797 val = ep->me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1798 if (val == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1799 val = failobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1800 Py_INCREF(val); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1801 return val; |
|
6395
22dae2637e08
dict_get(): New method for item access with different semantics than
Barry Warsaw <barry@python.org>
parents:
6351
diff
changeset
|
1802 } |
|
22dae2637e08
dict_get(): New method for item access with different semantics than
Barry Warsaw <barry@python.org>
parents:
6351
diff
changeset
|
1803 |
|
22dae2637e08
dict_get(): New method for item access with different semantics than
Barry Warsaw <barry@python.org>
parents:
6351
diff
changeset
|
1804 |
|
22dae2637e08
dict_get(): New method for item access with different semantics than
Barry Warsaw <barry@python.org>
parents:
6351
diff
changeset
|
1805 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1806 dict_setdefault(register PyDictObject *mp, PyObject *args) |
|
13892
2190b7599837
Barry's patch to implement the new setdefault() method.
Guido van Rossum <guido@python.org>
parents:
13660
diff
changeset
|
1807 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1808 PyObject *key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1809 PyObject *failobj = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1810 PyObject *val = NULL; |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
1811 Py_hash_t hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1812 PyDictEntry *ep; |
|
13892
2190b7599837
Barry's patch to implement the new setdefault() method.
Guido van Rossum <guido@python.org>
parents:
13660
diff
changeset
|
1813 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1814 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1815 return NULL; |
|
13892
2190b7599837
Barry's patch to implement the new setdefault() method.
Guido van Rossum <guido@python.org>
parents:
13660
diff
changeset
|
1816 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1817 if (!PyUnicode_CheckExact(key) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1818 (hash = ((PyUnicodeObject *) key)->hash) == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1819 hash = PyObject_Hash(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1820 if (hash == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1821 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1822 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1823 ep = (mp->ma_lookup)(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1824 if (ep == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1825 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1826 val = ep->me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1827 if (val == NULL) { |
|
75302
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
1828 if (dict_set_item_by_hash_or_entry((PyObject*)mp, key, hash, ep, |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
1829 failobj) == 0) |
|
90572ccda12c
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Antoine Pitrou <solipsis@pitrou.net>
parents:
74044
diff
changeset
|
1830 val = failobj; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1831 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1832 Py_XINCREF(val); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1833 return val; |
|
13892
2190b7599837
Barry's patch to implement the new setdefault() method.
Guido van Rossum <guido@python.org>
parents:
13660
diff
changeset
|
1834 } |
|
2190b7599837
Barry's patch to implement the new setdefault() method.
Guido van Rossum <guido@python.org>
parents:
13660
diff
changeset
|
1835 |
|
2190b7599837
Barry's patch to implement the new setdefault() method.
Guido van Rossum <guido@python.org>
parents:
13660
diff
changeset
|
1836 |
|
2190b7599837
Barry's patch to implement the new setdefault() method.
Guido van Rossum <guido@python.org>
parents:
13660
diff
changeset
|
1837 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1838 dict_clear(register PyDictObject *mp) |
|
5209
2ec9c933afb8
Add clear() method to dictionary objects.
Guido van Rossum <guido@python.org>
parents:
5059
diff
changeset
|
1839 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1840 PyDict_Clear((PyObject *)mp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1841 Py_RETURN_NONE; |
|
5209
2ec9c933afb8
Add clear() method to dictionary objects.
Guido van Rossum <guido@python.org>
parents:
5059
diff
changeset
|
1842 } |
|
2ec9c933afb8
Add clear() method to dictionary objects.
Guido van Rossum <guido@python.org>
parents:
5059
diff
changeset
|
1843 |
|
15520
8854d9d5add5
Add popitem() -- SF patch #102733.
Guido van Rossum <guido@python.org>
parents:
15463
diff
changeset
|
1844 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1845 dict_pop(PyDictObject *mp, PyObject *args) |
|
22994
196dfa7ed348
Add Raymond Hettinger's d.pop(). See SF patch 539949.
Guido van Rossum <guido@python.org>
parents:
22973
diff
changeset
|
1846 { |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
1847 Py_hash_t hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1848 PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1849 PyObject *old_value, *old_key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1850 PyObject *key, *deflt = NULL; |
|
22994
196dfa7ed348
Add Raymond Hettinger's d.pop(). See SF patch 539949.
Guido van Rossum <guido@python.org>
parents:
22973
diff
changeset
|
1851 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1852 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1853 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1854 if (mp->ma_used == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1855 if (deflt) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1856 Py_INCREF(deflt); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1857 return deflt; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1858 } |
|
65754
480e45828d4b
Issue 10221: Improve error message for dict.pop().
Raymond Hettinger <python@rcn.com>
parents:
61467
diff
changeset
|
1859 set_key_error(key); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1860 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1861 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1862 if (!PyUnicode_CheckExact(key) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1863 (hash = ((PyUnicodeObject *) key)->hash) == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1864 hash = PyObject_Hash(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1865 if (hash == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1866 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1867 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1868 ep = (mp->ma_lookup)(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1869 if (ep == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1870 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1871 if (ep->me_value == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1872 if (deflt) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1873 Py_INCREF(deflt); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1874 return deflt; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1875 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1876 set_key_error(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1877 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1878 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1879 old_key = ep->me_key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1880 Py_INCREF(dummy); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1881 ep->me_key = dummy; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1882 old_value = ep->me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1883 ep->me_value = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1884 mp->ma_used--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1885 Py_DECREF(old_key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1886 return old_value; |
|
22994
196dfa7ed348
Add Raymond Hettinger's d.pop(). See SF patch 539949.
Guido van Rossum <guido@python.org>
parents:
22973
diff
changeset
|
1887 } |
|
196dfa7ed348
Add Raymond Hettinger's d.pop(). See SF patch 539949.
Guido van Rossum <guido@python.org>
parents:
22973
diff
changeset
|
1888 |
|
196dfa7ed348
Add Raymond Hettinger's d.pop(). See SF patch 539949.
Guido van Rossum <guido@python.org>
parents:
22973
diff
changeset
|
1889 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1890 dict_popitem(PyDictObject *mp) |
|
15520
8854d9d5add5
Add popitem() -- SF patch #102733.
Guido van Rossum <guido@python.org>
parents:
15463
diff
changeset
|
1891 { |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
1892 Py_hash_t i = 0; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1893 PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1894 PyObject *res; |
|
15520
8854d9d5add5
Add popitem() -- SF patch #102733.
Guido van Rossum <guido@python.org>
parents:
15463
diff
changeset
|
1895 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1896 /* Allocate the result tuple before checking the size. Believe it |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1897 * or not, this allocation could trigger a garbage collection which |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1898 * could empty the dict, so if we checked the size first and that |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1899 * happened, the result would be an infinite loop (searching for an |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1900 * entry that no longer exists). Note that the usual popitem() |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1901 * idiom is "while d: k, v = d.popitem()". so needing to throw the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1902 * tuple away if the dict *is* empty isn't a significant |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1903 * inefficiency -- possible, but unlikely in practice. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1904 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1905 res = PyTuple_New(2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1906 if (res == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1907 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1908 if (mp->ma_used == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1909 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1910 PyErr_SetString(PyExc_KeyError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1911 "popitem(): dictionary is empty"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1912 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1913 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1914 /* Set ep to "the first" dict entry with a value. We abuse the hash |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1915 * field of slot 0 to hold a search finger: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1916 * If slot 0 has a value, use slot 0. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1917 * Else slot 0 is being used to hold a search finger, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1918 * and we use its hash value as the first index to look. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1919 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1920 ep = &mp->ma_table[0]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1921 if (ep->me_value == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1922 i = ep->me_hash; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1923 /* The hash field may be a real hash value, or it may be a |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1924 * legit search finger, or it may be a once-legit search |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1925 * finger that's out of bounds now because it wrapped around |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1926 * or the table shrunk -- simply make sure it's in bounds now. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1927 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1928 if (i > mp->ma_mask || i < 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1929 i = 1; /* skip slot 0 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1930 while ((ep = &mp->ma_table[i])->me_value == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1931 i++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1932 if (i > mp->ma_mask) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1933 i = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1934 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1935 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1936 PyTuple_SET_ITEM(res, 0, ep->me_key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1937 PyTuple_SET_ITEM(res, 1, ep->me_value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1938 Py_INCREF(dummy); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1939 ep->me_key = dummy; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1940 ep->me_value = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1941 mp->ma_used--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1942 assert(mp->ma_table[0].me_value == NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1943 mp->ma_table[0].me_hash = i + 1; /* next place to start */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1944 return res; |
|
15520
8854d9d5add5
Add popitem() -- SF patch #102733.
Guido van Rossum <guido@python.org>
parents:
15463
diff
changeset
|
1945 } |
|
8854d9d5add5
Add popitem() -- SF patch #102733.
Guido van Rossum <guido@python.org>
parents:
15463
diff
changeset
|
1946 |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1947 static int |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1948 dict_traverse(PyObject *op, visitproc visit, void *arg) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1949 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1950 Py_ssize_t i = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1951 PyObject *pk; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1952 PyObject *pv; |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1953 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1954 while (PyDict_Next(op, &i, &pk, &pv)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1955 Py_VISIT(pk); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1956 Py_VISIT(pv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1957 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1958 return 0; |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1959 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1960 |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1961 static int |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1962 dict_tp_clear(PyObject *op) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1963 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1964 PyDict_Clear(op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1965 return 0; |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1966 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1967 |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
1968 static PyObject *dictiter_new(PyDictObject *, PyTypeObject *); |
|
17644
5dbfe8316236
Add experimental iterkeys(), itervalues(), iteritems() to dict
Guido van Rossum <guido@python.org>
parents:
17617
diff
changeset
|
1969 |
|
47466
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45514
diff
changeset
|
1970 static PyObject * |
|
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45514
diff
changeset
|
1971 dict_sizeof(PyDictObject *mp) |
|
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45514
diff
changeset
|
1972 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1973 Py_ssize_t res; |
|
47466
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45514
diff
changeset
|
1974 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1975 res = sizeof(PyDictObject); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1976 if (mp->ma_table != mp->ma_smalltable) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1977 res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
1978 return PyLong_FromSsize_t(res); |
|
47466
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45514
diff
changeset
|
1979 } |
|
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45514
diff
changeset
|
1980 |
|
31172
e4fb6164158c
* Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents:
31019
diff
changeset
|
1981 PyDoc_STRVAR(contains__doc__, |
|
e4fb6164158c
* Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents:
31019
diff
changeset
|
1982 "D.__contains__(k) -> True if D has a key k, else False"); |
|
e4fb6164158c
* Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents:
31019
diff
changeset
|
1983 |
|
e4fb6164158c
* Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents:
31019
diff
changeset
|
1984 PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]"); |
|
e4fb6164158c
* Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents:
31019
diff
changeset
|
1985 |
|
47466
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45514
diff
changeset
|
1986 PyDoc_STRVAR(sizeof__doc__, |
|
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45514
diff
changeset
|
1987 "D.__sizeof__() -> size of D in memory, in bytes"); |
|
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45514
diff
changeset
|
1988 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22994
diff
changeset
|
1989 PyDoc_STRVAR(get__doc__, |
|
25115
4ea081100305
In doc strings, use 'k in D' rather than D.has_key(k).
Guido van Rossum <guido@python.org>
parents:
24901
diff
changeset
|
1990 "D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None."); |
|
15560
143646bafd1b
Add long-overdue docstrings to dict methods.
Tim Peters <tim.peters@gmail.com>
parents:
15554
diff
changeset
|
1991 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22994
diff
changeset
|
1992 PyDoc_STRVAR(setdefault_doc__, |
|
25115
4ea081100305
In doc strings, use 'k in D' rather than D.has_key(k).
Guido van Rossum <guido@python.org>
parents:
24901
diff
changeset
|
1993 "D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D"); |
|
15560
143646bafd1b
Add long-overdue docstrings to dict methods.
Tim Peters <tim.peters@gmail.com>
parents:
15554
diff
changeset
|
1994 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22994
diff
changeset
|
1995 PyDoc_STRVAR(pop__doc__, |
| 49493 | 1996 "D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\ |
|
28211
92e3b611dc9f
SF patch #693753: fix for bug 639806: default for dict.pop
Raymond Hettinger <python@rcn.com>
parents:
27902
diff
changeset
|
1997 If key is not found, d is returned if given, otherwise KeyError is raised"); |
|
22994
196dfa7ed348
Add Raymond Hettinger's d.pop(). See SF patch 539949.
Guido van Rossum <guido@python.org>
parents:
22973
diff
changeset
|
1998 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22994
diff
changeset
|
1999 PyDoc_STRVAR(popitem__doc__, |
|
15560
143646bafd1b
Add long-overdue docstrings to dict methods.
Tim Peters <tim.peters@gmail.com>
parents:
15554
diff
changeset
|
2000 "D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\ |
| 49493 | 2001 2-tuple; but raise KeyError if D is empty."); |
|
15560
143646bafd1b
Add long-overdue docstrings to dict methods.
Tim Peters <tim.peters@gmail.com>
parents:
15554
diff
changeset
|
2002 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22994
diff
changeset
|
2003 PyDoc_STRVAR(update__doc__, |
|
74044
393906d020fe
Small clarification in docstring of dict.update(): the positional argument is not required.
Georg Brandl <georg@python.org>
parents:
73103
diff
changeset
|
2004 "D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n" |
|
393906d020fe
Small clarification in docstring of dict.update(): the positional argument is not required.
Georg Brandl <georg@python.org>
parents:
73103
diff
changeset
|
2005 "If E present and has a .keys() method, does: for k in E: D[k] = E[k]\n\ |
|
393906d020fe
Small clarification in docstring of dict.update(): the positional argument is not required.
Georg Brandl <georg@python.org>
parents:
73103
diff
changeset
|
2006 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v\n\ |
| 49493 | 2007 In either case, this is followed by: for k in F: D[k] = F[k]"); |
|
15560
143646bafd1b
Add long-overdue docstrings to dict methods.
Tim Peters <tim.peters@gmail.com>
parents:
15554
diff
changeset
|
2008 |
|
26437
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
2009 PyDoc_STRVAR(fromkeys__doc__, |
|
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
2010 "dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\ |
|
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
2011 v defaults to None."); |
|
57d03375aead
SF Patch 643443. Added dict.fromkeys(iterable, value=None), a class
Raymond Hettinger <python@rcn.com>
parents:
26366
diff
changeset
|
2012 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22994
diff
changeset
|
2013 PyDoc_STRVAR(clear__doc__, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22994
diff
changeset
|
2014 "D.clear() -> None. Remove all items from D."); |
|
15560
143646bafd1b
Add long-overdue docstrings to dict methods.
Tim Peters <tim.peters@gmail.com>
parents:
15554
diff
changeset
|
2015 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22994
diff
changeset
|
2016 PyDoc_STRVAR(copy__doc__, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22994
diff
changeset
|
2017 "D.copy() -> a shallow copy of D"); |
|
15560
143646bafd1b
Add long-overdue docstrings to dict methods.
Tim Peters <tim.peters@gmail.com>
parents:
15554
diff
changeset
|
2018 |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2019 /* Forward */ |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2020 static PyObject *dictkeys_new(PyObject *); |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2021 static PyObject *dictitems_new(PyObject *); |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2022 static PyObject *dictvalues_new(PyObject *); |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2023 |
|
42381
9e84b4868984
Fix the docstrings for keys(), items(), values() (especially the latter).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
2024 PyDoc_STRVAR(keys__doc__, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2025 "D.keys() -> a set-like object providing a view on D's keys"); |
|
42381
9e84b4868984
Fix the docstrings for keys(), items(), values() (especially the latter).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
2026 PyDoc_STRVAR(items__doc__, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2027 "D.items() -> a set-like object providing a view on D's items"); |
|
42381
9e84b4868984
Fix the docstrings for keys(), items(), values() (especially the latter).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
2028 PyDoc_STRVAR(values__doc__, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2029 "D.values() -> an object providing a view on D's values"); |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2030 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
2031 static PyMethodDef mapp_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2032 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2033 contains__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2034 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2035 getitem__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2036 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2037 sizeof__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2038 {"get", (PyCFunction)dict_get, METH_VARARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2039 get__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2040 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2041 setdefault_doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2042 {"pop", (PyCFunction)dict_pop, METH_VARARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2043 pop__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2044 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2045 popitem__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2046 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2047 keys__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2048 {"items", (PyCFunction)dictitems_new, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2049 items__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2050 {"values", (PyCFunction)dictvalues_new, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2051 values__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2052 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2053 update__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2054 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2055 fromkeys__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2056 {"clear", (PyCFunction)dict_clear, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2057 clear__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2058 {"copy", (PyCFunction)dict_copy, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2059 copy__doc__}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2060 {NULL, NULL} /* sentinel */ |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2061 }; |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2062 |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
2063 /* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */ |
|
31019
b2fd7af17186
Expose dict_contains() and PyDict_Contains() with is about 10% faster
Raymond Hettinger <python@rcn.com>
parents:
30265
diff
changeset
|
2064 int |
|
b2fd7af17186
Expose dict_contains() and PyDict_Contains() with is about 10% faster
Raymond Hettinger <python@rcn.com>
parents:
30265
diff
changeset
|
2065 PyDict_Contains(PyObject *op, PyObject *key) |
|
17594
bf94af396b1e
Implement, test and document "key in dict" and "key not in dict".
Guido van Rossum <guido@python.org>
parents:
17536
diff
changeset
|
2066 { |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
2067 Py_hash_t hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2068 PyDictObject *mp = (PyDictObject *)op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2069 PyDictEntry *ep; |
|
17594
bf94af396b1e
Implement, test and document "key in dict" and "key not in dict".
Guido van Rossum <guido@python.org>
parents:
17536
diff
changeset
|
2070 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2071 if (!PyUnicode_CheckExact(key) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2072 (hash = ((PyUnicodeObject *) key)->hash) == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2073 hash = PyObject_Hash(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2074 if (hash == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2075 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2076 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2077 ep = (mp->ma_lookup)(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2078 return ep == NULL ? -1 : (ep->me_value != NULL); |
|
17594
bf94af396b1e
Implement, test and document "key in dict" and "key not in dict".
Guido van Rossum <guido@python.org>
parents:
17536
diff
changeset
|
2079 } |
|
bf94af396b1e
Implement, test and document "key in dict" and "key not in dict".
Guido van Rossum <guido@python.org>
parents:
17536
diff
changeset
|
2080 |
|
40893
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40823
diff
changeset
|
2081 /* Internal version of PyDict_Contains used when the hash value is already known */ |
|
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40823
diff
changeset
|
2082 int |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
64377
diff
changeset
|
2083 _PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash) |
|
40893
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40823
diff
changeset
|
2084 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2085 PyDictObject *mp = (PyDictObject *)op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2086 PyDictEntry *ep; |
|
40893
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40823
diff
changeset
|
2087 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2088 ep = (mp->ma_lookup)(mp, key, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2089 return ep == NULL ? -1 : (ep->me_value != NULL); |
|
40893
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40823
diff
changeset
|
2090 } |
|
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40823
diff
changeset
|
2091 |
|
17594
bf94af396b1e
Implement, test and document "key in dict" and "key not in dict".
Guido van Rossum <guido@python.org>
parents:
17536
diff
changeset
|
2092 /* Hack to implement "key in dict" */ |
|
bf94af396b1e
Implement, test and document "key in dict" and "key not in dict".
Guido van Rossum <guido@python.org>
parents:
17536
diff
changeset
|
2093 static PySequenceMethods dict_as_sequence = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2094 0, /* sq_length */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2095 0, /* sq_concat */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2096 0, /* sq_repeat */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2097 0, /* sq_item */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2098 0, /* sq_slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2099 0, /* sq_ass_item */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2100 0, /* sq_ass_slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2101 PyDict_Contains, /* sq_contains */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2102 0, /* sq_inplace_concat */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2103 0, /* sq_inplace_repeat */ |
|
17594
bf94af396b1e
Implement, test and document "key in dict" and "key not in dict".
Guido van Rossum <guido@python.org>
parents:
17536
diff
changeset
|
2104 }; |
|
bf94af396b1e
Implement, test and document "key in dict" and "key not in dict".
Guido van Rossum <guido@python.org>
parents:
17536
diff
changeset
|
2105 |
|
17644
5dbfe8316236
Add experimental iterkeys(), itervalues(), iteritems() to dict
Guido van Rossum <guido@python.org>
parents:
17617
diff
changeset
|
2106 static PyObject * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
2107 dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
2108 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2109 PyObject *self; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
2110 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2111 assert(type != NULL && type->tp_alloc != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2112 self = type->tp_alloc(type, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2113 if (self != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2114 PyDictObject *d = (PyDictObject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2115 /* It's guaranteed that tp->alloc zeroed out the struct. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2116 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2117 INIT_NONZERO_DICT_SLOTS(d); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2118 d->ma_lookup = lookdict_unicode; |
|
68585
bf94b6a73fc8
#11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65754
diff
changeset
|
2119 /* The object has been implicitly tracked by tp_alloc */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2120 if (type == &PyDict_Type) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2121 _PyObject_GC_UNTRACK(d); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
2122 #ifdef SHOW_CONVERSION_COUNTS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2123 ++created; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
2124 #endif |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
2125 #ifdef SHOW_TRACK_COUNT |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2126 if (_PyObject_GC_IS_TRACKED(d)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2127 count_tracked++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2128 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2129 count_untracked++; |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51971
diff
changeset
|
2130 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2131 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2132 return self; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
2133 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
2134 |
|
19658
2fa615dfc464
Make dictionary() a real constructor. Accepts at most one argument, "a
Tim Peters <tim.peters@gmail.com>
parents:
19581
diff
changeset
|
2135 static int |
|
2fa615dfc464
Make dictionary() a real constructor. Accepts at most one argument, "a
Tim Peters <tim.peters@gmail.com>
parents:
19581
diff
changeset
|
2136 dict_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
2fa615dfc464
Make dictionary() a real constructor. Accepts at most one argument, "a
Tim Peters <tim.peters@gmail.com>
parents:
19581
diff
changeset
|
2137 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2138 return dict_update_common(self, args, kwds, "dict"); |
|
19658
2fa615dfc464
Make dictionary() a real constructor. Accepts at most one argument, "a
Tim Peters <tim.peters@gmail.com>
parents:
19581
diff
changeset
|
2139 } |
|
2fa615dfc464
Make dictionary() a real constructor. Accepts at most one argument, "a
Tim Peters <tim.peters@gmail.com>
parents:
19581
diff
changeset
|
2140 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18283
diff
changeset
|
2141 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
2142 dict_iter(PyDictObject *dict) |
|
17644
5dbfe8316236
Add experimental iterkeys(), itervalues(), iteritems() to dict
Guido van Rossum <guido@python.org>
parents:
17617
diff
changeset
|
2143 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2144 return dictiter_new(dict, &PyDictIterKey_Type); |
|
17644
5dbfe8316236
Add experimental iterkeys(), itervalues(), iteritems() to dict
Guido van Rossum <guido@python.org>
parents:
17617
diff
changeset
|
2145 } |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2146 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22994
diff
changeset
|
2147 PyDoc_STRVAR(dictionary_doc, |
|
59224
8d48f9b59689
Merged revisions 78515-78516,78522 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
55584
diff
changeset
|
2148 "dict() -> new empty dictionary\n" |
|
20754
272336648d1f
Rename "dictionary" (type and constructor) to "dict".
Tim Peters <tim.peters@gmail.com>
parents:
20724
diff
changeset
|
2149 "dict(mapping) -> new dictionary initialized from a mapping object's\n" |
|
59224
8d48f9b59689
Merged revisions 78515-78516,78522 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
55584
diff
changeset
|
2150 " (key, value) pairs\n" |
|
8d48f9b59689
Merged revisions 78515-78516,78522 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
55584
diff
changeset
|
2151 "dict(iterable) -> new dictionary initialized as if via:\n" |
|
20724
f224632d0260
dictionary() constructor:
Tim Peters <tim.peters@gmail.com>
parents:
20683
diff
changeset
|
2152 " d = {}\n" |
|
59224
8d48f9b59689
Merged revisions 78515-78516,78522 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
55584
diff
changeset
|
2153 " for k, v in iterable:\n" |
|
26366
08b720cd387e
Patch #642500 with slight modifications: allow keyword arguments in
Just van Rossum <just@letterror.com>
parents:
25115
diff
changeset
|
2154 " d[k] = v\n" |
|
08b720cd387e
Patch #642500 with slight modifications: allow keyword arguments in
Just van Rossum <just@letterror.com>
parents:
25115
diff
changeset
|
2155 "dict(**kwargs) -> new dictionary initialized with the name=value pairs\n" |
|
08b720cd387e
Patch #642500 with slight modifications: allow keyword arguments in
Just van Rossum <just@letterror.com>
parents:
25115
diff
changeset
|
2156 " in the keyword argument list. For example: dict(one=1, two=2)"); |
|
19658
2fa615dfc464
Make dictionary() a real constructor. Accepts at most one argument, "a
Tim Peters <tim.peters@gmail.com>
parents:
19581
diff
changeset
|
2157 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
2158 PyTypeObject PyDict_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2159 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2160 "dict", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2161 sizeof(PyDictObject), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2162 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2163 (destructor)dict_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2164 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2165 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2166 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2167 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2168 (reprfunc)dict_repr, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2169 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2170 &dict_as_sequence, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2171 &dict_as_mapping, /* tp_as_mapping */ |
|
65512
17c96aaf93c8
Remove unneeded casts to hashfunc.
Georg Brandl <georg@python.org>
parents:
65498
diff
changeset
|
2172 PyObject_HashNotImplemented, /* tp_hash */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2173 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2174 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2175 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2176 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2177 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2178 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2179 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2180 dictionary_doc, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2181 dict_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2182 dict_tp_clear, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2183 dict_richcompare, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2184 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2185 (getiterfunc)dict_iter, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2186 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2187 mapp_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2188 0, /* tp_members */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2189 0, /* tp_getset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2190 0, /* tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2191 0, /* tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2192 0, /* tp_descr_get */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2193 0, /* tp_descr_set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2194 0, /* tp_dictoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2195 dict_init, /* tp_init */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2196 PyType_GenericAlloc, /* tp_alloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2197 dict_new, /* tp_new */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2198 PyObject_GC_Del, /* tp_free */ |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2199 }; |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2200 |
|
5540
a0cc005eccd7
Got rid of all the last_name_* bogosities. I don't think the
Guido van Rossum <guido@python.org>
parents:
5505
diff
changeset
|
2201 /* For backward compatibility with old dictionary interface */ |
|
a0cc005eccd7
Got rid of all the last_name_* bogosities. I don't think the
Guido van Rossum <guido@python.org>
parents:
5505
diff
changeset
|
2202 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5310
diff
changeset
|
2203 PyObject * |
|
26599
ecea8410178e
Constify char* API. Fixes #651363. 2.2 candidate.
Martin v. Löwis <martin@v.loewis.de>
parents:
26583
diff
changeset
|
2204 PyDict_GetItemString(PyObject *v, const char *key) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2205 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2206 PyObject *kv, *rv; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2207 kv = PyUnicode_FromString(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2208 if (kv == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2209 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2210 rv = PyDict_GetItem(v, kv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2211 Py_DECREF(kv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2212 return rv; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2213 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2214 |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2215 int |
|
26599
ecea8410178e
Constify char* API. Fixes #651363. 2.2 candidate.
Martin v. Löwis <martin@v.loewis.de>
parents:
26583
diff
changeset
|
2216 PyDict_SetItemString(PyObject *v, const char *key, PyObject *item) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2217 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2218 PyObject *kv; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2219 int err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2220 kv = PyUnicode_FromString(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2221 if (kv == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2222 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2223 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2224 err = PyDict_SetItem(v, kv, item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2225 Py_DECREF(kv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2226 return err; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2227 } |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2228 |
|
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2229 int |
|
26599
ecea8410178e
Constify char* API. Fixes #651363. 2.2 candidate.
Martin v. Löwis <martin@v.loewis.de>
parents:
26583
diff
changeset
|
2230 PyDict_DelItemString(PyObject *v, const char *key) |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2231 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2232 PyObject *kv; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2233 int err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2234 kv = PyUnicode_FromString(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2235 if (kv == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2236 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2237 err = PyDict_DelItem(v, kv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2238 Py_DECREF(kv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2239 return err; |
|
1256
7aa9613ffd36
Generalized version of dictionaries, with compatibility hacks.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2240 } |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2241 |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2242 /* Dictionary iterator types */ |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2243 |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2244 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2245 PyObject_HEAD |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2246 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2247 Py_ssize_t di_used; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2248 Py_ssize_t di_pos; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2249 PyObject* di_result; /* reusable result tuple for iteritems */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2250 Py_ssize_t len; |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2251 } dictiterobject; |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2252 |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2253 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43393
diff
changeset
|
2254 dictiter_new(PyDictObject *dict, PyTypeObject *itertype) |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2255 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2256 dictiterobject *di; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2257 di = PyObject_GC_New(dictiterobject, itertype); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2258 if (di == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2259 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2260 Py_INCREF(dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2261 di->di_dict = dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2262 di->di_used = dict->ma_used; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2263 di->di_pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2264 di->len = dict->ma_used; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2265 if (itertype == &PyDictIterItem_Type) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2266 di->di_result = PyTuple_Pack(2, Py_None, Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2267 if (di->di_result == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2268 Py_DECREF(di); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2269 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2270 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2271 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2272 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2273 di->di_result = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2274 _PyObject_GC_TRACK(di); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2275 return (PyObject *)di; |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2276 } |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2277 |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2278 static void |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2279 dictiter_dealloc(dictiterobject *di) |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2280 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2281 Py_XDECREF(di->di_dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2282 Py_XDECREF(di->di_result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2283 PyObject_GC_Del(di); |
|
50553
badb471dbaeb
Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49493
diff
changeset
|
2284 } |
|
badb471dbaeb
Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49493
diff
changeset
|
2285 |
|
badb471dbaeb
Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49493
diff
changeset
|
2286 static int |
|
badb471dbaeb
Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49493
diff
changeset
|
2287 dictiter_traverse(dictiterobject *di, visitproc visit, void *arg) |
|
badb471dbaeb
Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49493
diff
changeset
|
2288 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2289 Py_VISIT(di->di_dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2290 Py_VISIT(di->di_result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2291 return 0; |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2292 } |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2293 |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35350
diff
changeset
|
2294 static PyObject * |
|
31683
c32381f4dc6f
Make the new dictionary iterators transparent with respect to length.
Raymond Hettinger <python@rcn.com>
parents:
31680
diff
changeset
|
2295 dictiter_len(dictiterobject *di) |
|
c32381f4dc6f
Make the new dictionary iterators transparent with respect to length.
Raymond Hettinger <python@rcn.com>
parents:
31680
diff
changeset
|
2296 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2297 Py_ssize_t len = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2298 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2299 len = di->len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2300 return PyLong_FromSize_t(len); |
|
31683
c32381f4dc6f
Make the new dictionary iterators transparent with respect to length.
Raymond Hettinger <python@rcn.com>
parents:
31680
diff
changeset
|
2301 } |
|
c32381f4dc6f
Make the new dictionary iterators transparent with respect to length.
Raymond Hettinger <python@rcn.com>
parents:
31680
diff
changeset
|
2302 |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2303 PyDoc_STRVAR(length_hint_doc, |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2304 "Private method returning an estimate of len(list(it))."); |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35350
diff
changeset
|
2305 |
|
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35350
diff
changeset
|
2306 static PyMethodDef dictiter_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2307 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2308 length_hint_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2309 {NULL, NULL} /* sentinel */ |
|
31683
c32381f4dc6f
Make the new dictionary iterators transparent with respect to length.
Raymond Hettinger <python@rcn.com>
parents:
31680
diff
changeset
|
2310 }; |
|
c32381f4dc6f
Make the new dictionary iterators transparent with respect to length.
Raymond Hettinger <python@rcn.com>
parents:
31680
diff
changeset
|
2311 |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2312 static PyObject *dictiter_iternextkey(dictiterobject *di) |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2313 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2314 PyObject *key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2315 register Py_ssize_t i, mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2316 register PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2317 PyDictObject *d = di->di_dict; |
|
17617
aac65f50df6f
Mondo changes to the iterator stuff, without changing how Python code
Guido van Rossum <guido@python.org>
parents:
17597
diff
changeset
|
2318 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2319 if (d == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2320 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2321 assert (PyDict_Check(d)); |
|
24259
2f60f90ce309
Make StopIteration a sink state. This is done by clearing out the
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
2322 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2323 if (di->di_used != d->ma_used) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2324 PyErr_SetString(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2325 "dictionary changed size during iteration"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2326 di->di_used = -1; /* Make this state sticky */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2327 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2328 } |
|
24259
2f60f90ce309
Make StopIteration a sink state. This is done by clearing out the
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
2329 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2330 i = di->di_pos; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2331 if (i < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2332 goto fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2333 ep = d->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2334 mask = d->ma_mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2335 while (i <= mask && ep[i].me_value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2336 i++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2337 di->di_pos = i+1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2338 if (i > mask) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2339 goto fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2340 di->len--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2341 key = ep[i].me_key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2342 Py_INCREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2343 return key; |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2344 |
|
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2345 fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2346 Py_DECREF(d); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2347 di->di_dict = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2348 return NULL; |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2349 } |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2350 |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2351 PyTypeObject PyDictIterKey_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2352 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2353 "dict_keyiterator", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2354 sizeof(dictiterobject), /* tp_basicsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2355 0, /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2356 /* methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2357 (destructor)dictiter_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2358 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2359 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2360 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2361 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2362 0, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2363 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2364 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2365 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2366 0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2367 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2368 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2369 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2370 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2371 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2372 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2373 0, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2374 (traverseproc)dictiter_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2375 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2376 0, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2377 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2378 PyObject_SelfIter, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2379 (iternextfunc)dictiter_iternextkey, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2380 dictiter_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2381 0, |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2382 }; |
|
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2383 |
|
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2384 static PyObject *dictiter_iternextvalue(dictiterobject *di) |
|
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2385 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2386 PyObject *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2387 register Py_ssize_t i, mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2388 register PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2389 PyDictObject *d = di->di_dict; |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2390 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2391 if (d == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2392 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2393 assert (PyDict_Check(d)); |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2394 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2395 if (di->di_used != d->ma_used) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2396 PyErr_SetString(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2397 "dictionary changed size during iteration"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2398 di->di_used = -1; /* Make this state sticky */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2399 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2400 } |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2401 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2402 i = di->di_pos; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2403 mask = d->ma_mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2404 if (i < 0 || i > mask) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2405 goto fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2406 ep = d->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2407 while ((value=ep[i].me_value) == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2408 i++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2409 if (i > mask) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2410 goto fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2411 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2412 di->di_pos = i+1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2413 di->len--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2414 Py_INCREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2415 return value; |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2416 |
|
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2417 fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2418 Py_DECREF(d); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2419 di->di_dict = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2420 return NULL; |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2421 } |
|
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2422 |
|
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2423 PyTypeObject PyDictIterValue_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2424 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2425 "dict_valueiterator", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2426 sizeof(dictiterobject), /* tp_basicsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2427 0, /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2428 /* methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2429 (destructor)dictiter_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2430 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2431 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2432 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2433 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2434 0, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2435 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2436 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2437 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2438 0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2439 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2440 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2441 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2442 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2443 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2444 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2445 0, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2446 (traverseproc)dictiter_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2447 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2448 0, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2449 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2450 PyObject_SelfIter, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2451 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2452 dictiter_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2453 0, |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17595
diff
changeset
|
2454 }; |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2455 |
|
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2456 static PyObject *dictiter_iternextitem(dictiterobject *di) |
|
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2457 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2458 PyObject *key, *value, *result = di->di_result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2459 register Py_ssize_t i, mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2460 register PyDictEntry *ep; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2461 PyDictObject *d = di->di_dict; |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2462 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2463 if (d == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2464 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2465 assert (PyDict_Check(d)); |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2466 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2467 if (di->di_used != d->ma_used) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2468 PyErr_SetString(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2469 "dictionary changed size during iteration"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2470 di->di_used = -1; /* Make this state sticky */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2471 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2472 } |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2473 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2474 i = di->di_pos; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2475 if (i < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2476 goto fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2477 ep = d->ma_table; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2478 mask = d->ma_mask; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2479 while (i <= mask && ep[i].me_value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2480 i++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2481 di->di_pos = i+1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2482 if (i > mask) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2483 goto fail; |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2484 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2485 if (result->ob_refcnt == 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2486 Py_INCREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2487 Py_DECREF(PyTuple_GET_ITEM(result, 0)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2488 Py_DECREF(PyTuple_GET_ITEM(result, 1)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2489 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2490 result = PyTuple_New(2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2491 if (result == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2492 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2493 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2494 di->len--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2495 key = ep[i].me_key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2496 value = ep[i].me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2497 Py_INCREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2498 Py_INCREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2499 PyTuple_SET_ITEM(result, 0, key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2500 PyTuple_SET_ITEM(result, 1, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2501 return result; |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2502 |
|
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2503 fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2504 Py_DECREF(d); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2505 di->di_dict = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2506 return NULL; |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2507 } |
|
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2508 |
|
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2509 PyTypeObject PyDictIterItem_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2510 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2511 "dict_itemiterator", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2512 sizeof(dictiterobject), /* tp_basicsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2513 0, /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2514 /* methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2515 (destructor)dictiter_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2516 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2517 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2518 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2519 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2520 0, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2521 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2522 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2523 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2524 0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2525 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2526 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2527 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2528 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2529 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2530 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2531 0, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2532 (traverseproc)dictiter_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2533 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2534 0, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2535 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2536 PyObject_SelfIter, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2537 (iternextfunc)dictiter_iternextitem, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2538 dictiter_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2539 0, |
|
31680
bb3bccb3b77d
Optimize dictionary iterators.
Raymond Hettinger <python@rcn.com>
parents:
31677
diff
changeset
|
2540 }; |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2541 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2542 |
|
40806
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2543 /***********************************************/ |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2544 /* View objects for keys(), items(), values(). */ |
|
40806
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2545 /***********************************************/ |
|
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2546 |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2547 /* The instance lay-out is the same for all three; but the type differs. */ |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2548 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2549 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2550 PyObject_HEAD |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2551 PyDictObject *dv_dict; |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2552 } dictviewobject; |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2553 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2554 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2555 static void |
|
40806
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2556 dictview_dealloc(dictviewobject *dv) |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2557 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2558 Py_XDECREF(dv->dv_dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2559 PyObject_GC_Del(dv); |
|
50553
badb471dbaeb
Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49493
diff
changeset
|
2560 } |
|
badb471dbaeb
Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49493
diff
changeset
|
2561 |
|
badb471dbaeb
Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49493
diff
changeset
|
2562 static int |
|
badb471dbaeb
Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49493
diff
changeset
|
2563 dictview_traverse(dictviewobject *dv, visitproc visit, void *arg) |
|
badb471dbaeb
Merged revisions 68132 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49493
diff
changeset
|
2564 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2565 Py_VISIT(dv->dv_dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2566 return 0; |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2567 } |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2568 |
|
40805
eaedf84eabcd
Endow dict views with a proper length method.
Guido van Rossum <guido@python.org>
parents:
40804
diff
changeset
|
2569 static Py_ssize_t |
|
40806
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2570 dictview_len(dictviewobject *dv) |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2571 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2572 Py_ssize_t len = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2573 if (dv->dv_dict != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2574 len = dv->dv_dict->ma_used; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2575 return len; |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2576 } |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2577 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2578 static PyObject * |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2579 dictview_new(PyObject *dict, PyTypeObject *type) |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2580 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2581 dictviewobject *dv; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2582 if (dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2583 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2584 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2585 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2586 if (!PyDict_Check(dict)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2587 /* XXX Get rid of this restriction later */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2588 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2589 "%s() requires a dict argument, not '%s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2590 type->tp_name, dict->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2591 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2592 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2593 dv = PyObject_GC_New(dictviewobject, type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2594 if (dv == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2595 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2596 Py_INCREF(dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2597 dv->dv_dict = (PyDictObject *)dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2598 _PyObject_GC_TRACK(dv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2599 return (PyObject *)dv; |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2600 } |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2601 |
| 40953 | 2602 /* TODO(guido): The views objects are not complete: |
| 2603 | |
| 2604 * support more set operations | |
| 2605 * support arbitrary mappings? | |
| 2606 - either these should be static or exported in dictobject.h | |
| 2607 - if public then they should probably be in builtins | |
| 2608 */ | |
| 2609 | |
|
42799
d02610b0a9f3
Patch with Keir Mierle: add rich comparisons between dict views and sets,
Guido van Rossum <guido@python.org>
parents:
42750
diff
changeset
|
2610 /* Return 1 if self is a subset of other, iterating over self; |
|
d02610b0a9f3
Patch with Keir Mierle: add rich comparisons between dict views and sets,
Guido van Rossum <guido@python.org>
parents:
42750
diff
changeset
|
2611 0 if not; -1 if an error occurred. */ |
|
40823
50330d18d1cd
Make dict.keys() and dict.items() comparable to sets, using == and !=.
Guido van Rossum <guido@python.org>
parents:
40809
diff
changeset
|
2612 static int |
|
50330d18d1cd
Make dict.keys() and dict.items() comparable to sets, using == and !=.
Guido van Rossum <guido@python.org>
parents:
40809
diff
changeset
|
2613 all_contained_in(PyObject *self, PyObject *other) |
|
50330d18d1cd
Make dict.keys() and dict.items() comparable to sets, using == and !=.
Guido van Rossum <guido@python.org>
parents:
40809
diff
changeset
|
2614 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2615 PyObject *iter = PyObject_GetIter(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2616 int ok = 1; |
|
40823
50330d18d1cd
Make dict.keys() and dict.items() comparable to sets, using == and !=.
Guido van Rossum <guido@python.org>
parents:
40809
diff
changeset
|
2617 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2618 if (iter == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2619 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2620 for (;;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2621 PyObject *next = PyIter_Next(iter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2622 if (next == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2623 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2624 ok = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2625 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2626 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2627 ok = PySequence_Contains(other, next); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2628 Py_DECREF(next); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2629 if (ok <= 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2630 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2631 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2632 Py_DECREF(iter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2633 return ok; |
|
40823
50330d18d1cd
Make dict.keys() and dict.items() comparable to sets, using == and !=.
Guido van Rossum <guido@python.org>
parents:
40809
diff
changeset
|
2634 } |
|
50330d18d1cd
Make dict.keys() and dict.items() comparable to sets, using == and !=.
Guido van Rossum <guido@python.org>
parents:
40809
diff
changeset
|
2635 |
|
50330d18d1cd
Make dict.keys() and dict.items() comparable to sets, using == and !=.
Guido van Rossum <guido@python.org>
parents:
40809
diff
changeset
|
2636 static PyObject * |
|
50330d18d1cd
Make dict.keys() and dict.items() comparable to sets, using == and !=.
Guido van Rossum <guido@python.org>
parents:
40809
diff
changeset
|
2637 dictview_richcompare(PyObject *self, PyObject *other, int op) |
|
50330d18d1cd
Make dict.keys() and dict.items() comparable to sets, using == and !=.
Guido van Rossum <guido@python.org>
parents:
40809
diff
changeset
|
2638 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2639 Py_ssize_t len_self, len_other; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2640 int ok; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2641 PyObject *result; |
|
42799
d02610b0a9f3
Patch with Keir Mierle: add rich comparisons between dict views and sets,
Guido van Rossum <guido@python.org>
parents:
42750
diff
changeset
|
2642 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2643 assert(self != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2644 assert(PyDictViewSet_Check(self)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2645 assert(other != NULL); |
|
40823
50330d18d1cd
Make dict.keys() and dict.items() comparable to sets, using == and !=.
Guido van Rossum <guido@python.org>
parents:
40809
diff
changeset
|
2646 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2647 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2648 Py_INCREF(Py_NotImplemented); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2649 return Py_NotImplemented; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2650 } |
|
42799
d02610b0a9f3
Patch with Keir Mierle: add rich comparisons between dict views and sets,
Guido van Rossum <guido@python.org>
parents:
42750
diff
changeset
|
2651 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2652 len_self = PyObject_Size(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2653 if (len_self < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2654 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2655 len_other = PyObject_Size(other); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2656 if (len_other < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2657 return NULL; |
|
42799
d02610b0a9f3
Patch with Keir Mierle: add rich comparisons between dict views and sets,
Guido van Rossum <guido@python.org>
parents:
42750
diff
changeset
|
2658 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2659 ok = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2660 switch(op) { |
|
42799
d02610b0a9f3
Patch with Keir Mierle: add rich comparisons between dict views and sets,
Guido van Rossum <guido@python.org>
parents:
42750
diff
changeset
|
2661 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2662 case Py_NE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2663 case Py_EQ: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2664 if (len_self == len_other) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2665 ok = all_contained_in(self, other); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2666 if (op == Py_NE && ok >= 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2667 ok = !ok; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2668 break; |
|
42799
d02610b0a9f3
Patch with Keir Mierle: add rich comparisons between dict views and sets,
Guido van Rossum <guido@python.org>
parents:
42750
diff
changeset
|
2669 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2670 case Py_LT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2671 if (len_self < len_other) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2672 ok = all_contained_in(self, other); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2673 break; |
|
42799
d02610b0a9f3
Patch with Keir Mierle: add rich comparisons between dict views and sets,
Guido van Rossum <guido@python.org>
parents:
42750
diff
changeset
|
2674 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2675 case Py_LE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2676 if (len_self <= len_other) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2677 ok = all_contained_in(self, other); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2678 break; |
|
42799
d02610b0a9f3
Patch with Keir Mierle: add rich comparisons between dict views and sets,
Guido van Rossum <guido@python.org>
parents:
42750
diff
changeset
|
2679 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2680 case Py_GT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2681 if (len_self > len_other) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2682 ok = all_contained_in(other, self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2683 break; |
|
42799
d02610b0a9f3
Patch with Keir Mierle: add rich comparisons between dict views and sets,
Guido van Rossum <guido@python.org>
parents:
42750
diff
changeset
|
2684 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2685 case Py_GE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2686 if (len_self >= len_other) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2687 ok = all_contained_in(other, self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2688 break; |
|
42799
d02610b0a9f3
Patch with Keir Mierle: add rich comparisons between dict views and sets,
Guido van Rossum <guido@python.org>
parents:
42750
diff
changeset
|
2689 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2690 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2691 if (ok < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2692 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2693 result = ok ? Py_True : Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2694 Py_INCREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2695 return result; |
|
40823
50330d18d1cd
Make dict.keys() and dict.items() comparable to sets, using == and !=.
Guido van Rossum <guido@python.org>
parents:
40809
diff
changeset
|
2696 } |
|
50330d18d1cd
Make dict.keys() and dict.items() comparable to sets, using == and !=.
Guido van Rossum <guido@python.org>
parents:
40809
diff
changeset
|
2697 |
|
51971
5ad88b919318
Give dict views a helpful __repr__.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
2698 static PyObject * |
|
5ad88b919318
Give dict views a helpful __repr__.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
2699 dictview_repr(dictviewobject *dv) |
|
5ad88b919318
Give dict views a helpful __repr__.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
2700 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2701 PyObject *seq; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2702 PyObject *result; |
|
51971
5ad88b919318
Give dict views a helpful __repr__.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
2703 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2704 seq = PySequence_List((PyObject *)dv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2705 if (seq == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2706 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2707 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2708 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2709 Py_DECREF(seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2710 return result; |
|
51971
5ad88b919318
Give dict views a helpful __repr__.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
2711 } |
|
5ad88b919318
Give dict views a helpful __repr__.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
2712 |
|
40806
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2713 /*** dict_keys ***/ |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2714 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2715 static PyObject * |
|
40806
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2716 dictkeys_iter(dictviewobject *dv) |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2717 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2718 if (dv->dv_dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2719 Py_RETURN_NONE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2720 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2721 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type); |
|
40806
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2722 } |
|
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2723 |
|
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2724 static int |
|
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2725 dictkeys_contains(dictviewobject *dv, PyObject *obj) |
|
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2726 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2727 if (dv->dv_dict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2728 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2729 return PyDict_Contains((PyObject *)dv->dv_dict, obj); |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2730 } |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2731 |
|
40805
eaedf84eabcd
Endow dict views with a proper length method.
Guido van Rossum <guido@python.org>
parents:
40804
diff
changeset
|
2732 static PySequenceMethods dictkeys_as_sequence = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2733 (lenfunc)dictview_len, /* sq_length */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2734 0, /* sq_concat */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2735 0, /* sq_repeat */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2736 0, /* sq_item */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2737 0, /* sq_slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2738 0, /* sq_ass_item */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2739 0, /* sq_ass_slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2740 (objobjproc)dictkeys_contains, /* sq_contains */ |
|
40805
eaedf84eabcd
Endow dict views with a proper length method.
Guido van Rossum <guido@python.org>
parents:
40804
diff
changeset
|
2741 }; |
|
eaedf84eabcd
Endow dict views with a proper length method.
Guido van Rossum <guido@python.org>
parents:
40804
diff
changeset
|
2742 |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2743 static PyObject* |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2744 dictviews_sub(PyObject* self, PyObject *other) |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2745 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2746 PyObject *result = PySet_New(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2747 PyObject *tmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2748 if (result == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2749 return NULL; |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2750 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2751 tmp = PyObject_CallMethod(result, "difference_update", "O", other); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2752 if (tmp == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2753 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2754 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2755 } |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2756 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2757 Py_DECREF(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2758 return result; |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2759 } |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2760 |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2761 static PyObject* |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2762 dictviews_and(PyObject* self, PyObject *other) |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2763 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2764 PyObject *result = PySet_New(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2765 PyObject *tmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2766 if (result == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2767 return NULL; |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2768 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2769 tmp = PyObject_CallMethod(result, "intersection_update", "O", other); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2770 if (tmp == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2771 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2772 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2773 } |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2774 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2775 Py_DECREF(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2776 return result; |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2777 } |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2778 |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2779 static PyObject* |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2780 dictviews_or(PyObject* self, PyObject *other) |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2781 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2782 PyObject *result = PySet_New(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2783 PyObject *tmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2784 if (result == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2785 return NULL; |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2786 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2787 tmp = PyObject_CallMethod(result, "update", "O", other); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2788 if (tmp == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2789 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2790 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2791 } |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2792 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2793 Py_DECREF(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2794 return result; |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2795 } |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2796 |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2797 static PyObject* |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2798 dictviews_xor(PyObject* self, PyObject *other) |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2799 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2800 PyObject *result = PySet_New(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2801 PyObject *tmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2802 if (result == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2803 return NULL; |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2804 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2805 tmp = PyObject_CallMethod(result, "symmetric_difference_update", "O", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2806 other); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2807 if (tmp == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2808 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2809 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2810 } |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2811 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2812 Py_DECREF(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2813 return result; |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2814 } |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2815 |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2816 static PyNumberMethods dictviews_as_number = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2817 0, /*nb_add*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2818 (binaryfunc)dictviews_sub, /*nb_subtract*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2819 0, /*nb_multiply*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2820 0, /*nb_remainder*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2821 0, /*nb_divmod*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2822 0, /*nb_power*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2823 0, /*nb_negative*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2824 0, /*nb_positive*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2825 0, /*nb_absolute*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2826 0, /*nb_bool*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2827 0, /*nb_invert*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2828 0, /*nb_lshift*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2829 0, /*nb_rshift*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2830 (binaryfunc)dictviews_and, /*nb_and*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2831 (binaryfunc)dictviews_xor, /*nb_xor*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2832 (binaryfunc)dictviews_or, /*nb_or*/ |
|
42805
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2833 }; |
|
3cd60f744f8e
Keir Mierle's set operations for dict views (keys/items only of course).
Guido van Rossum <guido@python.org>
parents:
42799
diff
changeset
|
2834 |
|
64377
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2835 static PyObject* |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2836 dictviews_isdisjoint(PyObject *self, PyObject *other) |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2837 { |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2838 PyObject *it; |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2839 PyObject *item = NULL; |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2840 |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2841 if (self == other) { |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2842 if (dictview_len((dictviewobject *)self) == 0) |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2843 Py_RETURN_TRUE; |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2844 else |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2845 Py_RETURN_FALSE; |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2846 } |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2847 |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2848 /* Iterate over the shorter object (only if other is a set, |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2849 * because PySequence_Contains may be expensive otherwise): */ |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2850 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) { |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2851 Py_ssize_t len_self = dictview_len((dictviewobject *)self); |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2852 Py_ssize_t len_other = PyObject_Size(other); |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2853 if (len_other == -1) |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2854 return NULL; |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2855 |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2856 if ((len_other > len_self)) { |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2857 PyObject *tmp = other; |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2858 other = self; |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2859 self = tmp; |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2860 } |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2861 } |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2862 |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2863 it = PyObject_GetIter(other); |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2864 if (it == NULL) |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2865 return NULL; |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2866 |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2867 while ((item = PyIter_Next(it)) != NULL) { |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2868 int contains = PySequence_Contains(self, item); |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2869 Py_DECREF(item); |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2870 if (contains == -1) { |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2871 Py_DECREF(it); |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2872 return NULL; |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2873 } |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2874 |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2875 if (contains) { |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2876 Py_DECREF(it); |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2877 Py_RETURN_FALSE; |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2878 } |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2879 } |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2880 Py_DECREF(it); |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2881 if (PyErr_Occurred()) |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2882 return NULL; /* PyIter_Next raised an exception. */ |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2883 Py_RETURN_TRUE; |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2884 } |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2885 |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2886 PyDoc_STRVAR(isdisjoint_doc, |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2887 "Return True if the view and the given iterable have a null intersection."); |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2888 |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2889 static PyMethodDef dictkeys_methods[] = { |
|
64377
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2890 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O, |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2891 isdisjoint_doc}, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2892 {NULL, NULL} /* sentinel */ |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2893 }; |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2894 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2895 PyTypeObject PyDictKeys_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2896 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2897 "dict_keys", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2898 sizeof(dictviewobject), /* tp_basicsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2899 0, /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2900 /* methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2901 (destructor)dictview_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2902 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2903 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2904 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2905 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2906 (reprfunc)dictview_repr, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2907 &dictviews_as_number, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2908 &dictkeys_as_sequence, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2909 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2910 0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2911 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2912 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2913 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2914 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2915 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2916 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2917 0, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2918 (traverseproc)dictview_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2919 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2920 dictview_richcompare, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2921 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2922 (getiterfunc)dictkeys_iter, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2923 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2924 dictkeys_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2925 0, |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2926 }; |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2927 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2928 static PyObject * |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2929 dictkeys_new(PyObject *dict) |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2930 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2931 return dictview_new(dict, &PyDictKeys_Type); |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2932 } |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2933 |
|
40806
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2934 /*** dict_items ***/ |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2935 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2936 static PyObject * |
|
40806
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2937 dictitems_iter(dictviewobject *dv) |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2938 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2939 if (dv->dv_dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2940 Py_RETURN_NONE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2941 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2942 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type); |
|
40806
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2943 } |
|
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2944 |
|
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2945 static int |
|
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2946 dictitems_contains(dictviewobject *dv, PyObject *obj) |
|
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
2947 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2948 PyObject *key, *value, *found; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2949 if (dv->dv_dict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2950 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2951 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2952 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2953 key = PyTuple_GET_ITEM(obj, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2954 value = PyTuple_GET_ITEM(obj, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2955 found = PyDict_GetItem((PyObject *)dv->dv_dict, key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2956 if (found == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2957 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2958 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2959 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2960 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2961 return PyObject_RichCompareBool(value, found, Py_EQ); |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2962 } |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2963 |
|
40805
eaedf84eabcd
Endow dict views with a proper length method.
Guido van Rossum <guido@python.org>
parents:
40804
diff
changeset
|
2964 static PySequenceMethods dictitems_as_sequence = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2965 (lenfunc)dictview_len, /* sq_length */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2966 0, /* sq_concat */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2967 0, /* sq_repeat */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2968 0, /* sq_item */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2969 0, /* sq_slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2970 0, /* sq_ass_item */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2971 0, /* sq_ass_slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2972 (objobjproc)dictitems_contains, /* sq_contains */ |
|
40805
eaedf84eabcd
Endow dict views with a proper length method.
Guido van Rossum <guido@python.org>
parents:
40804
diff
changeset
|
2973 }; |
|
eaedf84eabcd
Endow dict views with a proper length method.
Guido van Rossum <guido@python.org>
parents:
40804
diff
changeset
|
2974 |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2975 static PyMethodDef dictitems_methods[] = { |
|
64377
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2976 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O, |
|
0260e04d2cfc
Issue #9212: Added the missing isdisjoint method to the dict_keys and
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
2977 isdisjoint_doc}, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2978 {NULL, NULL} /* sentinel */ |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2979 }; |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2980 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
2981 PyTypeObject PyDictItems_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2982 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2983 "dict_items", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2984 sizeof(dictviewobject), /* tp_basicsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2985 0, /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2986 /* methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2987 (destructor)dictview_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2988 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2989 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2990 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2991 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2992 (reprfunc)dictview_repr, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2993 &dictviews_as_number, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2994 &dictitems_as_sequence, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2995 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2996 0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2997 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2998 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
2999 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3000 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3001 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3002 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3003 0, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3004 (traverseproc)dictview_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3005 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3006 dictview_richcompare, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3007 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3008 (getiterfunc)dictitems_iter, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3009 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3010 dictitems_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3011 0, |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3012 }; |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3013 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3014 static PyObject * |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3015 dictitems_new(PyObject *dict) |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3016 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3017 return dictview_new(dict, &PyDictItems_Type); |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3018 } |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3019 |
|
40806
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
3020 /*** dict_values ***/ |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3021 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3022 static PyObject * |
|
40806
7da2ae1a4f70
Implement __contains__ for dict_keys and dict_items.
Guido van Rossum <guido@python.org>
parents:
40805
diff
changeset
|
3023 dictvalues_iter(dictviewobject *dv) |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3024 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3025 if (dv->dv_dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3026 Py_RETURN_NONE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3027 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3028 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type); |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3029 } |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3030 |
|
40805
eaedf84eabcd
Endow dict views with a proper length method.
Guido van Rossum <guido@python.org>
parents:
40804
diff
changeset
|
3031 static PySequenceMethods dictvalues_as_sequence = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3032 (lenfunc)dictview_len, /* sq_length */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3033 0, /* sq_concat */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3034 0, /* sq_repeat */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3035 0, /* sq_item */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3036 0, /* sq_slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3037 0, /* sq_ass_item */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3038 0, /* sq_ass_slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3039 (objobjproc)0, /* sq_contains */ |
|
40805
eaedf84eabcd
Endow dict views with a proper length method.
Guido van Rossum <guido@python.org>
parents:
40804
diff
changeset
|
3040 }; |
|
eaedf84eabcd
Endow dict views with a proper length method.
Guido van Rossum <guido@python.org>
parents:
40804
diff
changeset
|
3041 |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3042 static PyMethodDef dictvalues_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3043 {NULL, NULL} /* sentinel */ |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3044 }; |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3045 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3046 PyTypeObject PyDictValues_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3047 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3048 "dict_values", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3049 sizeof(dictviewobject), /* tp_basicsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3050 0, /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3051 /* methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3052 (destructor)dictview_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3053 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3054 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3055 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3056 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3057 (reprfunc)dictview_repr, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3058 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3059 &dictvalues_as_sequence, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3060 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3061 0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3062 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3063 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3064 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3065 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3066 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3067 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3068 0, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3069 (traverseproc)dictview_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3070 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3071 0, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3072 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3073 (getiterfunc)dictvalues_iter, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3074 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3075 dictvalues_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3076 0, |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3077 }; |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3078 |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3079 static PyObject * |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3080 dictvalues_new(PyObject *dict) |
|
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3081 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59224
diff
changeset
|
3082 return dictview_new(dict, &PyDictValues_Type); |
|
40804
435ed641a333
Very preliminary work on dict views.
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
3083 } |
