blob: 35a3e31672b6069bfdf4e855ab6315d8119d5a1e [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
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000156PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000157{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000158 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000159 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000161 if (dummy == NULL)
162 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000163#ifdef SHOW_CONVERSION_COUNTS
164 Py_AtExit(show_counts);
165#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000166 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000167 mp = PyObject_GC_New(dictobject, &PyDict_Type);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000168 if (mp == NULL)
169 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170 EMPTY_TO_MINSIZE(mp);
Fred Drake1bff34a2000-08-31 19:31:38 +0000171 mp->ma_lookup = lookdict_string;
172#ifdef SHOW_CONVERSION_COUNTS
173 ++created;
174#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000175 _PyObject_GC_TRACK(mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000176 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000177}
178
179/*
180The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000181This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000182Open addressing is preferred over chaining since the link overhead for
183chaining would be substantial (100% with typical malloc overhead).
184
Tim Peterseb28ef22001-06-02 05:27:19 +0000185The initial probe index is computed as hash mod the table size. Subsequent
186probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000187
188All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000189
Tim Peterseb28ef22001-06-02 05:27:19 +0000190(The details in this version are due to Tim Peters, building on many past
191contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
192Christian Tismer).
Fred Drake1bff34a2000-08-31 19:31:38 +0000193
194This function must never return NULL; failures are indicated by returning
195a dictentry* for which the me_value field is NULL. Exceptions are never
196reported by this function, and outstanding exceptions are maintained.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000197*/
Tim Peterseb28ef22001-06-02 05:27:19 +0000198
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000199static dictentry *
Tim Peters1f5871e2000-07-04 17:44:48 +0000200lookdict(dictobject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000201{
Guido van Rossum16e93a81997-01-28 00:00:11 +0000202 register int i;
Tim Peterseb28ef22001-06-02 05:27:19 +0000203 register unsigned int perturb;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000204 register dictentry *freeslot;
Tim Petersafb6ae82001-06-04 21:00:21 +0000205 register unsigned int mask = mp->ma_mask;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000206 dictentry *ep0 = mp->ma_table;
207 register dictentry *ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000208 register int restore_error;
209 register int checked_error;
Fred Drakec88b99c2000-08-31 19:04:07 +0000210 register int cmp;
211 PyObject *err_type, *err_value, *err_tb;
Tim Peters453163d2001-06-03 04:54:32 +0000212 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000213
Tim Peters2f228e72001-05-13 00:19:31 +0000214 i = hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000215 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000216 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000217 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000218
219 restore_error = checked_error = 0;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000220 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000221 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000222 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000223 if (ep->me_hash == hash) {
224 /* error can't have been checked yet */
225 checked_error = 1;
226 if (PyErr_Occurred()) {
227 restore_error = 1;
228 PyErr_Fetch(&err_type, &err_value, &err_tb);
229 }
Tim Peters453163d2001-06-03 04:54:32 +0000230 startkey = ep->me_key;
231 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000232 if (cmp < 0)
Guido van Rossumb9324202001-01-18 00:39:02 +0000233 PyErr_Clear();
Tim Peters453163d2001-06-03 04:54:32 +0000234 if (ep0 == mp->ma_table && ep->me_key == startkey) {
235 if (cmp > 0)
236 goto Done;
237 }
238 else {
239 /* The compare did major nasty stuff to the
240 * dict: start over.
241 * XXX A clever adversary could prevent this
242 * XXX from terminating.
243 */
244 ep = lookdict(mp, key, hash);
245 goto Done;
246 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000247 }
248 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000249 }
Tim Peters15d49292001-05-27 07:39:22 +0000250
Tim Peters342c65e2001-05-13 06:43:53 +0000251 /* In the loop, me_key == dummy is by far (factor of 100s) the
252 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000253 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
254 i = (i << 2) + i + perturb + 1;
255 ep = &ep0[i & mask];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000256 if (ep->me_key == NULL) {
Tim Peters7b5d0af2001-06-03 04:14:43 +0000257 if (freeslot != NULL)
258 ep = freeslot;
259 break;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000260 }
Tim Peters7b5d0af2001-06-03 04:14:43 +0000261 if (ep->me_key == key)
262 break;
263 if (ep->me_hash == hash && ep->me_key != dummy) {
Fred Drakec88b99c2000-08-31 19:04:07 +0000264 if (!checked_error) {
265 checked_error = 1;
266 if (PyErr_Occurred()) {
267 restore_error = 1;
268 PyErr_Fetch(&err_type, &err_value,
269 &err_tb);
270 }
271 }
Tim Peters453163d2001-06-03 04:54:32 +0000272 startkey = ep->me_key;
273 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000274 if (cmp < 0)
Guido van Rossumb9324202001-01-18 00:39:02 +0000275 PyErr_Clear();
Tim Peters453163d2001-06-03 04:54:32 +0000276 if (ep0 == mp->ma_table && ep->me_key == startkey) {
277 if (cmp > 0)
278 break;
279 }
280 else {
281 /* The compare did major nasty stuff to the
282 * dict: start over.
283 * XXX A clever adversary could prevent this
284 * XXX from terminating.
285 */
286 ep = lookdict(mp, key, hash);
287 break;
288 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000289 }
Tim Peters342c65e2001-05-13 06:43:53 +0000290 else if (ep->me_key == dummy && freeslot == NULL)
291 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000292 }
Tim Peters7b5d0af2001-06-03 04:14:43 +0000293
294Done:
295 if (restore_error)
296 PyErr_Restore(err_type, err_value, err_tb);
297 return ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000298}
299
300/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000301 * Hacked up version of lookdict which can assume keys are always strings;
302 * this assumption allows testing for errors during PyObject_Compare() to
303 * be dropped; string-string comparisons never raise exceptions. This also
304 * means we don't need to go through PyObject_Compare(); we can always use
Martin v. Löwiscd353062001-05-24 16:56:35 +0000305 * _PyString_Eq directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000306 *
Tim Peters0ab085c2001-09-14 00:25:33 +0000307 * This is valuable because the general-case error handling in lookdict() is
308 * expensive, and dicts with pure-string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000309 */
310static dictentry *
311lookdict_string(dictobject *mp, PyObject *key, register long hash)
312{
313 register int i;
Tim Peterseb28ef22001-06-02 05:27:19 +0000314 register unsigned int perturb;
Fred Drake1bff34a2000-08-31 19:31:38 +0000315 register dictentry *freeslot;
Tim Petersafb6ae82001-06-04 21:00:21 +0000316 register unsigned int mask = mp->ma_mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000317 dictentry *ep0 = mp->ma_table;
318 register dictentry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000319
Tim Peters0ab085c2001-09-14 00:25:33 +0000320 /* Make sure this function doesn't have to handle non-string keys,
321 including subclasses of str; e.g., one reason to subclass
322 strings is to override __eq__, and for speed we don't cater to
323 that here. */
324 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000325#ifdef SHOW_CONVERSION_COUNTS
326 ++converted;
327#endif
328 mp->ma_lookup = lookdict;
329 return lookdict(mp, key, hash);
330 }
Tim Peters2f228e72001-05-13 00:19:31 +0000331 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000332 ep = &ep0[i];
333 if (ep->me_key == NULL || ep->me_key == key)
334 return ep;
335 if (ep->me_key == dummy)
336 freeslot = ep;
337 else {
338 if (ep->me_hash == hash
Martin v. Löwiscd353062001-05-24 16:56:35 +0000339 && _PyString_Eq(ep->me_key, key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000340 return ep;
341 }
342 freeslot = NULL;
343 }
Tim Peters15d49292001-05-27 07:39:22 +0000344
Tim Peters342c65e2001-05-13 06:43:53 +0000345 /* In the loop, me_key == dummy is by far (factor of 100s) the
346 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000347 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
348 i = (i << 2) + i + perturb + 1;
349 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000350 if (ep->me_key == NULL)
351 return freeslot == NULL ? ep : freeslot;
352 if (ep->me_key == key
353 || (ep->me_hash == hash
354 && ep->me_key != dummy
Martin v. Löwiscd353062001-05-24 16:56:35 +0000355 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000356 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000357 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000358 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000359 }
360}
361
362/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000363Internal routine to insert a new item into the table.
364Used both by the internal resize routine and by the public insert routine.
365Eats a reference to key and one to value.
366*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000367static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000368insertdict(register dictobject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000369{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000371 register dictentry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000372 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
373
374 assert(mp->ma_lookup != NULL);
375 ep = mp->ma_lookup(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000376 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000377 old_value = ep->me_value;
378 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379 Py_DECREF(old_value); /* which **CAN** re-enter */
380 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000381 }
382 else {
383 if (ep->me_key == NULL)
384 mp->ma_fill++;
385 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 Py_DECREF(ep->me_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000387 ep->me_key = key;
388 ep->me_hash = hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000389 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000390 mp->ma_used++;
391 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000392}
393
394/*
395Restructure the table by allocating a new table and reinserting all
396items again. When entries have been deleted, the new table may
397actually be smaller than the old one.
398*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000399static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000400dictresize(dictobject *mp, int minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000401{
Tim Peterseb28ef22001-06-02 05:27:19 +0000402 int newsize;
Tim Peters0c6010b2001-05-23 23:33:57 +0000403 dictentry *oldtable, *newtable, *ep;
404 int i;
405 int is_oldtable_malloced;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000406 dictentry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000407
408 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000409
Tim Peterseb28ef22001-06-02 05:27:19 +0000410 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000411 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000412 newsize <= minused && newsize > 0;
413 newsize <<= 1)
414 ;
415 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000417 return -1;
418 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000419
420 /* Get space for a new table. */
421 oldtable = mp->ma_table;
422 assert(oldtable != NULL);
423 is_oldtable_malloced = oldtable != mp->ma_smalltable;
424
Tim Peters6d6c1a32001-08-02 04:15:00 +0000425 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000426 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000427 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000428 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000429 if (mp->ma_fill == mp->ma_used) {
430 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000431 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000432 }
433 /* We're not going to resize it, but rebuild the
434 table anyway to purge old dummy entries.
435 Subtle: This is *necessary* if fill==size,
436 as lookdict needs at least one virgin slot to
437 terminate failing searches. If fill < size, it's
438 merely desirable, as dummies slow searches. */
439 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000440 memcpy(small_copy, oldtable, sizeof(small_copy));
441 oldtable = small_copy;
442 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000443 }
444 else {
445 newtable = PyMem_NEW(dictentry, newsize);
446 if (newtable == NULL) {
447 PyErr_NoMemory();
448 return -1;
449 }
450 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000451
452 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000453 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000454 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000455 mp->ma_mask = newsize - 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000456 memset(newtable, 0, sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000457 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000458 i = mp->ma_fill;
459 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000460
Tim Peters19283142001-05-17 22:25:34 +0000461 /* Copy the data over; this is refcount-neutral for active entries;
462 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000463 for (ep = oldtable; i > 0; ep++) {
464 if (ep->me_value != NULL) { /* active entry */
465 --i;
Tim Peters19283142001-05-17 22:25:34 +0000466 insertdict(mp, ep->me_key, ep->me_hash, ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000467 }
Tim Peters19283142001-05-17 22:25:34 +0000468 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000469 --i;
Tim Peters19283142001-05-17 22:25:34 +0000470 assert(ep->me_key == dummy);
471 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000472 }
Tim Peters19283142001-05-17 22:25:34 +0000473 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000474 }
475
Tim Peters0c6010b2001-05-23 23:33:57 +0000476 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000477 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000478 return 0;
479}
480
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000481PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000482PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000483{
484 long hash;
Fred Drake1bff34a2000-08-31 19:31:38 +0000485 dictobject *mp = (dictobject *)op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 if (!PyDict_Check(op)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000487 return NULL;
488 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000489 if (!PyString_CheckExact(key) ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000491 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000493 if (hash == -1) {
494 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000495 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000496 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000497 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000498 return (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000499}
500
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000501/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
502 * dictionary if it is merely replacing the value for an existing key.
503 * This is means that it's safe to loop over a dictionary with
504 * PyDict_Next() and occasionally replace a value -- but you can't
505 * insert new keys or remove them.
506 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000507int
Tim Peters1f5871e2000-07-04 17:44:48 +0000508PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000509{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000510 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000511 register long hash;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000512 register int n_used;
513
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 if (!PyDict_Check(op)) {
515 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000516 return -1;
517 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000518 mp = (dictobject *)op;
Tim Peters0ab085c2001-09-14 00:25:33 +0000519 if (PyString_CheckExact(key)) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000520 hash = ((PyStringObject *)key)->ob_shash;
521 if (hash == -1)
522 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000523 }
Tim Peters1f7df352002-03-29 03:29:08 +0000524 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000526 if (hash == -1)
527 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000528 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000529 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000530 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 Py_INCREF(value);
532 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000533 insertdict(mp, key, hash, value);
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000534 /* If we added a key, we can safely resize. Otherwise just return!
535 * If fill >= 2/3 size, adjust size. Normally, this doubles or
536 * quaduples the size, but it's also possible for the dict to shrink
537 * (if ma_fill is much larger than ma_used, meaning a lot of dict
538 * keys have been * deleted).
539 *
540 * Quadrupling the size improves average dictionary sparseness
541 * (reducing collisions) at the cost of some memory and iteration
542 * speed (which loops over every possible entry). It also halves
543 * the number of expensive resize operations in a growing dictionary.
544 *
545 * Very large dictionaries (over 50K items) use doubling instead.
546 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000547 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000548 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
549 return 0;
550 return dictresize(mp, mp->ma_used*(mp->ma_used>50000 ? 2 : 4));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000551}
552
553int
Tim Peters1f5871e2000-07-04 17:44:48 +0000554PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000555{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000556 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000557 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000558 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000560
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561 if (!PyDict_Check(op)) {
562 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000563 return -1;
564 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000565 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000566 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000568 if (hash == -1)
569 return -1;
570 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000571 mp = (dictobject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000572 ep = (mp->ma_lookup)(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000573 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000575 return -1;
576 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000577 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000579 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000580 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000581 ep->me_value = NULL;
582 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000583 Py_DECREF(old_value);
584 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000585 return 0;
586}
587
Guido van Rossum25831651993-05-19 14:50:45 +0000588void
Tim Peters1f5871e2000-07-04 17:44:48 +0000589PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000590{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000591 dictobject *mp;
Tim Petersdea48ec2001-05-22 20:40:22 +0000592 dictentry *ep, *table;
593 int table_is_malloced;
594 int fill;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595 dictentry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000596#ifdef Py_DEBUG
597 int i, n;
598#endif
599
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000600 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000601 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000602 mp = (dictobject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000603#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000604 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000605 i = 0;
606#endif
607
608 table = mp->ma_table;
609 assert(table != NULL);
610 table_is_malloced = table != mp->ma_smalltable;
611
612 /* This is delicate. During the process of clearing the dict,
613 * decrefs can cause the dict to mutate. To avoid fatal confusion
614 * (voice of experience), we have to make the dict empty before
615 * clearing the slots, and never refer to anything via mp->xxx while
616 * clearing.
617 */
618 fill = mp->ma_fill;
619 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000620 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000621
622 else if (fill > 0) {
623 /* It's a small table with something that needs to be cleared.
624 * Afraid the only safe way is to copy the dict entries into
625 * another small table first.
626 */
627 memcpy(small_copy, table, sizeof(small_copy));
628 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000629 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000630 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000631 /* else it's a small table that's already empty */
632
633 /* Now we can finally clear things. If C had refcounts, we could
634 * assert that the refcount on table is 1 now, i.e. that this function
635 * has unique access to it, so decref side-effects can't alter it.
636 */
637 for (ep = table; fill > 0; ++ep) {
638#ifdef Py_DEBUG
639 assert(i < n);
640 ++i;
641#endif
642 if (ep->me_key) {
643 --fill;
644 Py_DECREF(ep->me_key);
645 Py_XDECREF(ep->me_value);
646 }
647#ifdef Py_DEBUG
648 else
649 assert(ep->me_value == NULL);
650#endif
651 }
652
653 if (table_is_malloced)
654 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000655}
656
Tim Peters080c88b2003-02-15 03:01:11 +0000657/*
658 * Iterate over a dict. Use like so:
659 *
660 * int i;
661 * PyObject *key, *value;
662 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000663 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000664 * Refer to borrowed references in key and value.
665 * }
666 *
667 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000668 * mutates the dict. One exception: it is safe if the loop merely changes
669 * the values associated with the keys (but doesn't insert new keys or
670 * delete keys), via PyDict_SetItem().
671 */
Guido van Rossum25831651993-05-19 14:50:45 +0000672int
Tim Peters1f5871e2000-07-04 17:44:48 +0000673PyDict_Next(PyObject *op, int *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000674{
Guido van Rossum25831651993-05-19 14:50:45 +0000675 int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000676 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000678 return 0;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000679 mp = (dictobject *)op;
Guido van Rossum25831651993-05-19 14:50:45 +0000680 i = *ppos;
681 if (i < 0)
682 return 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000683 while (i <= mp->ma_mask && mp->ma_table[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000684 i++;
685 *ppos = i+1;
Tim Petersafb6ae82001-06-04 21:00:21 +0000686 if (i > mp->ma_mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000687 return 0;
688 if (pkey)
689 *pkey = mp->ma_table[i].me_key;
690 if (pvalue)
691 *pvalue = mp->ma_table[i].me_value;
692 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000693}
694
695/* Methods */
696
697static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000698dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000699{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000700 register dictentry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000701 int fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000702 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000703 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000704 for (ep = mp->ma_table; fill > 0; ep++) {
705 if (ep->me_key) {
706 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000708 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000709 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000710 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000711 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000712 PyMem_DEL(mp->ma_table);
Guido van Rossum9475a232001-10-05 20:51:39 +0000713 mp->ob_type->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000714 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000715}
716
717static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000718dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000719{
720 register int i;
721 register int any;
Guido van Rossum255443b1998-04-10 22:47:14 +0000722
723 i = Py_ReprEnter((PyObject*)mp);
724 if (i != 0) {
725 if (i < 0)
726 return i;
727 fprintf(fp, "{...}");
728 return 0;
729 }
730
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000731 fprintf(fp, "{");
732 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000733 for (i = 0; i <= mp->ma_mask; i++) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000734 dictentry *ep = mp->ma_table + i;
735 PyObject *pvalue = ep->me_value;
736 if (pvalue != NULL) {
737 /* Prevent PyObject_Repr from deleting value during
738 key format */
739 Py_INCREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000740 if (any++ > 0)
741 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000742 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000743 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000744 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000745 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000746 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000747 fprintf(fp, ": ");
Tim Peters19b77cf2001-06-02 08:27:39 +0000748 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000749 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000750 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000751 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000752 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000753 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000754 }
755 }
756 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000757 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000758 return 0;
759}
760
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000761static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000762dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000763{
Tim Petersc6057842001-06-16 07:52:53 +0000764 int i;
Tim Petersa7259592001-06-16 05:11:17 +0000765 PyObject *s, *temp, *colon = NULL;
766 PyObject *pieces = NULL, *result = NULL;
767 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +0000768
Tim Petersa7259592001-06-16 05:11:17 +0000769 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +0000770 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000771 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +0000772 }
773
Tim Petersa7259592001-06-16 05:11:17 +0000774 if (mp->ma_used == 0) {
775 result = PyString_FromString("{}");
776 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000777 }
Tim Petersa7259592001-06-16 05:11:17 +0000778
779 pieces = PyList_New(0);
780 if (pieces == NULL)
781 goto Done;
782
783 colon = PyString_FromString(": ");
784 if (colon == NULL)
785 goto Done;
786
787 /* Do repr() on each key+value pair, and insert ": " between them.
788 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +0000789 i = 0;
790 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +0000791 int status;
792 /* Prevent repr from deleting value during key format. */
793 Py_INCREF(value);
794 s = PyObject_Repr(key);
795 PyString_Concat(&s, colon);
796 PyString_ConcatAndDel(&s, PyObject_Repr(value));
797 Py_DECREF(value);
798 if (s == NULL)
799 goto Done;
800 status = PyList_Append(pieces, s);
801 Py_DECREF(s); /* append created a new ref */
802 if (status < 0)
803 goto Done;
804 }
805
806 /* Add "{}" decorations to the first and last items. */
807 assert(PyList_GET_SIZE(pieces) > 0);
808 s = PyString_FromString("{");
809 if (s == NULL)
810 goto Done;
811 temp = PyList_GET_ITEM(pieces, 0);
812 PyString_ConcatAndDel(&s, temp);
813 PyList_SET_ITEM(pieces, 0, s);
814 if (s == NULL)
815 goto Done;
816
817 s = PyString_FromString("}");
818 if (s == NULL)
819 goto Done;
820 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
821 PyString_ConcatAndDel(&temp, s);
822 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
823 if (temp == NULL)
824 goto Done;
825
826 /* Paste them all together with ", " between. */
827 s = PyString_FromString(", ");
828 if (s == NULL)
829 goto Done;
830 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +0000831 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000832
833Done:
834 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +0000836 Py_ReprLeave((PyObject *)mp);
837 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000838}
839
840static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000841dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000842{
843 return mp->ma_used;
844}
845
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000847dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000848{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000850 long hash;
Tim Petersdea48ec2001-05-22 20:40:22 +0000851 assert(mp->ma_table != NULL);
Tim Peters0ab085c2001-09-14 00:25:33 +0000852 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000853 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000855 if (hash == -1)
856 return NULL;
857 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000858 v = (mp->ma_lookup)(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000859 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000861 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000863 return v;
864}
865
866static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000867dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000868{
869 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000871 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000873}
874
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000875static PyMappingMethods dict_as_mapping = {
876 (inquiry)dict_length, /*mp_length*/
877 (binaryfunc)dict_subscript, /*mp_subscript*/
878 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000879};
880
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000881static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000882dict_keys(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000883{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000885 register int i, j, n;
886
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000887 again:
888 n = mp->ma_used;
889 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000890 if (v == NULL)
891 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000892 if (n != mp->ma_used) {
893 /* Durnit. The allocations caused the dict to resize.
894 * Just start over, this shouldn't normally happen.
895 */
896 Py_DECREF(v);
897 goto again;
898 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000899 for (i = 0, j = 0; i <= mp->ma_mask; i++) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000900 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000901 PyObject *key = mp->ma_table[i].me_key;
902 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000903 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000904 j++;
905 }
906 }
907 return v;
908}
909
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000910static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000911dict_values(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000912{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000913 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000914 register int i, j, n;
915
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000916 again:
917 n = mp->ma_used;
918 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000919 if (v == NULL)
920 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000921 if (n != mp->ma_used) {
922 /* Durnit. The allocations caused the dict to resize.
923 * Just start over, this shouldn't normally happen.
924 */
925 Py_DECREF(v);
926 goto again;
927 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000928 for (i = 0, j = 0; i <= mp->ma_mask; i++) {
Guido van Rossum25831651993-05-19 14:50:45 +0000929 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 PyObject *value = mp->ma_table[i].me_value;
931 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000932 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000933 j++;
934 }
935 }
936 return v;
937}
938
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000939static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000940dict_items(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000941{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000943 register int i, j, n;
944 PyObject *item, *key, *value;
945
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000946 /* Preallocate the list of tuples, to avoid allocations during
947 * the loop over the items, which could trigger GC, which
948 * could resize the dict. :-(
949 */
950 again:
951 n = mp->ma_used;
952 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000953 if (v == NULL)
954 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000955 for (i = 0; i < n; i++) {
956 item = PyTuple_New(2);
957 if (item == NULL) {
958 Py_DECREF(v);
959 return NULL;
960 }
961 PyList_SET_ITEM(v, i, item);
962 }
963 if (n != mp->ma_used) {
964 /* Durnit. The allocations caused the dict to resize.
965 * Just start over, this shouldn't normally happen.
966 */
967 Py_DECREF(v);
968 goto again;
969 }
970 /* Nothing we do below makes any function calls. */
Tim Petersafb6ae82001-06-04 21:00:21 +0000971 for (i = 0, j = 0; i <= mp->ma_mask; i++) {
Guido van Rossum25831651993-05-19 14:50:45 +0000972 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000973 key = mp->ma_table[i].me_key;
974 value = mp->ma_table[i].me_value;
975 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000976 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000977 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000979 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000980 j++;
981 }
982 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000983 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +0000984 return v;
985}
986
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000987static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +0000988dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +0000989{
990 PyObject *seq;
991 PyObject *value = Py_None;
992 PyObject *it; /* iter(seq) */
993 PyObject *key;
994 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +0000995 int status;
996
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000997 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +0000998 return NULL;
999
1000 d = PyObject_CallObject(cls, NULL);
1001 if (d == NULL)
1002 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001003
1004 it = PyObject_GetIter(seq);
1005 if (it == NULL){
1006 Py_DECREF(d);
1007 return NULL;
1008 }
1009
1010 for (;;) {
1011 key = PyIter_Next(it);
1012 if (key == NULL) {
1013 if (PyErr_Occurred())
1014 goto Fail;
1015 break;
1016 }
Raymond Hettingere03e5b12002-12-07 08:10:51 +00001017 status = PyObject_SetItem(d, key, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001018 Py_DECREF(key);
1019 if (status < 0)
1020 goto Fail;
1021 }
1022
1023 Py_DECREF(it);
1024 return d;
1025
1026Fail:
1027 Py_DECREF(it);
1028 Py_DECREF(d);
1029 return NULL;
1030}
1031
1032static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001033dict_update(PyObject *mp, PyObject *other)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001034{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001035 if (PyDict_Update(mp, other) < 0)
1036 return NULL;
1037 Py_INCREF(Py_None);
1038 return Py_None;
1039}
1040
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001041/* Update unconditionally replaces existing items.
1042 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001043 otherwise it leaves existing items unchanged.
1044
1045 PyDict_{Update,Merge} update/merge from a mapping object.
1046
Tim Petersf582b822001-12-11 18:51:08 +00001047 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001048 producing iterable objects of length 2.
1049*/
1050
Tim Petersf582b822001-12-11 18:51:08 +00001051int
Tim Peters1fc240e2001-10-26 05:06:50 +00001052PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1053{
1054 PyObject *it; /* iter(seq2) */
1055 int i; /* index into seq2 of current element */
1056 PyObject *item; /* seq2[i] */
1057 PyObject *fast; /* item as a 2-tuple or 2-list */
1058
1059 assert(d != NULL);
1060 assert(PyDict_Check(d));
1061 assert(seq2 != NULL);
1062
1063 it = PyObject_GetIter(seq2);
1064 if (it == NULL)
1065 return -1;
1066
1067 for (i = 0; ; ++i) {
1068 PyObject *key, *value;
1069 int n;
1070
1071 fast = NULL;
1072 item = PyIter_Next(it);
1073 if (item == NULL) {
1074 if (PyErr_Occurred())
1075 goto Fail;
1076 break;
1077 }
1078
1079 /* Convert item to sequence, and verify length 2. */
1080 fast = PySequence_Fast(item, "");
1081 if (fast == NULL) {
1082 if (PyErr_ExceptionMatches(PyExc_TypeError))
1083 PyErr_Format(PyExc_TypeError,
1084 "cannot convert dictionary update "
1085 "sequence element #%d to a sequence",
1086 i);
1087 goto Fail;
1088 }
1089 n = PySequence_Fast_GET_SIZE(fast);
1090 if (n != 2) {
1091 PyErr_Format(PyExc_ValueError,
1092 "dictionary update sequence element #%d "
1093 "has length %d; 2 is required",
1094 i, n);
1095 goto Fail;
1096 }
1097
1098 /* Update/merge with this (key, value) pair. */
1099 key = PySequence_Fast_GET_ITEM(fast, 0);
1100 value = PySequence_Fast_GET_ITEM(fast, 1);
1101 if (override || PyDict_GetItem(d, key) == NULL) {
1102 int status = PyDict_SetItem(d, key, value);
1103 if (status < 0)
1104 goto Fail;
1105 }
1106 Py_DECREF(fast);
1107 Py_DECREF(item);
1108 }
1109
1110 i = 0;
1111 goto Return;
1112Fail:
1113 Py_XDECREF(item);
1114 Py_XDECREF(fast);
1115 i = -1;
1116Return:
1117 Py_DECREF(it);
1118 return i;
1119}
1120
Tim Peters6d6c1a32001-08-02 04:15:00 +00001121int
1122PyDict_Update(PyObject *a, PyObject *b)
1123{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001124 return PyDict_Merge(a, b, 1);
1125}
1126
1127int
1128PyDict_Merge(PyObject *a, PyObject *b, int override)
1129{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001130 register PyDictObject *mp, *other;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001131 register int i;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001132 dictentry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001133
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001134 /* We accept for the argument either a concrete dictionary object,
1135 * or an abstract "mapping" object. For the former, we can do
1136 * things quite efficiently. For the latter, we only require that
1137 * PyMapping_Keys() and PyObject_GetItem() be supported.
1138 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001139 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1140 PyErr_BadInternalCall();
1141 return -1;
1142 }
1143 mp = (dictobject*)a;
1144 if (PyDict_Check(b)) {
1145 other = (dictobject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001146 if (other == mp || other->ma_used == 0)
1147 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001148 return 0;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001149 /* Do one big resize at the start, rather than
1150 * incrementally resizing as we insert new items. Expect
1151 * that there will be no (or few) overlapping keys.
1152 */
1153 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001154 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001155 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001156 }
1157 for (i = 0; i <= other->ma_mask; i++) {
1158 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001159 if (entry->me_value != NULL &&
1160 (override ||
1161 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001162 Py_INCREF(entry->me_key);
1163 Py_INCREF(entry->me_value);
1164 insertdict(mp, entry->me_key, entry->me_hash,
1165 entry->me_value);
1166 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001167 }
1168 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001169 else {
1170 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001171 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001172 PyObject *iter;
1173 PyObject *key, *value;
1174 int status;
1175
1176 if (keys == NULL)
1177 /* Docstring says this is equivalent to E.keys() so
1178 * if E doesn't have a .keys() method we want
1179 * AttributeError to percolate up. Might as well
1180 * do the same for any other error.
1181 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001182 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001183
1184 iter = PyObject_GetIter(keys);
1185 Py_DECREF(keys);
1186 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001187 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001188
1189 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001190 if (!override && PyDict_GetItem(a, key) != NULL) {
1191 Py_DECREF(key);
1192 continue;
1193 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001194 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001195 if (value == NULL) {
1196 Py_DECREF(iter);
1197 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001198 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001199 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001200 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001201 Py_DECREF(key);
1202 Py_DECREF(value);
1203 if (status < 0) {
1204 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001205 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001206 }
1207 }
1208 Py_DECREF(iter);
1209 if (PyErr_Occurred())
1210 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001211 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001212 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001213 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001214}
1215
1216static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001217dict_copy(register dictobject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001218{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001219 return PyDict_Copy((PyObject*)mp);
1220}
1221
1222PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001223PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001224{
1225 register dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001226 register int i;
1227 dictobject *copy;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001228 dictentry *entry;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001229
1230 if (o == NULL || !PyDict_Check(o)) {
1231 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001232 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001233 }
1234 mp = (dictobject *)o;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001235 copy = (dictobject *)PyDict_New();
1236 if (copy == NULL)
1237 return NULL;
1238 if (mp->ma_used > 0) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001239 if (dictresize(copy, mp->ma_used*2) != 0)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001240 return NULL;
Tim Petersafb6ae82001-06-04 21:00:21 +00001241 for (i = 0; i <= mp->ma_mask; i++) {
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001242 entry = &mp->ma_table[i];
1243 if (entry->me_value != NULL) {
1244 Py_INCREF(entry->me_key);
1245 Py_INCREF(entry->me_value);
1246 insertdict(copy, entry->me_key, entry->me_hash,
1247 entry->me_value);
1248 }
1249 }
1250 }
1251 return (PyObject *)copy;
1252}
1253
Guido van Rossum4199fac1993-11-05 10:18:44 +00001254int
Tim Peters1f5871e2000-07-04 17:44:48 +00001255PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001256{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 if (mp == NULL || !PyDict_Check(mp)) {
1258 PyErr_BadInternalCall();
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001259 return 0;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001260 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001261 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001262}
1263
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001264PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001265PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001266{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001267 if (mp == NULL || !PyDict_Check(mp)) {
1268 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001269 return NULL;
1270 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001271 return dict_keys((dictobject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001272}
1273
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001274PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001275PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001276{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 if (mp == NULL || !PyDict_Check(mp)) {
1278 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001279 return NULL;
1280 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001281 return dict_values((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001282}
1283
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001285PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001286{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287 if (mp == NULL || !PyDict_Check(mp)) {
1288 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001289 return NULL;
1290 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001291 return dict_items((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001292}
1293
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001294/* Subroutine which returns the smallest key in a for which b's value
1295 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001296 pval argument. Both are NULL if no key in a is found for which b's status
1297 differs. The refcounts on (and only on) non-NULL *pval and function return
1298 values must be decremented by the caller (characterize() increments them
1299 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1300 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001301
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001303characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001304{
Tim Peters95bf9392001-05-10 08:32:44 +00001305 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1306 PyObject *aval = NULL; /* a[akey] */
Guido van Rossumb9324202001-01-18 00:39:02 +00001307 int i, cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001308
Tim Petersafb6ae82001-06-04 21:00:21 +00001309 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001310 PyObject *thiskey, *thisaval, *thisbval;
1311 if (a->ma_table[i].me_value == NULL)
1312 continue;
1313 thiskey = a->ma_table[i].me_key;
1314 Py_INCREF(thiskey); /* keep alive across compares */
1315 if (akey != NULL) {
1316 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1317 if (cmp < 0) {
1318 Py_DECREF(thiskey);
1319 goto Fail;
1320 }
1321 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001322 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001323 a->ma_table[i].me_value == NULL)
1324 {
1325 /* Not the *smallest* a key; or maybe it is
1326 * but the compare shrunk the dict so we can't
1327 * find its associated value anymore; or
1328 * maybe it is but the compare deleted the
1329 * a[thiskey] entry.
1330 */
1331 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001332 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001333 }
Tim Peters95bf9392001-05-10 08:32:44 +00001334 }
1335
1336 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1337 thisaval = a->ma_table[i].me_value;
1338 assert(thisaval);
1339 Py_INCREF(thisaval); /* keep alive */
1340 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1341 if (thisbval == NULL)
1342 cmp = 0;
1343 else {
1344 /* both dicts have thiskey: same values? */
1345 cmp = PyObject_RichCompareBool(
1346 thisaval, thisbval, Py_EQ);
1347 if (cmp < 0) {
1348 Py_DECREF(thiskey);
1349 Py_DECREF(thisaval);
1350 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001351 }
1352 }
Tim Peters95bf9392001-05-10 08:32:44 +00001353 if (cmp == 0) {
1354 /* New winner. */
1355 Py_XDECREF(akey);
1356 Py_XDECREF(aval);
1357 akey = thiskey;
1358 aval = thisaval;
1359 }
1360 else {
1361 Py_DECREF(thiskey);
1362 Py_DECREF(thisaval);
1363 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001364 }
Tim Peters95bf9392001-05-10 08:32:44 +00001365 *pval = aval;
1366 return akey;
1367
1368Fail:
1369 Py_XDECREF(akey);
1370 Py_XDECREF(aval);
1371 *pval = NULL;
1372 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001373}
1374
1375static int
Tim Peters1f5871e2000-07-04 17:44:48 +00001376dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001377{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001378 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001379 int res;
1380
1381 /* Compare lengths first */
1382 if (a->ma_used < b->ma_used)
1383 return -1; /* a is shorter */
1384 else if (a->ma_used > b->ma_used)
1385 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001386
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001387 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001388 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001389 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001390 if (adiff == NULL) {
1391 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001392 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001393 * must be equal.
1394 */
1395 res = PyErr_Occurred() ? -1 : 0;
1396 goto Finished;
1397 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001398 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001399 if (bdiff == NULL && PyErr_Occurred()) {
1400 assert(!bval);
1401 res = -1;
1402 goto Finished;
1403 }
1404 res = 0;
1405 if (bdiff) {
1406 /* bdiff == NULL "should be" impossible now, but perhaps
1407 * the last comparison done by the characterize() on a had
1408 * the side effect of making the dicts equal!
1409 */
1410 res = PyObject_Compare(adiff, bdiff);
1411 }
1412 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001413 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001414
1415Finished:
1416 Py_XDECREF(adiff);
1417 Py_XDECREF(bdiff);
1418 Py_XDECREF(aval);
1419 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001420 return res;
1421}
1422
Tim Peterse63415e2001-05-08 04:38:29 +00001423/* Return 1 if dicts equal, 0 if not, -1 if error.
1424 * Gets out as soon as any difference is detected.
1425 * Uses only Py_EQ comparison.
1426 */
1427static int
1428dict_equal(dictobject *a, dictobject *b)
1429{
1430 int i;
1431
1432 if (a->ma_used != b->ma_used)
1433 /* can't be equal if # of entries differ */
1434 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001435
Tim Peterse63415e2001-05-08 04:38:29 +00001436 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001437 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001438 PyObject *aval = a->ma_table[i].me_value;
1439 if (aval != NULL) {
1440 int cmp;
1441 PyObject *bval;
1442 PyObject *key = a->ma_table[i].me_key;
1443 /* temporarily bump aval's refcount to ensure it stays
1444 alive until we're done with it */
1445 Py_INCREF(aval);
1446 bval = PyDict_GetItem((PyObject *)b, key);
1447 if (bval == NULL) {
1448 Py_DECREF(aval);
1449 return 0;
1450 }
1451 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1452 Py_DECREF(aval);
1453 if (cmp <= 0) /* error or not equal */
1454 return cmp;
1455 }
1456 }
1457 return 1;
1458 }
1459
1460static PyObject *
1461dict_richcompare(PyObject *v, PyObject *w, int op)
1462{
1463 int cmp;
1464 PyObject *res;
1465
1466 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1467 res = Py_NotImplemented;
1468 }
1469 else if (op == Py_EQ || op == Py_NE) {
1470 cmp = dict_equal((dictobject *)v, (dictobject *)w);
1471 if (cmp < 0)
1472 return NULL;
1473 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1474 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001475 else
1476 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001477 Py_INCREF(res);
1478 return res;
1479 }
1480
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001481static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001482dict_has_key(register dictobject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001483{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001484 long hash;
1485 register long ok;
Tim Peters0ab085c2001-09-14 00:25:33 +00001486 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001487 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001488 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001489 if (hash == -1)
1490 return NULL;
1491 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001492 ok = (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001493 return PyBool_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001494}
1495
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001496static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001497dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001498{
1499 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001500 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001501 PyObject *val = NULL;
1502 long hash;
1503
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001504 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001505 return NULL;
1506
Tim Peters0ab085c2001-09-14 00:25:33 +00001507 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001508 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001509 hash = PyObject_Hash(key);
1510 if (hash == -1)
1511 return NULL;
1512 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001513 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001514
Barry Warsawc38c5da1997-10-06 17:49:20 +00001515 if (val == NULL)
1516 val = failobj;
1517 Py_INCREF(val);
1518 return val;
1519}
1520
1521
1522static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001523dict_setdefault(register dictobject *mp, PyObject *args)
1524{
1525 PyObject *key;
1526 PyObject *failobj = Py_None;
1527 PyObject *val = NULL;
1528 long hash;
1529
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001530 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001531 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001532
Tim Peters0ab085c2001-09-14 00:25:33 +00001533 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001534 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001535 hash = PyObject_Hash(key);
1536 if (hash == -1)
1537 return NULL;
1538 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001539 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001540 if (val == NULL) {
1541 val = failobj;
1542 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1543 val = NULL;
1544 }
1545 Py_XINCREF(val);
1546 return val;
1547}
1548
1549
1550static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001551dict_clear(register dictobject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001552{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001553 PyDict_Clear((PyObject *)mp);
1554 Py_INCREF(Py_None);
1555 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001556}
1557
Guido van Rossumba6ab842000-12-12 22:02:18 +00001558static PyObject *
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001559dict_pop(dictobject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001560{
1561 long hash;
1562 dictentry *ep;
1563 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001564 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001565
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001566 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1567 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001568 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001569 if (deflt) {
1570 Py_INCREF(deflt);
1571 return deflt;
1572 }
Guido van Rossume027d982002-04-12 15:11:59 +00001573 PyErr_SetString(PyExc_KeyError,
1574 "pop(): dictionary is empty");
1575 return NULL;
1576 }
1577 if (!PyString_CheckExact(key) ||
1578 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1579 hash = PyObject_Hash(key);
1580 if (hash == -1)
1581 return NULL;
1582 }
1583 ep = (mp->ma_lookup)(mp, key, hash);
1584 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001585 if (deflt) {
1586 Py_INCREF(deflt);
1587 return deflt;
1588 }
Guido van Rossume027d982002-04-12 15:11:59 +00001589 PyErr_SetObject(PyExc_KeyError, key);
1590 return NULL;
1591 }
1592 old_key = ep->me_key;
1593 Py_INCREF(dummy);
1594 ep->me_key = dummy;
1595 old_value = ep->me_value;
1596 ep->me_value = NULL;
1597 mp->ma_used--;
1598 Py_DECREF(old_key);
1599 return old_value;
1600}
1601
1602static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001603dict_popitem(dictobject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001604{
1605 int i = 0;
1606 dictentry *ep;
1607 PyObject *res;
1608
Tim Petersf4b33f62001-06-02 05:42:29 +00001609 /* Allocate the result tuple before checking the size. Believe it
1610 * or not, this allocation could trigger a garbage collection which
1611 * could empty the dict, so if we checked the size first and that
1612 * happened, the result would be an infinite loop (searching for an
1613 * entry that no longer exists). Note that the usual popitem()
1614 * idiom is "while d: k, v = d.popitem()". so needing to throw the
1615 * tuple away if the dict *is* empty isn't a significant
1616 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001617 */
1618 res = PyTuple_New(2);
1619 if (res == NULL)
1620 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001621 if (mp->ma_used == 0) {
1622 Py_DECREF(res);
1623 PyErr_SetString(PyExc_KeyError,
1624 "popitem(): dictionary is empty");
1625 return NULL;
1626 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001627 /* Set ep to "the first" dict entry with a value. We abuse the hash
1628 * field of slot 0 to hold a search finger:
1629 * If slot 0 has a value, use slot 0.
1630 * Else slot 0 is being used to hold a search finger,
1631 * and we use its hash value as the first index to look.
1632 */
1633 ep = &mp->ma_table[0];
1634 if (ep->me_value == NULL) {
1635 i = (int)ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001636 /* The hash field may be a real hash value, or it may be a
1637 * legit search finger, or it may be a once-legit search
1638 * finger that's out of bounds now because it wrapped around
1639 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001640 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001641 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001642 i = 1; /* skip slot 0 */
1643 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1644 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001645 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001646 i = 1;
1647 }
1648 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001649 PyTuple_SET_ITEM(res, 0, ep->me_key);
1650 PyTuple_SET_ITEM(res, 1, ep->me_value);
1651 Py_INCREF(dummy);
1652 ep->me_key = dummy;
1653 ep->me_value = NULL;
1654 mp->ma_used--;
1655 assert(mp->ma_table[0].me_value == NULL);
1656 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001657 return res;
1658}
1659
Jeremy Hylton8caad492000-06-23 14:18:11 +00001660static int
1661dict_traverse(PyObject *op, visitproc visit, void *arg)
1662{
1663 int i = 0, err;
1664 PyObject *pk;
1665 PyObject *pv;
1666
1667 while (PyDict_Next(op, &i, &pk, &pv)) {
1668 err = visit(pk, arg);
1669 if (err)
1670 return err;
1671 err = visit(pv, arg);
1672 if (err)
1673 return err;
1674 }
1675 return 0;
1676}
1677
1678static int
1679dict_tp_clear(PyObject *op)
1680{
1681 PyDict_Clear(op);
1682 return 0;
1683}
1684
Tim Petersf7f88b12000-12-13 23:18:45 +00001685
Jeremy Hylton938ace62002-07-17 16:30:39 +00001686static PyObject *dictiter_new(dictobject *, binaryfunc);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001687
1688static PyObject *
1689select_key(PyObject *key, PyObject *value)
1690{
1691 Py_INCREF(key);
1692 return key;
1693}
1694
1695static PyObject *
1696select_value(PyObject *key, PyObject *value)
1697{
1698 Py_INCREF(value);
1699 return value;
1700}
1701
1702static PyObject *
1703select_item(PyObject *key, PyObject *value)
1704{
1705 PyObject *res = PyTuple_New(2);
1706
1707 if (res != NULL) {
1708 Py_INCREF(key);
1709 Py_INCREF(value);
1710 PyTuple_SET_ITEM(res, 0, key);
1711 PyTuple_SET_ITEM(res, 1, value);
1712 }
1713 return res;
1714}
1715
1716static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001717dict_iterkeys(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001718{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001719 return dictiter_new(dict, select_key);
1720}
1721
1722static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001723dict_itervalues(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001724{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001725 return dictiter_new(dict, select_value);
1726}
1727
1728static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001729dict_iteritems(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001730{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001731 return dictiter_new(dict, select_item);
1732}
1733
1734
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001735PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00001736"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00001737
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001738PyDoc_STRVAR(contains__doc__,
1739"D.__contains__(k) -> True if D has a key k, else False");
1740
1741PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1742
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001743PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001744"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001745
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001746PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001747"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 +00001748
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001749PyDoc_STRVAR(pop__doc__,
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001750"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
1751If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001752
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001753PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001754"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000017552-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00001756
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001757PyDoc_STRVAR(keys__doc__,
1758"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00001759
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001760PyDoc_STRVAR(items__doc__,
1761"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00001762
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001763PyDoc_STRVAR(values__doc__,
1764"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00001765
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001766PyDoc_STRVAR(update__doc__,
1767"D.update(E) -> None. Update D from E: for k in E.keys(): D[k] = E[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00001768
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001769PyDoc_STRVAR(fromkeys__doc__,
1770"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1771v defaults to None.");
1772
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001773PyDoc_STRVAR(clear__doc__,
1774"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001775
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001776PyDoc_STRVAR(copy__doc__,
1777"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001778
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001779PyDoc_STRVAR(iterkeys__doc__,
1780"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001781
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001782PyDoc_STRVAR(itervalues__doc__,
1783"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001784
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001785PyDoc_STRVAR(iteritems__doc__,
1786"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001787
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001788static PyMethodDef mapp_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001789 {"__contains__",(PyCFunction)dict_has_key, METH_O | METH_COEXIST,
1790 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00001791 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001792 getitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001793 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001794 has_key__doc__},
1795 {"get", (PyCFunction)dict_get, METH_VARARGS,
1796 get__doc__},
1797 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1798 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001799 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00001800 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001801 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001802 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001803 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001804 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001805 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001806 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001807 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001808 values__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001809 {"update", (PyCFunction)dict_update, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001810 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001811 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
1812 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001813 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001814 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001815 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001816 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001817 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001818 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001819 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001820 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001821 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001822 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00001823 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001824};
1825
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001826int
1827PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001828{
1829 long hash;
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001830 dictobject *mp = (dictobject *)op;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001831
Tim Peters0ab085c2001-09-14 00:25:33 +00001832 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001833 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001834 hash = PyObject_Hash(key);
1835 if (hash == -1)
1836 return -1;
1837 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001838 return (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001839}
1840
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001841/* Hack to implement "key in dict" */
1842static PySequenceMethods dict_as_sequence = {
1843 0, /* sq_length */
1844 0, /* sq_concat */
1845 0, /* sq_repeat */
1846 0, /* sq_item */
1847 0, /* sq_slice */
1848 0, /* sq_ass_item */
1849 0, /* sq_ass_slice */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001850 (objobjproc)PyDict_Contains, /* sq_contains */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001851 0, /* sq_inplace_concat */
1852 0, /* sq_inplace_repeat */
1853};
1854
Guido van Rossum09e563a2001-05-01 12:10:21 +00001855static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001856dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1857{
1858 PyObject *self;
1859
1860 assert(type != NULL && type->tp_alloc != NULL);
1861 self = type->tp_alloc(type, 0);
1862 if (self != NULL) {
1863 PyDictObject *d = (PyDictObject *)self;
1864 /* It's guaranteed that tp->alloc zeroed out the struct. */
1865 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
1866 INIT_NONZERO_DICT_SLOTS(d);
1867 d->ma_lookup = lookdict_string;
1868#ifdef SHOW_CONVERSION_COUNTS
1869 ++created;
1870#endif
1871 }
1872 return self;
1873}
1874
Tim Peters25786c02001-09-02 08:22:48 +00001875static int
1876dict_init(PyObject *self, PyObject *args, PyObject *kwds)
1877{
1878 PyObject *arg = NULL;
Tim Peters1fc240e2001-10-26 05:06:50 +00001879 int result = 0;
Tim Peters25786c02001-09-02 08:22:48 +00001880
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001881 if (!PyArg_UnpackTuple(args, "dict", 0, 1, &arg))
Tim Peters1fc240e2001-10-26 05:06:50 +00001882 result = -1;
1883
1884 else if (arg != NULL) {
1885 if (PyObject_HasAttrString(arg, "keys"))
1886 result = PyDict_Merge(self, arg, 1);
1887 else
1888 result = PyDict_MergeFromSeq2(self, arg, 1);
Tim Peters25786c02001-09-02 08:22:48 +00001889 }
Just van Rossuma797d812002-11-23 09:45:04 +00001890 if (result == 0 && kwds != NULL)
1891 result = PyDict_Merge(self, kwds, 1);
Tim Peters1fc240e2001-10-26 05:06:50 +00001892 return result;
Tim Peters25786c02001-09-02 08:22:48 +00001893}
1894
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001895static long
1896dict_nohash(PyObject *self)
1897{
1898 PyErr_SetString(PyExc_TypeError, "dict objects are unhashable");
1899 return -1;
1900}
1901
Tim Peters6d6c1a32001-08-02 04:15:00 +00001902static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00001903dict_iter(dictobject *dict)
1904{
1905 return dictiter_new(dict, select_key);
1906}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001907
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001908PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00001909"dict() -> new empty dictionary.\n"
1910"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00001911" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00001912"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00001913" d = {}\n"
1914" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00001915" d[k] = v\n"
1916"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
1917" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00001918
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001919PyTypeObject PyDict_Type = {
1920 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001921 0,
Tim Petersa427a2b2001-10-29 22:25:45 +00001922 "dict",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001923 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001924 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00001925 (destructor)dict_dealloc, /* tp_dealloc */
1926 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001927 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00001928 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00001929 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00001930 (reprfunc)dict_repr, /* tp_repr */
1931 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001932 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00001933 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001934 dict_nohash, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00001935 0, /* tp_call */
1936 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001937 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00001938 0, /* tp_setattro */
1939 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001940 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00001941 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00001942 dictionary_doc, /* tp_doc */
Guido van Rossumb9324202001-01-18 00:39:02 +00001943 (traverseproc)dict_traverse, /* tp_traverse */
1944 (inquiry)dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00001945 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001946 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00001947 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001948 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001949 mapp_methods, /* tp_methods */
1950 0, /* tp_members */
1951 0, /* tp_getset */
1952 0, /* tp_base */
1953 0, /* tp_dict */
1954 0, /* tp_descr_get */
1955 0, /* tp_descr_set */
1956 0, /* tp_dictoffset */
Tim Peters25786c02001-09-02 08:22:48 +00001957 (initproc)dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001958 PyType_GenericAlloc, /* tp_alloc */
1959 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00001960 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001961};
1962
Guido van Rossum3cca2451997-05-16 14:23:33 +00001963/* For backward compatibility with old dictionary interface */
1964
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001965PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001966PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001967{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001968 PyObject *kv, *rv;
1969 kv = PyString_FromString(key);
1970 if (kv == NULL)
1971 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001972 rv = PyDict_GetItem(v, kv);
1973 Py_DECREF(kv);
1974 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001975}
1976
1977int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001978PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001979{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001980 PyObject *kv;
1981 int err;
1982 kv = PyString_FromString(key);
1983 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001984 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001985 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001986 err = PyDict_SetItem(v, kv, item);
1987 Py_DECREF(kv);
1988 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001989}
1990
1991int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001992PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001993{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001994 PyObject *kv;
1995 int err;
1996 kv = PyString_FromString(key);
1997 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001998 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001999 err = PyDict_DelItem(v, kv);
2000 Py_DECREF(kv);
2001 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002002}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002003
2004/* Dictionary iterator type */
2005
2006extern PyTypeObject PyDictIter_Type; /* Forward */
2007
2008typedef struct {
2009 PyObject_HEAD
Guido van Rossum2147df72002-07-16 20:30:22 +00002010 dictobject *di_dict; /* Set to NULL when iterator is exhausted */
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002011 int di_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002012 int di_pos;
Guido van Rossum09e563a2001-05-01 12:10:21 +00002013 binaryfunc di_select;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002014} dictiterobject;
2015
2016static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00002017dictiter_new(dictobject *dict, binaryfunc select)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002018{
2019 dictiterobject *di;
Neil Schemenauer6189b892002-04-12 02:43:00 +00002020 di = PyObject_New(dictiterobject, &PyDictIter_Type);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002021 if (di == NULL)
2022 return NULL;
2023 Py_INCREF(dict);
2024 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002025 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002026 di->di_pos = 0;
Guido van Rossum09e563a2001-05-01 12:10:21 +00002027 di->di_select = select;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002028 return (PyObject *)di;
2029}
2030
2031static void
2032dictiter_dealloc(dictiterobject *di)
2033{
Guido van Rossum2147df72002-07-16 20:30:22 +00002034 Py_XDECREF(di->di_dict);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002035 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002036}
2037
Guido van Rossum213c7a62001-04-23 14:08:49 +00002038static PyObject *dictiter_iternext(dictiterobject *di)
2039{
Guido van Rossum09e563a2001-05-01 12:10:21 +00002040 PyObject *key, *value;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002041
Guido van Rossum2147df72002-07-16 20:30:22 +00002042 if (di->di_dict == NULL)
2043 return NULL;
2044
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002045 if (di->di_used != di->di_dict->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002046 PyErr_SetString(PyExc_RuntimeError,
2047 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002048 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002049 return NULL;
2050 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002051 if (PyDict_Next((PyObject *)(di->di_dict), &di->di_pos, &key, &value))
Guido van Rossum09e563a2001-05-01 12:10:21 +00002052 return (*di->di_select)(key, value);
Guido van Rossum2147df72002-07-16 20:30:22 +00002053
2054 Py_DECREF(di->di_dict);
2055 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002056 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002057}
2058
2059PyTypeObject PyDictIter_Type = {
2060 PyObject_HEAD_INIT(&PyType_Type)
2061 0, /* ob_size */
2062 "dictionary-iterator", /* tp_name */
2063 sizeof(dictiterobject), /* tp_basicsize */
2064 0, /* tp_itemsize */
2065 /* methods */
2066 (destructor)dictiter_dealloc, /* tp_dealloc */
2067 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002068 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002069 0, /* tp_setattr */
2070 0, /* tp_compare */
2071 0, /* tp_repr */
2072 0, /* tp_as_number */
2073 0, /* tp_as_sequence */
2074 0, /* tp_as_mapping */
2075 0, /* tp_hash */
2076 0, /* tp_call */
2077 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002078 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002079 0, /* tp_setattro */
2080 0, /* tp_as_buffer */
2081 Py_TPFLAGS_DEFAULT, /* tp_flags */
2082 0, /* tp_doc */
2083 0, /* tp_traverse */
2084 0, /* tp_clear */
2085 0, /* tp_richcompare */
2086 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002087 PyObject_SelfIter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002088 (iternextfunc)dictiter_iternext, /* tp_iternext */
Guido van Rossum2147df72002-07-16 20:30:22 +00002089 0, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002090 0, /* tp_members */
2091 0, /* tp_getset */
2092 0, /* tp_base */
2093 0, /* tp_dict */
2094 0, /* tp_descr_get */
2095 0, /* tp_descr_set */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002096};