blob: 4e827980b57f88241554756595d3e5454b9fe09b [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);
Neal Norwitza22975f2006-09-05 02:24:03 +00001588 /* ditto for key */
1589 Py_INCREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001590 bval = PyDict_GetItem((PyObject *)b, key);
Neal Norwitza22975f2006-09-05 02:24:03 +00001591 Py_DECREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001592 if (bval == NULL) {
1593 Py_DECREF(aval);
1594 return 0;
1595 }
1596 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1597 Py_DECREF(aval);
1598 if (cmp <= 0) /* error or not equal */
1599 return cmp;
1600 }
1601 }
1602 return 1;
1603 }
1604
1605static PyObject *
1606dict_richcompare(PyObject *v, PyObject *w, int op)
1607{
1608 int cmp;
1609 PyObject *res;
1610
1611 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1612 res = Py_NotImplemented;
1613 }
1614 else if (op == Py_EQ || op == Py_NE) {
1615 cmp = dict_equal((dictobject *)v, (dictobject *)w);
1616 if (cmp < 0)
1617 return NULL;
1618 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1619 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001620 else
1621 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001622 Py_INCREF(res);
1623 return res;
1624 }
1625
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001626static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001627dict_has_key(register dictobject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001628{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001629 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +00001630 dictentry *ep;
Tim Petersd770ebd2006-06-01 15:50:44 +00001631
Tim Peters0ab085c2001-09-14 00:25:33 +00001632 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001633 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001634 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001635 if (hash == -1)
1636 return NULL;
1637 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001638 ep = (mp->ma_lookup)(mp, key, hash);
1639 if (ep == NULL)
1640 return NULL;
Tim Petersd770ebd2006-06-01 15:50:44 +00001641 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001642}
1643
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001644static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001645dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001646{
1647 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001648 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001649 PyObject *val = NULL;
1650 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +00001651 dictentry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001652
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001653 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001654 return NULL;
1655
Tim Peters0ab085c2001-09-14 00:25:33 +00001656 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001657 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001658 hash = PyObject_Hash(key);
1659 if (hash == -1)
1660 return NULL;
1661 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001662 ep = (mp->ma_lookup)(mp, key, hash);
1663 if (ep == NULL)
1664 return NULL;
1665 val = ep->me_value;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001666 if (val == NULL)
1667 val = failobj;
1668 Py_INCREF(val);
1669 return val;
1670}
1671
1672
1673static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001674dict_setdefault(register dictobject *mp, PyObject *args)
1675{
1676 PyObject *key;
1677 PyObject *failobj = Py_None;
1678 PyObject *val = NULL;
1679 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +00001680 dictentry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001681
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001682 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001683 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001684
Tim Peters0ab085c2001-09-14 00:25:33 +00001685 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001686 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001687 hash = PyObject_Hash(key);
1688 if (hash == -1)
1689 return NULL;
1690 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001691 ep = (mp->ma_lookup)(mp, key, hash);
1692 if (ep == NULL)
1693 return NULL;
1694 val = ep->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001695 if (val == NULL) {
1696 val = failobj;
1697 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1698 val = NULL;
1699 }
1700 Py_XINCREF(val);
1701 return val;
1702}
1703
1704
1705static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001706dict_clear(register dictobject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001707{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001708 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001709 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001710}
1711
Guido van Rossumba6ab842000-12-12 22:02:18 +00001712static PyObject *
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001713dict_pop(dictobject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001714{
1715 long hash;
1716 dictentry *ep;
1717 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001718 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001719
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001720 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1721 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001722 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001723 if (deflt) {
1724 Py_INCREF(deflt);
1725 return deflt;
1726 }
Guido van Rossume027d982002-04-12 15:11:59 +00001727 PyErr_SetString(PyExc_KeyError,
1728 "pop(): dictionary is empty");
1729 return NULL;
1730 }
1731 if (!PyString_CheckExact(key) ||
1732 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1733 hash = PyObject_Hash(key);
1734 if (hash == -1)
1735 return NULL;
1736 }
1737 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +00001738 if (ep == NULL)
1739 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001740 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001741 if (deflt) {
1742 Py_INCREF(deflt);
1743 return deflt;
1744 }
Guido van Rossume027d982002-04-12 15:11:59 +00001745 PyErr_SetObject(PyExc_KeyError, key);
1746 return NULL;
1747 }
1748 old_key = ep->me_key;
1749 Py_INCREF(dummy);
1750 ep->me_key = dummy;
1751 old_value = ep->me_value;
1752 ep->me_value = NULL;
1753 mp->ma_used--;
1754 Py_DECREF(old_key);
1755 return old_value;
1756}
1757
1758static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001759dict_popitem(dictobject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001760{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001761 Py_ssize_t i = 0;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001762 dictentry *ep;
1763 PyObject *res;
1764
Tim Petersf4b33f62001-06-02 05:42:29 +00001765 /* Allocate the result tuple before checking the size. Believe it
1766 * or not, this allocation could trigger a garbage collection which
1767 * could empty the dict, so if we checked the size first and that
1768 * happened, the result would be an infinite loop (searching for an
1769 * entry that no longer exists). Note that the usual popitem()
1770 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Tim Peters9b10f7e2006-05-30 04:16:25 +00001771 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00001772 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001773 */
1774 res = PyTuple_New(2);
1775 if (res == NULL)
1776 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001777 if (mp->ma_used == 0) {
1778 Py_DECREF(res);
1779 PyErr_SetString(PyExc_KeyError,
1780 "popitem(): dictionary is empty");
1781 return NULL;
1782 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001783 /* Set ep to "the first" dict entry with a value. We abuse the hash
1784 * field of slot 0 to hold a search finger:
1785 * If slot 0 has a value, use slot 0.
1786 * Else slot 0 is being used to hold a search finger,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001787 * and we use its hash value as the first index to look.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001788 */
1789 ep = &mp->ma_table[0];
1790 if (ep->me_value == NULL) {
Tim Peters9b10f7e2006-05-30 04:16:25 +00001791 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001792 /* The hash field may be a real hash value, or it may be a
1793 * legit search finger, or it may be a once-legit search
1794 * finger that's out of bounds now because it wrapped around
1795 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001796 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001797 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001798 i = 1; /* skip slot 0 */
1799 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1800 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001801 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001802 i = 1;
1803 }
1804 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001805 PyTuple_SET_ITEM(res, 0, ep->me_key);
1806 PyTuple_SET_ITEM(res, 1, ep->me_value);
1807 Py_INCREF(dummy);
1808 ep->me_key = dummy;
1809 ep->me_value = NULL;
1810 mp->ma_used--;
1811 assert(mp->ma_table[0].me_value == NULL);
1812 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001813 return res;
1814}
1815
Jeremy Hylton8caad492000-06-23 14:18:11 +00001816static int
1817dict_traverse(PyObject *op, visitproc visit, void *arg)
1818{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001819 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001820 PyObject *pk;
1821 PyObject *pv;
1822
1823 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Woutersc6e55062006-04-15 21:47:09 +00001824 Py_VISIT(pk);
1825 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00001826 }
1827 return 0;
1828}
1829
1830static int
1831dict_tp_clear(PyObject *op)
1832{
1833 PyDict_Clear(op);
1834 return 0;
1835}
1836
Tim Petersf7f88b12000-12-13 23:18:45 +00001837
Raymond Hettinger019a1482004-03-18 02:41:19 +00001838extern PyTypeObject PyDictIterKey_Type; /* Forward */
1839extern PyTypeObject PyDictIterValue_Type; /* Forward */
1840extern PyTypeObject PyDictIterItem_Type; /* Forward */
1841static PyObject *dictiter_new(dictobject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001842
1843static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001844dict_iterkeys(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001845{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001846 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001847}
1848
1849static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001850dict_itervalues(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001851{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001852 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001853}
1854
1855static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001856dict_iteritems(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001857{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001858 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001859}
1860
1861
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001862PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00001863"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00001864
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001865PyDoc_STRVAR(contains__doc__,
1866"D.__contains__(k) -> True if D has a key k, else False");
1867
1868PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1869
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001870PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001871"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001872
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001873PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001874"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 +00001875
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001876PyDoc_STRVAR(pop__doc__,
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001877"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
1878If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001879
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001880PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001881"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000018822-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00001883
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001884PyDoc_STRVAR(keys__doc__,
1885"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00001886
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001887PyDoc_STRVAR(items__doc__,
1888"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00001889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001890PyDoc_STRVAR(values__doc__,
1891"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00001892
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001893PyDoc_STRVAR(update__doc__,
Walter Dörwaldd70ad8a2004-05-28 20:59:21 +00001894"D.update(E, **F) -> None. Update D from E and F: for k in E: D[k] = E[k]\n\
1895(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 +00001896
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001897PyDoc_STRVAR(fromkeys__doc__,
1898"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1899v defaults to None.");
1900
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001901PyDoc_STRVAR(clear__doc__,
1902"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001903
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001904PyDoc_STRVAR(copy__doc__,
1905"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001906
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001907PyDoc_STRVAR(iterkeys__doc__,
1908"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001909
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001910PyDoc_STRVAR(itervalues__doc__,
1911"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001912
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001913PyDoc_STRVAR(iteritems__doc__,
1914"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001915
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001916static PyMethodDef mapp_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001917 {"__contains__",(PyCFunction)dict_has_key, METH_O | METH_COEXIST,
1918 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00001919 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001920 getitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001921 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001922 has_key__doc__},
1923 {"get", (PyCFunction)dict_get, METH_VARARGS,
1924 get__doc__},
1925 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1926 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001927 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00001928 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001929 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001930 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001931 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001932 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001933 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001934 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001935 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001936 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001937 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001938 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001939 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
1940 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001941 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001942 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001943 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001944 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001945 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001946 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001947 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001948 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001949 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001950 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00001951 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001952};
1953
Tim Petersd770ebd2006-06-01 15:50:44 +00001954/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001955int
1956PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001957{
1958 long hash;
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001959 dictobject *mp = (dictobject *)op;
Armin Rigo35f6d362006-06-01 13:19:12 +00001960 dictentry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001961
Tim Peters0ab085c2001-09-14 00:25:33 +00001962 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001963 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001964 hash = PyObject_Hash(key);
1965 if (hash == -1)
1966 return -1;
1967 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001968 ep = (mp->ma_lookup)(mp, key, hash);
Tim Petersd770ebd2006-06-01 15:50:44 +00001969 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001970}
1971
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001972/* Hack to implement "key in dict" */
1973static PySequenceMethods dict_as_sequence = {
Georg Brandl347b3002006-03-30 11:57:00 +00001974 0, /* sq_length */
1975 0, /* sq_concat */
1976 0, /* sq_repeat */
1977 0, /* sq_item */
1978 0, /* sq_slice */
1979 0, /* sq_ass_item */
1980 0, /* sq_ass_slice */
1981 PyDict_Contains, /* sq_contains */
1982 0, /* sq_inplace_concat */
1983 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001984};
1985
Guido van Rossum09e563a2001-05-01 12:10:21 +00001986static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001987dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1988{
1989 PyObject *self;
1990
1991 assert(type != NULL && type->tp_alloc != NULL);
1992 self = type->tp_alloc(type, 0);
1993 if (self != NULL) {
1994 PyDictObject *d = (PyDictObject *)self;
1995 /* It's guaranteed that tp->alloc zeroed out the struct. */
1996 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
1997 INIT_NONZERO_DICT_SLOTS(d);
1998 d->ma_lookup = lookdict_string;
1999#ifdef SHOW_CONVERSION_COUNTS
2000 ++created;
2001#endif
2002 }
2003 return self;
2004}
2005
Tim Peters25786c02001-09-02 08:22:48 +00002006static int
2007dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2008{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002009 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002010}
2011
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002012static long
2013dict_nohash(PyObject *self)
2014{
2015 PyErr_SetString(PyExc_TypeError, "dict objects are unhashable");
2016 return -1;
2017}
2018
Tim Peters6d6c1a32001-08-02 04:15:00 +00002019static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00002020dict_iter(dictobject *dict)
2021{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002022 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002023}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002024
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002025PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00002026"dict() -> new empty dictionary.\n"
2027"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00002028" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002029"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002030" d = {}\n"
2031" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002032" d[k] = v\n"
2033"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2034" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002035
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002036PyTypeObject PyDict_Type = {
2037 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002038 0,
Tim Petersa427a2b2001-10-29 22:25:45 +00002039 "dict",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002040 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002041 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00002042 (destructor)dict_dealloc, /* tp_dealloc */
2043 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002044 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00002045 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00002046 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00002047 (reprfunc)dict_repr, /* tp_repr */
2048 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002049 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00002050 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002051 dict_nohash, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00002052 0, /* tp_call */
2053 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002054 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00002055 0, /* tp_setattro */
2056 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002057 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00002058 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00002059 dictionary_doc, /* tp_doc */
Georg Brandl347b3002006-03-30 11:57:00 +00002060 dict_traverse, /* tp_traverse */
2061 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00002062 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002063 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00002064 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002065 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002066 mapp_methods, /* tp_methods */
2067 0, /* tp_members */
2068 0, /* tp_getset */
2069 0, /* tp_base */
2070 0, /* tp_dict */
2071 0, /* tp_descr_get */
2072 0, /* tp_descr_set */
2073 0, /* tp_dictoffset */
Georg Brandl347b3002006-03-30 11:57:00 +00002074 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002075 PyType_GenericAlloc, /* tp_alloc */
2076 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002077 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002078};
2079
Guido van Rossum3cca2451997-05-16 14:23:33 +00002080/* For backward compatibility with old dictionary interface */
2081
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002082PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002083PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002084{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002085 PyObject *kv, *rv;
2086 kv = PyString_FromString(key);
2087 if (kv == NULL)
2088 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002089 rv = PyDict_GetItem(v, kv);
2090 Py_DECREF(kv);
2091 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002092}
2093
2094int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002095PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002096{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002097 PyObject *kv;
2098 int err;
2099 kv = PyString_FromString(key);
2100 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002101 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00002102 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002103 err = PyDict_SetItem(v, kv, item);
2104 Py_DECREF(kv);
2105 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002106}
2107
2108int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002109PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002110{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002111 PyObject *kv;
2112 int err;
2113 kv = PyString_FromString(key);
2114 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002115 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002116 err = PyDict_DelItem(v, kv);
2117 Py_DECREF(kv);
2118 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002119}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002120
Raymond Hettinger019a1482004-03-18 02:41:19 +00002121/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002122
2123typedef struct {
2124 PyObject_HEAD
Guido van Rossum2147df72002-07-16 20:30:22 +00002125 dictobject *di_dict; /* Set to NULL when iterator is exhausted */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002126 Py_ssize_t di_used;
2127 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002128 PyObject* di_result; /* reusable result tuple for iteritems */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002129 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002130} dictiterobject;
2131
2132static PyObject *
Raymond Hettinger019a1482004-03-18 02:41:19 +00002133dictiter_new(dictobject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002134{
2135 dictiterobject *di;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002136 di = PyObject_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002137 if (di == NULL)
2138 return NULL;
2139 Py_INCREF(dict);
2140 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002141 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002142 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002143 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002144 if (itertype == &PyDictIterItem_Type) {
2145 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2146 if (di->di_result == NULL) {
2147 Py_DECREF(di);
2148 return NULL;
2149 }
2150 }
2151 else
2152 di->di_result = NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002153 return (PyObject *)di;
2154}
2155
2156static void
2157dictiter_dealloc(dictiterobject *di)
2158{
Guido van Rossum2147df72002-07-16 20:30:22 +00002159 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002160 Py_XDECREF(di->di_result);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002161 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002162}
2163
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002164static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002165dictiter_len(dictiterobject *di)
2166{
Tim Peters9b10f7e2006-05-30 04:16:25 +00002167 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002168 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002169 len = di->len;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002170 return PyInt_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002171}
2172
Armin Rigof5b3e362006-02-11 21:32:43 +00002173PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002174
2175static PyMethodDef dictiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002176 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002177 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002178};
2179
Raymond Hettinger019a1482004-03-18 02:41:19 +00002180static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002181{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002182 PyObject *key;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002183 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002184 register dictentry *ep;
2185 dictobject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002186
Raymond Hettinger019a1482004-03-18 02:41:19 +00002187 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002188 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002189 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002190
Raymond Hettinger019a1482004-03-18 02:41:19 +00002191 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002192 PyErr_SetString(PyExc_RuntimeError,
2193 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002194 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002195 return NULL;
2196 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002197
Raymond Hettinger019a1482004-03-18 02:41:19 +00002198 i = di->di_pos;
2199 if (i < 0)
2200 goto fail;
2201 ep = d->ma_table;
2202 mask = d->ma_mask;
2203 while (i <= mask && ep[i].me_value == NULL)
2204 i++;
2205 di->di_pos = i+1;
2206 if (i > mask)
2207 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002208 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002209 key = ep[i].me_key;
2210 Py_INCREF(key);
2211 return key;
2212
2213fail:
2214 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002215 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002216 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002217}
2218
Raymond Hettinger019a1482004-03-18 02:41:19 +00002219PyTypeObject PyDictIterKey_Type = {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002220 PyObject_HEAD_INIT(&PyType_Type)
2221 0, /* ob_size */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002222 "dictionary-keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002223 sizeof(dictiterobject), /* tp_basicsize */
2224 0, /* tp_itemsize */
2225 /* methods */
2226 (destructor)dictiter_dealloc, /* tp_dealloc */
2227 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002228 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002229 0, /* tp_setattr */
2230 0, /* tp_compare */
2231 0, /* tp_repr */
2232 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002233 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002234 0, /* tp_as_mapping */
2235 0, /* tp_hash */
2236 0, /* tp_call */
2237 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002238 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002239 0, /* tp_setattro */
2240 0, /* tp_as_buffer */
2241 Py_TPFLAGS_DEFAULT, /* tp_flags */
2242 0, /* tp_doc */
2243 0, /* tp_traverse */
2244 0, /* tp_clear */
2245 0, /* tp_richcompare */
2246 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002247 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002248 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002249 dictiter_methods, /* tp_methods */
2250 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002251};
2252
2253static PyObject *dictiter_iternextvalue(dictiterobject *di)
2254{
2255 PyObject *value;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002256 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002257 register dictentry *ep;
2258 dictobject *d = di->di_dict;
2259
2260 if (d == NULL)
2261 return NULL;
2262 assert (PyDict_Check(d));
2263
2264 if (di->di_used != d->ma_used) {
2265 PyErr_SetString(PyExc_RuntimeError,
2266 "dictionary changed size during iteration");
2267 di->di_used = -1; /* Make this state sticky */
2268 return NULL;
2269 }
2270
2271 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002272 mask = d->ma_mask;
2273 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002274 goto fail;
2275 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002276 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002277 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002278 if (i > mask)
2279 goto fail;
2280 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002281 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002282 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002283 Py_INCREF(value);
2284 return value;
2285
2286fail:
2287 Py_DECREF(d);
2288 di->di_dict = NULL;
2289 return NULL;
2290}
2291
2292PyTypeObject PyDictIterValue_Type = {
2293 PyObject_HEAD_INIT(&PyType_Type)
2294 0, /* ob_size */
2295 "dictionary-valueiterator", /* tp_name */
2296 sizeof(dictiterobject), /* tp_basicsize */
2297 0, /* tp_itemsize */
2298 /* methods */
2299 (destructor)dictiter_dealloc, /* tp_dealloc */
2300 0, /* tp_print */
2301 0, /* tp_getattr */
2302 0, /* tp_setattr */
2303 0, /* tp_compare */
2304 0, /* tp_repr */
2305 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002306 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002307 0, /* tp_as_mapping */
2308 0, /* tp_hash */
2309 0, /* tp_call */
2310 0, /* tp_str */
2311 PyObject_GenericGetAttr, /* tp_getattro */
2312 0, /* tp_setattro */
2313 0, /* tp_as_buffer */
2314 Py_TPFLAGS_DEFAULT, /* tp_flags */
2315 0, /* tp_doc */
2316 0, /* tp_traverse */
2317 0, /* tp_clear */
2318 0, /* tp_richcompare */
2319 0, /* tp_weaklistoffset */
2320 PyObject_SelfIter, /* tp_iter */
2321 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002322 dictiter_methods, /* tp_methods */
2323 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002324};
2325
2326static PyObject *dictiter_iternextitem(dictiterobject *di)
2327{
2328 PyObject *key, *value, *result = di->di_result;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002329 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002330 register dictentry *ep;
2331 dictobject *d = di->di_dict;
2332
2333 if (d == NULL)
2334 return NULL;
2335 assert (PyDict_Check(d));
2336
2337 if (di->di_used != d->ma_used) {
2338 PyErr_SetString(PyExc_RuntimeError,
2339 "dictionary changed size during iteration");
2340 di->di_used = -1; /* Make this state sticky */
2341 return NULL;
2342 }
2343
2344 i = di->di_pos;
2345 if (i < 0)
2346 goto fail;
2347 ep = d->ma_table;
2348 mask = d->ma_mask;
2349 while (i <= mask && ep[i].me_value == NULL)
2350 i++;
2351 di->di_pos = i+1;
2352 if (i > mask)
2353 goto fail;
2354
2355 if (result->ob_refcnt == 1) {
2356 Py_INCREF(result);
2357 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2358 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2359 } else {
2360 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002361 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002362 return NULL;
2363 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002364 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002365 key = ep[i].me_key;
2366 value = ep[i].me_value;
2367 Py_INCREF(key);
2368 Py_INCREF(value);
2369 PyTuple_SET_ITEM(result, 0, key);
2370 PyTuple_SET_ITEM(result, 1, value);
2371 return result;
2372
2373fail:
2374 Py_DECREF(d);
2375 di->di_dict = NULL;
2376 return NULL;
2377}
2378
2379PyTypeObject PyDictIterItem_Type = {
2380 PyObject_HEAD_INIT(&PyType_Type)
2381 0, /* ob_size */
2382 "dictionary-itemiterator", /* tp_name */
2383 sizeof(dictiterobject), /* tp_basicsize */
2384 0, /* tp_itemsize */
2385 /* methods */
2386 (destructor)dictiter_dealloc, /* tp_dealloc */
2387 0, /* tp_print */
2388 0, /* tp_getattr */
2389 0, /* tp_setattr */
2390 0, /* tp_compare */
2391 0, /* tp_repr */
2392 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002393 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002394 0, /* tp_as_mapping */
2395 0, /* tp_hash */
2396 0, /* tp_call */
2397 0, /* tp_str */
2398 PyObject_GenericGetAttr, /* tp_getattro */
2399 0, /* tp_setattro */
2400 0, /* tp_as_buffer */
2401 Py_TPFLAGS_DEFAULT, /* tp_flags */
2402 0, /* tp_doc */
2403 0, /* tp_traverse */
2404 0, /* tp_clear */
2405 0, /* tp_richcompare */
2406 0, /* tp_weaklistoffset */
2407 PyObject_SelfIter, /* tp_iter */
2408 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002409 dictiter_methods, /* tp_methods */
2410 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002411};