blob: 70f05e5def3721d54390990f46c3e4a0b4276345 [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,
5 describing explorations into dictionary design and optimization.
6 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.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000113*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000114
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000115/* Object used as dummy key to fill deleted entries */
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000116static PyObject *dummy; /* Initialized by first call to newdictobject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000117
Fred Drake1bff34a2000-08-31 19:31:38 +0000118/* forward declarations */
119static dictentry *
120lookdict_string(dictobject *mp, PyObject *key, long hash);
121
122#ifdef SHOW_CONVERSION_COUNTS
123static long created = 0L;
124static long converted = 0L;
125
126static void
127show_counts(void)
128{
129 fprintf(stderr, "created %ld string dicts\n", created);
130 fprintf(stderr, "converted %ld to normal dicts\n", converted);
131 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
132}
133#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000134
Tim Peters6d6c1a32001-08-02 04:15:00 +0000135/* Initialization macros.
136 There are two ways to create a dict: PyDict_New() is the main C API
137 function, and the tp_new slot maps to dict_new(). In the latter case we
138 can save a little time over what PyDict_New does because it's guaranteed
139 that the PyDictObject struct is already zeroed out.
140 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
141 an excellent reason not to).
142*/
143
144#define INIT_NONZERO_DICT_SLOTS(mp) do { \
Tim Petersdea48ec2001-05-22 20:40:22 +0000145 (mp)->ma_table = (mp)->ma_smalltable; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000146 (mp)->ma_mask = PyDict_MINSIZE - 1; \
147 } while(0)
148
149#define EMPTY_TO_MINSIZE(mp) do { \
150 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000151 (mp)->ma_used = (mp)->ma_fill = 0; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000152 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000153 } while(0)
154
Raymond Hettinger43442782004-03-17 21:55:03 +0000155/* Dictionary reuse scheme to save calls to malloc, free, and memset */
156#define MAXFREEDICTS 80
157static PyDictObject *free_dicts[MAXFREEDICTS];
158static int num_free_dicts = 0;
159
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000161PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000162{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000163 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000164 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000166 if (dummy == NULL)
167 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000168#ifdef SHOW_CONVERSION_COUNTS
169 Py_AtExit(show_counts);
170#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000171 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000172 if (num_free_dicts) {
173 mp = free_dicts[--num_free_dicts];
174 assert (mp != NULL);
175 assert (mp->ob_type == &PyDict_Type);
176 _Py_NewReference((PyObject *)mp);
177 if (mp->ma_fill) {
178 EMPTY_TO_MINSIZE(mp);
179 }
180 assert (mp->ma_used == 0);
181 assert (mp->ma_table == mp->ma_smalltable);
182 assert (mp->ma_mask == PyDict_MINSIZE - 1);
183 } else {
184 mp = PyObject_GC_New(dictobject, &PyDict_Type);
185 if (mp == NULL)
186 return NULL;
187 EMPTY_TO_MINSIZE(mp);
188 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000189 mp->ma_lookup = lookdict_string;
190#ifdef SHOW_CONVERSION_COUNTS
191 ++created;
192#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000193 _PyObject_GC_TRACK(mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000195}
196
197/*
198The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000199This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000200Open addressing is preferred over chaining since the link overhead for
201chaining would be substantial (100% with typical malloc overhead).
202
Tim Peterseb28ef22001-06-02 05:27:19 +0000203The initial probe index is computed as hash mod the table size. Subsequent
204probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000205
206All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000207
Tim Peterseb28ef22001-06-02 05:27:19 +0000208(The details in this version are due to Tim Peters, building on many past
209contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
210Christian Tismer).
Fred Drake1bff34a2000-08-31 19:31:38 +0000211
212This function must never return NULL; failures are indicated by returning
213a dictentry* for which the me_value field is NULL. Exceptions are never
214reported by this function, and outstanding exceptions are maintained.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000215*/
Tim Peterseb28ef22001-06-02 05:27:19 +0000216
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000217static dictentry *
Tim Peters1f5871e2000-07-04 17:44:48 +0000218lookdict(dictobject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000219{
Guido van Rossum16e93a81997-01-28 00:00:11 +0000220 register int i;
Tim Peterseb28ef22001-06-02 05:27:19 +0000221 register unsigned int perturb;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000222 register dictentry *freeslot;
Tim Petersafb6ae82001-06-04 21:00:21 +0000223 register unsigned int mask = mp->ma_mask;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000224 dictentry *ep0 = mp->ma_table;
225 register dictentry *ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000226 register int restore_error;
227 register int checked_error;
Fred Drakec88b99c2000-08-31 19:04:07 +0000228 register int cmp;
229 PyObject *err_type, *err_value, *err_tb;
Tim Peters453163d2001-06-03 04:54:32 +0000230 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000231
Tim Peters2f228e72001-05-13 00:19:31 +0000232 i = hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000233 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000234 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000235 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000236
237 restore_error = checked_error = 0;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000238 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000239 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000240 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000241 if (ep->me_hash == hash) {
242 /* error can't have been checked yet */
243 checked_error = 1;
244 if (PyErr_Occurred()) {
245 restore_error = 1;
246 PyErr_Fetch(&err_type, &err_value, &err_tb);
247 }
Tim Peters453163d2001-06-03 04:54:32 +0000248 startkey = ep->me_key;
249 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000250 if (cmp < 0)
Guido van Rossumb9324202001-01-18 00:39:02 +0000251 PyErr_Clear();
Tim Peters453163d2001-06-03 04:54:32 +0000252 if (ep0 == mp->ma_table && ep->me_key == startkey) {
253 if (cmp > 0)
254 goto Done;
255 }
256 else {
257 /* The compare did major nasty stuff to the
258 * dict: start over.
259 * XXX A clever adversary could prevent this
260 * XXX from terminating.
261 */
262 ep = lookdict(mp, key, hash);
263 goto Done;
264 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000265 }
266 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000267 }
Tim Peters15d49292001-05-27 07:39:22 +0000268
Tim Peters342c65e2001-05-13 06:43:53 +0000269 /* In the loop, me_key == dummy is by far (factor of 100s) the
270 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000271 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
272 i = (i << 2) + i + perturb + 1;
273 ep = &ep0[i & mask];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000274 if (ep->me_key == NULL) {
Tim Peters7b5d0af2001-06-03 04:14:43 +0000275 if (freeslot != NULL)
276 ep = freeslot;
277 break;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000278 }
Tim Peters7b5d0af2001-06-03 04:14:43 +0000279 if (ep->me_key == key)
280 break;
281 if (ep->me_hash == hash && ep->me_key != dummy) {
Fred Drakec88b99c2000-08-31 19:04:07 +0000282 if (!checked_error) {
283 checked_error = 1;
284 if (PyErr_Occurred()) {
285 restore_error = 1;
286 PyErr_Fetch(&err_type, &err_value,
287 &err_tb);
288 }
289 }
Tim Peters453163d2001-06-03 04:54:32 +0000290 startkey = ep->me_key;
291 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000292 if (cmp < 0)
Guido van Rossumb9324202001-01-18 00:39:02 +0000293 PyErr_Clear();
Tim Peters453163d2001-06-03 04:54:32 +0000294 if (ep0 == mp->ma_table && ep->me_key == startkey) {
295 if (cmp > 0)
296 break;
297 }
298 else {
299 /* The compare did major nasty stuff to the
300 * dict: start over.
301 * XXX A clever adversary could prevent this
302 * XXX from terminating.
303 */
304 ep = lookdict(mp, key, hash);
305 break;
306 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000307 }
Tim Peters342c65e2001-05-13 06:43:53 +0000308 else if (ep->me_key == dummy && freeslot == NULL)
309 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000310 }
Tim Peters7b5d0af2001-06-03 04:14:43 +0000311
312Done:
313 if (restore_error)
314 PyErr_Restore(err_type, err_value, err_tb);
315 return ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000316}
317
318/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000319 * Hacked up version of lookdict which can assume keys are always strings;
320 * this assumption allows testing for errors during PyObject_Compare() to
321 * be dropped; string-string comparisons never raise exceptions. This also
322 * means we don't need to go through PyObject_Compare(); we can always use
Martin v. Löwiscd353062001-05-24 16:56:35 +0000323 * _PyString_Eq directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000324 *
Tim Peters0ab085c2001-09-14 00:25:33 +0000325 * This is valuable because the general-case error handling in lookdict() is
326 * expensive, and dicts with pure-string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000327 */
328static dictentry *
329lookdict_string(dictobject *mp, PyObject *key, register long hash)
330{
331 register int i;
Tim Peterseb28ef22001-06-02 05:27:19 +0000332 register unsigned int perturb;
Fred Drake1bff34a2000-08-31 19:31:38 +0000333 register dictentry *freeslot;
Tim Petersafb6ae82001-06-04 21:00:21 +0000334 register unsigned int mask = mp->ma_mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000335 dictentry *ep0 = mp->ma_table;
336 register dictentry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000337
Tim Peters0ab085c2001-09-14 00:25:33 +0000338 /* Make sure this function doesn't have to handle non-string keys,
339 including subclasses of str; e.g., one reason to subclass
340 strings is to override __eq__, and for speed we don't cater to
341 that here. */
342 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000343#ifdef SHOW_CONVERSION_COUNTS
344 ++converted;
345#endif
346 mp->ma_lookup = lookdict;
347 return lookdict(mp, key, hash);
348 }
Tim Peters2f228e72001-05-13 00:19:31 +0000349 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000350 ep = &ep0[i];
351 if (ep->me_key == NULL || ep->me_key == key)
352 return ep;
353 if (ep->me_key == dummy)
354 freeslot = ep;
355 else {
356 if (ep->me_hash == hash
Martin v. Löwiscd353062001-05-24 16:56:35 +0000357 && _PyString_Eq(ep->me_key, key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000358 return ep;
359 }
360 freeslot = NULL;
361 }
Tim Peters15d49292001-05-27 07:39:22 +0000362
Tim Peters342c65e2001-05-13 06:43:53 +0000363 /* In the loop, me_key == dummy is by far (factor of 100s) the
364 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000365 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
366 i = (i << 2) + i + perturb + 1;
367 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000368 if (ep->me_key == NULL)
369 return freeslot == NULL ? ep : freeslot;
370 if (ep->me_key == key
371 || (ep->me_hash == hash
372 && ep->me_key != dummy
Martin v. Löwiscd353062001-05-24 16:56:35 +0000373 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000374 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000375 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000376 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000377 }
378}
379
380/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000381Internal routine to insert a new item into the table.
382Used both by the internal resize routine and by the public insert routine.
383Eats a reference to key and one to value.
384*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000385static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000386insertdict(register dictobject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000387{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000389 register dictentry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000390 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
391
392 assert(mp->ma_lookup != NULL);
393 ep = mp->ma_lookup(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000394 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000395 old_value = ep->me_value;
396 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000397 Py_DECREF(old_value); /* which **CAN** re-enter */
398 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000399 }
400 else {
401 if (ep->me_key == NULL)
402 mp->ma_fill++;
403 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404 Py_DECREF(ep->me_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000405 ep->me_key = key;
406 ep->me_hash = hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000407 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000408 mp->ma_used++;
409 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000410}
411
412/*
413Restructure the table by allocating a new table and reinserting all
414items again. When entries have been deleted, the new table may
415actually be smaller than the old one.
416*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000417static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000418dictresize(dictobject *mp, int minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000419{
Tim Peterseb28ef22001-06-02 05:27:19 +0000420 int newsize;
Tim Peters0c6010b2001-05-23 23:33:57 +0000421 dictentry *oldtable, *newtable, *ep;
422 int i;
423 int is_oldtable_malloced;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000424 dictentry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000425
426 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000427
Tim Peterseb28ef22001-06-02 05:27:19 +0000428 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000429 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000430 newsize <= minused && newsize > 0;
431 newsize <<= 1)
432 ;
433 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000435 return -1;
436 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000437
438 /* Get space for a new table. */
439 oldtable = mp->ma_table;
440 assert(oldtable != NULL);
441 is_oldtable_malloced = oldtable != mp->ma_smalltable;
442
Tim Peters6d6c1a32001-08-02 04:15:00 +0000443 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000444 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000445 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000446 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000447 if (mp->ma_fill == mp->ma_used) {
448 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000449 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000450 }
451 /* We're not going to resize it, but rebuild the
452 table anyway to purge old dummy entries.
453 Subtle: This is *necessary* if fill==size,
454 as lookdict needs at least one virgin slot to
455 terminate failing searches. If fill < size, it's
456 merely desirable, as dummies slow searches. */
457 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000458 memcpy(small_copy, oldtable, sizeof(small_copy));
459 oldtable = small_copy;
460 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000461 }
462 else {
463 newtable = PyMem_NEW(dictentry, newsize);
464 if (newtable == NULL) {
465 PyErr_NoMemory();
466 return -1;
467 }
468 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000469
470 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000471 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000472 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000473 mp->ma_mask = newsize - 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000474 memset(newtable, 0, sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000475 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000476 i = mp->ma_fill;
477 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000478
Tim Peters19283142001-05-17 22:25:34 +0000479 /* Copy the data over; this is refcount-neutral for active entries;
480 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000481 for (ep = oldtable; i > 0; ep++) {
482 if (ep->me_value != NULL) { /* active entry */
483 --i;
Tim Peters19283142001-05-17 22:25:34 +0000484 insertdict(mp, ep->me_key, ep->me_hash, ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000485 }
Tim Peters19283142001-05-17 22:25:34 +0000486 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000487 --i;
Tim Peters19283142001-05-17 22:25:34 +0000488 assert(ep->me_key == dummy);
489 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000490 }
Tim Peters19283142001-05-17 22:25:34 +0000491 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000492 }
493
Tim Peters0c6010b2001-05-23 23:33:57 +0000494 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000495 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000496 return 0;
497}
498
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000500PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000501{
502 long hash;
Fred Drake1bff34a2000-08-31 19:31:38 +0000503 dictobject *mp = (dictobject *)op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504 if (!PyDict_Check(op)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000505 return NULL;
506 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000507 if (!PyString_CheckExact(key) ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000509 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000511 if (hash == -1) {
512 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000513 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000514 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000515 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000516 return (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000517}
518
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000519/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
520 * dictionary if it is merely replacing the value for an existing key.
521 * This is means that it's safe to loop over a dictionary with
522 * PyDict_Next() and occasionally replace a value -- but you can't
523 * insert new keys or remove them.
524 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000525int
Tim Peters1f5871e2000-07-04 17:44:48 +0000526PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000527{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000528 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000529 register long hash;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000530 register int n_used;
531
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 if (!PyDict_Check(op)) {
533 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000534 return -1;
535 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000536 mp = (dictobject *)op;
Tim Peters0ab085c2001-09-14 00:25:33 +0000537 if (PyString_CheckExact(key)) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000538 hash = ((PyStringObject *)key)->ob_shash;
539 if (hash == -1)
540 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000541 }
Tim Peters1f7df352002-03-29 03:29:08 +0000542 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000544 if (hash == -1)
545 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000546 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000547 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000548 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 Py_INCREF(value);
550 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000551 insertdict(mp, key, hash, value);
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000552 /* If we added a key, we can safely resize. Otherwise just return!
553 * If fill >= 2/3 size, adjust size. Normally, this doubles or
554 * quaduples the size, but it's also possible for the dict to shrink
555 * (if ma_fill is much larger than ma_used, meaning a lot of dict
556 * keys have been * deleted).
557 *
558 * Quadrupling the size improves average dictionary sparseness
559 * (reducing collisions) at the cost of some memory and iteration
560 * speed (which loops over every possible entry). It also halves
561 * the number of expensive resize operations in a growing dictionary.
562 *
563 * Very large dictionaries (over 50K items) use doubling instead.
564 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000565 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000566 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
567 return 0;
568 return dictresize(mp, mp->ma_used*(mp->ma_used>50000 ? 2 : 4));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000569}
570
571int
Tim Peters1f5871e2000-07-04 17:44:48 +0000572PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000573{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000574 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000575 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000576 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000578
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 if (!PyDict_Check(op)) {
580 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000581 return -1;
582 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000583 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000584 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000586 if (hash == -1)
587 return -1;
588 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000589 mp = (dictobject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000590 ep = (mp->ma_lookup)(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000591 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000593 return -1;
594 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000595 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000597 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000598 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000599 ep->me_value = NULL;
600 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000601 Py_DECREF(old_value);
602 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000603 return 0;
604}
605
Guido van Rossum25831651993-05-19 14:50:45 +0000606void
Tim Peters1f5871e2000-07-04 17:44:48 +0000607PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000608{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000609 dictobject *mp;
Tim Petersdea48ec2001-05-22 20:40:22 +0000610 dictentry *ep, *table;
611 int table_is_malloced;
612 int fill;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000613 dictentry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000614#ifdef Py_DEBUG
615 int i, n;
616#endif
617
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000618 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000619 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000620 mp = (dictobject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000621#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000622 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000623 i = 0;
624#endif
625
626 table = mp->ma_table;
627 assert(table != NULL);
628 table_is_malloced = table != mp->ma_smalltable;
629
630 /* This is delicate. During the process of clearing the dict,
631 * decrefs can cause the dict to mutate. To avoid fatal confusion
632 * (voice of experience), we have to make the dict empty before
633 * clearing the slots, and never refer to anything via mp->xxx while
634 * clearing.
635 */
636 fill = mp->ma_fill;
637 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000638 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000639
640 else if (fill > 0) {
641 /* It's a small table with something that needs to be cleared.
642 * Afraid the only safe way is to copy the dict entries into
643 * another small table first.
644 */
645 memcpy(small_copy, table, sizeof(small_copy));
646 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000647 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000648 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000649 /* else it's a small table that's already empty */
650
651 /* Now we can finally clear things. If C had refcounts, we could
652 * assert that the refcount on table is 1 now, i.e. that this function
653 * has unique access to it, so decref side-effects can't alter it.
654 */
655 for (ep = table; fill > 0; ++ep) {
656#ifdef Py_DEBUG
657 assert(i < n);
658 ++i;
659#endif
660 if (ep->me_key) {
661 --fill;
662 Py_DECREF(ep->me_key);
663 Py_XDECREF(ep->me_value);
664 }
665#ifdef Py_DEBUG
666 else
667 assert(ep->me_value == NULL);
668#endif
669 }
670
671 if (table_is_malloced)
672 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000673}
674
Tim Peters080c88b2003-02-15 03:01:11 +0000675/*
676 * Iterate over a dict. Use like so:
677 *
678 * int i;
679 * PyObject *key, *value;
680 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000681 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000682 * Refer to borrowed references in key and value.
683 * }
684 *
685 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000686 * mutates the dict. One exception: it is safe if the loop merely changes
687 * the values associated with the keys (but doesn't insert new keys or
688 * delete keys), via PyDict_SetItem().
689 */
Guido van Rossum25831651993-05-19 14:50:45 +0000690int
Tim Peters1f5871e2000-07-04 17:44:48 +0000691PyDict_Next(PyObject *op, int *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000692{
Raymond Hettinger43442782004-03-17 21:55:03 +0000693 register int i, mask;
694 register dictentry *ep;
695
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000697 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000698 i = *ppos;
699 if (i < 0)
700 return 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000701 ep = ((dictobject *)op)->ma_table;
702 mask = ((dictobject *)op)->ma_mask;
703 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000704 i++;
705 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000706 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000707 return 0;
708 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000709 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000710 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000711 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000712 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000713}
714
715/* Methods */
716
717static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000718dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000719{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000720 register dictentry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000721 int fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000722 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000723 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000724 for (ep = mp->ma_table; fill > 0; ep++) {
725 if (ep->me_key) {
726 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000728 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000729 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000730 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000731 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000732 PyMem_DEL(mp->ma_table);
Raymond Hettinger43442782004-03-17 21:55:03 +0000733 if (num_free_dicts < MAXFREEDICTS && mp->ob_type == &PyDict_Type)
734 free_dicts[num_free_dicts++] = mp;
735 else
736 mp->ob_type->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000737 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000738}
739
740static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000741dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000742{
743 register int i;
744 register int any;
Guido van Rossum255443b1998-04-10 22:47:14 +0000745
746 i = Py_ReprEnter((PyObject*)mp);
747 if (i != 0) {
748 if (i < 0)
749 return i;
750 fprintf(fp, "{...}");
751 return 0;
752 }
753
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000754 fprintf(fp, "{");
755 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000756 for (i = 0; i <= mp->ma_mask; i++) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000757 dictentry *ep = mp->ma_table + i;
758 PyObject *pvalue = ep->me_value;
759 if (pvalue != NULL) {
760 /* Prevent PyObject_Repr from deleting value during
761 key format */
762 Py_INCREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000763 if (any++ > 0)
764 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000765 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000766 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000767 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000768 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000769 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000770 fprintf(fp, ": ");
Tim Peters19b77cf2001-06-02 08:27:39 +0000771 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000772 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000773 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000774 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000775 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000776 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000777 }
778 }
779 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000780 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000781 return 0;
782}
783
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000785dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000786{
Tim Petersc6057842001-06-16 07:52:53 +0000787 int i;
Tim Petersa7259592001-06-16 05:11:17 +0000788 PyObject *s, *temp, *colon = NULL;
789 PyObject *pieces = NULL, *result = NULL;
790 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +0000791
Tim Petersa7259592001-06-16 05:11:17 +0000792 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +0000793 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000794 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +0000795 }
796
Tim Petersa7259592001-06-16 05:11:17 +0000797 if (mp->ma_used == 0) {
798 result = PyString_FromString("{}");
799 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000800 }
Tim Petersa7259592001-06-16 05:11:17 +0000801
802 pieces = PyList_New(0);
803 if (pieces == NULL)
804 goto Done;
805
806 colon = PyString_FromString(": ");
807 if (colon == NULL)
808 goto Done;
809
810 /* Do repr() on each key+value pair, and insert ": " between them.
811 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +0000812 i = 0;
813 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +0000814 int status;
815 /* Prevent repr from deleting value during key format. */
816 Py_INCREF(value);
817 s = PyObject_Repr(key);
818 PyString_Concat(&s, colon);
819 PyString_ConcatAndDel(&s, PyObject_Repr(value));
820 Py_DECREF(value);
821 if (s == NULL)
822 goto Done;
823 status = PyList_Append(pieces, s);
824 Py_DECREF(s); /* append created a new ref */
825 if (status < 0)
826 goto Done;
827 }
828
829 /* Add "{}" decorations to the first and last items. */
830 assert(PyList_GET_SIZE(pieces) > 0);
831 s = PyString_FromString("{");
832 if (s == NULL)
833 goto Done;
834 temp = PyList_GET_ITEM(pieces, 0);
835 PyString_ConcatAndDel(&s, temp);
836 PyList_SET_ITEM(pieces, 0, s);
837 if (s == NULL)
838 goto Done;
839
840 s = PyString_FromString("}");
841 if (s == NULL)
842 goto Done;
843 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
844 PyString_ConcatAndDel(&temp, s);
845 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
846 if (temp == NULL)
847 goto Done;
848
849 /* Paste them all together with ", " between. */
850 s = PyString_FromString(", ");
851 if (s == NULL)
852 goto Done;
853 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +0000854 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000855
856Done:
857 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +0000859 Py_ReprLeave((PyObject *)mp);
860 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000861}
862
863static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000864dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000865{
866 return mp->ma_used;
867}
868
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000870dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000871{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000873 long hash;
Tim Petersdea48ec2001-05-22 20:40:22 +0000874 assert(mp->ma_table != NULL);
Tim Peters0ab085c2001-09-14 00:25:33 +0000875 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000876 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000877 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000878 if (hash == -1)
879 return NULL;
880 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000881 v = (mp->ma_lookup)(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000882 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000884 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000886 return v;
887}
888
889static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000890dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000891{
892 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000894 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000896}
897
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000898static PyMappingMethods dict_as_mapping = {
899 (inquiry)dict_length, /*mp_length*/
900 (binaryfunc)dict_subscript, /*mp_subscript*/
901 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000902};
903
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000905dict_keys(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000906{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 register PyObject *v;
Raymond Hettinger43442782004-03-17 21:55:03 +0000908 register int i, j;
909 dictentry *ep;
910 int mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000911
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000912 again:
913 n = mp->ma_used;
914 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000915 if (v == NULL)
916 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000917 if (n != mp->ma_used) {
918 /* Durnit. The allocations caused the dict to resize.
919 * Just start over, this shouldn't normally happen.
920 */
921 Py_DECREF(v);
922 goto again;
923 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000924 ep = mp->ma_table;
925 mask = mp->ma_mask;
926 for (i = 0, j = 0; i <= mask; i++) {
927 if (ep[i].me_value != NULL) {
928 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000930 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000931 j++;
932 }
933 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000934 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000935 return v;
936}
937
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000939dict_values(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000940{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 register PyObject *v;
Raymond Hettinger43442782004-03-17 21:55:03 +0000942 register int i, j;
943 dictentry *ep;
944 int mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000945
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000946 again:
947 n = mp->ma_used;
948 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000949 if (v == NULL)
950 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000951 if (n != mp->ma_used) {
952 /* Durnit. The allocations caused the dict to resize.
953 * Just start over, this shouldn't normally happen.
954 */
955 Py_DECREF(v);
956 goto again;
957 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000958 ep = mp->ma_table;
959 mask = mp->ma_mask;
960 for (i = 0, j = 0; i <= mask; i++) {
961 if (ep[i].me_value != NULL) {
962 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000964 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000965 j++;
966 }
967 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000968 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +0000969 return v;
970}
971
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000973dict_items(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000974{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000976 register int i, j, n;
Raymond Hettinger43442782004-03-17 21:55:03 +0000977 int mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000978 PyObject *item, *key, *value;
Raymond Hettinger43442782004-03-17 21:55:03 +0000979 dictentry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000980
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000981 /* Preallocate the list of tuples, to avoid allocations during
982 * the loop over the items, which could trigger GC, which
983 * could resize the dict. :-(
984 */
985 again:
986 n = mp->ma_used;
987 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000988 if (v == NULL)
989 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000990 for (i = 0; i < n; i++) {
991 item = PyTuple_New(2);
992 if (item == NULL) {
993 Py_DECREF(v);
994 return NULL;
995 }
996 PyList_SET_ITEM(v, i, item);
997 }
998 if (n != mp->ma_used) {
999 /* Durnit. The allocations caused the dict to resize.
1000 * Just start over, this shouldn't normally happen.
1001 */
1002 Py_DECREF(v);
1003 goto again;
1004 }
1005 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001006 ep = mp->ma_table;
1007 mask = mp->ma_mask;
1008 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001009 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001010 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001011 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001013 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001014 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001015 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001016 j++;
1017 }
1018 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001019 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001020 return v;
1021}
1022
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001023static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001024dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001025{
1026 PyObject *seq;
1027 PyObject *value = Py_None;
1028 PyObject *it; /* iter(seq) */
1029 PyObject *key;
1030 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001031 int status;
1032
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001033 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001034 return NULL;
1035
1036 d = PyObject_CallObject(cls, NULL);
1037 if (d == NULL)
1038 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001039
1040 it = PyObject_GetIter(seq);
1041 if (it == NULL){
1042 Py_DECREF(d);
1043 return NULL;
1044 }
1045
1046 for (;;) {
1047 key = PyIter_Next(it);
1048 if (key == NULL) {
1049 if (PyErr_Occurred())
1050 goto Fail;
1051 break;
1052 }
Raymond Hettingere03e5b12002-12-07 08:10:51 +00001053 status = PyObject_SetItem(d, key, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001054 Py_DECREF(key);
1055 if (status < 0)
1056 goto Fail;
1057 }
1058
1059 Py_DECREF(it);
1060 return d;
1061
1062Fail:
1063 Py_DECREF(it);
1064 Py_DECREF(d);
1065 return NULL;
1066}
1067
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001068static int
1069dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001070{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001071 PyObject *arg = NULL;
1072 int result = 0;
1073
1074 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1075 result = -1;
1076
1077 else if (arg != NULL) {
1078 if (PyObject_HasAttrString(arg, "keys"))
1079 result = PyDict_Merge(self, arg, 1);
1080 else
1081 result = PyDict_MergeFromSeq2(self, arg, 1);
1082 }
1083 if (result == 0 && kwds != NULL)
1084 result = PyDict_Merge(self, kwds, 1);
1085 return result;
1086}
1087
1088static PyObject *
1089dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1090{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001091 if (dict_update_common(self, args, kwds, "update") != -1)
1092 Py_RETURN_NONE;
1093 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001094}
1095
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001096/* Update unconditionally replaces existing items.
1097 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001098 otherwise it leaves existing items unchanged.
1099
1100 PyDict_{Update,Merge} update/merge from a mapping object.
1101
Tim Petersf582b822001-12-11 18:51:08 +00001102 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001103 producing iterable objects of length 2.
1104*/
1105
Tim Petersf582b822001-12-11 18:51:08 +00001106int
Tim Peters1fc240e2001-10-26 05:06:50 +00001107PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1108{
1109 PyObject *it; /* iter(seq2) */
1110 int i; /* index into seq2 of current element */
1111 PyObject *item; /* seq2[i] */
1112 PyObject *fast; /* item as a 2-tuple or 2-list */
1113
1114 assert(d != NULL);
1115 assert(PyDict_Check(d));
1116 assert(seq2 != NULL);
1117
1118 it = PyObject_GetIter(seq2);
1119 if (it == NULL)
1120 return -1;
1121
1122 for (i = 0; ; ++i) {
1123 PyObject *key, *value;
1124 int n;
1125
1126 fast = NULL;
1127 item = PyIter_Next(it);
1128 if (item == NULL) {
1129 if (PyErr_Occurred())
1130 goto Fail;
1131 break;
1132 }
1133
1134 /* Convert item to sequence, and verify length 2. */
1135 fast = PySequence_Fast(item, "");
1136 if (fast == NULL) {
1137 if (PyErr_ExceptionMatches(PyExc_TypeError))
1138 PyErr_Format(PyExc_TypeError,
1139 "cannot convert dictionary update "
1140 "sequence element #%d to a sequence",
1141 i);
1142 goto Fail;
1143 }
1144 n = PySequence_Fast_GET_SIZE(fast);
1145 if (n != 2) {
1146 PyErr_Format(PyExc_ValueError,
1147 "dictionary update sequence element #%d "
1148 "has length %d; 2 is required",
1149 i, n);
1150 goto Fail;
1151 }
1152
1153 /* Update/merge with this (key, value) pair. */
1154 key = PySequence_Fast_GET_ITEM(fast, 0);
1155 value = PySequence_Fast_GET_ITEM(fast, 1);
1156 if (override || PyDict_GetItem(d, key) == NULL) {
1157 int status = PyDict_SetItem(d, key, value);
1158 if (status < 0)
1159 goto Fail;
1160 }
1161 Py_DECREF(fast);
1162 Py_DECREF(item);
1163 }
1164
1165 i = 0;
1166 goto Return;
1167Fail:
1168 Py_XDECREF(item);
1169 Py_XDECREF(fast);
1170 i = -1;
1171Return:
1172 Py_DECREF(it);
1173 return i;
1174}
1175
Tim Peters6d6c1a32001-08-02 04:15:00 +00001176int
1177PyDict_Update(PyObject *a, PyObject *b)
1178{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001179 return PyDict_Merge(a, b, 1);
1180}
1181
1182int
1183PyDict_Merge(PyObject *a, PyObject *b, int override)
1184{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001185 register PyDictObject *mp, *other;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001186 register int i;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001187 dictentry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001188
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001189 /* We accept for the argument either a concrete dictionary object,
1190 * or an abstract "mapping" object. For the former, we can do
1191 * things quite efficiently. For the latter, we only require that
1192 * PyMapping_Keys() and PyObject_GetItem() be supported.
1193 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001194 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1195 PyErr_BadInternalCall();
1196 return -1;
1197 }
1198 mp = (dictobject*)a;
1199 if (PyDict_Check(b)) {
1200 other = (dictobject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001201 if (other == mp || other->ma_used == 0)
1202 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001203 return 0;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001204 /* Do one big resize at the start, rather than
1205 * incrementally resizing as we insert new items. Expect
1206 * that there will be no (or few) overlapping keys.
1207 */
1208 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001209 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001210 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001211 }
1212 for (i = 0; i <= other->ma_mask; i++) {
1213 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001214 if (entry->me_value != NULL &&
1215 (override ||
1216 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001217 Py_INCREF(entry->me_key);
1218 Py_INCREF(entry->me_value);
1219 insertdict(mp, entry->me_key, entry->me_hash,
1220 entry->me_value);
1221 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001222 }
1223 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001224 else {
1225 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001226 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001227 PyObject *iter;
1228 PyObject *key, *value;
1229 int status;
1230
1231 if (keys == NULL)
1232 /* Docstring says this is equivalent to E.keys() so
1233 * if E doesn't have a .keys() method we want
1234 * AttributeError to percolate up. Might as well
1235 * do the same for any other error.
1236 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001237 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001238
1239 iter = PyObject_GetIter(keys);
1240 Py_DECREF(keys);
1241 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001242 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001243
1244 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001245 if (!override && PyDict_GetItem(a, key) != NULL) {
1246 Py_DECREF(key);
1247 continue;
1248 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001249 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001250 if (value == NULL) {
1251 Py_DECREF(iter);
1252 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001253 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001254 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001255 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001256 Py_DECREF(key);
1257 Py_DECREF(value);
1258 if (status < 0) {
1259 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001260 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001261 }
1262 }
1263 Py_DECREF(iter);
1264 if (PyErr_Occurred())
1265 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001266 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001267 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001268 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001269}
1270
1271static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001272dict_copy(register dictobject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001273{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001274 return PyDict_Copy((PyObject*)mp);
1275}
1276
1277PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001278PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001279{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001280 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001281
1282 if (o == NULL || !PyDict_Check(o)) {
1283 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001284 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001285 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001286 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001287 if (copy == NULL)
1288 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001289 if (PyDict_Merge(copy, o, 1) == 0)
1290 return copy;
1291 Py_DECREF(copy);
1292 return copy;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001293}
1294
Guido van Rossum4199fac1993-11-05 10:18:44 +00001295int
Tim Peters1f5871e2000-07-04 17:44:48 +00001296PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001297{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298 if (mp == NULL || !PyDict_Check(mp)) {
1299 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001300 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001301 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001302 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001303}
1304
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001306PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001307{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308 if (mp == NULL || !PyDict_Check(mp)) {
1309 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001310 return NULL;
1311 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001312 return dict_keys((dictobject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001313}
1314
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001316PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001317{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318 if (mp == NULL || !PyDict_Check(mp)) {
1319 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001320 return NULL;
1321 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001322 return dict_values((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001323}
1324
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001326PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001327{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001328 if (mp == NULL || !PyDict_Check(mp)) {
1329 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001330 return NULL;
1331 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001332 return dict_items((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001333}
1334
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001335/* Subroutine which returns the smallest key in a for which b's value
1336 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001337 pval argument. Both are NULL if no key in a is found for which b's status
1338 differs. The refcounts on (and only on) non-NULL *pval and function return
1339 values must be decremented by the caller (characterize() increments them
1340 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1341 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001342
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001343static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001344characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001345{
Tim Peters95bf9392001-05-10 08:32:44 +00001346 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1347 PyObject *aval = NULL; /* a[akey] */
Guido van Rossumb9324202001-01-18 00:39:02 +00001348 int i, cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001349
Tim Petersafb6ae82001-06-04 21:00:21 +00001350 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001351 PyObject *thiskey, *thisaval, *thisbval;
1352 if (a->ma_table[i].me_value == NULL)
1353 continue;
1354 thiskey = a->ma_table[i].me_key;
1355 Py_INCREF(thiskey); /* keep alive across compares */
1356 if (akey != NULL) {
1357 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1358 if (cmp < 0) {
1359 Py_DECREF(thiskey);
1360 goto Fail;
1361 }
1362 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001363 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001364 a->ma_table[i].me_value == NULL)
1365 {
1366 /* Not the *smallest* a key; or maybe it is
1367 * but the compare shrunk the dict so we can't
1368 * find its associated value anymore; or
1369 * maybe it is but the compare deleted the
1370 * a[thiskey] entry.
1371 */
1372 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001373 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001374 }
Tim Peters95bf9392001-05-10 08:32:44 +00001375 }
1376
1377 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1378 thisaval = a->ma_table[i].me_value;
1379 assert(thisaval);
1380 Py_INCREF(thisaval); /* keep alive */
1381 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1382 if (thisbval == NULL)
1383 cmp = 0;
1384 else {
1385 /* both dicts have thiskey: same values? */
1386 cmp = PyObject_RichCompareBool(
1387 thisaval, thisbval, Py_EQ);
1388 if (cmp < 0) {
1389 Py_DECREF(thiskey);
1390 Py_DECREF(thisaval);
1391 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001392 }
1393 }
Tim Peters95bf9392001-05-10 08:32:44 +00001394 if (cmp == 0) {
1395 /* New winner. */
1396 Py_XDECREF(akey);
1397 Py_XDECREF(aval);
1398 akey = thiskey;
1399 aval = thisaval;
1400 }
1401 else {
1402 Py_DECREF(thiskey);
1403 Py_DECREF(thisaval);
1404 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001405 }
Tim Peters95bf9392001-05-10 08:32:44 +00001406 *pval = aval;
1407 return akey;
1408
1409Fail:
1410 Py_XDECREF(akey);
1411 Py_XDECREF(aval);
1412 *pval = NULL;
1413 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001414}
1415
1416static int
Tim Peters1f5871e2000-07-04 17:44:48 +00001417dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001418{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001420 int res;
1421
1422 /* Compare lengths first */
1423 if (a->ma_used < b->ma_used)
1424 return -1; /* a is shorter */
1425 else if (a->ma_used > b->ma_used)
1426 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001427
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001428 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001429 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001430 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001431 if (adiff == NULL) {
1432 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001433 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001434 * must be equal.
1435 */
1436 res = PyErr_Occurred() ? -1 : 0;
1437 goto Finished;
1438 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001439 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001440 if (bdiff == NULL && PyErr_Occurred()) {
1441 assert(!bval);
1442 res = -1;
1443 goto Finished;
1444 }
1445 res = 0;
1446 if (bdiff) {
1447 /* bdiff == NULL "should be" impossible now, but perhaps
1448 * the last comparison done by the characterize() on a had
1449 * the side effect of making the dicts equal!
1450 */
1451 res = PyObject_Compare(adiff, bdiff);
1452 }
1453 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001454 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001455
1456Finished:
1457 Py_XDECREF(adiff);
1458 Py_XDECREF(bdiff);
1459 Py_XDECREF(aval);
1460 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001461 return res;
1462}
1463
Tim Peterse63415e2001-05-08 04:38:29 +00001464/* Return 1 if dicts equal, 0 if not, -1 if error.
1465 * Gets out as soon as any difference is detected.
1466 * Uses only Py_EQ comparison.
1467 */
1468static int
1469dict_equal(dictobject *a, dictobject *b)
1470{
1471 int i;
1472
1473 if (a->ma_used != b->ma_used)
1474 /* can't be equal if # of entries differ */
1475 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001476
Tim Peterse63415e2001-05-08 04:38:29 +00001477 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001478 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001479 PyObject *aval = a->ma_table[i].me_value;
1480 if (aval != NULL) {
1481 int cmp;
1482 PyObject *bval;
1483 PyObject *key = a->ma_table[i].me_key;
1484 /* temporarily bump aval's refcount to ensure it stays
1485 alive until we're done with it */
1486 Py_INCREF(aval);
1487 bval = PyDict_GetItem((PyObject *)b, key);
1488 if (bval == NULL) {
1489 Py_DECREF(aval);
1490 return 0;
1491 }
1492 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1493 Py_DECREF(aval);
1494 if (cmp <= 0) /* error or not equal */
1495 return cmp;
1496 }
1497 }
1498 return 1;
1499 }
1500
1501static PyObject *
1502dict_richcompare(PyObject *v, PyObject *w, int op)
1503{
1504 int cmp;
1505 PyObject *res;
1506
1507 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1508 res = Py_NotImplemented;
1509 }
1510 else if (op == Py_EQ || op == Py_NE) {
1511 cmp = dict_equal((dictobject *)v, (dictobject *)w);
1512 if (cmp < 0)
1513 return NULL;
1514 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1515 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001516 else
1517 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001518 Py_INCREF(res);
1519 return res;
1520 }
1521
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001522static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001523dict_has_key(register dictobject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001524{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001525 long hash;
1526 register long ok;
Tim Peters0ab085c2001-09-14 00:25:33 +00001527 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001528 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001529 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001530 if (hash == -1)
1531 return NULL;
1532 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001533 ok = (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001534 return PyBool_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001535}
1536
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001537static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001538dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001539{
1540 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001541 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001542 PyObject *val = NULL;
1543 long hash;
1544
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001545 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001546 return NULL;
1547
Tim Peters0ab085c2001-09-14 00:25:33 +00001548 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001549 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001550 hash = PyObject_Hash(key);
1551 if (hash == -1)
1552 return NULL;
1553 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001554 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001555
Barry Warsawc38c5da1997-10-06 17:49:20 +00001556 if (val == NULL)
1557 val = failobj;
1558 Py_INCREF(val);
1559 return val;
1560}
1561
1562
1563static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001564dict_setdefault(register dictobject *mp, PyObject *args)
1565{
1566 PyObject *key;
1567 PyObject *failobj = Py_None;
1568 PyObject *val = NULL;
1569 long hash;
1570
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001571 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001572 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001573
Tim Peters0ab085c2001-09-14 00:25:33 +00001574 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001575 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001576 hash = PyObject_Hash(key);
1577 if (hash == -1)
1578 return NULL;
1579 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001580 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001581 if (val == NULL) {
1582 val = failobj;
1583 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1584 val = NULL;
1585 }
1586 Py_XINCREF(val);
1587 return val;
1588}
1589
1590
1591static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001592dict_clear(register dictobject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001593{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001595 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001596}
1597
Guido van Rossumba6ab842000-12-12 22:02:18 +00001598static PyObject *
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001599dict_pop(dictobject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001600{
1601 long hash;
1602 dictentry *ep;
1603 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001604 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001605
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001606 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1607 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001608 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001609 if (deflt) {
1610 Py_INCREF(deflt);
1611 return deflt;
1612 }
Guido van Rossume027d982002-04-12 15:11:59 +00001613 PyErr_SetString(PyExc_KeyError,
1614 "pop(): dictionary is empty");
1615 return NULL;
1616 }
1617 if (!PyString_CheckExact(key) ||
1618 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1619 hash = PyObject_Hash(key);
1620 if (hash == -1)
1621 return NULL;
1622 }
1623 ep = (mp->ma_lookup)(mp, key, hash);
1624 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001625 if (deflt) {
1626 Py_INCREF(deflt);
1627 return deflt;
1628 }
Guido van Rossume027d982002-04-12 15:11:59 +00001629 PyErr_SetObject(PyExc_KeyError, key);
1630 return NULL;
1631 }
1632 old_key = ep->me_key;
1633 Py_INCREF(dummy);
1634 ep->me_key = dummy;
1635 old_value = ep->me_value;
1636 ep->me_value = NULL;
1637 mp->ma_used--;
1638 Py_DECREF(old_key);
1639 return old_value;
1640}
1641
1642static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001643dict_popitem(dictobject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001644{
1645 int i = 0;
1646 dictentry *ep;
1647 PyObject *res;
1648
Tim Petersf4b33f62001-06-02 05:42:29 +00001649 /* Allocate the result tuple before checking the size. Believe it
1650 * or not, this allocation could trigger a garbage collection which
1651 * could empty the dict, so if we checked the size first and that
1652 * happened, the result would be an infinite loop (searching for an
1653 * entry that no longer exists). Note that the usual popitem()
1654 * idiom is "while d: k, v = d.popitem()". so needing to throw the
1655 * tuple away if the dict *is* empty isn't a significant
1656 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001657 */
1658 res = PyTuple_New(2);
1659 if (res == NULL)
1660 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001661 if (mp->ma_used == 0) {
1662 Py_DECREF(res);
1663 PyErr_SetString(PyExc_KeyError,
1664 "popitem(): dictionary is empty");
1665 return NULL;
1666 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001667 /* Set ep to "the first" dict entry with a value. We abuse the hash
1668 * field of slot 0 to hold a search finger:
1669 * If slot 0 has a value, use slot 0.
1670 * Else slot 0 is being used to hold a search finger,
1671 * and we use its hash value as the first index to look.
1672 */
1673 ep = &mp->ma_table[0];
1674 if (ep->me_value == NULL) {
1675 i = (int)ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001676 /* The hash field may be a real hash value, or it may be a
1677 * legit search finger, or it may be a once-legit search
1678 * finger that's out of bounds now because it wrapped around
1679 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001680 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001681 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001682 i = 1; /* skip slot 0 */
1683 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1684 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001685 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001686 i = 1;
1687 }
1688 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001689 PyTuple_SET_ITEM(res, 0, ep->me_key);
1690 PyTuple_SET_ITEM(res, 1, ep->me_value);
1691 Py_INCREF(dummy);
1692 ep->me_key = dummy;
1693 ep->me_value = NULL;
1694 mp->ma_used--;
1695 assert(mp->ma_table[0].me_value == NULL);
1696 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001697 return res;
1698}
1699
Jeremy Hylton8caad492000-06-23 14:18:11 +00001700static int
1701dict_traverse(PyObject *op, visitproc visit, void *arg)
1702{
1703 int i = 0, err;
1704 PyObject *pk;
1705 PyObject *pv;
1706
1707 while (PyDict_Next(op, &i, &pk, &pv)) {
1708 err = visit(pk, arg);
1709 if (err)
1710 return err;
1711 err = visit(pv, arg);
1712 if (err)
1713 return err;
1714 }
1715 return 0;
1716}
1717
1718static int
1719dict_tp_clear(PyObject *op)
1720{
1721 PyDict_Clear(op);
1722 return 0;
1723}
1724
Tim Petersf7f88b12000-12-13 23:18:45 +00001725
Raymond Hettinger019a1482004-03-18 02:41:19 +00001726extern PyTypeObject PyDictIterKey_Type; /* Forward */
1727extern PyTypeObject PyDictIterValue_Type; /* Forward */
1728extern PyTypeObject PyDictIterItem_Type; /* Forward */
1729static PyObject *dictiter_new(dictobject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001730
1731static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001732dict_iterkeys(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001733{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001734 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001735}
1736
1737static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001738dict_itervalues(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001739{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001740 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001741}
1742
1743static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001744dict_iteritems(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001745{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001746 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001747}
1748
1749
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001750PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00001751"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00001752
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001753PyDoc_STRVAR(contains__doc__,
1754"D.__contains__(k) -> True if D has a key k, else False");
1755
1756PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1757
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001758PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001759"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001760
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001761PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001762"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 +00001763
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001764PyDoc_STRVAR(pop__doc__,
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001765"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
1766If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001767
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001768PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001769"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000017702-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00001771
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001772PyDoc_STRVAR(keys__doc__,
1773"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00001774
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001775PyDoc_STRVAR(items__doc__,
1776"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00001777
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001778PyDoc_STRVAR(values__doc__,
1779"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00001780
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001781PyDoc_STRVAR(update__doc__,
Walter Dörwaldd70ad8a2004-05-28 20:59:21 +00001782"D.update(E, **F) -> None. Update D from E and F: for k in E: D[k] = E[k]\n\
1783(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 +00001784
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001785PyDoc_STRVAR(fromkeys__doc__,
1786"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1787v defaults to None.");
1788
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001789PyDoc_STRVAR(clear__doc__,
1790"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001791
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001792PyDoc_STRVAR(copy__doc__,
1793"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001794
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001795PyDoc_STRVAR(iterkeys__doc__,
1796"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001798PyDoc_STRVAR(itervalues__doc__,
1799"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001800
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001801PyDoc_STRVAR(iteritems__doc__,
1802"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001803
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001804static PyMethodDef mapp_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001805 {"__contains__",(PyCFunction)dict_has_key, METH_O | METH_COEXIST,
1806 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00001807 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001808 getitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001809 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001810 has_key__doc__},
1811 {"get", (PyCFunction)dict_get, METH_VARARGS,
1812 get__doc__},
1813 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1814 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001815 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00001816 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001817 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001818 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001819 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001820 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001821 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001822 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001823 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001824 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001825 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001826 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001827 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
1828 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001829 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001830 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001831 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001832 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001833 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001834 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001835 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001836 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001837 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001838 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00001839 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001840};
1841
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001842int
1843PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001844{
1845 long hash;
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001846 dictobject *mp = (dictobject *)op;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001847
Tim Peters0ab085c2001-09-14 00:25:33 +00001848 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001849 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001850 hash = PyObject_Hash(key);
1851 if (hash == -1)
1852 return -1;
1853 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001854 return (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001855}
1856
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001857/* Hack to implement "key in dict" */
1858static PySequenceMethods dict_as_sequence = {
1859 0, /* sq_length */
1860 0, /* sq_concat */
1861 0, /* sq_repeat */
1862 0, /* sq_item */
1863 0, /* sq_slice */
1864 0, /* sq_ass_item */
1865 0, /* sq_ass_slice */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001866 (objobjproc)PyDict_Contains, /* sq_contains */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001867 0, /* sq_inplace_concat */
1868 0, /* sq_inplace_repeat */
1869};
1870
Guido van Rossum09e563a2001-05-01 12:10:21 +00001871static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001872dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1873{
1874 PyObject *self;
1875
1876 assert(type != NULL && type->tp_alloc != NULL);
1877 self = type->tp_alloc(type, 0);
1878 if (self != NULL) {
1879 PyDictObject *d = (PyDictObject *)self;
1880 /* It's guaranteed that tp->alloc zeroed out the struct. */
1881 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
1882 INIT_NONZERO_DICT_SLOTS(d);
1883 d->ma_lookup = lookdict_string;
1884#ifdef SHOW_CONVERSION_COUNTS
1885 ++created;
1886#endif
1887 }
1888 return self;
1889}
1890
Tim Peters25786c02001-09-02 08:22:48 +00001891static int
1892dict_init(PyObject *self, PyObject *args, PyObject *kwds)
1893{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001894 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00001895}
1896
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001897static long
1898dict_nohash(PyObject *self)
1899{
1900 PyErr_SetString(PyExc_TypeError, "dict objects are unhashable");
1901 return -1;
1902}
1903
Tim Peters6d6c1a32001-08-02 04:15:00 +00001904static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00001905dict_iter(dictobject *dict)
1906{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001907 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001908}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001909
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001910PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00001911"dict() -> new empty dictionary.\n"
1912"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00001913" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00001914"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00001915" d = {}\n"
1916" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00001917" d[k] = v\n"
1918"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
1919" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00001920
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001921PyTypeObject PyDict_Type = {
1922 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001923 0,
Tim Petersa427a2b2001-10-29 22:25:45 +00001924 "dict",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001925 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001926 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00001927 (destructor)dict_dealloc, /* tp_dealloc */
1928 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001929 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00001930 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00001931 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00001932 (reprfunc)dict_repr, /* tp_repr */
1933 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001934 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00001935 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001936 dict_nohash, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00001937 0, /* tp_call */
1938 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001939 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00001940 0, /* tp_setattro */
1941 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001942 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00001943 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00001944 dictionary_doc, /* tp_doc */
Guido van Rossumb9324202001-01-18 00:39:02 +00001945 (traverseproc)dict_traverse, /* tp_traverse */
1946 (inquiry)dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00001947 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001948 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00001949 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001950 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001951 mapp_methods, /* tp_methods */
1952 0, /* tp_members */
1953 0, /* tp_getset */
1954 0, /* tp_base */
1955 0, /* tp_dict */
1956 0, /* tp_descr_get */
1957 0, /* tp_descr_set */
1958 0, /* tp_dictoffset */
Tim Peters25786c02001-09-02 08:22:48 +00001959 (initproc)dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001960 PyType_GenericAlloc, /* tp_alloc */
1961 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00001962 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001963};
1964
Guido van Rossum3cca2451997-05-16 14:23:33 +00001965/* For backward compatibility with old dictionary interface */
1966
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001967PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001968PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001969{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001970 PyObject *kv, *rv;
1971 kv = PyString_FromString(key);
1972 if (kv == NULL)
1973 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001974 rv = PyDict_GetItem(v, kv);
1975 Py_DECREF(kv);
1976 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001977}
1978
1979int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001980PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001981{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001982 PyObject *kv;
1983 int err;
1984 kv = PyString_FromString(key);
1985 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001986 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001987 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001988 err = PyDict_SetItem(v, kv, item);
1989 Py_DECREF(kv);
1990 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001991}
1992
1993int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001994PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001995{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001996 PyObject *kv;
1997 int err;
1998 kv = PyString_FromString(key);
1999 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002000 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002001 err = PyDict_DelItem(v, kv);
2002 Py_DECREF(kv);
2003 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002004}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002005
Raymond Hettinger019a1482004-03-18 02:41:19 +00002006/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002007
2008typedef struct {
2009 PyObject_HEAD
Guido van Rossum2147df72002-07-16 20:30:22 +00002010 dictobject *di_dict; /* Set to NULL when iterator is exhausted */
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002011 int di_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002012 int di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002013 PyObject* di_result; /* reusable result tuple for iteritems */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002014 long len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002015} dictiterobject;
2016
2017static PyObject *
Raymond Hettinger019a1482004-03-18 02:41:19 +00002018dictiter_new(dictobject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002019{
2020 dictiterobject *di;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002021 di = PyObject_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002022 if (di == NULL)
2023 return NULL;
2024 Py_INCREF(dict);
2025 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002026 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002027 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002028 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002029 if (itertype == &PyDictIterItem_Type) {
2030 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2031 if (di->di_result == NULL) {
2032 Py_DECREF(di);
2033 return NULL;
2034 }
2035 }
2036 else
2037 di->di_result = NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002038 return (PyObject *)di;
2039}
2040
2041static void
2042dictiter_dealloc(dictiterobject *di)
2043{
Guido van Rossum2147df72002-07-16 20:30:22 +00002044 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002045 Py_XDECREF(di->di_result);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002046 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002047}
2048
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002049static int
2050dictiter_len(dictiterobject *di)
2051{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002052 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2053 return di->len;
2054 return 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002055}
2056
2057static PySequenceMethods dictiter_as_sequence = {
2058 (inquiry)dictiter_len, /* sq_length */
2059 0, /* sq_concat */
2060};
2061
Raymond Hettinger019a1482004-03-18 02:41:19 +00002062static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002063{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002064 PyObject *key;
2065 register int i, mask;
2066 register dictentry *ep;
2067 dictobject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002068
Raymond Hettinger019a1482004-03-18 02:41:19 +00002069 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002070 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002071 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002072
Raymond Hettinger019a1482004-03-18 02:41:19 +00002073 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002074 PyErr_SetString(PyExc_RuntimeError,
2075 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002076 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002077 return NULL;
2078 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002079
Raymond Hettinger019a1482004-03-18 02:41:19 +00002080 i = di->di_pos;
2081 if (i < 0)
2082 goto fail;
2083 ep = d->ma_table;
2084 mask = d->ma_mask;
2085 while (i <= mask && ep[i].me_value == NULL)
2086 i++;
2087 di->di_pos = i+1;
2088 if (i > mask)
2089 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002090 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002091 key = ep[i].me_key;
2092 Py_INCREF(key);
2093 return key;
2094
2095fail:
2096 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002097 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002098 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002099}
2100
Raymond Hettinger019a1482004-03-18 02:41:19 +00002101PyTypeObject PyDictIterKey_Type = {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002102 PyObject_HEAD_INIT(&PyType_Type)
2103 0, /* ob_size */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002104 "dictionary-keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002105 sizeof(dictiterobject), /* tp_basicsize */
2106 0, /* tp_itemsize */
2107 /* methods */
2108 (destructor)dictiter_dealloc, /* tp_dealloc */
2109 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002110 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002111 0, /* tp_setattr */
2112 0, /* tp_compare */
2113 0, /* tp_repr */
2114 0, /* tp_as_number */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002115 &dictiter_as_sequence, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002116 0, /* tp_as_mapping */
2117 0, /* tp_hash */
2118 0, /* tp_call */
2119 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002120 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002121 0, /* tp_setattro */
2122 0, /* tp_as_buffer */
2123 Py_TPFLAGS_DEFAULT, /* tp_flags */
2124 0, /* tp_doc */
2125 0, /* tp_traverse */
2126 0, /* tp_clear */
2127 0, /* tp_richcompare */
2128 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002129 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002130 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2131};
2132
2133static PyObject *dictiter_iternextvalue(dictiterobject *di)
2134{
2135 PyObject *value;
2136 register int i, mask;
2137 register dictentry *ep;
2138 dictobject *d = di->di_dict;
2139
2140 if (d == NULL)
2141 return NULL;
2142 assert (PyDict_Check(d));
2143
2144 if (di->di_used != d->ma_used) {
2145 PyErr_SetString(PyExc_RuntimeError,
2146 "dictionary changed size during iteration");
2147 di->di_used = -1; /* Make this state sticky */
2148 return NULL;
2149 }
2150
2151 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002152 mask = d->ma_mask;
2153 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002154 goto fail;
2155 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002156 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002157 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002158 if (i > mask)
2159 goto fail;
2160 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002161 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002162 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002163 Py_INCREF(value);
2164 return value;
2165
2166fail:
2167 Py_DECREF(d);
2168 di->di_dict = NULL;
2169 return NULL;
2170}
2171
2172PyTypeObject PyDictIterValue_Type = {
2173 PyObject_HEAD_INIT(&PyType_Type)
2174 0, /* ob_size */
2175 "dictionary-valueiterator", /* tp_name */
2176 sizeof(dictiterobject), /* tp_basicsize */
2177 0, /* tp_itemsize */
2178 /* methods */
2179 (destructor)dictiter_dealloc, /* tp_dealloc */
2180 0, /* tp_print */
2181 0, /* tp_getattr */
2182 0, /* tp_setattr */
2183 0, /* tp_compare */
2184 0, /* tp_repr */
2185 0, /* tp_as_number */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002186 &dictiter_as_sequence, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002187 0, /* tp_as_mapping */
2188 0, /* tp_hash */
2189 0, /* tp_call */
2190 0, /* tp_str */
2191 PyObject_GenericGetAttr, /* tp_getattro */
2192 0, /* tp_setattro */
2193 0, /* tp_as_buffer */
2194 Py_TPFLAGS_DEFAULT, /* tp_flags */
2195 0, /* tp_doc */
2196 0, /* tp_traverse */
2197 0, /* tp_clear */
2198 0, /* tp_richcompare */
2199 0, /* tp_weaklistoffset */
2200 PyObject_SelfIter, /* tp_iter */
2201 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2202};
2203
2204static PyObject *dictiter_iternextitem(dictiterobject *di)
2205{
2206 PyObject *key, *value, *result = di->di_result;
2207 register int i, mask;
2208 register dictentry *ep;
2209 dictobject *d = di->di_dict;
2210
2211 if (d == NULL)
2212 return NULL;
2213 assert (PyDict_Check(d));
2214
2215 if (di->di_used != d->ma_used) {
2216 PyErr_SetString(PyExc_RuntimeError,
2217 "dictionary changed size during iteration");
2218 di->di_used = -1; /* Make this state sticky */
2219 return NULL;
2220 }
2221
2222 i = di->di_pos;
2223 if (i < 0)
2224 goto fail;
2225 ep = d->ma_table;
2226 mask = d->ma_mask;
2227 while (i <= mask && ep[i].me_value == NULL)
2228 i++;
2229 di->di_pos = i+1;
2230 if (i > mask)
2231 goto fail;
2232
2233 if (result->ob_refcnt == 1) {
2234 Py_INCREF(result);
2235 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2236 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2237 } else {
2238 result = PyTuple_New(2);
2239 if (result == NULL)
2240 return NULL;
2241 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002242 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002243 key = ep[i].me_key;
2244 value = ep[i].me_value;
2245 Py_INCREF(key);
2246 Py_INCREF(value);
2247 PyTuple_SET_ITEM(result, 0, key);
2248 PyTuple_SET_ITEM(result, 1, value);
2249 return result;
2250
2251fail:
2252 Py_DECREF(d);
2253 di->di_dict = NULL;
2254 return NULL;
2255}
2256
2257PyTypeObject PyDictIterItem_Type = {
2258 PyObject_HEAD_INIT(&PyType_Type)
2259 0, /* ob_size */
2260 "dictionary-itemiterator", /* tp_name */
2261 sizeof(dictiterobject), /* tp_basicsize */
2262 0, /* tp_itemsize */
2263 /* methods */
2264 (destructor)dictiter_dealloc, /* tp_dealloc */
2265 0, /* tp_print */
2266 0, /* tp_getattr */
2267 0, /* tp_setattr */
2268 0, /* tp_compare */
2269 0, /* tp_repr */
2270 0, /* tp_as_number */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002271 &dictiter_as_sequence, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002272 0, /* tp_as_mapping */
2273 0, /* tp_hash */
2274 0, /* tp_call */
2275 0, /* tp_str */
2276 PyObject_GenericGetAttr, /* tp_getattro */
2277 0, /* tp_setattro */
2278 0, /* tp_as_buffer */
2279 Py_TPFLAGS_DEFAULT, /* tp_flags */
2280 0, /* tp_doc */
2281 0, /* tp_traverse */
2282 0, /* tp_clear */
2283 0, /* tp_richcompare */
2284 0, /* tp_weaklistoffset */
2285 PyObject_SelfIter, /* tp_iter */
2286 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002287};