blob: d4cd925b8b82b00603944e9b0d02956c166500a5 [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
230This function must never return NULL; failures are indicated by returning
231a dictentry* for which the me_value field is NULL. Exceptions are never
232reported by this function, and outstanding exceptions are maintained.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000233*/
Tim Peterseb28ef22001-06-02 05:27:19 +0000234
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000235static dictentry *
Tim Peters1f5871e2000-07-04 17:44:48 +0000236lookdict(dictobject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000237{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000238 register Py_ssize_t i;
239 register size_t perturb;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000240 register dictentry *freeslot;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000241 register Py_ssize_t mask = mp->ma_mask;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000242 dictentry *ep0 = mp->ma_table;
243 register dictentry *ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000244 register int restore_error;
245 register int checked_error;
Fred Drakec88b99c2000-08-31 19:04:07 +0000246 register int cmp;
247 PyObject *err_type, *err_value, *err_tb;
Tim Peters453163d2001-06-03 04:54:32 +0000248 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000249
Tim Peters2f228e72001-05-13 00:19:31 +0000250 i = hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000251 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000252 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000253 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000254
255 restore_error = checked_error = 0;
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) {
260 /* error can't have been checked yet */
261 checked_error = 1;
262 if (PyErr_Occurred()) {
263 restore_error = 1;
264 PyErr_Fetch(&err_type, &err_value, &err_tb);
265 }
Tim Peters453163d2001-06-03 04:54:32 +0000266 startkey = ep->me_key;
267 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000268 if (cmp < 0)
Guido van Rossumb9324202001-01-18 00:39:02 +0000269 PyErr_Clear();
Tim Peters453163d2001-06-03 04:54:32 +0000270 if (ep0 == mp->ma_table && ep->me_key == startkey) {
271 if (cmp > 0)
272 goto Done;
273 }
274 else {
275 /* The compare did major nasty stuff to the
276 * dict: start over.
277 * XXX A clever adversary could prevent this
278 * XXX from terminating.
279 */
280 ep = lookdict(mp, key, hash);
281 goto Done;
282 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000283 }
284 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000285 }
Tim Peters15d49292001-05-27 07:39:22 +0000286
Tim Peters342c65e2001-05-13 06:43:53 +0000287 /* In the loop, me_key == dummy is by far (factor of 100s) the
288 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000289 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
290 i = (i << 2) + i + perturb + 1;
291 ep = &ep0[i & mask];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000292 if (ep->me_key == NULL) {
Tim Peters7b5d0af2001-06-03 04:14:43 +0000293 if (freeslot != NULL)
294 ep = freeslot;
295 break;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000296 }
Tim Peters7b5d0af2001-06-03 04:14:43 +0000297 if (ep->me_key == key)
298 break;
299 if (ep->me_hash == hash && ep->me_key != dummy) {
Fred Drakec88b99c2000-08-31 19:04:07 +0000300 if (!checked_error) {
301 checked_error = 1;
302 if (PyErr_Occurred()) {
303 restore_error = 1;
304 PyErr_Fetch(&err_type, &err_value,
305 &err_tb);
306 }
307 }
Tim Peters453163d2001-06-03 04:54:32 +0000308 startkey = ep->me_key;
309 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000310 if (cmp < 0)
Guido van Rossumb9324202001-01-18 00:39:02 +0000311 PyErr_Clear();
Tim Peters453163d2001-06-03 04:54:32 +0000312 if (ep0 == mp->ma_table && ep->me_key == startkey) {
313 if (cmp > 0)
314 break;
315 }
316 else {
317 /* The compare did major nasty stuff to the
318 * dict: start over.
319 * XXX A clever adversary could prevent this
320 * XXX from terminating.
321 */
322 ep = lookdict(mp, key, hash);
323 break;
324 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000325 }
Tim Peters342c65e2001-05-13 06:43:53 +0000326 else if (ep->me_key == dummy && freeslot == NULL)
327 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000328 }
Tim Peters7b5d0af2001-06-03 04:14:43 +0000329
330Done:
331 if (restore_error)
332 PyErr_Restore(err_type, err_value, err_tb);
333 return ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000334}
335
336/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000337 * Hacked up version of lookdict which can assume keys are always strings;
338 * this assumption allows testing for errors during PyObject_Compare() to
339 * be dropped; string-string comparisons never raise exceptions. This also
340 * means we don't need to go through PyObject_Compare(); we can always use
Martin v. Löwiscd353062001-05-24 16:56:35 +0000341 * _PyString_Eq directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000342 *
Tim Peters0ab085c2001-09-14 00:25:33 +0000343 * This is valuable because the general-case error handling in lookdict() is
344 * expensive, and dicts with pure-string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000345 */
346static dictentry *
347lookdict_string(dictobject *mp, PyObject *key, register long hash)
348{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000349 register Py_ssize_t i;
350 register size_t perturb;
Fred Drake1bff34a2000-08-31 19:31:38 +0000351 register dictentry *freeslot;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000352 register Py_ssize_t mask = mp->ma_mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000353 dictentry *ep0 = mp->ma_table;
354 register dictentry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000355
Tim Peters0ab085c2001-09-14 00:25:33 +0000356 /* Make sure this function doesn't have to handle non-string keys,
357 including subclasses of str; e.g., one reason to subclass
358 strings is to override __eq__, and for speed we don't cater to
359 that here. */
360 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000361#ifdef SHOW_CONVERSION_COUNTS
362 ++converted;
363#endif
364 mp->ma_lookup = lookdict;
365 return lookdict(mp, key, hash);
366 }
Tim Peters2f228e72001-05-13 00:19:31 +0000367 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000368 ep = &ep0[i];
369 if (ep->me_key == NULL || ep->me_key == key)
370 return ep;
371 if (ep->me_key == dummy)
372 freeslot = ep;
373 else {
374 if (ep->me_hash == hash
Martin v. Löwiscd353062001-05-24 16:56:35 +0000375 && _PyString_Eq(ep->me_key, key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000376 return ep;
377 }
378 freeslot = NULL;
379 }
Tim Peters15d49292001-05-27 07:39:22 +0000380
Tim Peters342c65e2001-05-13 06:43:53 +0000381 /* In the loop, me_key == dummy is by far (factor of 100s) the
382 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000383 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
384 i = (i << 2) + i + perturb + 1;
385 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000386 if (ep->me_key == NULL)
387 return freeslot == NULL ? ep : freeslot;
388 if (ep->me_key == key
389 || (ep->me_hash == hash
390 && ep->me_key != dummy
Martin v. Löwiscd353062001-05-24 16:56:35 +0000391 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000392 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000393 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000394 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000395 }
396}
397
398/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000399Internal routine to insert a new item into the table.
400Used both by the internal resize routine and by the public insert routine.
401Eats a reference to key and one to value.
402*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000403static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000404insertdict(register dictobject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000405{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000407 register dictentry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000408 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
409
410 assert(mp->ma_lookup != NULL);
411 ep = mp->ma_lookup(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000412 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000413 old_value = ep->me_value;
414 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415 Py_DECREF(old_value); /* which **CAN** re-enter */
416 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000417 }
418 else {
419 if (ep->me_key == NULL)
420 mp->ma_fill++;
Raymond Hettinger07ead172005-02-05 23:42:57 +0000421 else {
422 assert(ep->me_key == dummy);
423 Py_DECREF(dummy);
424 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000425 ep->me_key = key;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000426 ep->me_hash = (Py_ssize_t)hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000427 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000428 mp->ma_used++;
429 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000430}
431
432/*
433Restructure the table by allocating a new table and reinserting all
434items again. When entries have been deleted, the new table may
435actually be smaller than the old one.
436*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000437static int
Tim Peters9b10f7e2006-05-30 04:16:25 +0000438dictresize(dictobject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000439{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000440 Py_ssize_t newsize;
Tim Peters0c6010b2001-05-23 23:33:57 +0000441 dictentry *oldtable, *newtable, *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000442 Py_ssize_t i;
Tim Peters0c6010b2001-05-23 23:33:57 +0000443 int is_oldtable_malloced;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000444 dictentry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000445
446 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000447
Tim Peterseb28ef22001-06-02 05:27:19 +0000448 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000449 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000450 newsize <= minused && newsize > 0;
451 newsize <<= 1)
452 ;
453 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000455 return -1;
456 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000457
458 /* Get space for a new table. */
459 oldtable = mp->ma_table;
460 assert(oldtable != NULL);
461 is_oldtable_malloced = oldtable != mp->ma_smalltable;
462
Tim Peters6d6c1a32001-08-02 04:15:00 +0000463 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000464 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000465 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000466 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000467 if (mp->ma_fill == mp->ma_used) {
468 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000469 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000470 }
471 /* We're not going to resize it, but rebuild the
472 table anyway to purge old dummy entries.
473 Subtle: This is *necessary* if fill==size,
474 as lookdict needs at least one virgin slot to
475 terminate failing searches. If fill < size, it's
476 merely desirable, as dummies slow searches. */
477 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000478 memcpy(small_copy, oldtable, sizeof(small_copy));
479 oldtable = small_copy;
480 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000481 }
482 else {
483 newtable = PyMem_NEW(dictentry, newsize);
484 if (newtable == NULL) {
485 PyErr_NoMemory();
486 return -1;
487 }
488 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000489
490 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000491 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000492 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000493 mp->ma_mask = newsize - 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000494 memset(newtable, 0, sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000495 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000496 i = mp->ma_fill;
497 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000498
Tim Peters19283142001-05-17 22:25:34 +0000499 /* Copy the data over; this is refcount-neutral for active entries;
500 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000501 for (ep = oldtable; i > 0; ep++) {
502 if (ep->me_value != NULL) { /* active entry */
503 --i;
Tim Peters19283142001-05-17 22:25:34 +0000504 insertdict(mp, ep->me_key, ep->me_hash, ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000505 }
Tim Peters19283142001-05-17 22:25:34 +0000506 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000507 --i;
Tim Peters19283142001-05-17 22:25:34 +0000508 assert(ep->me_key == dummy);
509 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000510 }
Tim Peters19283142001-05-17 22:25:34 +0000511 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000512 }
513
Tim Peters0c6010b2001-05-23 23:33:57 +0000514 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000515 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000516 return 0;
517}
518
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000520PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000521{
522 long hash;
Fred Drake1bff34a2000-08-31 19:31:38 +0000523 dictobject *mp = (dictobject *)op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 if (!PyDict_Check(op)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000525 return NULL;
526 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000527 if (!PyString_CheckExact(key) ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000529 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000531 if (hash == -1) {
532 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000533 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000534 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000535 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000536 return (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000537}
538
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000539/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000540 * dictionary if it's merely replacing the value for an existing key.
541 * This means that it's safe to loop over a dictionary with PyDict_Next()
542 * and occasionally replace a value -- but you can't insert new keys or
543 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000544 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000545int
Tim Peters1f5871e2000-07-04 17:44:48 +0000546PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000547{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000548 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000549 register long hash;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000550 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000551
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000552 if (!PyDict_Check(op)) {
553 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000554 return -1;
555 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000556 mp = (dictobject *)op;
Tim Peters0ab085c2001-09-14 00:25:33 +0000557 if (PyString_CheckExact(key)) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000558 hash = ((PyStringObject *)key)->ob_shash;
559 if (hash == -1)
560 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000561 }
Tim Peters1f7df352002-03-29 03:29:08 +0000562 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000564 if (hash == -1)
565 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000566 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000567 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000568 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 Py_INCREF(value);
570 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000571 insertdict(mp, key, hash, value);
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000572 /* If we added a key, we can safely resize. Otherwise just return!
573 * If fill >= 2/3 size, adjust size. Normally, this doubles or
574 * quaduples the size, but it's also possible for the dict to shrink
Tim Peters60b29962006-01-01 01:19:23 +0000575 * (if ma_fill is much larger than ma_used, meaning a lot of dict
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000576 * keys have been * deleted).
Tim Peters60b29962006-01-01 01:19:23 +0000577 *
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000578 * Quadrupling the size improves average dictionary sparseness
579 * (reducing collisions) at the cost of some memory and iteration
580 * speed (which loops over every possible entry). It also halves
Neal Norwitz80af59c2006-05-30 04:19:21 +0000581 * the number of expensive resize operations in a growing dictionary.
Tim Peters60b29962006-01-01 01:19:23 +0000582 *
583 * Very large dictionaries (over 50K items) use doubling instead.
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000584 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000585 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000586 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
587 return 0;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000588 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000589}
590
591int
Tim Peters1f5871e2000-07-04 17:44:48 +0000592PyDict_DelItem(PyObject *op, PyObject *key)
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;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000596 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000598
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 if (!PyDict_Check(op)) {
600 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000601 return -1;
602 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000603 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000604 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000606 if (hash == -1)
607 return -1;
608 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000609 mp = (dictobject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000610 ep = (mp->ma_lookup)(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000611 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000613 return -1;
614 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000615 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000617 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000618 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000619 ep->me_value = NULL;
620 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000621 Py_DECREF(old_value);
622 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000623 return 0;
624}
625
Guido van Rossum25831651993-05-19 14:50:45 +0000626void
Tim Peters1f5871e2000-07-04 17:44:48 +0000627PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000628{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000629 dictobject *mp;
Tim Petersdea48ec2001-05-22 20:40:22 +0000630 dictentry *ep, *table;
631 int table_is_malloced;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000632 Py_ssize_t fill;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000633 dictentry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000634#ifdef Py_DEBUG
Tim Peters9b10f7e2006-05-30 04:16:25 +0000635 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000636#endif
637
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000639 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000640 mp = (dictobject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000641#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000642 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000643 i = 0;
644#endif
645
646 table = mp->ma_table;
647 assert(table != NULL);
648 table_is_malloced = table != mp->ma_smalltable;
649
650 /* This is delicate. During the process of clearing the dict,
651 * decrefs can cause the dict to mutate. To avoid fatal confusion
652 * (voice of experience), we have to make the dict empty before
653 * clearing the slots, and never refer to anything via mp->xxx while
654 * clearing.
655 */
656 fill = mp->ma_fill;
657 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000658 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000659
660 else if (fill > 0) {
661 /* It's a small table with something that needs to be cleared.
662 * Afraid the only safe way is to copy the dict entries into
663 * another small table first.
664 */
665 memcpy(small_copy, table, sizeof(small_copy));
666 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000667 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000668 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000669 /* else it's a small table that's already empty */
670
671 /* Now we can finally clear things. If C had refcounts, we could
672 * assert that the refcount on table is 1 now, i.e. that this function
673 * has unique access to it, so decref side-effects can't alter it.
674 */
675 for (ep = table; fill > 0; ++ep) {
676#ifdef Py_DEBUG
677 assert(i < n);
678 ++i;
679#endif
680 if (ep->me_key) {
681 --fill;
682 Py_DECREF(ep->me_key);
683 Py_XDECREF(ep->me_value);
684 }
685#ifdef Py_DEBUG
686 else
687 assert(ep->me_value == NULL);
688#endif
689 }
690
691 if (table_is_malloced)
692 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000693}
694
Tim Peters080c88b2003-02-15 03:01:11 +0000695/*
696 * Iterate over a dict. Use like so:
697 *
Tim Peters9b10f7e2006-05-30 04:16:25 +0000698 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000699 * PyObject *key, *value;
700 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000701 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000702 * Refer to borrowed references in key and value.
703 * }
704 *
705 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000706 * mutates the dict. One exception: it is safe if the loop merely changes
707 * the values associated with the keys (but doesn't insert new keys or
708 * delete keys), via PyDict_SetItem().
709 */
Guido van Rossum25831651993-05-19 14:50:45 +0000710int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000711PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000712{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000713 register Py_ssize_t i;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000714 register Py_ssize_t mask;
Raymond Hettinger43442782004-03-17 21:55:03 +0000715 register dictentry *ep;
716
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000718 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000719 i = *ppos;
720 if (i < 0)
721 return 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000722 ep = ((dictobject *)op)->ma_table;
723 mask = ((dictobject *)op)->ma_mask;
724 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000725 i++;
726 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000727 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000728 return 0;
729 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000730 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000731 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000732 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000733 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000734}
735
736/* Methods */
737
738static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000739dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000740{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000741 register dictentry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000742 Py_ssize_t fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000743 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000744 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000745 for (ep = mp->ma_table; fill > 0; ep++) {
746 if (ep->me_key) {
747 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000748 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000749 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000750 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000751 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000752 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000753 PyMem_DEL(mp->ma_table);
Raymond Hettinger43442782004-03-17 21:55:03 +0000754 if (num_free_dicts < MAXFREEDICTS && mp->ob_type == &PyDict_Type)
755 free_dicts[num_free_dicts++] = mp;
Tim Peters60b29962006-01-01 01:19:23 +0000756 else
Raymond Hettinger43442782004-03-17 21:55:03 +0000757 mp->ob_type->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000758 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000759}
760
761static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000762dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000763{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000764 register Py_ssize_t i;
765 register Py_ssize_t any;
Tim Peters33f4a6a2006-05-30 05:23:59 +0000766 int status;
Guido van Rossum255443b1998-04-10 22:47:14 +0000767
Tim Peters33f4a6a2006-05-30 05:23:59 +0000768 status = Py_ReprEnter((PyObject*)mp);
769 if (status != 0) {
770 if (status < 0)
771 return status;
Guido van Rossum255443b1998-04-10 22:47:14 +0000772 fprintf(fp, "{...}");
773 return 0;
774 }
775
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000776 fprintf(fp, "{");
777 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000778 for (i = 0; i <= mp->ma_mask; i++) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000779 dictentry *ep = mp->ma_table + i;
780 PyObject *pvalue = ep->me_value;
781 if (pvalue != NULL) {
782 /* Prevent PyObject_Repr from deleting value during
783 key format */
784 Py_INCREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000785 if (any++ > 0)
786 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000787 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000788 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000789 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000790 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000791 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000792 fprintf(fp, ": ");
Tim Peters19b77cf2001-06-02 08:27:39 +0000793 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000794 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000795 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000796 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000797 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000798 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000799 }
800 }
801 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000802 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000803 return 0;
804}
805
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000807dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000808{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000809 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000810 PyObject *s, *temp, *colon = NULL;
811 PyObject *pieces = NULL, *result = NULL;
812 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +0000813
Tim Petersa7259592001-06-16 05:11:17 +0000814 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +0000815 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000816 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +0000817 }
818
Tim Petersa7259592001-06-16 05:11:17 +0000819 if (mp->ma_used == 0) {
820 result = PyString_FromString("{}");
821 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000822 }
Tim Petersa7259592001-06-16 05:11:17 +0000823
824 pieces = PyList_New(0);
825 if (pieces == NULL)
826 goto Done;
827
828 colon = PyString_FromString(": ");
829 if (colon == NULL)
830 goto Done;
831
832 /* Do repr() on each key+value pair, and insert ": " between them.
833 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +0000834 i = 0;
835 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +0000836 int status;
837 /* Prevent repr from deleting value during key format. */
838 Py_INCREF(value);
839 s = PyObject_Repr(key);
840 PyString_Concat(&s, colon);
841 PyString_ConcatAndDel(&s, PyObject_Repr(value));
842 Py_DECREF(value);
843 if (s == NULL)
844 goto Done;
845 status = PyList_Append(pieces, s);
846 Py_DECREF(s); /* append created a new ref */
847 if (status < 0)
848 goto Done;
849 }
850
851 /* Add "{}" decorations to the first and last items. */
852 assert(PyList_GET_SIZE(pieces) > 0);
853 s = PyString_FromString("{");
854 if (s == NULL)
855 goto Done;
856 temp = PyList_GET_ITEM(pieces, 0);
857 PyString_ConcatAndDel(&s, temp);
858 PyList_SET_ITEM(pieces, 0, s);
859 if (s == NULL)
860 goto Done;
861
862 s = PyString_FromString("}");
863 if (s == NULL)
864 goto Done;
865 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
866 PyString_ConcatAndDel(&temp, s);
867 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
868 if (temp == NULL)
869 goto Done;
870
871 /* Paste them all together with ", " between. */
872 s = PyString_FromString(", ");
873 if (s == NULL)
874 goto Done;
875 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +0000876 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000877
878Done:
879 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000880 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +0000881 Py_ReprLeave((PyObject *)mp);
882 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000883}
884
Martin v. Löwis18e16552006-02-15 17:27:45 +0000885static Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +0000886dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000887{
888 return mp->ma_used;
889}
890
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000892dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000893{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000894 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000895 long hash;
Tim Petersdea48ec2001-05-22 20:40:22 +0000896 assert(mp->ma_table != NULL);
Tim Peters0ab085c2001-09-14 00:25:33 +0000897 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000898 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000899 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000900 if (hash == -1)
901 return NULL;
902 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000903 v = (mp->ma_lookup)(mp, key, hash) -> me_value;
Guido van Rossum1968ad32006-02-25 22:38:04 +0000904 if (v == NULL) {
905 if (!PyDict_CheckExact(mp)) {
906 /* Look up __missing__ method if we're a subclass. */
Guido van Rossum4b92a822006-02-25 23:32:30 +0000907 PyObject *missing;
Guido van Rossum1968ad32006-02-25 22:38:04 +0000908 static PyObject *missing_str = NULL;
909 if (missing_str == NULL)
Tim Peters9b10f7e2006-05-30 04:16:25 +0000910 missing_str =
Guido van Rossum1968ad32006-02-25 22:38:04 +0000911 PyString_InternFromString("__missing__");
Guido van Rossum4b92a822006-02-25 23:32:30 +0000912 missing = _PyType_Lookup(mp->ob_type, missing_str);
Guido van Rossum1968ad32006-02-25 22:38:04 +0000913 if (missing != NULL)
914 return PyObject_CallFunctionObjArgs(missing,
915 (PyObject *)mp, key, NULL);
916 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000917 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum1968ad32006-02-25 22:38:04 +0000918 return NULL;
919 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000920 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000921 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000922 return v;
923}
924
925static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000926dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000927{
928 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000930 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000932}
933
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000934static PyMappingMethods dict_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000935 (lenfunc)dict_length, /*mp_length*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000936 (binaryfunc)dict_subscript, /*mp_subscript*/
937 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000938};
939
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000941dict_keys(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000942{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000944 register Py_ssize_t i, j;
Raymond Hettinger43442782004-03-17 21:55:03 +0000945 dictentry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000946 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000947
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000948 again:
949 n = mp->ma_used;
950 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000951 if (v == NULL)
952 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000953 if (n != mp->ma_used) {
954 /* Durnit. The allocations caused the dict to resize.
955 * Just start over, this shouldn't normally happen.
956 */
957 Py_DECREF(v);
958 goto again;
959 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000960 ep = mp->ma_table;
961 mask = mp->ma_mask;
962 for (i = 0, j = 0; i <= mask; i++) {
963 if (ep[i].me_value != NULL) {
964 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000966 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000967 j++;
968 }
969 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000970 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000971 return v;
972}
973
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000975dict_values(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000976{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000978 register Py_ssize_t i, j;
Raymond Hettinger43442782004-03-17 21:55:03 +0000979 dictentry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000980 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000981
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000982 again:
983 n = mp->ma_used;
984 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000985 if (v == NULL)
986 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000987 if (n != mp->ma_used) {
988 /* Durnit. The allocations caused the dict to resize.
989 * Just start over, this shouldn't normally happen.
990 */
991 Py_DECREF(v);
992 goto again;
993 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000994 ep = mp->ma_table;
995 mask = mp->ma_mask;
996 for (i = 0, j = 0; i <= mask; i++) {
997 if (ep[i].me_value != NULL) {
998 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001000 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001001 j++;
1002 }
1003 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001004 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001005 return v;
1006}
1007
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001008static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001009dict_items(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001010{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001012 register Py_ssize_t i, j, n;
1013 Py_ssize_t mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001014 PyObject *item, *key, *value;
Raymond Hettinger43442782004-03-17 21:55:03 +00001015 dictentry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001016
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001017 /* Preallocate the list of tuples, to avoid allocations during
1018 * the loop over the items, which could trigger GC, which
1019 * could resize the dict. :-(
1020 */
1021 again:
1022 n = mp->ma_used;
1023 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001024 if (v == NULL)
1025 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001026 for (i = 0; i < n; i++) {
1027 item = PyTuple_New(2);
1028 if (item == NULL) {
1029 Py_DECREF(v);
1030 return NULL;
1031 }
1032 PyList_SET_ITEM(v, i, item);
1033 }
1034 if (n != mp->ma_used) {
1035 /* Durnit. The allocations caused the dict to resize.
1036 * Just start over, this shouldn't normally happen.
1037 */
1038 Py_DECREF(v);
1039 goto again;
1040 }
1041 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001042 ep = mp->ma_table;
1043 mask = mp->ma_mask;
1044 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001045 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001046 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001047 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001049 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001051 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001052 j++;
1053 }
1054 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001055 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001056 return v;
1057}
1058
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001059static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001060dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001061{
1062 PyObject *seq;
1063 PyObject *value = Py_None;
1064 PyObject *it; /* iter(seq) */
1065 PyObject *key;
1066 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001067 int status;
1068
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001069 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001070 return NULL;
1071
1072 d = PyObject_CallObject(cls, NULL);
1073 if (d == NULL)
1074 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001075
1076 it = PyObject_GetIter(seq);
1077 if (it == NULL){
1078 Py_DECREF(d);
1079 return NULL;
1080 }
1081
1082 for (;;) {
1083 key = PyIter_Next(it);
1084 if (key == NULL) {
1085 if (PyErr_Occurred())
1086 goto Fail;
1087 break;
1088 }
Raymond Hettingere03e5b12002-12-07 08:10:51 +00001089 status = PyObject_SetItem(d, key, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001090 Py_DECREF(key);
1091 if (status < 0)
1092 goto Fail;
1093 }
1094
1095 Py_DECREF(it);
1096 return d;
1097
1098Fail:
1099 Py_DECREF(it);
1100 Py_DECREF(d);
1101 return NULL;
1102}
1103
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001104static int
1105dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001106{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001107 PyObject *arg = NULL;
1108 int result = 0;
1109
1110 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1111 result = -1;
1112
1113 else if (arg != NULL) {
1114 if (PyObject_HasAttrString(arg, "keys"))
1115 result = PyDict_Merge(self, arg, 1);
1116 else
1117 result = PyDict_MergeFromSeq2(self, arg, 1);
1118 }
1119 if (result == 0 && kwds != NULL)
1120 result = PyDict_Merge(self, kwds, 1);
1121 return result;
1122}
1123
1124static PyObject *
1125dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1126{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001127 if (dict_update_common(self, args, kwds, "update") != -1)
1128 Py_RETURN_NONE;
1129 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001130}
1131
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001132/* Update unconditionally replaces existing items.
1133 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001134 otherwise it leaves existing items unchanged.
1135
1136 PyDict_{Update,Merge} update/merge from a mapping object.
1137
Tim Petersf582b822001-12-11 18:51:08 +00001138 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001139 producing iterable objects of length 2.
1140*/
1141
Tim Petersf582b822001-12-11 18:51:08 +00001142int
Tim Peters1fc240e2001-10-26 05:06:50 +00001143PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1144{
1145 PyObject *it; /* iter(seq2) */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001146 Py_ssize_t i; /* index into seq2 of current element */
Tim Peters1fc240e2001-10-26 05:06:50 +00001147 PyObject *item; /* seq2[i] */
1148 PyObject *fast; /* item as a 2-tuple or 2-list */
1149
1150 assert(d != NULL);
1151 assert(PyDict_Check(d));
1152 assert(seq2 != NULL);
1153
1154 it = PyObject_GetIter(seq2);
1155 if (it == NULL)
1156 return -1;
1157
1158 for (i = 0; ; ++i) {
1159 PyObject *key, *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001160 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001161
1162 fast = NULL;
1163 item = PyIter_Next(it);
1164 if (item == NULL) {
1165 if (PyErr_Occurred())
1166 goto Fail;
1167 break;
1168 }
1169
1170 /* Convert item to sequence, and verify length 2. */
1171 fast = PySequence_Fast(item, "");
1172 if (fast == NULL) {
1173 if (PyErr_ExceptionMatches(PyExc_TypeError))
1174 PyErr_Format(PyExc_TypeError,
1175 "cannot convert dictionary update "
Neal Norwitzd3881b02006-05-30 04:25:05 +00001176 "sequence element #%zd to a sequence",
Tim Peters1fc240e2001-10-26 05:06:50 +00001177 i);
1178 goto Fail;
1179 }
1180 n = PySequence_Fast_GET_SIZE(fast);
1181 if (n != 2) {
1182 PyErr_Format(PyExc_ValueError,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001183 "dictionary update sequence element #%zd "
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00001184 "has length %zd; 2 is required",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00001185 i, n);
Tim Peters1fc240e2001-10-26 05:06:50 +00001186 goto Fail;
1187 }
1188
1189 /* Update/merge with this (key, value) pair. */
1190 key = PySequence_Fast_GET_ITEM(fast, 0);
1191 value = PySequence_Fast_GET_ITEM(fast, 1);
1192 if (override || PyDict_GetItem(d, key) == NULL) {
1193 int status = PyDict_SetItem(d, key, value);
1194 if (status < 0)
1195 goto Fail;
1196 }
1197 Py_DECREF(fast);
1198 Py_DECREF(item);
1199 }
1200
1201 i = 0;
1202 goto Return;
1203Fail:
1204 Py_XDECREF(item);
1205 Py_XDECREF(fast);
1206 i = -1;
1207Return:
1208 Py_DECREF(it);
Neal Norwitzd3881b02006-05-30 04:25:05 +00001209 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001210}
1211
Tim Peters6d6c1a32001-08-02 04:15:00 +00001212int
1213PyDict_Update(PyObject *a, PyObject *b)
1214{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001215 return PyDict_Merge(a, b, 1);
1216}
1217
1218int
1219PyDict_Merge(PyObject *a, PyObject *b, int override)
1220{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001221 register PyDictObject *mp, *other;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001222 register Py_ssize_t i;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001223 dictentry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001224
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001225 /* We accept for the argument either a concrete dictionary object,
1226 * or an abstract "mapping" object. For the former, we can do
1227 * things quite efficiently. For the latter, we only require that
1228 * PyMapping_Keys() and PyObject_GetItem() be supported.
1229 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001230 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1231 PyErr_BadInternalCall();
1232 return -1;
1233 }
1234 mp = (dictobject*)a;
1235 if (PyDict_Check(b)) {
1236 other = (dictobject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001237 if (other == mp || other->ma_used == 0)
1238 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001239 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001240 if (mp->ma_used == 0)
1241 /* Since the target dict is empty, PyDict_GetItem()
1242 * always returns NULL. Setting override to 1
1243 * skips the unnecessary test.
1244 */
1245 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001246 /* Do one big resize at the start, rather than
1247 * incrementally resizing as we insert new items. Expect
1248 * that there will be no (or few) overlapping keys.
1249 */
1250 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001251 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001252 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001253 }
1254 for (i = 0; i <= other->ma_mask; i++) {
1255 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001256 if (entry->me_value != NULL &&
1257 (override ||
1258 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001259 Py_INCREF(entry->me_key);
1260 Py_INCREF(entry->me_value);
Tim Peters9b10f7e2006-05-30 04:16:25 +00001261 insertdict(mp, entry->me_key,
1262 (long)entry->me_hash,
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001263 entry->me_value);
1264 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001265 }
1266 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001267 else {
1268 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001269 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001270 PyObject *iter;
1271 PyObject *key, *value;
1272 int status;
1273
1274 if (keys == NULL)
1275 /* Docstring says this is equivalent to E.keys() so
1276 * if E doesn't have a .keys() method we want
1277 * AttributeError to percolate up. Might as well
1278 * do the same for any other error.
1279 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001280 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001281
1282 iter = PyObject_GetIter(keys);
1283 Py_DECREF(keys);
1284 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001285 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001286
1287 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001288 if (!override && PyDict_GetItem(a, key) != NULL) {
1289 Py_DECREF(key);
1290 continue;
1291 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001292 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001293 if (value == NULL) {
1294 Py_DECREF(iter);
1295 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001296 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001297 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001298 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001299 Py_DECREF(key);
1300 Py_DECREF(value);
1301 if (status < 0) {
1302 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001303 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001304 }
1305 }
1306 Py_DECREF(iter);
1307 if (PyErr_Occurred())
1308 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001309 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001310 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001311 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001312}
1313
1314static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001315dict_copy(register dictobject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001316{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001317 return PyDict_Copy((PyObject*)mp);
1318}
1319
1320PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001321PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001322{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001323 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001324
1325 if (o == NULL || !PyDict_Check(o)) {
1326 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001327 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001328 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001329 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001330 if (copy == NULL)
1331 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001332 if (PyDict_Merge(copy, o, 1) == 0)
1333 return copy;
1334 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001335 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001336}
1337
Martin v. Löwis18e16552006-02-15 17:27:45 +00001338Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001339PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001340{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001341 if (mp == NULL || !PyDict_Check(mp)) {
1342 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001343 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001344 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001345 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001346}
1347
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001349PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001350{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001351 if (mp == NULL || !PyDict_Check(mp)) {
1352 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001353 return NULL;
1354 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001355 return dict_keys((dictobject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001356}
1357
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001359PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001360{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361 if (mp == NULL || !PyDict_Check(mp)) {
1362 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001363 return NULL;
1364 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001365 return dict_values((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001366}
1367
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001368PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001369PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001370{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371 if (mp == NULL || !PyDict_Check(mp)) {
1372 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001373 return NULL;
1374 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001375 return dict_items((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001376}
1377
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001378/* Subroutine which returns the smallest key in a for which b's value
1379 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001380 pval argument. Both are NULL if no key in a is found for which b's status
1381 differs. The refcounts on (and only on) non-NULL *pval and function return
1382 values must be decremented by the caller (characterize() increments them
1383 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1384 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001385
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001387characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001388{
Tim Peters95bf9392001-05-10 08:32:44 +00001389 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1390 PyObject *aval = NULL; /* a[akey] */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001391 Py_ssize_t i;
1392 int cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001393
Tim Petersafb6ae82001-06-04 21:00:21 +00001394 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001395 PyObject *thiskey, *thisaval, *thisbval;
1396 if (a->ma_table[i].me_value == NULL)
1397 continue;
1398 thiskey = a->ma_table[i].me_key;
1399 Py_INCREF(thiskey); /* keep alive across compares */
1400 if (akey != NULL) {
1401 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1402 if (cmp < 0) {
1403 Py_DECREF(thiskey);
1404 goto Fail;
1405 }
1406 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001407 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001408 a->ma_table[i].me_value == NULL)
1409 {
1410 /* Not the *smallest* a key; or maybe it is
1411 * but the compare shrunk the dict so we can't
1412 * find its associated value anymore; or
1413 * maybe it is but the compare deleted the
1414 * a[thiskey] entry.
Neal Norwitzd3881b02006-05-30 04:25:05 +00001415 */
Tim Peters95bf9392001-05-10 08:32:44 +00001416 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001417 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001418 }
Tim Peters95bf9392001-05-10 08:32:44 +00001419 }
1420
1421 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1422 thisaval = a->ma_table[i].me_value;
1423 assert(thisaval);
1424 Py_INCREF(thisaval); /* keep alive */
1425 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1426 if (thisbval == NULL)
1427 cmp = 0;
1428 else {
1429 /* both dicts have thiskey: same values? */
1430 cmp = PyObject_RichCompareBool(
1431 thisaval, thisbval, Py_EQ);
1432 if (cmp < 0) {
1433 Py_DECREF(thiskey);
1434 Py_DECREF(thisaval);
1435 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001436 }
1437 }
Tim Peters95bf9392001-05-10 08:32:44 +00001438 if (cmp == 0) {
1439 /* New winner. */
1440 Py_XDECREF(akey);
1441 Py_XDECREF(aval);
1442 akey = thiskey;
1443 aval = thisaval;
1444 }
1445 else {
1446 Py_DECREF(thiskey);
1447 Py_DECREF(thisaval);
1448 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001449 }
Tim Peters95bf9392001-05-10 08:32:44 +00001450 *pval = aval;
1451 return akey;
1452
1453Fail:
1454 Py_XDECREF(akey);
1455 Py_XDECREF(aval);
1456 *pval = NULL;
1457 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001458}
1459
1460static int
Tim Peters1f5871e2000-07-04 17:44:48 +00001461dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001462{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001463 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001464 int res;
1465
1466 /* Compare lengths first */
1467 if (a->ma_used < b->ma_used)
1468 return -1; /* a is shorter */
1469 else if (a->ma_used > b->ma_used)
1470 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001471
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001472 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001473 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001474 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001475 if (adiff == NULL) {
1476 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001477 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001478 * must be equal.
1479 */
1480 res = PyErr_Occurred() ? -1 : 0;
1481 goto Finished;
1482 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001483 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001484 if (bdiff == NULL && PyErr_Occurred()) {
1485 assert(!bval);
1486 res = -1;
1487 goto Finished;
1488 }
1489 res = 0;
1490 if (bdiff) {
1491 /* bdiff == NULL "should be" impossible now, but perhaps
1492 * the last comparison done by the characterize() on a had
1493 * the side effect of making the dicts equal!
1494 */
1495 res = PyObject_Compare(adiff, bdiff);
1496 }
1497 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001498 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001499
1500Finished:
1501 Py_XDECREF(adiff);
1502 Py_XDECREF(bdiff);
1503 Py_XDECREF(aval);
1504 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001505 return res;
1506}
1507
Tim Peterse63415e2001-05-08 04:38:29 +00001508/* Return 1 if dicts equal, 0 if not, -1 if error.
1509 * Gets out as soon as any difference is detected.
1510 * Uses only Py_EQ comparison.
1511 */
1512static int
1513dict_equal(dictobject *a, dictobject *b)
1514{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001515 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001516
1517 if (a->ma_used != b->ma_used)
1518 /* can't be equal if # of entries differ */
1519 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001520
Tim Peterse63415e2001-05-08 04:38:29 +00001521 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001522 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001523 PyObject *aval = a->ma_table[i].me_value;
1524 if (aval != NULL) {
1525 int cmp;
1526 PyObject *bval;
1527 PyObject *key = a->ma_table[i].me_key;
1528 /* temporarily bump aval's refcount to ensure it stays
1529 alive until we're done with it */
1530 Py_INCREF(aval);
1531 bval = PyDict_GetItem((PyObject *)b, key);
1532 if (bval == NULL) {
1533 Py_DECREF(aval);
1534 return 0;
1535 }
1536 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1537 Py_DECREF(aval);
1538 if (cmp <= 0) /* error or not equal */
1539 return cmp;
1540 }
1541 }
1542 return 1;
1543 }
1544
1545static PyObject *
1546dict_richcompare(PyObject *v, PyObject *w, int op)
1547{
1548 int cmp;
1549 PyObject *res;
1550
1551 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1552 res = Py_NotImplemented;
1553 }
1554 else if (op == Py_EQ || op == Py_NE) {
1555 cmp = dict_equal((dictobject *)v, (dictobject *)w);
1556 if (cmp < 0)
1557 return NULL;
1558 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1559 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001560 else
1561 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001562 Py_INCREF(res);
1563 return res;
1564 }
1565
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001567dict_has_key(register dictobject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001568{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001569 long hash;
1570 register long ok;
Tim Peters0ab085c2001-09-14 00:25:33 +00001571 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001572 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001573 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001574 if (hash == -1)
1575 return NULL;
1576 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001577 ok = (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001578 return PyBool_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001579}
1580
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001581static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001582dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001583{
1584 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001585 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001586 PyObject *val = NULL;
1587 long hash;
1588
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001589 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001590 return NULL;
1591
Tim Peters0ab085c2001-09-14 00:25:33 +00001592 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001593 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001594 hash = PyObject_Hash(key);
1595 if (hash == -1)
1596 return NULL;
1597 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001598 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001599
Barry Warsawc38c5da1997-10-06 17:49:20 +00001600 if (val == NULL)
1601 val = failobj;
1602 Py_INCREF(val);
1603 return val;
1604}
1605
1606
1607static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001608dict_setdefault(register dictobject *mp, PyObject *args)
1609{
1610 PyObject *key;
1611 PyObject *failobj = Py_None;
1612 PyObject *val = NULL;
1613 long hash;
1614
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001615 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001616 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001617
Tim Peters0ab085c2001-09-14 00:25:33 +00001618 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001619 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001620 hash = PyObject_Hash(key);
1621 if (hash == -1)
1622 return NULL;
1623 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001624 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001625 if (val == NULL) {
1626 val = failobj;
1627 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1628 val = NULL;
1629 }
1630 Py_XINCREF(val);
1631 return val;
1632}
1633
1634
1635static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001636dict_clear(register dictobject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001637{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001638 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001639 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001640}
1641
Guido van Rossumba6ab842000-12-12 22:02:18 +00001642static PyObject *
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001643dict_pop(dictobject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001644{
1645 long hash;
1646 dictentry *ep;
1647 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001648 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001649
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001650 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1651 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001652 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001653 if (deflt) {
1654 Py_INCREF(deflt);
1655 return deflt;
1656 }
Guido van Rossume027d982002-04-12 15:11:59 +00001657 PyErr_SetString(PyExc_KeyError,
1658 "pop(): dictionary is empty");
1659 return NULL;
1660 }
1661 if (!PyString_CheckExact(key) ||
1662 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1663 hash = PyObject_Hash(key);
1664 if (hash == -1)
1665 return NULL;
1666 }
1667 ep = (mp->ma_lookup)(mp, key, hash);
1668 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001669 if (deflt) {
1670 Py_INCREF(deflt);
1671 return deflt;
1672 }
Guido van Rossume027d982002-04-12 15:11:59 +00001673 PyErr_SetObject(PyExc_KeyError, key);
1674 return NULL;
1675 }
1676 old_key = ep->me_key;
1677 Py_INCREF(dummy);
1678 ep->me_key = dummy;
1679 old_value = ep->me_value;
1680 ep->me_value = NULL;
1681 mp->ma_used--;
1682 Py_DECREF(old_key);
1683 return old_value;
1684}
1685
1686static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001687dict_popitem(dictobject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001688{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001689 Py_ssize_t i = 0;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001690 dictentry *ep;
1691 PyObject *res;
1692
Tim Petersf4b33f62001-06-02 05:42:29 +00001693 /* Allocate the result tuple before checking the size. Believe it
1694 * or not, this allocation could trigger a garbage collection which
1695 * could empty the dict, so if we checked the size first and that
1696 * happened, the result would be an infinite loop (searching for an
1697 * entry that no longer exists). Note that the usual popitem()
1698 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Tim Peters9b10f7e2006-05-30 04:16:25 +00001699 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00001700 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001701 */
1702 res = PyTuple_New(2);
1703 if (res == NULL)
1704 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001705 if (mp->ma_used == 0) {
1706 Py_DECREF(res);
1707 PyErr_SetString(PyExc_KeyError,
1708 "popitem(): dictionary is empty");
1709 return NULL;
1710 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001711 /* Set ep to "the first" dict entry with a value. We abuse the hash
1712 * field of slot 0 to hold a search finger:
1713 * If slot 0 has a value, use slot 0.
1714 * Else slot 0 is being used to hold a search finger,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001715 * and we use its hash value as the first index to look.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001716 */
1717 ep = &mp->ma_table[0];
1718 if (ep->me_value == NULL) {
Tim Peters9b10f7e2006-05-30 04:16:25 +00001719 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001720 /* The hash field may be a real hash value, or it may be a
1721 * legit search finger, or it may be a once-legit search
1722 * finger that's out of bounds now because it wrapped around
1723 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001724 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001725 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001726 i = 1; /* skip slot 0 */
1727 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1728 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001729 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001730 i = 1;
1731 }
1732 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001733 PyTuple_SET_ITEM(res, 0, ep->me_key);
1734 PyTuple_SET_ITEM(res, 1, ep->me_value);
1735 Py_INCREF(dummy);
1736 ep->me_key = dummy;
1737 ep->me_value = NULL;
1738 mp->ma_used--;
1739 assert(mp->ma_table[0].me_value == NULL);
1740 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001741 return res;
1742}
1743
Jeremy Hylton8caad492000-06-23 14:18:11 +00001744static int
1745dict_traverse(PyObject *op, visitproc visit, void *arg)
1746{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001747 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001748 PyObject *pk;
1749 PyObject *pv;
1750
1751 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Woutersc6e55062006-04-15 21:47:09 +00001752 Py_VISIT(pk);
1753 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00001754 }
1755 return 0;
1756}
1757
1758static int
1759dict_tp_clear(PyObject *op)
1760{
1761 PyDict_Clear(op);
1762 return 0;
1763}
1764
Tim Petersf7f88b12000-12-13 23:18:45 +00001765
Raymond Hettinger019a1482004-03-18 02:41:19 +00001766extern PyTypeObject PyDictIterKey_Type; /* Forward */
1767extern PyTypeObject PyDictIterValue_Type; /* Forward */
1768extern PyTypeObject PyDictIterItem_Type; /* Forward */
1769static PyObject *dictiter_new(dictobject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001770
1771static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001772dict_iterkeys(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001773{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001774 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001775}
1776
1777static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001778dict_itervalues(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001779{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001780 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001781}
1782
1783static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001784dict_iteritems(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001785{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001786 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001787}
1788
1789
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001790PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00001791"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00001792
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001793PyDoc_STRVAR(contains__doc__,
1794"D.__contains__(k) -> True if D has a key k, else False");
1795
1796PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001798PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001799"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001800
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001801PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001802"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 +00001803
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001804PyDoc_STRVAR(pop__doc__,
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001805"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
1806If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001807
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001808PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001809"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000018102-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00001811
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001812PyDoc_STRVAR(keys__doc__,
1813"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00001814
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001815PyDoc_STRVAR(items__doc__,
1816"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00001817
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001818PyDoc_STRVAR(values__doc__,
1819"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00001820
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001821PyDoc_STRVAR(update__doc__,
Walter Dörwaldd70ad8a2004-05-28 20:59:21 +00001822"D.update(E, **F) -> None. Update D from E and F: for k in E: D[k] = E[k]\n\
1823(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 +00001824
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001825PyDoc_STRVAR(fromkeys__doc__,
1826"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1827v defaults to None.");
1828
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001829PyDoc_STRVAR(clear__doc__,
1830"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001831
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001832PyDoc_STRVAR(copy__doc__,
1833"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001834
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001835PyDoc_STRVAR(iterkeys__doc__,
1836"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001837
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001838PyDoc_STRVAR(itervalues__doc__,
1839"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001840
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001841PyDoc_STRVAR(iteritems__doc__,
1842"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001843
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001844static PyMethodDef mapp_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001845 {"__contains__",(PyCFunction)dict_has_key, METH_O | METH_COEXIST,
1846 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00001847 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001848 getitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001849 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001850 has_key__doc__},
1851 {"get", (PyCFunction)dict_get, METH_VARARGS,
1852 get__doc__},
1853 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1854 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001855 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00001856 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001857 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001858 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001859 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001860 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001861 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001862 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001863 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001864 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001865 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001866 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001867 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
1868 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001869 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001870 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001871 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001872 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001873 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001874 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001875 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001876 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001877 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001878 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00001879 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001880};
1881
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001882int
1883PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001884{
1885 long hash;
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001886 dictobject *mp = (dictobject *)op;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001887
Tim Peters0ab085c2001-09-14 00:25:33 +00001888 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001889 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001890 hash = PyObject_Hash(key);
1891 if (hash == -1)
1892 return -1;
1893 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001894 return (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001895}
1896
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001897/* Hack to implement "key in dict" */
1898static PySequenceMethods dict_as_sequence = {
Georg Brandl347b3002006-03-30 11:57:00 +00001899 0, /* sq_length */
1900 0, /* sq_concat */
1901 0, /* sq_repeat */
1902 0, /* sq_item */
1903 0, /* sq_slice */
1904 0, /* sq_ass_item */
1905 0, /* sq_ass_slice */
1906 PyDict_Contains, /* sq_contains */
1907 0, /* sq_inplace_concat */
1908 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001909};
1910
Guido van Rossum09e563a2001-05-01 12:10:21 +00001911static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001912dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1913{
1914 PyObject *self;
1915
1916 assert(type != NULL && type->tp_alloc != NULL);
1917 self = type->tp_alloc(type, 0);
1918 if (self != NULL) {
1919 PyDictObject *d = (PyDictObject *)self;
1920 /* It's guaranteed that tp->alloc zeroed out the struct. */
1921 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
1922 INIT_NONZERO_DICT_SLOTS(d);
1923 d->ma_lookup = lookdict_string;
1924#ifdef SHOW_CONVERSION_COUNTS
1925 ++created;
1926#endif
1927 }
1928 return self;
1929}
1930
Tim Peters25786c02001-09-02 08:22:48 +00001931static int
1932dict_init(PyObject *self, PyObject *args, PyObject *kwds)
1933{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001934 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00001935}
1936
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001937static long
1938dict_nohash(PyObject *self)
1939{
1940 PyErr_SetString(PyExc_TypeError, "dict objects are unhashable");
1941 return -1;
1942}
1943
Tim Peters6d6c1a32001-08-02 04:15:00 +00001944static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00001945dict_iter(dictobject *dict)
1946{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001947 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001948}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001949
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001950PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00001951"dict() -> new empty dictionary.\n"
1952"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00001953" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00001954"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00001955" d = {}\n"
1956" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00001957" d[k] = v\n"
1958"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
1959" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00001960
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001961PyTypeObject PyDict_Type = {
1962 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001963 0,
Tim Petersa427a2b2001-10-29 22:25:45 +00001964 "dict",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001965 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001966 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00001967 (destructor)dict_dealloc, /* tp_dealloc */
1968 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001969 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00001970 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00001971 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00001972 (reprfunc)dict_repr, /* tp_repr */
1973 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001974 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00001975 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001976 dict_nohash, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00001977 0, /* tp_call */
1978 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001979 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00001980 0, /* tp_setattro */
1981 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001982 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00001983 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00001984 dictionary_doc, /* tp_doc */
Georg Brandl347b3002006-03-30 11:57:00 +00001985 dict_traverse, /* tp_traverse */
1986 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00001987 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001988 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00001989 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001990 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001991 mapp_methods, /* tp_methods */
1992 0, /* tp_members */
1993 0, /* tp_getset */
1994 0, /* tp_base */
1995 0, /* tp_dict */
1996 0, /* tp_descr_get */
1997 0, /* tp_descr_set */
1998 0, /* tp_dictoffset */
Georg Brandl347b3002006-03-30 11:57:00 +00001999 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002000 PyType_GenericAlloc, /* tp_alloc */
2001 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002002 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002003};
2004
Guido van Rossum3cca2451997-05-16 14:23:33 +00002005/* For backward compatibility with old dictionary interface */
2006
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002007PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002008PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002009{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002010 PyObject *kv, *rv;
2011 kv = PyString_FromString(key);
2012 if (kv == NULL)
2013 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002014 rv = PyDict_GetItem(v, kv);
2015 Py_DECREF(kv);
2016 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002017}
2018
2019int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002020PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002021{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002022 PyObject *kv;
2023 int err;
2024 kv = PyString_FromString(key);
2025 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002026 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00002027 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002028 err = PyDict_SetItem(v, kv, item);
2029 Py_DECREF(kv);
2030 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002031}
2032
2033int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002034PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002035{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002036 PyObject *kv;
2037 int err;
2038 kv = PyString_FromString(key);
2039 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002040 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002041 err = PyDict_DelItem(v, kv);
2042 Py_DECREF(kv);
2043 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002044}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002045
Raymond Hettinger019a1482004-03-18 02:41:19 +00002046/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002047
2048typedef struct {
2049 PyObject_HEAD
Guido van Rossum2147df72002-07-16 20:30:22 +00002050 dictobject *di_dict; /* Set to NULL when iterator is exhausted */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002051 Py_ssize_t di_used;
2052 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002053 PyObject* di_result; /* reusable result tuple for iteritems */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002054 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002055} dictiterobject;
2056
2057static PyObject *
Raymond Hettinger019a1482004-03-18 02:41:19 +00002058dictiter_new(dictobject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002059{
2060 dictiterobject *di;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002061 di = PyObject_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002062 if (di == NULL)
2063 return NULL;
2064 Py_INCREF(dict);
2065 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002066 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002067 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002068 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002069 if (itertype == &PyDictIterItem_Type) {
2070 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2071 if (di->di_result == NULL) {
2072 Py_DECREF(di);
2073 return NULL;
2074 }
2075 }
2076 else
2077 di->di_result = NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002078 return (PyObject *)di;
2079}
2080
2081static void
2082dictiter_dealloc(dictiterobject *di)
2083{
Guido van Rossum2147df72002-07-16 20:30:22 +00002084 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002085 Py_XDECREF(di->di_result);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002086 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002087}
2088
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002089static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002090dictiter_len(dictiterobject *di)
2091{
Tim Peters9b10f7e2006-05-30 04:16:25 +00002092 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002093 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002094 len = di->len;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002095 return PyInt_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002096}
2097
Armin Rigof5b3e362006-02-11 21:32:43 +00002098PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002099
2100static PyMethodDef dictiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002101 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002102 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002103};
2104
Raymond Hettinger019a1482004-03-18 02:41:19 +00002105static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002106{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002107 PyObject *key;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002108 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002109 register dictentry *ep;
2110 dictobject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002111
Raymond Hettinger019a1482004-03-18 02:41:19 +00002112 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002113 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002114 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002115
Raymond Hettinger019a1482004-03-18 02:41:19 +00002116 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002117 PyErr_SetString(PyExc_RuntimeError,
2118 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002119 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002120 return NULL;
2121 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002122
Raymond Hettinger019a1482004-03-18 02:41:19 +00002123 i = di->di_pos;
2124 if (i < 0)
2125 goto fail;
2126 ep = d->ma_table;
2127 mask = d->ma_mask;
2128 while (i <= mask && ep[i].me_value == NULL)
2129 i++;
2130 di->di_pos = i+1;
2131 if (i > mask)
2132 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002133 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002134 key = ep[i].me_key;
2135 Py_INCREF(key);
2136 return key;
2137
2138fail:
2139 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002140 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002141 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002142}
2143
Raymond Hettinger019a1482004-03-18 02:41:19 +00002144PyTypeObject PyDictIterKey_Type = {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002145 PyObject_HEAD_INIT(&PyType_Type)
2146 0, /* ob_size */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002147 "dictionary-keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002148 sizeof(dictiterobject), /* tp_basicsize */
2149 0, /* tp_itemsize */
2150 /* methods */
2151 (destructor)dictiter_dealloc, /* tp_dealloc */
2152 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002153 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002154 0, /* tp_setattr */
2155 0, /* tp_compare */
2156 0, /* tp_repr */
2157 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002158 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002159 0, /* tp_as_mapping */
2160 0, /* tp_hash */
2161 0, /* tp_call */
2162 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002163 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002164 0, /* tp_setattro */
2165 0, /* tp_as_buffer */
2166 Py_TPFLAGS_DEFAULT, /* tp_flags */
2167 0, /* tp_doc */
2168 0, /* tp_traverse */
2169 0, /* tp_clear */
2170 0, /* tp_richcompare */
2171 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002172 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002173 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002174 dictiter_methods, /* tp_methods */
2175 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002176};
2177
2178static PyObject *dictiter_iternextvalue(dictiterobject *di)
2179{
2180 PyObject *value;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002181 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002182 register dictentry *ep;
2183 dictobject *d = di->di_dict;
2184
2185 if (d == NULL)
2186 return NULL;
2187 assert (PyDict_Check(d));
2188
2189 if (di->di_used != d->ma_used) {
2190 PyErr_SetString(PyExc_RuntimeError,
2191 "dictionary changed size during iteration");
2192 di->di_used = -1; /* Make this state sticky */
2193 return NULL;
2194 }
2195
2196 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002197 mask = d->ma_mask;
2198 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002199 goto fail;
2200 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002201 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002202 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002203 if (i > mask)
2204 goto fail;
2205 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002206 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002207 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002208 Py_INCREF(value);
2209 return value;
2210
2211fail:
2212 Py_DECREF(d);
2213 di->di_dict = NULL;
2214 return NULL;
2215}
2216
2217PyTypeObject PyDictIterValue_Type = {
2218 PyObject_HEAD_INIT(&PyType_Type)
2219 0, /* ob_size */
2220 "dictionary-valueiterator", /* tp_name */
2221 sizeof(dictiterobject), /* tp_basicsize */
2222 0, /* tp_itemsize */
2223 /* methods */
2224 (destructor)dictiter_dealloc, /* tp_dealloc */
2225 0, /* tp_print */
2226 0, /* tp_getattr */
2227 0, /* tp_setattr */
2228 0, /* tp_compare */
2229 0, /* tp_repr */
2230 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002231 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002232 0, /* tp_as_mapping */
2233 0, /* tp_hash */
2234 0, /* tp_call */
2235 0, /* tp_str */
2236 PyObject_GenericGetAttr, /* tp_getattro */
2237 0, /* tp_setattro */
2238 0, /* tp_as_buffer */
2239 Py_TPFLAGS_DEFAULT, /* tp_flags */
2240 0, /* tp_doc */
2241 0, /* tp_traverse */
2242 0, /* tp_clear */
2243 0, /* tp_richcompare */
2244 0, /* tp_weaklistoffset */
2245 PyObject_SelfIter, /* tp_iter */
2246 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002247 dictiter_methods, /* tp_methods */
2248 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002249};
2250
2251static PyObject *dictiter_iternextitem(dictiterobject *di)
2252{
2253 PyObject *key, *value, *result = di->di_result;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002254 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002255 register dictentry *ep;
2256 dictobject *d = di->di_dict;
2257
2258 if (d == NULL)
2259 return NULL;
2260 assert (PyDict_Check(d));
2261
2262 if (di->di_used != d->ma_used) {
2263 PyErr_SetString(PyExc_RuntimeError,
2264 "dictionary changed size during iteration");
2265 di->di_used = -1; /* Make this state sticky */
2266 return NULL;
2267 }
2268
2269 i = di->di_pos;
2270 if (i < 0)
2271 goto fail;
2272 ep = d->ma_table;
2273 mask = d->ma_mask;
2274 while (i <= mask && ep[i].me_value == NULL)
2275 i++;
2276 di->di_pos = i+1;
2277 if (i > mask)
2278 goto fail;
2279
2280 if (result->ob_refcnt == 1) {
2281 Py_INCREF(result);
2282 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2283 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2284 } else {
2285 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002286 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002287 return NULL;
2288 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002289 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002290 key = ep[i].me_key;
2291 value = ep[i].me_value;
2292 Py_INCREF(key);
2293 Py_INCREF(value);
2294 PyTuple_SET_ITEM(result, 0, key);
2295 PyTuple_SET_ITEM(result, 1, value);
2296 return result;
2297
2298fail:
2299 Py_DECREF(d);
2300 di->di_dict = NULL;
2301 return NULL;
2302}
2303
2304PyTypeObject PyDictIterItem_Type = {
2305 PyObject_HEAD_INIT(&PyType_Type)
2306 0, /* ob_size */
2307 "dictionary-itemiterator", /* tp_name */
2308 sizeof(dictiterobject), /* tp_basicsize */
2309 0, /* tp_itemsize */
2310 /* methods */
2311 (destructor)dictiter_dealloc, /* tp_dealloc */
2312 0, /* tp_print */
2313 0, /* tp_getattr */
2314 0, /* tp_setattr */
2315 0, /* tp_compare */
2316 0, /* tp_repr */
2317 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002318 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002319 0, /* tp_as_mapping */
2320 0, /* tp_hash */
2321 0, /* tp_call */
2322 0, /* tp_str */
2323 PyObject_GenericGetAttr, /* tp_getattro */
2324 0, /* tp_setattro */
2325 0, /* tp_as_buffer */
2326 Py_TPFLAGS_DEFAULT, /* tp_flags */
2327 0, /* tp_doc */
2328 0, /* tp_traverse */
2329 0, /* tp_clear */
2330 0, /* tp_richcompare */
2331 0, /* tp_weaklistoffset */
2332 PyObject_SelfIter, /* tp_iter */
2333 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002334 dictiter_methods, /* tp_methods */
2335 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002336};