blob: aaca5aa4c1dae36d91336fb75b759bef72bb5b95 [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++;
Raymond Hettinger07ead172005-02-05 23:42:57 +0000403 else {
404 assert(ep->me_key == dummy);
405 Py_DECREF(dummy);
406 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000407 ep->me_key = key;
408 ep->me_hash = hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000409 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000410 mp->ma_used++;
411 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000412}
413
414/*
415Restructure the table by allocating a new table and reinserting all
416items again. When entries have been deleted, the new table may
417actually be smaller than the old one.
418*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000419static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000420dictresize(dictobject *mp, int minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000421{
Tim Peterseb28ef22001-06-02 05:27:19 +0000422 int newsize;
Tim Peters0c6010b2001-05-23 23:33:57 +0000423 dictentry *oldtable, *newtable, *ep;
424 int i;
425 int is_oldtable_malloced;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000426 dictentry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000427
428 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000429
Tim Peterseb28ef22001-06-02 05:27:19 +0000430 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000431 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000432 newsize <= minused && newsize > 0;
433 newsize <<= 1)
434 ;
435 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000437 return -1;
438 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000439
440 /* Get space for a new table. */
441 oldtable = mp->ma_table;
442 assert(oldtable != NULL);
443 is_oldtable_malloced = oldtable != mp->ma_smalltable;
444
Tim Peters6d6c1a32001-08-02 04:15:00 +0000445 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000446 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000447 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000448 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000449 if (mp->ma_fill == mp->ma_used) {
450 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000451 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000452 }
453 /* We're not going to resize it, but rebuild the
454 table anyway to purge old dummy entries.
455 Subtle: This is *necessary* if fill==size,
456 as lookdict needs at least one virgin slot to
457 terminate failing searches. If fill < size, it's
458 merely desirable, as dummies slow searches. */
459 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000460 memcpy(small_copy, oldtable, sizeof(small_copy));
461 oldtable = small_copy;
462 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000463 }
464 else {
465 newtable = PyMem_NEW(dictentry, newsize);
466 if (newtable == NULL) {
467 PyErr_NoMemory();
468 return -1;
469 }
470 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000471
472 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000473 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000474 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000475 mp->ma_mask = newsize - 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000476 memset(newtable, 0, sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000477 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000478 i = mp->ma_fill;
479 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000480
Tim Peters19283142001-05-17 22:25:34 +0000481 /* Copy the data over; this is refcount-neutral for active entries;
482 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000483 for (ep = oldtable; i > 0; ep++) {
484 if (ep->me_value != NULL) { /* active entry */
485 --i;
Tim Peters19283142001-05-17 22:25:34 +0000486 insertdict(mp, ep->me_key, ep->me_hash, ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000487 }
Tim Peters19283142001-05-17 22:25:34 +0000488 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000489 --i;
Tim Peters19283142001-05-17 22:25:34 +0000490 assert(ep->me_key == dummy);
491 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000492 }
Tim Peters19283142001-05-17 22:25:34 +0000493 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000494 }
495
Tim Peters0c6010b2001-05-23 23:33:57 +0000496 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000497 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000498 return 0;
499}
500
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000501PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000502PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000503{
504 long hash;
Fred Drake1bff34a2000-08-31 19:31:38 +0000505 dictobject *mp = (dictobject *)op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 if (!PyDict_Check(op)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000507 return NULL;
508 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000509 if (!PyString_CheckExact(key) ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000511 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000513 if (hash == -1) {
514 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000515 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000516 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000517 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000518 return (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000519}
520
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000521/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
522 * dictionary if it is merely replacing the value for an existing key.
523 * This is means that it's safe to loop over a dictionary with
524 * PyDict_Next() and occasionally replace a value -- but you can't
525 * insert new keys or remove them.
526 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000527int
Tim Peters1f5871e2000-07-04 17:44:48 +0000528PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000529{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000530 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000531 register long hash;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000532 register int n_used;
533
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 if (!PyDict_Check(op)) {
535 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000536 return -1;
537 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000538 mp = (dictobject *)op;
Tim Peters0ab085c2001-09-14 00:25:33 +0000539 if (PyString_CheckExact(key)) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000540 hash = ((PyStringObject *)key)->ob_shash;
541 if (hash == -1)
542 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000543 }
Tim Peters1f7df352002-03-29 03:29:08 +0000544 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000546 if (hash == -1)
547 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000548 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000549 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000550 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 Py_INCREF(value);
552 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000553 insertdict(mp, key, hash, value);
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000554 /* If we added a key, we can safely resize. Otherwise just return!
555 * If fill >= 2/3 size, adjust size. Normally, this doubles or
556 * quaduples the size, but it's also possible for the dict to shrink
557 * (if ma_fill is much larger than ma_used, meaning a lot of dict
558 * keys have been * deleted).
559 *
560 * Quadrupling the size improves average dictionary sparseness
561 * (reducing collisions) at the cost of some memory and iteration
562 * speed (which loops over every possible entry). It also halves
563 * the number of expensive resize operations in a growing dictionary.
564 *
565 * Very large dictionaries (over 50K items) use doubling instead.
566 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000567 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000568 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
569 return 0;
570 return dictresize(mp, mp->ma_used*(mp->ma_used>50000 ? 2 : 4));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000571}
572
573int
Tim Peters1f5871e2000-07-04 17:44:48 +0000574PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000575{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000576 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000577 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000578 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000580
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 if (!PyDict_Check(op)) {
582 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000583 return -1;
584 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000585 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000586 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000588 if (hash == -1)
589 return -1;
590 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000591 mp = (dictobject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000592 ep = (mp->ma_lookup)(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000593 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000595 return -1;
596 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000597 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000599 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000600 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000601 ep->me_value = NULL;
602 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000603 Py_DECREF(old_value);
604 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000605 return 0;
606}
607
Guido van Rossum25831651993-05-19 14:50:45 +0000608void
Tim Peters1f5871e2000-07-04 17:44:48 +0000609PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000610{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000611 dictobject *mp;
Tim Petersdea48ec2001-05-22 20:40:22 +0000612 dictentry *ep, *table;
613 int table_is_malloced;
614 int fill;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000615 dictentry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000616#ifdef Py_DEBUG
617 int i, n;
618#endif
619
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000621 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000622 mp = (dictobject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000623#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000624 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000625 i = 0;
626#endif
627
628 table = mp->ma_table;
629 assert(table != NULL);
630 table_is_malloced = table != mp->ma_smalltable;
631
632 /* This is delicate. During the process of clearing the dict,
633 * decrefs can cause the dict to mutate. To avoid fatal confusion
634 * (voice of experience), we have to make the dict empty before
635 * clearing the slots, and never refer to anything via mp->xxx while
636 * clearing.
637 */
638 fill = mp->ma_fill;
639 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000640 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000641
642 else if (fill > 0) {
643 /* It's a small table with something that needs to be cleared.
644 * Afraid the only safe way is to copy the dict entries into
645 * another small table first.
646 */
647 memcpy(small_copy, table, sizeof(small_copy));
648 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000649 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000650 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000651 /* else it's a small table that's already empty */
652
653 /* Now we can finally clear things. If C had refcounts, we could
654 * assert that the refcount on table is 1 now, i.e. that this function
655 * has unique access to it, so decref side-effects can't alter it.
656 */
657 for (ep = table; fill > 0; ++ep) {
658#ifdef Py_DEBUG
659 assert(i < n);
660 ++i;
661#endif
662 if (ep->me_key) {
663 --fill;
664 Py_DECREF(ep->me_key);
665 Py_XDECREF(ep->me_value);
666 }
667#ifdef Py_DEBUG
668 else
669 assert(ep->me_value == NULL);
670#endif
671 }
672
673 if (table_is_malloced)
674 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000675}
676
Tim Peters080c88b2003-02-15 03:01:11 +0000677/*
678 * Iterate over a dict. Use like so:
679 *
680 * int i;
681 * PyObject *key, *value;
682 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000683 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000684 * Refer to borrowed references in key and value.
685 * }
686 *
687 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000688 * mutates the dict. One exception: it is safe if the loop merely changes
689 * the values associated with the keys (but doesn't insert new keys or
690 * delete keys), via PyDict_SetItem().
691 */
Guido van Rossum25831651993-05-19 14:50:45 +0000692int
Tim Peters1f5871e2000-07-04 17:44:48 +0000693PyDict_Next(PyObject *op, int *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000694{
Raymond Hettinger43442782004-03-17 21:55:03 +0000695 register int i, mask;
696 register dictentry *ep;
697
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000698 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000699 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000700 i = *ppos;
701 if (i < 0)
702 return 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000703 ep = ((dictobject *)op)->ma_table;
704 mask = ((dictobject *)op)->ma_mask;
705 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000706 i++;
707 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000708 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000709 return 0;
710 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000711 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000712 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000713 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000714 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000715}
716
717/* Methods */
718
719static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000720dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000721{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000722 register dictentry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000723 int fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000724 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000725 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000726 for (ep = mp->ma_table; fill > 0; ep++) {
727 if (ep->me_key) {
728 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000729 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000730 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000731 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000732 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000733 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000734 PyMem_DEL(mp->ma_table);
Raymond Hettinger43442782004-03-17 21:55:03 +0000735 if (num_free_dicts < MAXFREEDICTS && mp->ob_type == &PyDict_Type)
736 free_dicts[num_free_dicts++] = mp;
737 else
738 mp->ob_type->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000739 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000740}
741
742static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000743dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000744{
745 register int i;
746 register int any;
Guido van Rossum255443b1998-04-10 22:47:14 +0000747
748 i = Py_ReprEnter((PyObject*)mp);
749 if (i != 0) {
750 if (i < 0)
751 return i;
752 fprintf(fp, "{...}");
753 return 0;
754 }
755
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000756 fprintf(fp, "{");
757 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000758 for (i = 0; i <= mp->ma_mask; i++) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000759 dictentry *ep = mp->ma_table + i;
760 PyObject *pvalue = ep->me_value;
761 if (pvalue != NULL) {
762 /* Prevent PyObject_Repr from deleting value during
763 key format */
764 Py_INCREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000765 if (any++ > 0)
766 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000767 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000768 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000769 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000770 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000771 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000772 fprintf(fp, ": ");
Tim Peters19b77cf2001-06-02 08:27:39 +0000773 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000774 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000775 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000776 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000777 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000778 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000779 }
780 }
781 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000782 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000783 return 0;
784}
785
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000787dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000788{
Tim Petersc6057842001-06-16 07:52:53 +0000789 int i;
Tim Petersa7259592001-06-16 05:11:17 +0000790 PyObject *s, *temp, *colon = NULL;
791 PyObject *pieces = NULL, *result = NULL;
792 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +0000793
Tim Petersa7259592001-06-16 05:11:17 +0000794 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +0000795 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000796 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +0000797 }
798
Tim Petersa7259592001-06-16 05:11:17 +0000799 if (mp->ma_used == 0) {
800 result = PyString_FromString("{}");
801 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000802 }
Tim Petersa7259592001-06-16 05:11:17 +0000803
804 pieces = PyList_New(0);
805 if (pieces == NULL)
806 goto Done;
807
808 colon = PyString_FromString(": ");
809 if (colon == NULL)
810 goto Done;
811
812 /* Do repr() on each key+value pair, and insert ": " between them.
813 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +0000814 i = 0;
815 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +0000816 int status;
817 /* Prevent repr from deleting value during key format. */
818 Py_INCREF(value);
819 s = PyObject_Repr(key);
820 PyString_Concat(&s, colon);
821 PyString_ConcatAndDel(&s, PyObject_Repr(value));
822 Py_DECREF(value);
823 if (s == NULL)
824 goto Done;
825 status = PyList_Append(pieces, s);
826 Py_DECREF(s); /* append created a new ref */
827 if (status < 0)
828 goto Done;
829 }
830
831 /* Add "{}" decorations to the first and last items. */
832 assert(PyList_GET_SIZE(pieces) > 0);
833 s = PyString_FromString("{");
834 if (s == NULL)
835 goto Done;
836 temp = PyList_GET_ITEM(pieces, 0);
837 PyString_ConcatAndDel(&s, temp);
838 PyList_SET_ITEM(pieces, 0, s);
839 if (s == NULL)
840 goto Done;
841
842 s = PyString_FromString("}");
843 if (s == NULL)
844 goto Done;
845 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
846 PyString_ConcatAndDel(&temp, s);
847 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
848 if (temp == NULL)
849 goto Done;
850
851 /* Paste them all together with ", " between. */
852 s = PyString_FromString(", ");
853 if (s == NULL)
854 goto Done;
855 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +0000856 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000857
858Done:
859 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +0000861 Py_ReprLeave((PyObject *)mp);
862 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000863}
864
865static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000866dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000867{
868 return mp->ma_used;
869}
870
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000872dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000873{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000875 long hash;
Tim Petersdea48ec2001-05-22 20:40:22 +0000876 assert(mp->ma_table != NULL);
Tim Peters0ab085c2001-09-14 00:25:33 +0000877 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000878 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000879 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000880 if (hash == -1)
881 return NULL;
882 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000883 v = (mp->ma_lookup)(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000884 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000886 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000887 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000888 return v;
889}
890
891static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000892dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000893{
894 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000896 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000898}
899
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000900static PyMappingMethods dict_as_mapping = {
901 (inquiry)dict_length, /*mp_length*/
902 (binaryfunc)dict_subscript, /*mp_subscript*/
903 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000904};
905
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000906static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000907dict_keys(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000908{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909 register PyObject *v;
Raymond Hettinger43442782004-03-17 21:55:03 +0000910 register int i, j;
911 dictentry *ep;
912 int mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000913
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000914 again:
915 n = mp->ma_used;
916 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000917 if (v == NULL)
918 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000919 if (n != mp->ma_used) {
920 /* Durnit. The allocations caused the dict to resize.
921 * Just start over, this shouldn't normally happen.
922 */
923 Py_DECREF(v);
924 goto again;
925 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000926 ep = mp->ma_table;
927 mask = mp->ma_mask;
928 for (i = 0, j = 0; i <= mask; i++) {
929 if (ep[i].me_value != NULL) {
930 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000932 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000933 j++;
934 }
935 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000936 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000937 return v;
938}
939
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000941dict_values(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000942{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943 register PyObject *v;
Raymond Hettinger43442782004-03-17 21:55:03 +0000944 register int i, j;
945 dictentry *ep;
946 int mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000947
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000948 again:
949 n = mp->ma_used;
950 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000951 if (v == NULL)
952 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000953 if (n != mp->ma_used) {
954 /* Durnit. The allocations caused the dict to resize.
955 * Just start over, this shouldn't normally happen.
956 */
957 Py_DECREF(v);
958 goto again;
959 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000960 ep = mp->ma_table;
961 mask = mp->ma_mask;
962 for (i = 0, j = 0; i <= mask; i++) {
963 if (ep[i].me_value != NULL) {
964 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000966 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000967 j++;
968 }
969 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000970 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +0000971 return v;
972}
973
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000975dict_items(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000976{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000978 register int i, j, n;
Raymond Hettinger43442782004-03-17 21:55:03 +0000979 int mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000980 PyObject *item, *key, *value;
Raymond Hettinger43442782004-03-17 21:55:03 +0000981 dictentry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000982
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000983 /* Preallocate the list of tuples, to avoid allocations during
984 * the loop over the items, which could trigger GC, which
985 * could resize the dict. :-(
986 */
987 again:
988 n = mp->ma_used;
989 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000990 if (v == NULL)
991 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000992 for (i = 0; i < n; i++) {
993 item = PyTuple_New(2);
994 if (item == NULL) {
995 Py_DECREF(v);
996 return NULL;
997 }
998 PyList_SET_ITEM(v, i, item);
999 }
1000 if (n != mp->ma_used) {
1001 /* Durnit. The allocations caused the dict to resize.
1002 * Just start over, this shouldn't normally happen.
1003 */
1004 Py_DECREF(v);
1005 goto again;
1006 }
1007 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001008 ep = mp->ma_table;
1009 mask = mp->ma_mask;
1010 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001011 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001012 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001013 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001014 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001015 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001017 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001018 j++;
1019 }
1020 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001021 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001022 return v;
1023}
1024
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001025static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001026dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001027{
1028 PyObject *seq;
1029 PyObject *value = Py_None;
1030 PyObject *it; /* iter(seq) */
1031 PyObject *key;
1032 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001033 int status;
1034
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001035 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001036 return NULL;
1037
1038 d = PyObject_CallObject(cls, NULL);
1039 if (d == NULL)
1040 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001041
1042 it = PyObject_GetIter(seq);
1043 if (it == NULL){
1044 Py_DECREF(d);
1045 return NULL;
1046 }
1047
1048 for (;;) {
1049 key = PyIter_Next(it);
1050 if (key == NULL) {
1051 if (PyErr_Occurred())
1052 goto Fail;
1053 break;
1054 }
Raymond Hettingere03e5b12002-12-07 08:10:51 +00001055 status = PyObject_SetItem(d, key, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001056 Py_DECREF(key);
1057 if (status < 0)
1058 goto Fail;
1059 }
1060
1061 Py_DECREF(it);
1062 return d;
1063
1064Fail:
1065 Py_DECREF(it);
1066 Py_DECREF(d);
1067 return NULL;
1068}
1069
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001070static int
1071dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001072{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001073 PyObject *arg = NULL;
1074 int result = 0;
1075
1076 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1077 result = -1;
1078
1079 else if (arg != NULL) {
1080 if (PyObject_HasAttrString(arg, "keys"))
1081 result = PyDict_Merge(self, arg, 1);
1082 else
1083 result = PyDict_MergeFromSeq2(self, arg, 1);
1084 }
1085 if (result == 0 && kwds != NULL)
1086 result = PyDict_Merge(self, kwds, 1);
1087 return result;
1088}
1089
1090static PyObject *
1091dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1092{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001093 if (dict_update_common(self, args, kwds, "update") != -1)
1094 Py_RETURN_NONE;
1095 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001096}
1097
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001098/* Update unconditionally replaces existing items.
1099 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001100 otherwise it leaves existing items unchanged.
1101
1102 PyDict_{Update,Merge} update/merge from a mapping object.
1103
Tim Petersf582b822001-12-11 18:51:08 +00001104 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001105 producing iterable objects of length 2.
1106*/
1107
Tim Petersf582b822001-12-11 18:51:08 +00001108int
Tim Peters1fc240e2001-10-26 05:06:50 +00001109PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1110{
1111 PyObject *it; /* iter(seq2) */
1112 int i; /* index into seq2 of current element */
1113 PyObject *item; /* seq2[i] */
1114 PyObject *fast; /* item as a 2-tuple or 2-list */
1115
1116 assert(d != NULL);
1117 assert(PyDict_Check(d));
1118 assert(seq2 != NULL);
1119
1120 it = PyObject_GetIter(seq2);
1121 if (it == NULL)
1122 return -1;
1123
1124 for (i = 0; ; ++i) {
1125 PyObject *key, *value;
1126 int n;
1127
1128 fast = NULL;
1129 item = PyIter_Next(it);
1130 if (item == NULL) {
1131 if (PyErr_Occurred())
1132 goto Fail;
1133 break;
1134 }
1135
1136 /* Convert item to sequence, and verify length 2. */
1137 fast = PySequence_Fast(item, "");
1138 if (fast == NULL) {
1139 if (PyErr_ExceptionMatches(PyExc_TypeError))
1140 PyErr_Format(PyExc_TypeError,
1141 "cannot convert dictionary update "
1142 "sequence element #%d to a sequence",
1143 i);
1144 goto Fail;
1145 }
1146 n = PySequence_Fast_GET_SIZE(fast);
1147 if (n != 2) {
1148 PyErr_Format(PyExc_ValueError,
1149 "dictionary update sequence element #%d "
1150 "has length %d; 2 is required",
1151 i, n);
1152 goto Fail;
1153 }
1154
1155 /* Update/merge with this (key, value) pair. */
1156 key = PySequence_Fast_GET_ITEM(fast, 0);
1157 value = PySequence_Fast_GET_ITEM(fast, 1);
1158 if (override || PyDict_GetItem(d, key) == NULL) {
1159 int status = PyDict_SetItem(d, key, value);
1160 if (status < 0)
1161 goto Fail;
1162 }
1163 Py_DECREF(fast);
1164 Py_DECREF(item);
1165 }
1166
1167 i = 0;
1168 goto Return;
1169Fail:
1170 Py_XDECREF(item);
1171 Py_XDECREF(fast);
1172 i = -1;
1173Return:
1174 Py_DECREF(it);
1175 return i;
1176}
1177
Tim Peters6d6c1a32001-08-02 04:15:00 +00001178int
1179PyDict_Update(PyObject *a, PyObject *b)
1180{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001181 return PyDict_Merge(a, b, 1);
1182}
1183
1184int
1185PyDict_Merge(PyObject *a, PyObject *b, int override)
1186{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001187 register PyDictObject *mp, *other;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001188 register int i;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001189 dictentry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001190
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001191 /* We accept for the argument either a concrete dictionary object,
1192 * or an abstract "mapping" object. For the former, we can do
1193 * things quite efficiently. For the latter, we only require that
1194 * PyMapping_Keys() and PyObject_GetItem() be supported.
1195 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001196 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1197 PyErr_BadInternalCall();
1198 return -1;
1199 }
1200 mp = (dictobject*)a;
1201 if (PyDict_Check(b)) {
1202 other = (dictobject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001203 if (other == mp || other->ma_used == 0)
1204 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001205 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001206 if (mp->ma_used == 0)
1207 /* Since the target dict is empty, PyDict_GetItem()
1208 * always returns NULL. Setting override to 1
1209 * skips the unnecessary test.
1210 */
1211 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001212 /* Do one big resize at the start, rather than
1213 * incrementally resizing as we insert new items. Expect
1214 * that there will be no (or few) overlapping keys.
1215 */
1216 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001217 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001218 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001219 }
1220 for (i = 0; i <= other->ma_mask; i++) {
1221 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001222 if (entry->me_value != NULL &&
1223 (override ||
1224 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001225 Py_INCREF(entry->me_key);
1226 Py_INCREF(entry->me_value);
1227 insertdict(mp, entry->me_key, entry->me_hash,
1228 entry->me_value);
1229 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001230 }
1231 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001232 else {
1233 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001234 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001235 PyObject *iter;
1236 PyObject *key, *value;
1237 int status;
1238
1239 if (keys == NULL)
1240 /* Docstring says this is equivalent to E.keys() so
1241 * if E doesn't have a .keys() method we want
1242 * AttributeError to percolate up. Might as well
1243 * do the same for any other error.
1244 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001245 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001246
1247 iter = PyObject_GetIter(keys);
1248 Py_DECREF(keys);
1249 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001250 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001251
1252 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001253 if (!override && PyDict_GetItem(a, key) != NULL) {
1254 Py_DECREF(key);
1255 continue;
1256 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001257 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001258 if (value == NULL) {
1259 Py_DECREF(iter);
1260 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001261 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001262 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001263 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001264 Py_DECREF(key);
1265 Py_DECREF(value);
1266 if (status < 0) {
1267 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001268 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001269 }
1270 }
1271 Py_DECREF(iter);
1272 if (PyErr_Occurred())
1273 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001274 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001275 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001276 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001277}
1278
1279static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001280dict_copy(register dictobject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001281{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001282 return PyDict_Copy((PyObject*)mp);
1283}
1284
1285PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001286PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001287{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001288 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001289
1290 if (o == NULL || !PyDict_Check(o)) {
1291 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001292 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001293 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001294 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001295 if (copy == NULL)
1296 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001297 if (PyDict_Merge(copy, o, 1) == 0)
1298 return copy;
1299 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001300 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001301}
1302
Guido van Rossum4199fac1993-11-05 10:18:44 +00001303int
Tim Peters1f5871e2000-07-04 17:44:48 +00001304PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001305{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 if (mp == NULL || !PyDict_Check(mp)) {
1307 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001308 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001309 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001310 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001311}
1312
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001314PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001315{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001316 if (mp == NULL || !PyDict_Check(mp)) {
1317 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001318 return NULL;
1319 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001320 return dict_keys((dictobject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001321}
1322
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001324PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001325{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 if (mp == NULL || !PyDict_Check(mp)) {
1327 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001328 return NULL;
1329 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001330 return dict_values((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001331}
1332
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001334PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001335{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336 if (mp == NULL || !PyDict_Check(mp)) {
1337 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001338 return NULL;
1339 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001340 return dict_items((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001341}
1342
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001343/* Subroutine which returns the smallest key in a for which b's value
1344 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001345 pval argument. Both are NULL if no key in a is found for which b's status
1346 differs. The refcounts on (and only on) non-NULL *pval and function return
1347 values must be decremented by the caller (characterize() increments them
1348 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1349 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001350
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001351static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001352characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001353{
Tim Peters95bf9392001-05-10 08:32:44 +00001354 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1355 PyObject *aval = NULL; /* a[akey] */
Guido van Rossumb9324202001-01-18 00:39:02 +00001356 int i, cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001357
Tim Petersafb6ae82001-06-04 21:00:21 +00001358 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001359 PyObject *thiskey, *thisaval, *thisbval;
1360 if (a->ma_table[i].me_value == NULL)
1361 continue;
1362 thiskey = a->ma_table[i].me_key;
1363 Py_INCREF(thiskey); /* keep alive across compares */
1364 if (akey != NULL) {
1365 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1366 if (cmp < 0) {
1367 Py_DECREF(thiskey);
1368 goto Fail;
1369 }
1370 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001371 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001372 a->ma_table[i].me_value == NULL)
1373 {
1374 /* Not the *smallest* a key; or maybe it is
1375 * but the compare shrunk the dict so we can't
1376 * find its associated value anymore; or
1377 * maybe it is but the compare deleted the
1378 * a[thiskey] entry.
1379 */
1380 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001381 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001382 }
Tim Peters95bf9392001-05-10 08:32:44 +00001383 }
1384
1385 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1386 thisaval = a->ma_table[i].me_value;
1387 assert(thisaval);
1388 Py_INCREF(thisaval); /* keep alive */
1389 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1390 if (thisbval == NULL)
1391 cmp = 0;
1392 else {
1393 /* both dicts have thiskey: same values? */
1394 cmp = PyObject_RichCompareBool(
1395 thisaval, thisbval, Py_EQ);
1396 if (cmp < 0) {
1397 Py_DECREF(thiskey);
1398 Py_DECREF(thisaval);
1399 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001400 }
1401 }
Tim Peters95bf9392001-05-10 08:32:44 +00001402 if (cmp == 0) {
1403 /* New winner. */
1404 Py_XDECREF(akey);
1405 Py_XDECREF(aval);
1406 akey = thiskey;
1407 aval = thisaval;
1408 }
1409 else {
1410 Py_DECREF(thiskey);
1411 Py_DECREF(thisaval);
1412 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001413 }
Tim Peters95bf9392001-05-10 08:32:44 +00001414 *pval = aval;
1415 return akey;
1416
1417Fail:
1418 Py_XDECREF(akey);
1419 Py_XDECREF(aval);
1420 *pval = NULL;
1421 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001422}
1423
1424static int
Tim Peters1f5871e2000-07-04 17:44:48 +00001425dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001426{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001428 int res;
1429
1430 /* Compare lengths first */
1431 if (a->ma_used < b->ma_used)
1432 return -1; /* a is shorter */
1433 else if (a->ma_used > b->ma_used)
1434 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001435
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001436 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001437 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001438 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001439 if (adiff == NULL) {
1440 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001441 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001442 * must be equal.
1443 */
1444 res = PyErr_Occurred() ? -1 : 0;
1445 goto Finished;
1446 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001447 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001448 if (bdiff == NULL && PyErr_Occurred()) {
1449 assert(!bval);
1450 res = -1;
1451 goto Finished;
1452 }
1453 res = 0;
1454 if (bdiff) {
1455 /* bdiff == NULL "should be" impossible now, but perhaps
1456 * the last comparison done by the characterize() on a had
1457 * the side effect of making the dicts equal!
1458 */
1459 res = PyObject_Compare(adiff, bdiff);
1460 }
1461 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001462 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001463
1464Finished:
1465 Py_XDECREF(adiff);
1466 Py_XDECREF(bdiff);
1467 Py_XDECREF(aval);
1468 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001469 return res;
1470}
1471
Tim Peterse63415e2001-05-08 04:38:29 +00001472/* Return 1 if dicts equal, 0 if not, -1 if error.
1473 * Gets out as soon as any difference is detected.
1474 * Uses only Py_EQ comparison.
1475 */
1476static int
1477dict_equal(dictobject *a, dictobject *b)
1478{
1479 int i;
1480
1481 if (a->ma_used != b->ma_used)
1482 /* can't be equal if # of entries differ */
1483 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001484
Tim Peterse63415e2001-05-08 04:38:29 +00001485 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001486 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001487 PyObject *aval = a->ma_table[i].me_value;
1488 if (aval != NULL) {
1489 int cmp;
1490 PyObject *bval;
1491 PyObject *key = a->ma_table[i].me_key;
1492 /* temporarily bump aval's refcount to ensure it stays
1493 alive until we're done with it */
1494 Py_INCREF(aval);
1495 bval = PyDict_GetItem((PyObject *)b, key);
1496 if (bval == NULL) {
1497 Py_DECREF(aval);
1498 return 0;
1499 }
1500 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1501 Py_DECREF(aval);
1502 if (cmp <= 0) /* error or not equal */
1503 return cmp;
1504 }
1505 }
1506 return 1;
1507 }
1508
1509static PyObject *
1510dict_richcompare(PyObject *v, PyObject *w, int op)
1511{
1512 int cmp;
1513 PyObject *res;
1514
1515 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1516 res = Py_NotImplemented;
1517 }
1518 else if (op == Py_EQ || op == Py_NE) {
1519 cmp = dict_equal((dictobject *)v, (dictobject *)w);
1520 if (cmp < 0)
1521 return NULL;
1522 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1523 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001524 else
1525 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001526 Py_INCREF(res);
1527 return res;
1528 }
1529
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001530static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001531dict_has_key(register dictobject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001532{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001533 long hash;
1534 register long ok;
Tim Peters0ab085c2001-09-14 00:25:33 +00001535 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001536 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001537 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001538 if (hash == -1)
1539 return NULL;
1540 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001541 ok = (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001542 return PyBool_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001543}
1544
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001545static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001546dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001547{
1548 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001549 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001550 PyObject *val = NULL;
1551 long hash;
1552
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001553 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001554 return NULL;
1555
Tim Peters0ab085c2001-09-14 00:25:33 +00001556 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001557 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001558 hash = PyObject_Hash(key);
1559 if (hash == -1)
1560 return NULL;
1561 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001562 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001563
Barry Warsawc38c5da1997-10-06 17:49:20 +00001564 if (val == NULL)
1565 val = failobj;
1566 Py_INCREF(val);
1567 return val;
1568}
1569
1570
1571static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001572dict_setdefault(register dictobject *mp, PyObject *args)
1573{
1574 PyObject *key;
1575 PyObject *failobj = Py_None;
1576 PyObject *val = NULL;
1577 long hash;
1578
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001579 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001580 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001581
Tim Peters0ab085c2001-09-14 00:25:33 +00001582 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001583 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001584 hash = PyObject_Hash(key);
1585 if (hash == -1)
1586 return NULL;
1587 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001588 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001589 if (val == NULL) {
1590 val = failobj;
1591 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1592 val = NULL;
1593 }
1594 Py_XINCREF(val);
1595 return val;
1596}
1597
1598
1599static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001600dict_clear(register dictobject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001601{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001602 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001603 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001604}
1605
Guido van Rossumba6ab842000-12-12 22:02:18 +00001606static PyObject *
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001607dict_pop(dictobject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001608{
1609 long hash;
1610 dictentry *ep;
1611 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001612 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001613
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001614 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1615 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001616 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001617 if (deflt) {
1618 Py_INCREF(deflt);
1619 return deflt;
1620 }
Guido van Rossume027d982002-04-12 15:11:59 +00001621 PyErr_SetString(PyExc_KeyError,
1622 "pop(): dictionary is empty");
1623 return NULL;
1624 }
1625 if (!PyString_CheckExact(key) ||
1626 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1627 hash = PyObject_Hash(key);
1628 if (hash == -1)
1629 return NULL;
1630 }
1631 ep = (mp->ma_lookup)(mp, key, hash);
1632 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001633 if (deflt) {
1634 Py_INCREF(deflt);
1635 return deflt;
1636 }
Guido van Rossume027d982002-04-12 15:11:59 +00001637 PyErr_SetObject(PyExc_KeyError, key);
1638 return NULL;
1639 }
1640 old_key = ep->me_key;
1641 Py_INCREF(dummy);
1642 ep->me_key = dummy;
1643 old_value = ep->me_value;
1644 ep->me_value = NULL;
1645 mp->ma_used--;
1646 Py_DECREF(old_key);
1647 return old_value;
1648}
1649
1650static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001651dict_popitem(dictobject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001652{
1653 int i = 0;
1654 dictentry *ep;
1655 PyObject *res;
1656
Tim Petersf4b33f62001-06-02 05:42:29 +00001657 /* Allocate the result tuple before checking the size. Believe it
1658 * or not, this allocation could trigger a garbage collection which
1659 * could empty the dict, so if we checked the size first and that
1660 * happened, the result would be an infinite loop (searching for an
1661 * entry that no longer exists). Note that the usual popitem()
1662 * idiom is "while d: k, v = d.popitem()". so needing to throw the
1663 * tuple away if the dict *is* empty isn't a significant
1664 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001665 */
1666 res = PyTuple_New(2);
1667 if (res == NULL)
1668 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001669 if (mp->ma_used == 0) {
1670 Py_DECREF(res);
1671 PyErr_SetString(PyExc_KeyError,
1672 "popitem(): dictionary is empty");
1673 return NULL;
1674 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001675 /* Set ep to "the first" dict entry with a value. We abuse the hash
1676 * field of slot 0 to hold a search finger:
1677 * If slot 0 has a value, use slot 0.
1678 * Else slot 0 is being used to hold a search finger,
1679 * and we use its hash value as the first index to look.
1680 */
1681 ep = &mp->ma_table[0];
1682 if (ep->me_value == NULL) {
1683 i = (int)ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001684 /* The hash field may be a real hash value, or it may be a
1685 * legit search finger, or it may be a once-legit search
1686 * finger that's out of bounds now because it wrapped around
1687 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001688 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001689 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001690 i = 1; /* skip slot 0 */
1691 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1692 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001693 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001694 i = 1;
1695 }
1696 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001697 PyTuple_SET_ITEM(res, 0, ep->me_key);
1698 PyTuple_SET_ITEM(res, 1, ep->me_value);
1699 Py_INCREF(dummy);
1700 ep->me_key = dummy;
1701 ep->me_value = NULL;
1702 mp->ma_used--;
1703 assert(mp->ma_table[0].me_value == NULL);
1704 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001705 return res;
1706}
1707
Jeremy Hylton8caad492000-06-23 14:18:11 +00001708static int
1709dict_traverse(PyObject *op, visitproc visit, void *arg)
1710{
1711 int i = 0, err;
1712 PyObject *pk;
1713 PyObject *pv;
1714
1715 while (PyDict_Next(op, &i, &pk, &pv)) {
1716 err = visit(pk, arg);
1717 if (err)
1718 return err;
1719 err = visit(pv, arg);
1720 if (err)
1721 return err;
1722 }
1723 return 0;
1724}
1725
1726static int
1727dict_tp_clear(PyObject *op)
1728{
1729 PyDict_Clear(op);
1730 return 0;
1731}
1732
Tim Petersf7f88b12000-12-13 23:18:45 +00001733
Raymond Hettinger019a1482004-03-18 02:41:19 +00001734extern PyTypeObject PyDictIterKey_Type; /* Forward */
1735extern PyTypeObject PyDictIterValue_Type; /* Forward */
1736extern PyTypeObject PyDictIterItem_Type; /* Forward */
1737static PyObject *dictiter_new(dictobject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001738
1739static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001740dict_iterkeys(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001741{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001742 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001743}
1744
1745static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001746dict_itervalues(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001747{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001748 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001749}
1750
1751static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001752dict_iteritems(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001753{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001754 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001755}
1756
1757
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001758PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00001759"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00001760
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001761PyDoc_STRVAR(contains__doc__,
1762"D.__contains__(k) -> True if D has a key k, else False");
1763
1764PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1765
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001766PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001767"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001768
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001769PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001770"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 +00001771
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001772PyDoc_STRVAR(pop__doc__,
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001773"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
1774If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001775
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001776PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001777"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000017782-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00001779
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001780PyDoc_STRVAR(keys__doc__,
1781"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00001782
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001783PyDoc_STRVAR(items__doc__,
1784"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00001785
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001786PyDoc_STRVAR(values__doc__,
1787"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00001788
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001789PyDoc_STRVAR(update__doc__,
Walter Dörwaldd70ad8a2004-05-28 20:59:21 +00001790"D.update(E, **F) -> None. Update D from E and F: for k in E: D[k] = E[k]\n\
1791(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 +00001792
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001793PyDoc_STRVAR(fromkeys__doc__,
1794"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1795v defaults to None.");
1796
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001797PyDoc_STRVAR(clear__doc__,
1798"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001799
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001800PyDoc_STRVAR(copy__doc__,
1801"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001802
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001803PyDoc_STRVAR(iterkeys__doc__,
1804"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001805
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001806PyDoc_STRVAR(itervalues__doc__,
1807"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001808
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001809PyDoc_STRVAR(iteritems__doc__,
1810"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001811
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001812static PyMethodDef mapp_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001813 {"__contains__",(PyCFunction)dict_has_key, METH_O | METH_COEXIST,
1814 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00001815 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001816 getitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001817 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001818 has_key__doc__},
1819 {"get", (PyCFunction)dict_get, METH_VARARGS,
1820 get__doc__},
1821 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1822 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001823 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00001824 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001825 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001826 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001827 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001828 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001829 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001830 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001831 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001832 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001833 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001834 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001835 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
1836 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001837 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001838 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001839 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001840 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001841 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001842 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001843 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001844 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001845 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001846 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00001847 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001848};
1849
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001850int
1851PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001852{
1853 long hash;
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001854 dictobject *mp = (dictobject *)op;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001855
Tim Peters0ab085c2001-09-14 00:25:33 +00001856 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001857 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001858 hash = PyObject_Hash(key);
1859 if (hash == -1)
1860 return -1;
1861 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001862 return (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001863}
1864
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001865/* Hack to implement "key in dict" */
1866static PySequenceMethods dict_as_sequence = {
1867 0, /* sq_length */
1868 0, /* sq_concat */
1869 0, /* sq_repeat */
1870 0, /* sq_item */
1871 0, /* sq_slice */
1872 0, /* sq_ass_item */
1873 0, /* sq_ass_slice */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001874 (objobjproc)PyDict_Contains, /* sq_contains */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001875 0, /* sq_inplace_concat */
1876 0, /* sq_inplace_repeat */
1877};
1878
Guido van Rossum09e563a2001-05-01 12:10:21 +00001879static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001880dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1881{
1882 PyObject *self;
1883
1884 assert(type != NULL && type->tp_alloc != NULL);
1885 self = type->tp_alloc(type, 0);
1886 if (self != NULL) {
1887 PyDictObject *d = (PyDictObject *)self;
1888 /* It's guaranteed that tp->alloc zeroed out the struct. */
1889 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
1890 INIT_NONZERO_DICT_SLOTS(d);
1891 d->ma_lookup = lookdict_string;
1892#ifdef SHOW_CONVERSION_COUNTS
1893 ++created;
1894#endif
1895 }
1896 return self;
1897}
1898
Tim Peters25786c02001-09-02 08:22:48 +00001899static int
1900dict_init(PyObject *self, PyObject *args, PyObject *kwds)
1901{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001902 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00001903}
1904
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001905static long
1906dict_nohash(PyObject *self)
1907{
1908 PyErr_SetString(PyExc_TypeError, "dict objects are unhashable");
1909 return -1;
1910}
1911
Tim Peters6d6c1a32001-08-02 04:15:00 +00001912static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00001913dict_iter(dictobject *dict)
1914{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001915 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001916}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001917
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001918PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00001919"dict() -> new empty dictionary.\n"
1920"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00001921" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00001922"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00001923" d = {}\n"
1924" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00001925" d[k] = v\n"
1926"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
1927" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00001928
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001929PyTypeObject PyDict_Type = {
1930 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001931 0,
Tim Petersa427a2b2001-10-29 22:25:45 +00001932 "dict",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001933 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001934 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00001935 (destructor)dict_dealloc, /* tp_dealloc */
1936 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001937 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00001938 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00001939 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00001940 (reprfunc)dict_repr, /* tp_repr */
1941 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001942 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00001943 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001944 dict_nohash, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00001945 0, /* tp_call */
1946 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001947 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00001948 0, /* tp_setattro */
1949 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001950 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00001951 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00001952 dictionary_doc, /* tp_doc */
Guido van Rossumb9324202001-01-18 00:39:02 +00001953 (traverseproc)dict_traverse, /* tp_traverse */
1954 (inquiry)dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00001955 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001956 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00001957 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001958 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001959 mapp_methods, /* tp_methods */
1960 0, /* tp_members */
1961 0, /* tp_getset */
1962 0, /* tp_base */
1963 0, /* tp_dict */
1964 0, /* tp_descr_get */
1965 0, /* tp_descr_set */
1966 0, /* tp_dictoffset */
Tim Peters25786c02001-09-02 08:22:48 +00001967 (initproc)dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001968 PyType_GenericAlloc, /* tp_alloc */
1969 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00001970 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001971};
1972
Guido van Rossum3cca2451997-05-16 14:23:33 +00001973/* For backward compatibility with old dictionary interface */
1974
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001975PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001976PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001977{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001978 PyObject *kv, *rv;
1979 kv = PyString_FromString(key);
1980 if (kv == NULL)
1981 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001982 rv = PyDict_GetItem(v, kv);
1983 Py_DECREF(kv);
1984 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001985}
1986
1987int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001988PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001989{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001990 PyObject *kv;
1991 int err;
1992 kv = PyString_FromString(key);
1993 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001994 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001995 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001996 err = PyDict_SetItem(v, kv, item);
1997 Py_DECREF(kv);
1998 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001999}
2000
2001int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002002PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002003{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002004 PyObject *kv;
2005 int err;
2006 kv = PyString_FromString(key);
2007 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002008 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002009 err = PyDict_DelItem(v, kv);
2010 Py_DECREF(kv);
2011 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002012}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002013
Raymond Hettinger019a1482004-03-18 02:41:19 +00002014/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002015
2016typedef struct {
2017 PyObject_HEAD
Guido van Rossum2147df72002-07-16 20:30:22 +00002018 dictobject *di_dict; /* Set to NULL when iterator is exhausted */
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002019 int di_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002020 int di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002021 PyObject* di_result; /* reusable result tuple for iteritems */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002022 long len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002023} dictiterobject;
2024
2025static PyObject *
Raymond Hettinger019a1482004-03-18 02:41:19 +00002026dictiter_new(dictobject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002027{
2028 dictiterobject *di;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002029 di = PyObject_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002030 if (di == NULL)
2031 return NULL;
2032 Py_INCREF(dict);
2033 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002034 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002035 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002036 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002037 if (itertype == &PyDictIterItem_Type) {
2038 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2039 if (di->di_result == NULL) {
2040 Py_DECREF(di);
2041 return NULL;
2042 }
2043 }
2044 else
2045 di->di_result = NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002046 return (PyObject *)di;
2047}
2048
2049static void
2050dictiter_dealloc(dictiterobject *di)
2051{
Guido van Rossum2147df72002-07-16 20:30:22 +00002052 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002053 Py_XDECREF(di->di_result);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002054 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002055}
2056
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002057static int
2058dictiter_len(dictiterobject *di)
2059{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002060 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2061 return di->len;
2062 return 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002063}
2064
2065static PySequenceMethods dictiter_as_sequence = {
2066 (inquiry)dictiter_len, /* sq_length */
2067 0, /* sq_concat */
2068};
2069
Raymond Hettinger019a1482004-03-18 02:41:19 +00002070static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002071{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002072 PyObject *key;
2073 register int i, mask;
2074 register dictentry *ep;
2075 dictobject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002076
Raymond Hettinger019a1482004-03-18 02:41:19 +00002077 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002078 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002079 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002080
Raymond Hettinger019a1482004-03-18 02:41:19 +00002081 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002082 PyErr_SetString(PyExc_RuntimeError,
2083 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002084 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002085 return NULL;
2086 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002087
Raymond Hettinger019a1482004-03-18 02:41:19 +00002088 i = di->di_pos;
2089 if (i < 0)
2090 goto fail;
2091 ep = d->ma_table;
2092 mask = d->ma_mask;
2093 while (i <= mask && ep[i].me_value == NULL)
2094 i++;
2095 di->di_pos = i+1;
2096 if (i > mask)
2097 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002098 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002099 key = ep[i].me_key;
2100 Py_INCREF(key);
2101 return key;
2102
2103fail:
2104 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002105 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002106 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002107}
2108
Raymond Hettinger019a1482004-03-18 02:41:19 +00002109PyTypeObject PyDictIterKey_Type = {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002110 PyObject_HEAD_INIT(&PyType_Type)
2111 0, /* ob_size */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002112 "dictionary-keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002113 sizeof(dictiterobject), /* tp_basicsize */
2114 0, /* tp_itemsize */
2115 /* methods */
2116 (destructor)dictiter_dealloc, /* tp_dealloc */
2117 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002118 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002119 0, /* tp_setattr */
2120 0, /* tp_compare */
2121 0, /* tp_repr */
2122 0, /* tp_as_number */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002123 &dictiter_as_sequence, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002124 0, /* tp_as_mapping */
2125 0, /* tp_hash */
2126 0, /* tp_call */
2127 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002128 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002129 0, /* tp_setattro */
2130 0, /* tp_as_buffer */
2131 Py_TPFLAGS_DEFAULT, /* tp_flags */
2132 0, /* tp_doc */
2133 0, /* tp_traverse */
2134 0, /* tp_clear */
2135 0, /* tp_richcompare */
2136 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002137 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002138 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2139};
2140
2141static PyObject *dictiter_iternextvalue(dictiterobject *di)
2142{
2143 PyObject *value;
2144 register int i, mask;
2145 register dictentry *ep;
2146 dictobject *d = di->di_dict;
2147
2148 if (d == NULL)
2149 return NULL;
2150 assert (PyDict_Check(d));
2151
2152 if (di->di_used != d->ma_used) {
2153 PyErr_SetString(PyExc_RuntimeError,
2154 "dictionary changed size during iteration");
2155 di->di_used = -1; /* Make this state sticky */
2156 return NULL;
2157 }
2158
2159 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002160 mask = d->ma_mask;
2161 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002162 goto fail;
2163 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002164 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002165 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002166 if (i > mask)
2167 goto fail;
2168 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002169 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002170 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002171 Py_INCREF(value);
2172 return value;
2173
2174fail:
2175 Py_DECREF(d);
2176 di->di_dict = NULL;
2177 return NULL;
2178}
2179
2180PyTypeObject PyDictIterValue_Type = {
2181 PyObject_HEAD_INIT(&PyType_Type)
2182 0, /* ob_size */
2183 "dictionary-valueiterator", /* tp_name */
2184 sizeof(dictiterobject), /* tp_basicsize */
2185 0, /* tp_itemsize */
2186 /* methods */
2187 (destructor)dictiter_dealloc, /* tp_dealloc */
2188 0, /* tp_print */
2189 0, /* tp_getattr */
2190 0, /* tp_setattr */
2191 0, /* tp_compare */
2192 0, /* tp_repr */
2193 0, /* tp_as_number */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002194 &dictiter_as_sequence, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002195 0, /* tp_as_mapping */
2196 0, /* tp_hash */
2197 0, /* tp_call */
2198 0, /* tp_str */
2199 PyObject_GenericGetAttr, /* tp_getattro */
2200 0, /* tp_setattro */
2201 0, /* tp_as_buffer */
2202 Py_TPFLAGS_DEFAULT, /* tp_flags */
2203 0, /* tp_doc */
2204 0, /* tp_traverse */
2205 0, /* tp_clear */
2206 0, /* tp_richcompare */
2207 0, /* tp_weaklistoffset */
2208 PyObject_SelfIter, /* tp_iter */
2209 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2210};
2211
2212static PyObject *dictiter_iternextitem(dictiterobject *di)
2213{
2214 PyObject *key, *value, *result = di->di_result;
2215 register int i, mask;
2216 register dictentry *ep;
2217 dictobject *d = di->di_dict;
2218
2219 if (d == NULL)
2220 return NULL;
2221 assert (PyDict_Check(d));
2222
2223 if (di->di_used != d->ma_used) {
2224 PyErr_SetString(PyExc_RuntimeError,
2225 "dictionary changed size during iteration");
2226 di->di_used = -1; /* Make this state sticky */
2227 return NULL;
2228 }
2229
2230 i = di->di_pos;
2231 if (i < 0)
2232 goto fail;
2233 ep = d->ma_table;
2234 mask = d->ma_mask;
2235 while (i <= mask && ep[i].me_value == NULL)
2236 i++;
2237 di->di_pos = i+1;
2238 if (i > mask)
2239 goto fail;
2240
2241 if (result->ob_refcnt == 1) {
2242 Py_INCREF(result);
2243 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2244 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2245 } else {
2246 result = PyTuple_New(2);
2247 if (result == NULL)
2248 return NULL;
2249 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002250 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002251 key = ep[i].me_key;
2252 value = ep[i].me_value;
2253 Py_INCREF(key);
2254 Py_INCREF(value);
2255 PyTuple_SET_ITEM(result, 0, key);
2256 PyTuple_SET_ITEM(result, 1, value);
2257 return result;
2258
2259fail:
2260 Py_DECREF(d);
2261 di->di_dict = NULL;
2262 return NULL;
2263}
2264
2265PyTypeObject PyDictIterItem_Type = {
2266 PyObject_HEAD_INIT(&PyType_Type)
2267 0, /* ob_size */
2268 "dictionary-itemiterator", /* tp_name */
2269 sizeof(dictiterobject), /* tp_basicsize */
2270 0, /* tp_itemsize */
2271 /* methods */
2272 (destructor)dictiter_dealloc, /* tp_dealloc */
2273 0, /* tp_print */
2274 0, /* tp_getattr */
2275 0, /* tp_setattr */
2276 0, /* tp_compare */
2277 0, /* tp_repr */
2278 0, /* tp_as_number */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002279 &dictiter_as_sequence, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002280 0, /* tp_as_mapping */
2281 0, /* tp_hash */
2282 0, /* tp_call */
2283 0, /* tp_str */
2284 PyObject_GenericGetAttr, /* tp_getattro */
2285 0, /* tp_setattro */
2286 0, /* tp_as_buffer */
2287 Py_TPFLAGS_DEFAULT, /* tp_flags */
2288 0, /* tp_doc */
2289 0, /* tp_traverse */
2290 0, /* tp_clear */
2291 0, /* tp_richcompare */
2292 0, /* tp_weaklistoffset */
2293 PyObject_SelfIter, /* tp_iter */
2294 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002295};