blob: f3b6b7fda6a23f12317c4d8bb41c2ef8638ba7f0 [file] [log] [blame]
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001
Guido van Rossum2bc13791999-03-24 19:06:42 +00002/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003
Raymond Hettinger930427b2003-05-03 06:51:59 +00004/* The distribution includes a separate file, Objects/dictnotes.txt,
Tim Peters60b29962006-01-01 01:19:23 +00005 describing explorations into dictionary design and optimization.
Raymond Hettinger930427b2003-05-03 06:51:59 +00006 It covers typical dictionary use patterns, the parameters for
7 tuning dictionaries, and several ideas for possible optimizations.
8*/
9
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010#include "Python.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000011
Tim Peters6d6c1a32001-08-02 04:15:00 +000012typedef PyDictEntry dictentry;
13typedef PyDictObject dictobject;
Guido van Rossum16e93a81997-01-28 00:00:11 +000014
Tim Peterseb28ef22001-06-02 05:27:19 +000015/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000016#undef SHOW_CONVERSION_COUNTS
17
Tim Peterseb28ef22001-06-02 05:27:19 +000018/* See large comment block below. This must be >= 1. */
19#define PERTURB_SHIFT 5
20
Guido van Rossum16e93a81997-01-28 00:00:11 +000021/*
Tim Peterseb28ef22001-06-02 05:27:19 +000022Major subtleties ahead: Most hash schemes depend on having a "good" hash
23function, in the sense of simulating randomness. Python doesn't: its most
24important hash functions (for strings and ints) are very regular in common
25cases:
Tim Peters15d49292001-05-27 07:39:22 +000026
Tim Peterseb28ef22001-06-02 05:27:19 +000027>>> map(hash, (0, 1, 2, 3))
28[0, 1, 2, 3]
29>>> map(hash, ("namea", "nameb", "namec", "named"))
30[-1658398457, -1658398460, -1658398459, -1658398462]
31>>>
Tim Peters15d49292001-05-27 07:39:22 +000032
Tim Peterseb28ef22001-06-02 05:27:19 +000033This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
34the low-order i bits as the initial table index is extremely fast, and there
35are no collisions at all for dicts indexed by a contiguous range of ints.
36The same is approximately true when keys are "consecutive" strings. So this
37gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000038
Tim Peterseb28ef22001-06-02 05:27:19 +000039OTOH, when collisions occur, the tendency to fill contiguous slices of the
40hash table makes a good collision resolution strategy crucial. Taking only
41the last i bits of the hash code is also vulnerable: for example, consider
42[i << 16 for i in range(20000)] as a set of keys. Since ints are their own
43hash codes, and this fits in a dict of size 2**15, the last 15 bits of every
44hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000045
Tim Peterseb28ef22001-06-02 05:27:19 +000046But catering to unusual cases should not slow the usual ones, so we just take
47the last i bits anyway. It's up to collision resolution to do the rest. If
48we *usually* find the key we're looking for on the first try (and, it turns
49out, we usually do -- the table load factor is kept under 2/3, so the odds
50are solidly in our favor), then it makes best sense to keep the initial index
51computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000052
Tim Peterseb28ef22001-06-02 05:27:19 +000053The first half of collision resolution is to visit table indices via this
54recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000055
Tim Peterseb28ef22001-06-02 05:27:19 +000056 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000057
Tim Peterseb28ef22001-06-02 05:27:19 +000058For any initial j in range(2**i), repeating that 2**i times generates each
59int in range(2**i) exactly once (see any text on random-number generation for
60proof). By itself, this doesn't help much: like linear probing (setting
61j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
62order. This would be bad, except that's not the only thing we do, and it's
63actually *good* in the common cases where hash keys are consecutive. In an
64example that's really too small to make this entirely clear, for a table of
65size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000066
Tim Peterseb28ef22001-06-02 05:27:19 +000067 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
68
69If two things come in at index 5, the first place we look after is index 2,
70not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
71Linear probing is deadly in this case because there the fixed probe order
72is the *same* as the order consecutive keys are likely to arrive. But it's
73extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
74and certain that consecutive hash codes do not.
75
76The other half of the strategy is to get the other bits of the hash code
77into play. This is done by initializing a (unsigned) vrbl "perturb" to the
78full hash code, and changing the recurrence to:
79
80 j = (5*j) + 1 + perturb;
81 perturb >>= PERTURB_SHIFT;
82 use j % 2**i as the next table index;
83
84Now the probe sequence depends (eventually) on every bit in the hash code,
85and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
86because it quickly magnifies small differences in the bits that didn't affect
87the initial index. Note that because perturb is unsigned, if the recurrence
88is executed often enough perturb eventually becomes and remains 0. At that
89point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
90that's certain to find an empty slot eventually (since it generates every int
91in range(2**i), and we make sure there's always at least one empty slot).
92
93Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
94small so that the high bits of the hash code continue to affect the probe
95sequence across iterations; but you want it large so that in really bad cases
96the high-order hash bits have an effect on early iterations. 5 was "the
97best" in minimizing total collisions across experiments Tim Peters ran (on
98both normal and pathological cases), but 4 and 6 weren't significantly worse.
99
100Historical: Reimer Behrends contributed the idea of using a polynomial-based
101approach, using repeated multiplication by x in GF(2**n) where an irreducible
102polynomial for each table size was chosen such that x was a primitive root.
103Christian Tismer later extended that to use division by x instead, as an
104efficient way to get the high bits of the hash code into play. This scheme
105also gave excellent collision statistics, but was more expensive: two
106if-tests were required inside the loop; computing "the next" index took about
107the same number of operations but without as much potential parallelism
108(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
109above, and then shifting perturb can be done while the table index is being
110masked); and the dictobject struct required a member to hold the table's
111polynomial. In Tim's experiments the current scheme ran faster, produced
112equally good collision statistics, needed less code & used less memory.
Tim Peters9b10f7e2006-05-30 04:16:25 +0000113
114Theoretical Python 2.5 headache: hash codes are only C "long", but
115sizeof(Py_ssize_t) > sizeof(long) may be possible. In that case, and if a
116dict is genuinely huge, then only the slots directly reachable via indexing
117by a C long can be the first slot in a probe sequence. The probe sequence
118will still eventually reach every slot in the table, but the collision rate
119on initial probes may be much higher than this scheme was designed for.
120Getting a hash code as fat as Py_ssize_t is the only real cure. But in
121practice, this probably won't make a lick of difference for many years (at
122which point everyone will have terabytes of RAM on 64-bit boxes).
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000123*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000124
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000125/* Object used as dummy key to fill deleted entries */
Raymond Hettingerf81e4502005-08-17 02:19:36 +0000126static PyObject *dummy = NULL; /* Initialized by first call to newdictobject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000127
Armin Rigoe1709372006-04-12 17:06:05 +0000128#ifdef Py_REF_DEBUG
129PyObject *
130_PyDict_Dummy(void)
131{
132 return dummy;
133}
134#endif
135
Fred Drake1bff34a2000-08-31 19:31:38 +0000136/* forward declarations */
137static dictentry *
138lookdict_string(dictobject *mp, PyObject *key, long hash);
139
140#ifdef SHOW_CONVERSION_COUNTS
141static long created = 0L;
142static long converted = 0L;
143
144static void
145show_counts(void)
146{
147 fprintf(stderr, "created %ld string dicts\n", created);
148 fprintf(stderr, "converted %ld to normal dicts\n", converted);
149 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
150}
151#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000152
Tim Peters6d6c1a32001-08-02 04:15:00 +0000153/* Initialization macros.
154 There are two ways to create a dict: PyDict_New() is the main C API
155 function, and the tp_new slot maps to dict_new(). In the latter case we
156 can save a little time over what PyDict_New does because it's guaranteed
157 that the PyDictObject struct is already zeroed out.
158 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
159 an excellent reason not to).
160*/
161
162#define INIT_NONZERO_DICT_SLOTS(mp) do { \
Tim Petersdea48ec2001-05-22 20:40:22 +0000163 (mp)->ma_table = (mp)->ma_smalltable; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000164 (mp)->ma_mask = PyDict_MINSIZE - 1; \
165 } while(0)
166
167#define EMPTY_TO_MINSIZE(mp) do { \
168 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000169 (mp)->ma_used = (mp)->ma_fill = 0; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000171 } while(0)
172
Raymond Hettinger43442782004-03-17 21:55:03 +0000173/* Dictionary reuse scheme to save calls to malloc, free, and memset */
174#define MAXFREEDICTS 80
175static PyDictObject *free_dicts[MAXFREEDICTS];
176static int num_free_dicts = 0;
177
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000179PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000180{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000181 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000182 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000184 if (dummy == NULL)
185 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000186#ifdef SHOW_CONVERSION_COUNTS
187 Py_AtExit(show_counts);
188#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000189 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000190 if (num_free_dicts) {
191 mp = free_dicts[--num_free_dicts];
192 assert (mp != NULL);
193 assert (mp->ob_type == &PyDict_Type);
194 _Py_NewReference((PyObject *)mp);
195 if (mp->ma_fill) {
196 EMPTY_TO_MINSIZE(mp);
197 }
198 assert (mp->ma_used == 0);
199 assert (mp->ma_table == mp->ma_smalltable);
200 assert (mp->ma_mask == PyDict_MINSIZE - 1);
201 } else {
202 mp = PyObject_GC_New(dictobject, &PyDict_Type);
203 if (mp == NULL)
204 return NULL;
205 EMPTY_TO_MINSIZE(mp);
206 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000207 mp->ma_lookup = lookdict_string;
208#ifdef SHOW_CONVERSION_COUNTS
209 ++created;
210#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000211 _PyObject_GC_TRACK(mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000213}
214
215/*
216The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000217This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000218Open addressing is preferred over chaining since the link overhead for
219chaining would be substantial (100% with typical malloc overhead).
220
Tim Peterseb28ef22001-06-02 05:27:19 +0000221The initial probe index is computed as hash mod the table size. Subsequent
222probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000223
224All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000225
Tim Peterseb28ef22001-06-02 05:27:19 +0000226(The details in this version are due to Tim Peters, building on many past
227contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
228Christian Tismer).
Fred Drake1bff34a2000-08-31 19:31:38 +0000229
Tim Petersd770ebd2006-06-01 15:50:44 +0000230lookdict() is general-purpose, and may return NULL if (and only if) a
231comparison raises an exception (this was new in Python 2.5).
232lookdict_string() below is specialized to string keys, comparison of which can
233never raise an exception; that function can never return NULL. For both, when
234the key isn't found a dictentry* is returned for which the me_value field is
235NULL; this is the slot in the dict at which the key would have been found, and
236the caller can (if it wishes) add the <key, value> pair to the returned
237dictentry*.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000238*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000239static dictentry *
Tim Peters1f5871e2000-07-04 17:44:48 +0000240lookdict(dictobject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000241{
Tim Petersd770ebd2006-06-01 15:50:44 +0000242 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000243 register size_t perturb;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000244 register dictentry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000245 register size_t mask = (size_t)mp->ma_mask;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000246 dictentry *ep0 = mp->ma_table;
247 register dictentry *ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000248 register int cmp;
Tim Peters453163d2001-06-03 04:54:32 +0000249 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000250
Tim Petersd770ebd2006-06-01 15:50:44 +0000251 i = (size_t)hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000252 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000253 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000254 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000255
Guido van Rossum16e93a81997-01-28 00:00:11 +0000256 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000257 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000258 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000259 if (ep->me_hash == hash) {
Tim Peters453163d2001-06-03 04:54:32 +0000260 startkey = ep->me_key;
261 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000262 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000263 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000264 if (ep0 == mp->ma_table && ep->me_key == startkey) {
265 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000266 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000267 }
268 else {
269 /* The compare did major nasty stuff to the
270 * dict: start over.
271 * XXX A clever adversary could prevent this
272 * XXX from terminating.
273 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000274 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000275 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000276 }
277 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000278 }
Tim Peters15d49292001-05-27 07:39:22 +0000279
Tim Peters342c65e2001-05-13 06:43:53 +0000280 /* In the loop, me_key == dummy is by far (factor of 100s) the
281 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000282 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
283 i = (i << 2) + i + perturb + 1;
284 ep = &ep0[i & mask];
Armin Rigo35f6d362006-06-01 13:19:12 +0000285 if (ep->me_key == NULL)
286 return freeslot == NULL ? ep : freeslot;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000287 if (ep->me_key == key)
Armin Rigo35f6d362006-06-01 13:19:12 +0000288 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000289 if (ep->me_hash == hash && ep->me_key != dummy) {
Tim Peters453163d2001-06-03 04:54:32 +0000290 startkey = ep->me_key;
291 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000292 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000293 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000294 if (ep0 == mp->ma_table && ep->me_key == startkey) {
295 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000296 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000297 }
298 else {
299 /* The compare did major nasty stuff to the
300 * dict: start over.
301 * XXX A clever adversary could prevent this
302 * XXX from terminating.
303 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000304 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000305 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000306 }
Tim Peters342c65e2001-05-13 06:43:53 +0000307 else if (ep->me_key == dummy && freeslot == NULL)
308 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000309 }
310}
311
312/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000313 * Hacked up version of lookdict which can assume keys are always strings;
Tim Petersd770ebd2006-06-01 15:50:44 +0000314 * this assumption allows testing for errors during PyObject_RichCompareBool()
315 * to be dropped; string-string comparisons never raise exceptions. This also
316 * means we don't need to go through PyObject_RichCompareBool(); we can always
317 * use _PyString_Eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000318 *
Tim Petersd770ebd2006-06-01 15:50:44 +0000319 * This is valuable because dicts with only string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000320 */
321static dictentry *
322lookdict_string(dictobject *mp, PyObject *key, register long hash)
323{
Tim Petersd770ebd2006-06-01 15:50:44 +0000324 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000325 register size_t perturb;
Fred Drake1bff34a2000-08-31 19:31:38 +0000326 register dictentry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000327 register size_t mask = (size_t)mp->ma_mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000328 dictentry *ep0 = mp->ma_table;
329 register dictentry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000330
Tim Peters0ab085c2001-09-14 00:25:33 +0000331 /* Make sure this function doesn't have to handle non-string keys,
332 including subclasses of str; e.g., one reason to subclass
333 strings is to override __eq__, and for speed we don't cater to
334 that here. */
335 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000336#ifdef SHOW_CONVERSION_COUNTS
337 ++converted;
338#endif
339 mp->ma_lookup = lookdict;
340 return lookdict(mp, key, hash);
341 }
Tim Peters2f228e72001-05-13 00:19:31 +0000342 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000343 ep = &ep0[i];
344 if (ep->me_key == NULL || ep->me_key == key)
345 return ep;
346 if (ep->me_key == dummy)
347 freeslot = ep;
348 else {
Tim Petersd770ebd2006-06-01 15:50:44 +0000349 if (ep->me_hash == hash && _PyString_Eq(ep->me_key, key))
Fred Drake1bff34a2000-08-31 19:31:38 +0000350 return ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000351 freeslot = NULL;
352 }
Tim Peters15d49292001-05-27 07:39:22 +0000353
Tim Peters342c65e2001-05-13 06:43:53 +0000354 /* In the loop, me_key == dummy is by far (factor of 100s) the
355 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000356 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
357 i = (i << 2) + i + perturb + 1;
358 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000359 if (ep->me_key == NULL)
360 return freeslot == NULL ? ep : freeslot;
361 if (ep->me_key == key
362 || (ep->me_hash == hash
363 && ep->me_key != dummy
Martin v. Löwiscd353062001-05-24 16:56:35 +0000364 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000365 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000366 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000367 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000368 }
369}
370
371/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000372Internal routine to insert a new item into the table.
373Used both by the internal resize routine and by the public insert routine.
374Eats a reference to key and one to value.
Tim Petersd770ebd2006-06-01 15:50:44 +0000375Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000376*/
Armin Rigo35f6d362006-06-01 13:19:12 +0000377static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000378insertdict(register dictobject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000379{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000381 register dictentry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000382 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
383
384 assert(mp->ma_lookup != NULL);
385 ep = mp->ma_lookup(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000386 if (ep == NULL) {
387 Py_DECREF(key);
388 Py_DECREF(value);
389 return -1;
390 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000391 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000392 old_value = ep->me_value;
393 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000394 Py_DECREF(old_value); /* which **CAN** re-enter */
395 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000396 }
397 else {
398 if (ep->me_key == NULL)
399 mp->ma_fill++;
Raymond Hettinger07ead172005-02-05 23:42:57 +0000400 else {
401 assert(ep->me_key == dummy);
402 Py_DECREF(dummy);
403 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000404 ep->me_key = key;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000405 ep->me_hash = (Py_ssize_t)hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000406 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000407 mp->ma_used++;
408 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000409 return 0;
410}
411
412/*
413Internal routine used by dictresize() to insert an item which is
414known to be absent from the dict. This routine also assumes that
415the dict contains no deleted entries. Besides the performance benefit,
416using insertdict() in dictresize() is dangerous (SF bug #1456209).
Tim Petersd770ebd2006-06-01 15:50:44 +0000417Note that no refcounts are changed by this routine; if needed, the caller
418is responsible for incref'ing `key` and `value`.
Armin Rigo35f6d362006-06-01 13:19:12 +0000419*/
420static void
421insertdict_clean(register dictobject *mp, PyObject *key, long hash,
422 PyObject *value)
423{
Tim Petersd770ebd2006-06-01 15:50:44 +0000424 register size_t i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000425 register size_t perturb;
Tim Petersd770ebd2006-06-01 15:50:44 +0000426 register size_t mask = (size_t)mp->ma_mask;
Armin Rigo35f6d362006-06-01 13:19:12 +0000427 dictentry *ep0 = mp->ma_table;
428 register dictentry *ep;
429
430 i = hash & mask;
431 ep = &ep0[i];
432 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
433 i = (i << 2) + i + perturb + 1;
434 ep = &ep0[i & mask];
435 }
Tim Petersd770ebd2006-06-01 15:50:44 +0000436 assert(ep->me_value == NULL);
Armin Rigo35f6d362006-06-01 13:19:12 +0000437 mp->ma_fill++;
438 ep->me_key = key;
439 ep->me_hash = (Py_ssize_t)hash;
440 ep->me_value = value;
441 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000442}
443
444/*
445Restructure the table by allocating a new table and reinserting all
446items again. When entries have been deleted, the new table may
447actually be smaller than the old one.
448*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000449static int
Tim Peters9b10f7e2006-05-30 04:16:25 +0000450dictresize(dictobject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000451{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000452 Py_ssize_t newsize;
Tim Peters0c6010b2001-05-23 23:33:57 +0000453 dictentry *oldtable, *newtable, *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000454 Py_ssize_t i;
Tim Peters0c6010b2001-05-23 23:33:57 +0000455 int is_oldtable_malloced;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000456 dictentry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000457
458 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000459
Tim Peterseb28ef22001-06-02 05:27:19 +0000460 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000461 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000462 newsize <= minused && newsize > 0;
463 newsize <<= 1)
464 ;
465 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000467 return -1;
468 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000469
470 /* Get space for a new table. */
471 oldtable = mp->ma_table;
472 assert(oldtable != NULL);
473 is_oldtable_malloced = oldtable != mp->ma_smalltable;
474
Tim Peters6d6c1a32001-08-02 04:15:00 +0000475 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000476 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000477 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000478 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000479 if (mp->ma_fill == mp->ma_used) {
480 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000481 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000482 }
483 /* We're not going to resize it, but rebuild the
484 table anyway to purge old dummy entries.
485 Subtle: This is *necessary* if fill==size,
486 as lookdict needs at least one virgin slot to
487 terminate failing searches. If fill < size, it's
488 merely desirable, as dummies slow searches. */
489 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000490 memcpy(small_copy, oldtable, sizeof(small_copy));
491 oldtable = small_copy;
492 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000493 }
494 else {
495 newtable = PyMem_NEW(dictentry, newsize);
496 if (newtable == NULL) {
497 PyErr_NoMemory();
498 return -1;
499 }
500 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000501
502 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000503 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000504 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000505 mp->ma_mask = newsize - 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000506 memset(newtable, 0, sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000507 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000508 i = mp->ma_fill;
509 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000510
Tim Peters19283142001-05-17 22:25:34 +0000511 /* Copy the data over; this is refcount-neutral for active entries;
512 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000513 for (ep = oldtable; i > 0; ep++) {
514 if (ep->me_value != NULL) { /* active entry */
515 --i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000516 insertdict_clean(mp, ep->me_key, (long)ep->me_hash,
517 ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000518 }
Tim Peters19283142001-05-17 22:25:34 +0000519 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000520 --i;
Tim Peters19283142001-05-17 22:25:34 +0000521 assert(ep->me_key == dummy);
522 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000523 }
Tim Peters19283142001-05-17 22:25:34 +0000524 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000525 }
526
Tim Peters0c6010b2001-05-23 23:33:57 +0000527 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000528 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000529 return 0;
530}
531
Tim Petersd770ebd2006-06-01 15:50:44 +0000532/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
533 * that may occur (originally dicts supported only string keys, and exceptions
534 * weren't possible). So, while the original intent was that a NULL return
Andrew M. Kuchling0067b5f2006-08-04 20:37:43 +0000535 * meant the key wasn't present, in reality it can mean that, or that an error
Tim Petersd770ebd2006-06-01 15:50:44 +0000536 * (suppressed) occurred while computing the key's hash, or that some error
537 * (suppressed) occurred when comparing keys in the dict's internal probe
538 * sequence. A nasty example of the latter is when a Python-coded comparison
539 * function hits a stack-depth error, which can cause this to return NULL
540 * even if the key is present.
541 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000543PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000544{
545 long hash;
Fred Drake1bff34a2000-08-31 19:31:38 +0000546 dictobject *mp = (dictobject *)op;
Armin Rigo35f6d362006-06-01 13:19:12 +0000547 dictentry *ep;
548 PyThreadState *tstate;
Tim Petersd770ebd2006-06-01 15:50:44 +0000549 if (!PyDict_Check(op))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000550 return NULL;
Tim Peters0ab085c2001-09-14 00:25:33 +0000551 if (!PyString_CheckExact(key) ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000552 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000553 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000555 if (hash == -1) {
556 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000557 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000558 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000559 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000560
561 /* We can arrive here with a NULL tstate during initialization:
562 try running "python -Wi" for an example related to string
563 interning. Let's just hope that no exception occurs then... */
Armin Rigoacd0d6d2006-06-10 10:57:40 +0000564 tstate = _PyThreadState_Current;
Armin Rigo35f6d362006-06-01 13:19:12 +0000565 if (tstate != NULL && tstate->curexc_type != NULL) {
566 /* preserve the existing exception */
567 PyObject *err_type, *err_value, *err_tb;
568 PyErr_Fetch(&err_type, &err_value, &err_tb);
569 ep = (mp->ma_lookup)(mp, key, hash);
570 /* ignore errors */
571 PyErr_Restore(err_type, err_value, err_tb);
572 if (ep == NULL)
573 return NULL;
574 }
575 else {
576 ep = (mp->ma_lookup)(mp, key, hash);
577 if (ep == NULL) {
578 PyErr_Clear();
579 return NULL;
580 }
581 }
582 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000583}
584
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000585/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000586 * dictionary if it's merely replacing the value for an existing key.
587 * This means that it's safe to loop over a dictionary with PyDict_Next()
588 * and occasionally replace a value -- but you can't insert new keys or
589 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000590 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000591int
Tim Peters1f5871e2000-07-04 17:44:48 +0000592PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000593{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000594 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000595 register long hash;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000596 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000597
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 if (!PyDict_Check(op)) {
599 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000600 return -1;
601 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000602 assert(key);
603 assert(value);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000604 mp = (dictobject *)op;
Tim Peters0ab085c2001-09-14 00:25:33 +0000605 if (PyString_CheckExact(key)) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000606 hash = ((PyStringObject *)key)->ob_shash;
607 if (hash == -1)
608 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000609 }
Tim Peters1f7df352002-03-29 03:29:08 +0000610 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000612 if (hash == -1)
613 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000614 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000615 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000616 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 Py_INCREF(value);
618 Py_INCREF(key);
Armin Rigo35f6d362006-06-01 13:19:12 +0000619 if (insertdict(mp, key, hash, value) != 0)
620 return -1;
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000621 /* If we added a key, we can safely resize. Otherwise just return!
622 * If fill >= 2/3 size, adjust size. Normally, this doubles or
623 * quaduples the size, but it's also possible for the dict to shrink
Tim Peters60b29962006-01-01 01:19:23 +0000624 * (if ma_fill is much larger than ma_used, meaning a lot of dict
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000625 * keys have been * deleted).
Tim Peters60b29962006-01-01 01:19:23 +0000626 *
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000627 * Quadrupling the size improves average dictionary sparseness
628 * (reducing collisions) at the cost of some memory and iteration
629 * speed (which loops over every possible entry). It also halves
Neal Norwitz80af59c2006-05-30 04:19:21 +0000630 * the number of expensive resize operations in a growing dictionary.
Tim Peters60b29962006-01-01 01:19:23 +0000631 *
632 * Very large dictionaries (over 50K items) use doubling instead.
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000633 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000634 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000635 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
636 return 0;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000637 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000638}
639
640int
Tim Peters1f5871e2000-07-04 17:44:48 +0000641PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000642{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000643 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000644 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000645 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000647
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 if (!PyDict_Check(op)) {
649 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000650 return -1;
651 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000652 assert(key);
Tim Peters0ab085c2001-09-14 00:25:33 +0000653 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000654 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000656 if (hash == -1)
657 return -1;
658 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000659 mp = (dictobject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000660 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000661 if (ep == NULL)
662 return -1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000663 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000665 return -1;
666 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000667 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000669 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000670 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000671 ep->me_value = NULL;
672 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000673 Py_DECREF(old_value);
674 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000675 return 0;
676}
677
Guido van Rossum25831651993-05-19 14:50:45 +0000678void
Tim Peters1f5871e2000-07-04 17:44:48 +0000679PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000680{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000681 dictobject *mp;
Tim Petersdea48ec2001-05-22 20:40:22 +0000682 dictentry *ep, *table;
683 int table_is_malloced;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000684 Py_ssize_t fill;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000685 dictentry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000686#ifdef Py_DEBUG
Tim Peters9b10f7e2006-05-30 04:16:25 +0000687 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000688#endif
689
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000691 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000692 mp = (dictobject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000693#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000694 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000695 i = 0;
696#endif
697
698 table = mp->ma_table;
699 assert(table != NULL);
700 table_is_malloced = table != mp->ma_smalltable;
701
702 /* This is delicate. During the process of clearing the dict,
703 * decrefs can cause the dict to mutate. To avoid fatal confusion
704 * (voice of experience), we have to make the dict empty before
705 * clearing the slots, and never refer to anything via mp->xxx while
706 * clearing.
707 */
708 fill = mp->ma_fill;
709 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000710 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000711
712 else if (fill > 0) {
713 /* It's a small table with something that needs to be cleared.
714 * Afraid the only safe way is to copy the dict entries into
715 * another small table first.
716 */
717 memcpy(small_copy, table, sizeof(small_copy));
718 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000719 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000720 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000721 /* else it's a small table that's already empty */
722
723 /* Now we can finally clear things. If C had refcounts, we could
724 * assert that the refcount on table is 1 now, i.e. that this function
725 * has unique access to it, so decref side-effects can't alter it.
726 */
727 for (ep = table; fill > 0; ++ep) {
728#ifdef Py_DEBUG
729 assert(i < n);
730 ++i;
731#endif
732 if (ep->me_key) {
733 --fill;
734 Py_DECREF(ep->me_key);
735 Py_XDECREF(ep->me_value);
736 }
737#ifdef Py_DEBUG
738 else
739 assert(ep->me_value == NULL);
740#endif
741 }
742
743 if (table_is_malloced)
744 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000745}
746
Tim Peters080c88b2003-02-15 03:01:11 +0000747/*
748 * Iterate over a dict. Use like so:
749 *
Tim Peters9b10f7e2006-05-30 04:16:25 +0000750 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000751 * PyObject *key, *value;
752 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000753 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000754 * Refer to borrowed references in key and value.
755 * }
756 *
757 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000758 * mutates the dict. One exception: it is safe if the loop merely changes
759 * the values associated with the keys (but doesn't insert new keys or
760 * delete keys), via PyDict_SetItem().
761 */
Guido van Rossum25831651993-05-19 14:50:45 +0000762int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000763PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000764{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000765 register Py_ssize_t i;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000766 register Py_ssize_t mask;
Raymond Hettinger43442782004-03-17 21:55:03 +0000767 register dictentry *ep;
768
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000770 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000771 i = *ppos;
772 if (i < 0)
773 return 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000774 ep = ((dictobject *)op)->ma_table;
775 mask = ((dictobject *)op)->ma_mask;
776 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000777 i++;
778 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000779 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000780 return 0;
781 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000782 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000783 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000784 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000785 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000786}
787
788/* Methods */
789
790static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000791dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000792{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000793 register dictentry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000794 Py_ssize_t fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000795 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000796 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000797 for (ep = mp->ma_table; fill > 0; ep++) {
798 if (ep->me_key) {
799 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000801 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000802 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000803 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000804 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000805 PyMem_DEL(mp->ma_table);
Raymond Hettinger43442782004-03-17 21:55:03 +0000806 if (num_free_dicts < MAXFREEDICTS && mp->ob_type == &PyDict_Type)
807 free_dicts[num_free_dicts++] = mp;
Tim Peters60b29962006-01-01 01:19:23 +0000808 else
Raymond Hettinger43442782004-03-17 21:55:03 +0000809 mp->ob_type->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000810 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000811}
812
813static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000814dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000815{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000816 register Py_ssize_t i;
817 register Py_ssize_t any;
Tim Peters33f4a6a2006-05-30 05:23:59 +0000818 int status;
Guido van Rossum255443b1998-04-10 22:47:14 +0000819
Tim Peters33f4a6a2006-05-30 05:23:59 +0000820 status = Py_ReprEnter((PyObject*)mp);
821 if (status != 0) {
822 if (status < 0)
823 return status;
Guido van Rossum255443b1998-04-10 22:47:14 +0000824 fprintf(fp, "{...}");
825 return 0;
826 }
827
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000828 fprintf(fp, "{");
829 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000830 for (i = 0; i <= mp->ma_mask; i++) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000831 dictentry *ep = mp->ma_table + i;
832 PyObject *pvalue = ep->me_value;
833 if (pvalue != NULL) {
834 /* Prevent PyObject_Repr from deleting value during
835 key format */
836 Py_INCREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000837 if (any++ > 0)
838 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000839 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000840 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000841 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000842 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000843 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000844 fprintf(fp, ": ");
Tim Peters19b77cf2001-06-02 08:27:39 +0000845 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000846 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000847 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000848 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000849 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000850 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000851 }
852 }
853 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000854 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000855 return 0;
856}
857
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000859dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000860{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000861 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000862 PyObject *s, *temp, *colon = NULL;
863 PyObject *pieces = NULL, *result = NULL;
864 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +0000865
Tim Petersa7259592001-06-16 05:11:17 +0000866 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +0000867 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000868 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +0000869 }
870
Tim Petersa7259592001-06-16 05:11:17 +0000871 if (mp->ma_used == 0) {
872 result = PyString_FromString("{}");
873 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000874 }
Tim Petersa7259592001-06-16 05:11:17 +0000875
876 pieces = PyList_New(0);
877 if (pieces == NULL)
878 goto Done;
879
880 colon = PyString_FromString(": ");
881 if (colon == NULL)
882 goto Done;
883
884 /* Do repr() on each key+value pair, and insert ": " between them.
885 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +0000886 i = 0;
887 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +0000888 int status;
889 /* Prevent repr from deleting value during key format. */
890 Py_INCREF(value);
891 s = PyObject_Repr(key);
892 PyString_Concat(&s, colon);
893 PyString_ConcatAndDel(&s, PyObject_Repr(value));
894 Py_DECREF(value);
895 if (s == NULL)
896 goto Done;
897 status = PyList_Append(pieces, s);
898 Py_DECREF(s); /* append created a new ref */
899 if (status < 0)
900 goto Done;
901 }
902
903 /* Add "{}" decorations to the first and last items. */
904 assert(PyList_GET_SIZE(pieces) > 0);
905 s = PyString_FromString("{");
906 if (s == NULL)
907 goto Done;
908 temp = PyList_GET_ITEM(pieces, 0);
909 PyString_ConcatAndDel(&s, temp);
910 PyList_SET_ITEM(pieces, 0, s);
911 if (s == NULL)
912 goto Done;
913
914 s = PyString_FromString("}");
915 if (s == NULL)
916 goto Done;
917 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
918 PyString_ConcatAndDel(&temp, s);
919 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
920 if (temp == NULL)
921 goto Done;
922
923 /* Paste them all together with ", " between. */
924 s = PyString_FromString(", ");
925 if (s == NULL)
926 goto Done;
927 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +0000928 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000929
930Done:
931 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +0000933 Py_ReprLeave((PyObject *)mp);
934 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000935}
936
Martin v. Löwis18e16552006-02-15 17:27:45 +0000937static Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +0000938dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000939{
940 return mp->ma_used;
941}
942
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000944dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000945{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000947 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +0000948 dictentry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000949 assert(mp->ma_table != NULL);
Tim Peters0ab085c2001-09-14 00:25:33 +0000950 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000951 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000953 if (hash == -1)
954 return NULL;
955 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000956 ep = (mp->ma_lookup)(mp, key, hash);
957 if (ep == NULL)
958 return NULL;
959 v = ep->me_value;
Guido van Rossum1968ad32006-02-25 22:38:04 +0000960 if (v == NULL) {
961 if (!PyDict_CheckExact(mp)) {
962 /* Look up __missing__ method if we're a subclass. */
Guido van Rossum4b92a822006-02-25 23:32:30 +0000963 PyObject *missing;
Guido van Rossum1968ad32006-02-25 22:38:04 +0000964 static PyObject *missing_str = NULL;
965 if (missing_str == NULL)
Tim Peters9b10f7e2006-05-30 04:16:25 +0000966 missing_str =
Guido van Rossum1968ad32006-02-25 22:38:04 +0000967 PyString_InternFromString("__missing__");
Guido van Rossum4b92a822006-02-25 23:32:30 +0000968 missing = _PyType_Lookup(mp->ob_type, missing_str);
Guido van Rossum1968ad32006-02-25 22:38:04 +0000969 if (missing != NULL)
970 return PyObject_CallFunctionObjArgs(missing,
971 (PyObject *)mp, key, NULL);
972 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum1968ad32006-02-25 22:38:04 +0000974 return NULL;
975 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000976 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000978 return v;
979}
980
981static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000982dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000983{
984 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000986 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000988}
989
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000990static PyMappingMethods dict_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000991 (lenfunc)dict_length, /*mp_length*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000992 (binaryfunc)dict_subscript, /*mp_subscript*/
993 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000994};
995
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000997dict_keys(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000998{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001000 register Py_ssize_t i, j;
Raymond Hettinger43442782004-03-17 21:55:03 +00001001 dictentry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001002 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001003
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001004 again:
1005 n = mp->ma_used;
1006 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001007 if (v == NULL)
1008 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001009 if (n != mp->ma_used) {
1010 /* Durnit. The allocations caused the dict to resize.
1011 * Just start over, this shouldn't normally happen.
1012 */
1013 Py_DECREF(v);
1014 goto again;
1015 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001016 ep = mp->ma_table;
1017 mask = mp->ma_mask;
1018 for (i = 0, j = 0; i <= mask; i++) {
1019 if (ep[i].me_value != NULL) {
1020 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001022 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001023 j++;
1024 }
1025 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001026 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001027 return v;
1028}
1029
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001031dict_values(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001032{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001034 register Py_ssize_t i, j;
Raymond Hettinger43442782004-03-17 21:55:03 +00001035 dictentry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001036 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001037
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001038 again:
1039 n = mp->ma_used;
1040 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001041 if (v == NULL)
1042 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001043 if (n != mp->ma_used) {
1044 /* Durnit. The allocations caused the dict to resize.
1045 * Just start over, this shouldn't normally happen.
1046 */
1047 Py_DECREF(v);
1048 goto again;
1049 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001050 ep = mp->ma_table;
1051 mask = mp->ma_mask;
1052 for (i = 0, j = 0; i <= mask; i++) {
1053 if (ep[i].me_value != NULL) {
1054 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001056 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001057 j++;
1058 }
1059 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001060 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001061 return v;
1062}
1063
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001064static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001065dict_items(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001066{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001068 register Py_ssize_t i, j, n;
1069 Py_ssize_t mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001070 PyObject *item, *key, *value;
Raymond Hettinger43442782004-03-17 21:55:03 +00001071 dictentry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001072
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001073 /* Preallocate the list of tuples, to avoid allocations during
1074 * the loop over the items, which could trigger GC, which
1075 * could resize the dict. :-(
1076 */
1077 again:
1078 n = mp->ma_used;
1079 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001080 if (v == NULL)
1081 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001082 for (i = 0; i < n; i++) {
1083 item = PyTuple_New(2);
1084 if (item == NULL) {
1085 Py_DECREF(v);
1086 return NULL;
1087 }
1088 PyList_SET_ITEM(v, i, item);
1089 }
1090 if (n != mp->ma_used) {
1091 /* Durnit. The allocations caused the dict to resize.
1092 * Just start over, this shouldn't normally happen.
1093 */
1094 Py_DECREF(v);
1095 goto again;
1096 }
1097 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001098 ep = mp->ma_table;
1099 mask = mp->ma_mask;
1100 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001101 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001102 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001103 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001105 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001106 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001107 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001108 j++;
1109 }
1110 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001111 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001112 return v;
1113}
1114
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001115static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001116dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001117{
1118 PyObject *seq;
1119 PyObject *value = Py_None;
1120 PyObject *it; /* iter(seq) */
1121 PyObject *key;
1122 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001123 int status;
1124
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001125 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001126 return NULL;
1127
1128 d = PyObject_CallObject(cls, NULL);
1129 if (d == NULL)
1130 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001131
1132 it = PyObject_GetIter(seq);
1133 if (it == NULL){
1134 Py_DECREF(d);
1135 return NULL;
1136 }
1137
1138 for (;;) {
1139 key = PyIter_Next(it);
1140 if (key == NULL) {
1141 if (PyErr_Occurred())
1142 goto Fail;
1143 break;
1144 }
Raymond Hettingere03e5b12002-12-07 08:10:51 +00001145 status = PyObject_SetItem(d, key, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001146 Py_DECREF(key);
1147 if (status < 0)
1148 goto Fail;
1149 }
1150
1151 Py_DECREF(it);
1152 return d;
1153
1154Fail:
1155 Py_DECREF(it);
1156 Py_DECREF(d);
1157 return NULL;
1158}
1159
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001160static int
1161dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001162{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001163 PyObject *arg = NULL;
1164 int result = 0;
1165
1166 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1167 result = -1;
1168
1169 else if (arg != NULL) {
1170 if (PyObject_HasAttrString(arg, "keys"))
1171 result = PyDict_Merge(self, arg, 1);
1172 else
1173 result = PyDict_MergeFromSeq2(self, arg, 1);
1174 }
1175 if (result == 0 && kwds != NULL)
1176 result = PyDict_Merge(self, kwds, 1);
1177 return result;
1178}
1179
1180static PyObject *
1181dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1182{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001183 if (dict_update_common(self, args, kwds, "update") != -1)
1184 Py_RETURN_NONE;
1185 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001186}
1187
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001188/* Update unconditionally replaces existing items.
1189 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001190 otherwise it leaves existing items unchanged.
1191
1192 PyDict_{Update,Merge} update/merge from a mapping object.
1193
Tim Petersf582b822001-12-11 18:51:08 +00001194 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001195 producing iterable objects of length 2.
1196*/
1197
Tim Petersf582b822001-12-11 18:51:08 +00001198int
Tim Peters1fc240e2001-10-26 05:06:50 +00001199PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1200{
1201 PyObject *it; /* iter(seq2) */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001202 Py_ssize_t i; /* index into seq2 of current element */
Tim Peters1fc240e2001-10-26 05:06:50 +00001203 PyObject *item; /* seq2[i] */
1204 PyObject *fast; /* item as a 2-tuple or 2-list */
1205
1206 assert(d != NULL);
1207 assert(PyDict_Check(d));
1208 assert(seq2 != NULL);
1209
1210 it = PyObject_GetIter(seq2);
1211 if (it == NULL)
1212 return -1;
1213
1214 for (i = 0; ; ++i) {
1215 PyObject *key, *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001216 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001217
1218 fast = NULL;
1219 item = PyIter_Next(it);
1220 if (item == NULL) {
1221 if (PyErr_Occurred())
1222 goto Fail;
1223 break;
1224 }
1225
1226 /* Convert item to sequence, and verify length 2. */
1227 fast = PySequence_Fast(item, "");
1228 if (fast == NULL) {
1229 if (PyErr_ExceptionMatches(PyExc_TypeError))
1230 PyErr_Format(PyExc_TypeError,
1231 "cannot convert dictionary update "
Neal Norwitzd3881b02006-05-30 04:25:05 +00001232 "sequence element #%zd to a sequence",
Tim Peters1fc240e2001-10-26 05:06:50 +00001233 i);
1234 goto Fail;
1235 }
1236 n = PySequence_Fast_GET_SIZE(fast);
1237 if (n != 2) {
1238 PyErr_Format(PyExc_ValueError,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001239 "dictionary update sequence element #%zd "
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00001240 "has length %zd; 2 is required",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00001241 i, n);
Tim Peters1fc240e2001-10-26 05:06:50 +00001242 goto Fail;
1243 }
1244
1245 /* Update/merge with this (key, value) pair. */
1246 key = PySequence_Fast_GET_ITEM(fast, 0);
1247 value = PySequence_Fast_GET_ITEM(fast, 1);
1248 if (override || PyDict_GetItem(d, key) == NULL) {
1249 int status = PyDict_SetItem(d, key, value);
1250 if (status < 0)
1251 goto Fail;
1252 }
1253 Py_DECREF(fast);
1254 Py_DECREF(item);
1255 }
1256
1257 i = 0;
1258 goto Return;
1259Fail:
1260 Py_XDECREF(item);
1261 Py_XDECREF(fast);
1262 i = -1;
1263Return:
1264 Py_DECREF(it);
Neal Norwitzd3881b02006-05-30 04:25:05 +00001265 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001266}
1267
Tim Peters6d6c1a32001-08-02 04:15:00 +00001268int
1269PyDict_Update(PyObject *a, PyObject *b)
1270{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001271 return PyDict_Merge(a, b, 1);
1272}
1273
1274int
1275PyDict_Merge(PyObject *a, PyObject *b, int override)
1276{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001277 register PyDictObject *mp, *other;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001278 register Py_ssize_t i;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001279 dictentry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001280
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001281 /* We accept for the argument either a concrete dictionary object,
1282 * or an abstract "mapping" object. For the former, we can do
1283 * things quite efficiently. For the latter, we only require that
1284 * PyMapping_Keys() and PyObject_GetItem() be supported.
1285 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001286 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1287 PyErr_BadInternalCall();
1288 return -1;
1289 }
1290 mp = (dictobject*)a;
1291 if (PyDict_Check(b)) {
1292 other = (dictobject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001293 if (other == mp || other->ma_used == 0)
1294 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001295 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001296 if (mp->ma_used == 0)
1297 /* Since the target dict is empty, PyDict_GetItem()
1298 * always returns NULL. Setting override to 1
1299 * skips the unnecessary test.
1300 */
1301 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001302 /* Do one big resize at the start, rather than
1303 * incrementally resizing as we insert new items. Expect
1304 * that there will be no (or few) overlapping keys.
1305 */
1306 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001307 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001308 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001309 }
1310 for (i = 0; i <= other->ma_mask; i++) {
1311 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001312 if (entry->me_value != NULL &&
1313 (override ||
1314 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001315 Py_INCREF(entry->me_key);
1316 Py_INCREF(entry->me_value);
Armin Rigo35f6d362006-06-01 13:19:12 +00001317 if (insertdict(mp, entry->me_key,
1318 (long)entry->me_hash,
1319 entry->me_value) != 0)
1320 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001321 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001322 }
1323 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001324 else {
1325 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001326 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001327 PyObject *iter;
1328 PyObject *key, *value;
1329 int status;
1330
1331 if (keys == NULL)
1332 /* Docstring says this is equivalent to E.keys() so
1333 * if E doesn't have a .keys() method we want
1334 * AttributeError to percolate up. Might as well
1335 * do the same for any other error.
1336 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001337 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001338
1339 iter = PyObject_GetIter(keys);
1340 Py_DECREF(keys);
1341 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001342 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001343
1344 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001345 if (!override && PyDict_GetItem(a, key) != NULL) {
1346 Py_DECREF(key);
1347 continue;
1348 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001349 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001350 if (value == NULL) {
1351 Py_DECREF(iter);
1352 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001353 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001354 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001355 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001356 Py_DECREF(key);
1357 Py_DECREF(value);
1358 if (status < 0) {
1359 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001360 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001361 }
1362 }
1363 Py_DECREF(iter);
1364 if (PyErr_Occurred())
1365 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001366 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001367 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001368 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001369}
1370
1371static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001372dict_copy(register dictobject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001373{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001374 return PyDict_Copy((PyObject*)mp);
1375}
1376
1377PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001378PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001379{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001380 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001381
1382 if (o == NULL || !PyDict_Check(o)) {
1383 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001384 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001385 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001386 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001387 if (copy == NULL)
1388 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001389 if (PyDict_Merge(copy, o, 1) == 0)
1390 return copy;
1391 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001392 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001393}
1394
Martin v. Löwis18e16552006-02-15 17:27:45 +00001395Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001396PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001397{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 if (mp == NULL || !PyDict_Check(mp)) {
1399 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001400 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001401 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001402 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001403}
1404
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001406PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001407{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001408 if (mp == NULL || !PyDict_Check(mp)) {
1409 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001410 return NULL;
1411 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001412 return dict_keys((dictobject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001413}
1414
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001416PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001417{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418 if (mp == NULL || !PyDict_Check(mp)) {
1419 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001420 return NULL;
1421 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001422 return dict_values((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001423}
1424
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001425PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001426PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001427{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001428 if (mp == NULL || !PyDict_Check(mp)) {
1429 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001430 return NULL;
1431 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001432 return dict_items((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001433}
1434
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001435/* Subroutine which returns the smallest key in a for which b's value
1436 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001437 pval argument. Both are NULL if no key in a is found for which b's status
1438 differs. The refcounts on (and only on) non-NULL *pval and function return
1439 values must be decremented by the caller (characterize() increments them
1440 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1441 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001442
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001444characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001445{
Tim Peters95bf9392001-05-10 08:32:44 +00001446 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1447 PyObject *aval = NULL; /* a[akey] */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001448 Py_ssize_t i;
1449 int cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001450
Tim Petersafb6ae82001-06-04 21:00:21 +00001451 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001452 PyObject *thiskey, *thisaval, *thisbval;
1453 if (a->ma_table[i].me_value == NULL)
1454 continue;
1455 thiskey = a->ma_table[i].me_key;
1456 Py_INCREF(thiskey); /* keep alive across compares */
1457 if (akey != NULL) {
1458 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1459 if (cmp < 0) {
1460 Py_DECREF(thiskey);
1461 goto Fail;
1462 }
1463 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001464 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001465 a->ma_table[i].me_value == NULL)
1466 {
1467 /* Not the *smallest* a key; or maybe it is
1468 * but the compare shrunk the dict so we can't
1469 * find its associated value anymore; or
1470 * maybe it is but the compare deleted the
1471 * a[thiskey] entry.
Neal Norwitzd3881b02006-05-30 04:25:05 +00001472 */
Tim Peters95bf9392001-05-10 08:32:44 +00001473 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001474 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001475 }
Tim Peters95bf9392001-05-10 08:32:44 +00001476 }
1477
1478 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1479 thisaval = a->ma_table[i].me_value;
1480 assert(thisaval);
1481 Py_INCREF(thisaval); /* keep alive */
1482 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1483 if (thisbval == NULL)
1484 cmp = 0;
1485 else {
1486 /* both dicts have thiskey: same values? */
1487 cmp = PyObject_RichCompareBool(
1488 thisaval, thisbval, Py_EQ);
1489 if (cmp < 0) {
1490 Py_DECREF(thiskey);
1491 Py_DECREF(thisaval);
1492 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001493 }
1494 }
Tim Peters95bf9392001-05-10 08:32:44 +00001495 if (cmp == 0) {
1496 /* New winner. */
1497 Py_XDECREF(akey);
1498 Py_XDECREF(aval);
1499 akey = thiskey;
1500 aval = thisaval;
1501 }
1502 else {
1503 Py_DECREF(thiskey);
1504 Py_DECREF(thisaval);
1505 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001506 }
Tim Peters95bf9392001-05-10 08:32:44 +00001507 *pval = aval;
1508 return akey;
1509
1510Fail:
1511 Py_XDECREF(akey);
1512 Py_XDECREF(aval);
1513 *pval = NULL;
1514 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001515}
1516
1517static int
Tim Peters1f5871e2000-07-04 17:44:48 +00001518dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001519{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001521 int res;
1522
1523 /* Compare lengths first */
1524 if (a->ma_used < b->ma_used)
1525 return -1; /* a is shorter */
1526 else if (a->ma_used > b->ma_used)
1527 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001528
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001529 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001530 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001531 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001532 if (adiff == NULL) {
1533 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001534 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001535 * must be equal.
1536 */
1537 res = PyErr_Occurred() ? -1 : 0;
1538 goto Finished;
1539 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001540 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001541 if (bdiff == NULL && PyErr_Occurred()) {
1542 assert(!bval);
1543 res = -1;
1544 goto Finished;
1545 }
1546 res = 0;
1547 if (bdiff) {
1548 /* bdiff == NULL "should be" impossible now, but perhaps
1549 * the last comparison done by the characterize() on a had
1550 * the side effect of making the dicts equal!
1551 */
1552 res = PyObject_Compare(adiff, bdiff);
1553 }
1554 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001555 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001556
1557Finished:
1558 Py_XDECREF(adiff);
1559 Py_XDECREF(bdiff);
1560 Py_XDECREF(aval);
1561 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001562 return res;
1563}
1564
Tim Peterse63415e2001-05-08 04:38:29 +00001565/* Return 1 if dicts equal, 0 if not, -1 if error.
1566 * Gets out as soon as any difference is detected.
1567 * Uses only Py_EQ comparison.
1568 */
1569static int
1570dict_equal(dictobject *a, dictobject *b)
1571{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001572 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001573
1574 if (a->ma_used != b->ma_used)
1575 /* can't be equal if # of entries differ */
1576 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001577
Tim Peterse63415e2001-05-08 04:38:29 +00001578 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001579 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001580 PyObject *aval = a->ma_table[i].me_value;
1581 if (aval != NULL) {
1582 int cmp;
1583 PyObject *bval;
1584 PyObject *key = a->ma_table[i].me_key;
1585 /* temporarily bump aval's refcount to ensure it stays
1586 alive until we're done with it */
1587 Py_INCREF(aval);
1588 bval = PyDict_GetItem((PyObject *)b, key);
1589 if (bval == NULL) {
1590 Py_DECREF(aval);
1591 return 0;
1592 }
1593 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1594 Py_DECREF(aval);
1595 if (cmp <= 0) /* error or not equal */
1596 return cmp;
1597 }
1598 }
1599 return 1;
1600 }
1601
1602static PyObject *
1603dict_richcompare(PyObject *v, PyObject *w, int op)
1604{
1605 int cmp;
1606 PyObject *res;
1607
1608 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1609 res = Py_NotImplemented;
1610 }
1611 else if (op == Py_EQ || op == Py_NE) {
1612 cmp = dict_equal((dictobject *)v, (dictobject *)w);
1613 if (cmp < 0)
1614 return NULL;
1615 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1616 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001617 else
1618 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001619 Py_INCREF(res);
1620 return res;
1621 }
1622
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001623static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001624dict_has_key(register dictobject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001625{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001626 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +00001627 dictentry *ep;
Tim Petersd770ebd2006-06-01 15:50:44 +00001628
Tim Peters0ab085c2001-09-14 00:25:33 +00001629 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001630 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001631 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001632 if (hash == -1)
1633 return NULL;
1634 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001635 ep = (mp->ma_lookup)(mp, key, hash);
1636 if (ep == NULL)
1637 return NULL;
Tim Petersd770ebd2006-06-01 15:50:44 +00001638 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001639}
1640
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001641static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001642dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001643{
1644 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001645 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001646 PyObject *val = NULL;
1647 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +00001648 dictentry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001649
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001650 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001651 return NULL;
1652
Tim Peters0ab085c2001-09-14 00:25:33 +00001653 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001654 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001655 hash = PyObject_Hash(key);
1656 if (hash == -1)
1657 return NULL;
1658 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001659 ep = (mp->ma_lookup)(mp, key, hash);
1660 if (ep == NULL)
1661 return NULL;
1662 val = ep->me_value;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001663 if (val == NULL)
1664 val = failobj;
1665 Py_INCREF(val);
1666 return val;
1667}
1668
1669
1670static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001671dict_setdefault(register dictobject *mp, PyObject *args)
1672{
1673 PyObject *key;
1674 PyObject *failobj = Py_None;
1675 PyObject *val = NULL;
1676 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +00001677 dictentry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001678
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001679 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001680 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001681
Tim Peters0ab085c2001-09-14 00:25:33 +00001682 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001683 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001684 hash = PyObject_Hash(key);
1685 if (hash == -1)
1686 return NULL;
1687 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001688 ep = (mp->ma_lookup)(mp, key, hash);
1689 if (ep == NULL)
1690 return NULL;
1691 val = ep->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001692 if (val == NULL) {
1693 val = failobj;
1694 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1695 val = NULL;
1696 }
1697 Py_XINCREF(val);
1698 return val;
1699}
1700
1701
1702static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001703dict_clear(register dictobject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001704{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001705 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001706 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001707}
1708
Guido van Rossumba6ab842000-12-12 22:02:18 +00001709static PyObject *
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001710dict_pop(dictobject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001711{
1712 long hash;
1713 dictentry *ep;
1714 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001715 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001716
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001717 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1718 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001719 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001720 if (deflt) {
1721 Py_INCREF(deflt);
1722 return deflt;
1723 }
Guido van Rossume027d982002-04-12 15:11:59 +00001724 PyErr_SetString(PyExc_KeyError,
1725 "pop(): dictionary is empty");
1726 return NULL;
1727 }
1728 if (!PyString_CheckExact(key) ||
1729 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1730 hash = PyObject_Hash(key);
1731 if (hash == -1)
1732 return NULL;
1733 }
1734 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +00001735 if (ep == NULL)
1736 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001737 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001738 if (deflt) {
1739 Py_INCREF(deflt);
1740 return deflt;
1741 }
Guido van Rossume027d982002-04-12 15:11:59 +00001742 PyErr_SetObject(PyExc_KeyError, key);
1743 return NULL;
1744 }
1745 old_key = ep->me_key;
1746 Py_INCREF(dummy);
1747 ep->me_key = dummy;
1748 old_value = ep->me_value;
1749 ep->me_value = NULL;
1750 mp->ma_used--;
1751 Py_DECREF(old_key);
1752 return old_value;
1753}
1754
1755static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001756dict_popitem(dictobject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001757{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001758 Py_ssize_t i = 0;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001759 dictentry *ep;
1760 PyObject *res;
1761
Tim Petersf4b33f62001-06-02 05:42:29 +00001762 /* Allocate the result tuple before checking the size. Believe it
1763 * or not, this allocation could trigger a garbage collection which
1764 * could empty the dict, so if we checked the size first and that
1765 * happened, the result would be an infinite loop (searching for an
1766 * entry that no longer exists). Note that the usual popitem()
1767 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Tim Peters9b10f7e2006-05-30 04:16:25 +00001768 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00001769 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001770 */
1771 res = PyTuple_New(2);
1772 if (res == NULL)
1773 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001774 if (mp->ma_used == 0) {
1775 Py_DECREF(res);
1776 PyErr_SetString(PyExc_KeyError,
1777 "popitem(): dictionary is empty");
1778 return NULL;
1779 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001780 /* Set ep to "the first" dict entry with a value. We abuse the hash
1781 * field of slot 0 to hold a search finger:
1782 * If slot 0 has a value, use slot 0.
1783 * Else slot 0 is being used to hold a search finger,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001784 * and we use its hash value as the first index to look.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001785 */
1786 ep = &mp->ma_table[0];
1787 if (ep->me_value == NULL) {
Tim Peters9b10f7e2006-05-30 04:16:25 +00001788 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001789 /* The hash field may be a real hash value, or it may be a
1790 * legit search finger, or it may be a once-legit search
1791 * finger that's out of bounds now because it wrapped around
1792 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001793 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001794 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001795 i = 1; /* skip slot 0 */
1796 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1797 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001798 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001799 i = 1;
1800 }
1801 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001802 PyTuple_SET_ITEM(res, 0, ep->me_key);
1803 PyTuple_SET_ITEM(res, 1, ep->me_value);
1804 Py_INCREF(dummy);
1805 ep->me_key = dummy;
1806 ep->me_value = NULL;
1807 mp->ma_used--;
1808 assert(mp->ma_table[0].me_value == NULL);
1809 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001810 return res;
1811}
1812
Jeremy Hylton8caad492000-06-23 14:18:11 +00001813static int
1814dict_traverse(PyObject *op, visitproc visit, void *arg)
1815{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001816 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001817 PyObject *pk;
1818 PyObject *pv;
1819
1820 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Woutersc6e55062006-04-15 21:47:09 +00001821 Py_VISIT(pk);
1822 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00001823 }
1824 return 0;
1825}
1826
1827static int
1828dict_tp_clear(PyObject *op)
1829{
1830 PyDict_Clear(op);
1831 return 0;
1832}
1833
Tim Petersf7f88b12000-12-13 23:18:45 +00001834
Raymond Hettinger019a1482004-03-18 02:41:19 +00001835extern PyTypeObject PyDictIterKey_Type; /* Forward */
1836extern PyTypeObject PyDictIterValue_Type; /* Forward */
1837extern PyTypeObject PyDictIterItem_Type; /* Forward */
1838static PyObject *dictiter_new(dictobject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001839
1840static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001841dict_iterkeys(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001842{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001843 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001844}
1845
1846static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001847dict_itervalues(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001848{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001849 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001850}
1851
1852static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001853dict_iteritems(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001854{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001855 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001856}
1857
1858
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001859PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00001860"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00001861
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001862PyDoc_STRVAR(contains__doc__,
1863"D.__contains__(k) -> True if D has a key k, else False");
1864
1865PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1866
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001867PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001868"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001869
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001870PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001871"D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001872
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001873PyDoc_STRVAR(pop__doc__,
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001874"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
1875If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001876
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001877PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001878"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000018792-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00001880
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001881PyDoc_STRVAR(keys__doc__,
1882"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00001883
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001884PyDoc_STRVAR(items__doc__,
1885"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00001886
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001887PyDoc_STRVAR(values__doc__,
1888"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00001889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001890PyDoc_STRVAR(update__doc__,
Walter Dörwaldd70ad8a2004-05-28 20:59:21 +00001891"D.update(E, **F) -> None. Update D from E and F: for k in E: D[k] = E[k]\n\
1892(if E has keys else: for (k, v) in E: D[k] = v) then: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00001893
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001894PyDoc_STRVAR(fromkeys__doc__,
1895"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1896v defaults to None.");
1897
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001898PyDoc_STRVAR(clear__doc__,
1899"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001900
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001901PyDoc_STRVAR(copy__doc__,
1902"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001903
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001904PyDoc_STRVAR(iterkeys__doc__,
1905"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001906
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001907PyDoc_STRVAR(itervalues__doc__,
1908"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001909
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001910PyDoc_STRVAR(iteritems__doc__,
1911"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001912
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001913static PyMethodDef mapp_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001914 {"__contains__",(PyCFunction)dict_has_key, METH_O | METH_COEXIST,
1915 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00001916 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001917 getitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001918 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001919 has_key__doc__},
1920 {"get", (PyCFunction)dict_get, METH_VARARGS,
1921 get__doc__},
1922 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1923 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001924 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00001925 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001926 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001927 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001928 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001929 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001930 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001931 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001932 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001933 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001934 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001935 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001936 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
1937 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001938 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001939 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001940 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001941 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001942 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001943 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001944 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001945 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001946 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001947 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00001948 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001949};
1950
Tim Petersd770ebd2006-06-01 15:50:44 +00001951/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001952int
1953PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001954{
1955 long hash;
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001956 dictobject *mp = (dictobject *)op;
Armin Rigo35f6d362006-06-01 13:19:12 +00001957 dictentry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001958
Tim Peters0ab085c2001-09-14 00:25:33 +00001959 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001960 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001961 hash = PyObject_Hash(key);
1962 if (hash == -1)
1963 return -1;
1964 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001965 ep = (mp->ma_lookup)(mp, key, hash);
Tim Petersd770ebd2006-06-01 15:50:44 +00001966 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001967}
1968
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001969/* Hack to implement "key in dict" */
1970static PySequenceMethods dict_as_sequence = {
Georg Brandl347b3002006-03-30 11:57:00 +00001971 0, /* sq_length */
1972 0, /* sq_concat */
1973 0, /* sq_repeat */
1974 0, /* sq_item */
1975 0, /* sq_slice */
1976 0, /* sq_ass_item */
1977 0, /* sq_ass_slice */
1978 PyDict_Contains, /* sq_contains */
1979 0, /* sq_inplace_concat */
1980 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001981};
1982
Guido van Rossum09e563a2001-05-01 12:10:21 +00001983static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001984dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1985{
1986 PyObject *self;
1987
1988 assert(type != NULL && type->tp_alloc != NULL);
1989 self = type->tp_alloc(type, 0);
1990 if (self != NULL) {
1991 PyDictObject *d = (PyDictObject *)self;
1992 /* It's guaranteed that tp->alloc zeroed out the struct. */
1993 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
1994 INIT_NONZERO_DICT_SLOTS(d);
1995 d->ma_lookup = lookdict_string;
1996#ifdef SHOW_CONVERSION_COUNTS
1997 ++created;
1998#endif
1999 }
2000 return self;
2001}
2002
Tim Peters25786c02001-09-02 08:22:48 +00002003static int
2004dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2005{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002006 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002007}
2008
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002009static long
2010dict_nohash(PyObject *self)
2011{
2012 PyErr_SetString(PyExc_TypeError, "dict objects are unhashable");
2013 return -1;
2014}
2015
Tim Peters6d6c1a32001-08-02 04:15:00 +00002016static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00002017dict_iter(dictobject *dict)
2018{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002019 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002020}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002021
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002022PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00002023"dict() -> new empty dictionary.\n"
2024"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00002025" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002026"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002027" d = {}\n"
2028" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002029" d[k] = v\n"
2030"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2031" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002032
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002033PyTypeObject PyDict_Type = {
2034 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002035 0,
Tim Petersa427a2b2001-10-29 22:25:45 +00002036 "dict",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002037 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002038 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00002039 (destructor)dict_dealloc, /* tp_dealloc */
2040 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002041 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00002042 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00002043 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00002044 (reprfunc)dict_repr, /* tp_repr */
2045 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002046 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00002047 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002048 dict_nohash, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00002049 0, /* tp_call */
2050 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002051 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00002052 0, /* tp_setattro */
2053 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002054 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00002055 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00002056 dictionary_doc, /* tp_doc */
Georg Brandl347b3002006-03-30 11:57:00 +00002057 dict_traverse, /* tp_traverse */
2058 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00002059 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002060 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00002061 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002062 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002063 mapp_methods, /* tp_methods */
2064 0, /* tp_members */
2065 0, /* tp_getset */
2066 0, /* tp_base */
2067 0, /* tp_dict */
2068 0, /* tp_descr_get */
2069 0, /* tp_descr_set */
2070 0, /* tp_dictoffset */
Georg Brandl347b3002006-03-30 11:57:00 +00002071 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002072 PyType_GenericAlloc, /* tp_alloc */
2073 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002074 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002075};
2076
Guido van Rossum3cca2451997-05-16 14:23:33 +00002077/* For backward compatibility with old dictionary interface */
2078
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002079PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002080PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002081{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002082 PyObject *kv, *rv;
2083 kv = PyString_FromString(key);
2084 if (kv == NULL)
2085 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002086 rv = PyDict_GetItem(v, kv);
2087 Py_DECREF(kv);
2088 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002089}
2090
2091int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002092PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002093{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002094 PyObject *kv;
2095 int err;
2096 kv = PyString_FromString(key);
2097 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002098 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00002099 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002100 err = PyDict_SetItem(v, kv, item);
2101 Py_DECREF(kv);
2102 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002103}
2104
2105int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002106PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002107{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002108 PyObject *kv;
2109 int err;
2110 kv = PyString_FromString(key);
2111 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002112 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002113 err = PyDict_DelItem(v, kv);
2114 Py_DECREF(kv);
2115 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002116}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002117
Raymond Hettinger019a1482004-03-18 02:41:19 +00002118/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002119
2120typedef struct {
2121 PyObject_HEAD
Guido van Rossum2147df72002-07-16 20:30:22 +00002122 dictobject *di_dict; /* Set to NULL when iterator is exhausted */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002123 Py_ssize_t di_used;
2124 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002125 PyObject* di_result; /* reusable result tuple for iteritems */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002126 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002127} dictiterobject;
2128
2129static PyObject *
Raymond Hettinger019a1482004-03-18 02:41:19 +00002130dictiter_new(dictobject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002131{
2132 dictiterobject *di;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002133 di = PyObject_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002134 if (di == NULL)
2135 return NULL;
2136 Py_INCREF(dict);
2137 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002138 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002139 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002140 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002141 if (itertype == &PyDictIterItem_Type) {
2142 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2143 if (di->di_result == NULL) {
2144 Py_DECREF(di);
2145 return NULL;
2146 }
2147 }
2148 else
2149 di->di_result = NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002150 return (PyObject *)di;
2151}
2152
2153static void
2154dictiter_dealloc(dictiterobject *di)
2155{
Guido van Rossum2147df72002-07-16 20:30:22 +00002156 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002157 Py_XDECREF(di->di_result);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002158 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002159}
2160
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002161static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002162dictiter_len(dictiterobject *di)
2163{
Tim Peters9b10f7e2006-05-30 04:16:25 +00002164 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002165 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002166 len = di->len;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002167 return PyInt_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002168}
2169
Armin Rigof5b3e362006-02-11 21:32:43 +00002170PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002171
2172static PyMethodDef dictiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002173 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002174 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002175};
2176
Raymond Hettinger019a1482004-03-18 02:41:19 +00002177static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002178{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002179 PyObject *key;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002180 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002181 register dictentry *ep;
2182 dictobject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002183
Raymond Hettinger019a1482004-03-18 02:41:19 +00002184 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002185 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002186 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002187
Raymond Hettinger019a1482004-03-18 02:41:19 +00002188 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002189 PyErr_SetString(PyExc_RuntimeError,
2190 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002191 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002192 return NULL;
2193 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002194
Raymond Hettinger019a1482004-03-18 02:41:19 +00002195 i = di->di_pos;
2196 if (i < 0)
2197 goto fail;
2198 ep = d->ma_table;
2199 mask = d->ma_mask;
2200 while (i <= mask && ep[i].me_value == NULL)
2201 i++;
2202 di->di_pos = i+1;
2203 if (i > mask)
2204 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002205 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002206 key = ep[i].me_key;
2207 Py_INCREF(key);
2208 return key;
2209
2210fail:
2211 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002212 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002213 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002214}
2215
Raymond Hettinger019a1482004-03-18 02:41:19 +00002216PyTypeObject PyDictIterKey_Type = {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002217 PyObject_HEAD_INIT(&PyType_Type)
2218 0, /* ob_size */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002219 "dictionary-keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002220 sizeof(dictiterobject), /* tp_basicsize */
2221 0, /* tp_itemsize */
2222 /* methods */
2223 (destructor)dictiter_dealloc, /* tp_dealloc */
2224 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002225 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002226 0, /* tp_setattr */
2227 0, /* tp_compare */
2228 0, /* tp_repr */
2229 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002230 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002231 0, /* tp_as_mapping */
2232 0, /* tp_hash */
2233 0, /* tp_call */
2234 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002235 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002236 0, /* tp_setattro */
2237 0, /* tp_as_buffer */
2238 Py_TPFLAGS_DEFAULT, /* tp_flags */
2239 0, /* tp_doc */
2240 0, /* tp_traverse */
2241 0, /* tp_clear */
2242 0, /* tp_richcompare */
2243 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002244 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002245 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002246 dictiter_methods, /* tp_methods */
2247 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002248};
2249
2250static PyObject *dictiter_iternextvalue(dictiterobject *di)
2251{
2252 PyObject *value;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002253 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002254 register dictentry *ep;
2255 dictobject *d = di->di_dict;
2256
2257 if (d == NULL)
2258 return NULL;
2259 assert (PyDict_Check(d));
2260
2261 if (di->di_used != d->ma_used) {
2262 PyErr_SetString(PyExc_RuntimeError,
2263 "dictionary changed size during iteration");
2264 di->di_used = -1; /* Make this state sticky */
2265 return NULL;
2266 }
2267
2268 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002269 mask = d->ma_mask;
2270 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002271 goto fail;
2272 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002273 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002274 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002275 if (i > mask)
2276 goto fail;
2277 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002278 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002279 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002280 Py_INCREF(value);
2281 return value;
2282
2283fail:
2284 Py_DECREF(d);
2285 di->di_dict = NULL;
2286 return NULL;
2287}
2288
2289PyTypeObject PyDictIterValue_Type = {
2290 PyObject_HEAD_INIT(&PyType_Type)
2291 0, /* ob_size */
2292 "dictionary-valueiterator", /* tp_name */
2293 sizeof(dictiterobject), /* tp_basicsize */
2294 0, /* tp_itemsize */
2295 /* methods */
2296 (destructor)dictiter_dealloc, /* tp_dealloc */
2297 0, /* tp_print */
2298 0, /* tp_getattr */
2299 0, /* tp_setattr */
2300 0, /* tp_compare */
2301 0, /* tp_repr */
2302 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002303 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002304 0, /* tp_as_mapping */
2305 0, /* tp_hash */
2306 0, /* tp_call */
2307 0, /* tp_str */
2308 PyObject_GenericGetAttr, /* tp_getattro */
2309 0, /* tp_setattro */
2310 0, /* tp_as_buffer */
2311 Py_TPFLAGS_DEFAULT, /* tp_flags */
2312 0, /* tp_doc */
2313 0, /* tp_traverse */
2314 0, /* tp_clear */
2315 0, /* tp_richcompare */
2316 0, /* tp_weaklistoffset */
2317 PyObject_SelfIter, /* tp_iter */
2318 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002319 dictiter_methods, /* tp_methods */
2320 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002321};
2322
2323static PyObject *dictiter_iternextitem(dictiterobject *di)
2324{
2325 PyObject *key, *value, *result = di->di_result;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002326 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002327 register dictentry *ep;
2328 dictobject *d = di->di_dict;
2329
2330 if (d == NULL)
2331 return NULL;
2332 assert (PyDict_Check(d));
2333
2334 if (di->di_used != d->ma_used) {
2335 PyErr_SetString(PyExc_RuntimeError,
2336 "dictionary changed size during iteration");
2337 di->di_used = -1; /* Make this state sticky */
2338 return NULL;
2339 }
2340
2341 i = di->di_pos;
2342 if (i < 0)
2343 goto fail;
2344 ep = d->ma_table;
2345 mask = d->ma_mask;
2346 while (i <= mask && ep[i].me_value == NULL)
2347 i++;
2348 di->di_pos = i+1;
2349 if (i > mask)
2350 goto fail;
2351
2352 if (result->ob_refcnt == 1) {
2353 Py_INCREF(result);
2354 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2355 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2356 } else {
2357 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002358 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002359 return NULL;
2360 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002361 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002362 key = ep[i].me_key;
2363 value = ep[i].me_value;
2364 Py_INCREF(key);
2365 Py_INCREF(value);
2366 PyTuple_SET_ITEM(result, 0, key);
2367 PyTuple_SET_ITEM(result, 1, value);
2368 return result;
2369
2370fail:
2371 Py_DECREF(d);
2372 di->di_dict = NULL;
2373 return NULL;
2374}
2375
2376PyTypeObject PyDictIterItem_Type = {
2377 PyObject_HEAD_INIT(&PyType_Type)
2378 0, /* ob_size */
2379 "dictionary-itemiterator", /* tp_name */
2380 sizeof(dictiterobject), /* tp_basicsize */
2381 0, /* tp_itemsize */
2382 /* methods */
2383 (destructor)dictiter_dealloc, /* tp_dealloc */
2384 0, /* tp_print */
2385 0, /* tp_getattr */
2386 0, /* tp_setattr */
2387 0, /* tp_compare */
2388 0, /* tp_repr */
2389 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002390 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002391 0, /* tp_as_mapping */
2392 0, /* tp_hash */
2393 0, /* tp_call */
2394 0, /* tp_str */
2395 PyObject_GenericGetAttr, /* tp_getattro */
2396 0, /* tp_setattro */
2397 0, /* tp_as_buffer */
2398 Py_TPFLAGS_DEFAULT, /* tp_flags */
2399 0, /* tp_doc */
2400 0, /* tp_traverse */
2401 0, /* tp_clear */
2402 0, /* tp_richcompare */
2403 0, /* tp_weaklistoffset */
2404 PyObject_SelfIter, /* tp_iter */
2405 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002406 dictiter_methods, /* tp_methods */
2407 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002408};