blob: 587dad390e615d3400d9bc585158ce0a88e18f0b [file] [log] [blame]
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001
Guido van Rossum2bc13791999-03-24 19:06:42 +00002/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003
Raymond Hettinger930427b2003-05-03 06:51:59 +00004/* The distribution includes a separate file, Objects/dictnotes.txt,
Tim Peters60b29962006-01-01 01:19:23 +00005 describing explorations into dictionary design and optimization.
Raymond Hettinger930427b2003-05-03 06:51:59 +00006 It covers typical dictionary use patterns, the parameters for
7 tuning dictionaries, and several ideas for possible optimizations.
8*/
9
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010#include "Python.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000011
Tim Peters6d6c1a32001-08-02 04:15:00 +000012typedef PyDictEntry dictentry;
13typedef PyDictObject dictobject;
Guido van Rossum16e93a81997-01-28 00:00:11 +000014
Georg Brandlb9f4ad32006-10-29 18:31:42 +000015/* Set a key error with the specified argument, wrapping it in a
16 * tuple automatically so that tuple keys are not unpacked as the
17 * exception arguments. */
18static void
19set_key_error(PyObject *arg)
20{
21 PyObject *tup;
22 tup = PyTuple_Pack(1, arg);
23 if (!tup)
24 return; /* caller will expect error to be set anyway */
25 PyErr_SetObject(PyExc_KeyError, tup);
Neal Norwitz7b932da2006-10-29 23:39:03 +000026 Py_DECREF(tup);
Georg Brandlb9f4ad32006-10-29 18:31:42 +000027}
28
Tim Peterseb28ef22001-06-02 05:27:19 +000029/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000030#undef SHOW_CONVERSION_COUNTS
31
Tim Peterseb28ef22001-06-02 05:27:19 +000032/* See large comment block below. This must be >= 1. */
33#define PERTURB_SHIFT 5
34
Guido van Rossum16e93a81997-01-28 00:00:11 +000035/*
Tim Peterseb28ef22001-06-02 05:27:19 +000036Major subtleties ahead: Most hash schemes depend on having a "good" hash
37function, in the sense of simulating randomness. Python doesn't: its most
38important hash functions (for strings and ints) are very regular in common
39cases:
Tim Peters15d49292001-05-27 07:39:22 +000040
Tim Peterseb28ef22001-06-02 05:27:19 +000041>>> map(hash, (0, 1, 2, 3))
42[0, 1, 2, 3]
43>>> map(hash, ("namea", "nameb", "namec", "named"))
44[-1658398457, -1658398460, -1658398459, -1658398462]
45>>>
Tim Peters15d49292001-05-27 07:39:22 +000046
Tim Peterseb28ef22001-06-02 05:27:19 +000047This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
48the low-order i bits as the initial table index is extremely fast, and there
49are no collisions at all for dicts indexed by a contiguous range of ints.
50The same is approximately true when keys are "consecutive" strings. So this
51gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000052
Tim Peterseb28ef22001-06-02 05:27:19 +000053OTOH, when collisions occur, the tendency to fill contiguous slices of the
54hash table makes a good collision resolution strategy crucial. Taking only
55the last i bits of the hash code is also vulnerable: for example, consider
56[i << 16 for i in range(20000)] as a set of keys. Since ints are their own
57hash codes, and this fits in a dict of size 2**15, the last 15 bits of every
58hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000059
Tim Peterseb28ef22001-06-02 05:27:19 +000060But catering to unusual cases should not slow the usual ones, so we just take
61the last i bits anyway. It's up to collision resolution to do the rest. If
62we *usually* find the key we're looking for on the first try (and, it turns
63out, we usually do -- the table load factor is kept under 2/3, so the odds
64are solidly in our favor), then it makes best sense to keep the initial index
65computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000066
Tim Peterseb28ef22001-06-02 05:27:19 +000067The first half of collision resolution is to visit table indices via this
68recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000069
Tim Peterseb28ef22001-06-02 05:27:19 +000070 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000071
Tim Peterseb28ef22001-06-02 05:27:19 +000072For any initial j in range(2**i), repeating that 2**i times generates each
73int in range(2**i) exactly once (see any text on random-number generation for
74proof). By itself, this doesn't help much: like linear probing (setting
75j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
76order. This would be bad, except that's not the only thing we do, and it's
77actually *good* in the common cases where hash keys are consecutive. In an
78example that's really too small to make this entirely clear, for a table of
79size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000080
Tim Peterseb28ef22001-06-02 05:27:19 +000081 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
82
83If two things come in at index 5, the first place we look after is index 2,
84not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
85Linear probing is deadly in this case because there the fixed probe order
86is the *same* as the order consecutive keys are likely to arrive. But it's
87extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
88and certain that consecutive hash codes do not.
89
90The other half of the strategy is to get the other bits of the hash code
91into play. This is done by initializing a (unsigned) vrbl "perturb" to the
92full hash code, and changing the recurrence to:
93
94 j = (5*j) + 1 + perturb;
95 perturb >>= PERTURB_SHIFT;
96 use j % 2**i as the next table index;
97
98Now the probe sequence depends (eventually) on every bit in the hash code,
99and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
100because it quickly magnifies small differences in the bits that didn't affect
101the initial index. Note that because perturb is unsigned, if the recurrence
102is executed often enough perturb eventually becomes and remains 0. At that
103point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
104that's certain to find an empty slot eventually (since it generates every int
105in range(2**i), and we make sure there's always at least one empty slot).
106
107Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
108small so that the high bits of the hash code continue to affect the probe
109sequence across iterations; but you want it large so that in really bad cases
110the high-order hash bits have an effect on early iterations. 5 was "the
111best" in minimizing total collisions across experiments Tim Peters ran (on
112both normal and pathological cases), but 4 and 6 weren't significantly worse.
113
114Historical: Reimer Behrends contributed the idea of using a polynomial-based
115approach, using repeated multiplication by x in GF(2**n) where an irreducible
116polynomial for each table size was chosen such that x was a primitive root.
117Christian Tismer later extended that to use division by x instead, as an
118efficient way to get the high bits of the hash code into play. This scheme
119also gave excellent collision statistics, but was more expensive: two
120if-tests were required inside the loop; computing "the next" index took about
121the same number of operations but without as much potential parallelism
122(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
123above, and then shifting perturb can be done while the table index is being
124masked); and the dictobject struct required a member to hold the table's
125polynomial. In Tim's experiments the current scheme ran faster, produced
126equally good collision statistics, needed less code & used less memory.
Tim Peters9b10f7e2006-05-30 04:16:25 +0000127
128Theoretical Python 2.5 headache: hash codes are only C "long", but
129sizeof(Py_ssize_t) > sizeof(long) may be possible. In that case, and if a
130dict is genuinely huge, then only the slots directly reachable via indexing
131by a C long can be the first slot in a probe sequence. The probe sequence
132will still eventually reach every slot in the table, but the collision rate
133on initial probes may be much higher than this scheme was designed for.
134Getting a hash code as fat as Py_ssize_t is the only real cure. But in
135practice, this probably won't make a lick of difference for many years (at
136which point everyone will have terabytes of RAM on 64-bit boxes).
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000137*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000138
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000139/* Object used as dummy key to fill deleted entries */
Raymond Hettingerf81e4502005-08-17 02:19:36 +0000140static PyObject *dummy = NULL; /* Initialized by first call to newdictobject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000141
Armin Rigoe1709372006-04-12 17:06:05 +0000142#ifdef Py_REF_DEBUG
143PyObject *
144_PyDict_Dummy(void)
145{
146 return dummy;
147}
148#endif
149
Fred Drake1bff34a2000-08-31 19:31:38 +0000150/* forward declarations */
151static dictentry *
152lookdict_string(dictobject *mp, PyObject *key, long hash);
153
154#ifdef SHOW_CONVERSION_COUNTS
155static long created = 0L;
156static long converted = 0L;
157
158static void
159show_counts(void)
160{
161 fprintf(stderr, "created %ld string dicts\n", created);
162 fprintf(stderr, "converted %ld to normal dicts\n", converted);
163 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
164}
165#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000166
Tim Peters6d6c1a32001-08-02 04:15:00 +0000167/* Initialization macros.
168 There are two ways to create a dict: PyDict_New() is the main C API
169 function, and the tp_new slot maps to dict_new(). In the latter case we
170 can save a little time over what PyDict_New does because it's guaranteed
171 that the PyDictObject struct is already zeroed out.
172 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
173 an excellent reason not to).
174*/
175
176#define INIT_NONZERO_DICT_SLOTS(mp) do { \
Tim Petersdea48ec2001-05-22 20:40:22 +0000177 (mp)->ma_table = (mp)->ma_smalltable; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000178 (mp)->ma_mask = PyDict_MINSIZE - 1; \
179 } while(0)
180
181#define EMPTY_TO_MINSIZE(mp) do { \
182 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000183 (mp)->ma_used = (mp)->ma_fill = 0; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000184 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000185 } while(0)
186
Raymond Hettinger43442782004-03-17 21:55:03 +0000187/* Dictionary reuse scheme to save calls to malloc, free, and memset */
188#define MAXFREEDICTS 80
189static PyDictObject *free_dicts[MAXFREEDICTS];
190static int num_free_dicts = 0;
191
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000193PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000194{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000195 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000196 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000198 if (dummy == NULL)
199 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000200#ifdef SHOW_CONVERSION_COUNTS
201 Py_AtExit(show_counts);
202#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000203 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000204 if (num_free_dicts) {
205 mp = free_dicts[--num_free_dicts];
206 assert (mp != NULL);
207 assert (mp->ob_type == &PyDict_Type);
208 _Py_NewReference((PyObject *)mp);
209 if (mp->ma_fill) {
210 EMPTY_TO_MINSIZE(mp);
211 }
212 assert (mp->ma_used == 0);
213 assert (mp->ma_table == mp->ma_smalltable);
214 assert (mp->ma_mask == PyDict_MINSIZE - 1);
215 } else {
216 mp = PyObject_GC_New(dictobject, &PyDict_Type);
217 if (mp == NULL)
218 return NULL;
219 EMPTY_TO_MINSIZE(mp);
220 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000221 mp->ma_lookup = lookdict_string;
222#ifdef SHOW_CONVERSION_COUNTS
223 ++created;
224#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000225 _PyObject_GC_TRACK(mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000227}
228
229/*
230The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000231This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000232Open addressing is preferred over chaining since the link overhead for
233chaining would be substantial (100% with typical malloc overhead).
234
Tim Peterseb28ef22001-06-02 05:27:19 +0000235The initial probe index is computed as hash mod the table size. Subsequent
236probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000237
238All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000239
Tim Peterseb28ef22001-06-02 05:27:19 +0000240(The details in this version are due to Tim Peters, building on many past
241contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
242Christian Tismer).
Fred Drake1bff34a2000-08-31 19:31:38 +0000243
Tim Petersd770ebd2006-06-01 15:50:44 +0000244lookdict() is general-purpose, and may return NULL if (and only if) a
245comparison raises an exception (this was new in Python 2.5).
246lookdict_string() below is specialized to string keys, comparison of which can
247never raise an exception; that function can never return NULL. For both, when
248the key isn't found a dictentry* is returned for which the me_value field is
249NULL; this is the slot in the dict at which the key would have been found, and
250the caller can (if it wishes) add the <key, value> pair to the returned
251dictentry*.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000252*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000253static dictentry *
Tim Peters1f5871e2000-07-04 17:44:48 +0000254lookdict(dictobject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000255{
Tim Petersd770ebd2006-06-01 15:50:44 +0000256 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000257 register size_t perturb;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000258 register dictentry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000259 register size_t mask = (size_t)mp->ma_mask;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000260 dictentry *ep0 = mp->ma_table;
261 register dictentry *ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000262 register int cmp;
Tim Peters453163d2001-06-03 04:54:32 +0000263 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000264
Tim Petersd770ebd2006-06-01 15:50:44 +0000265 i = (size_t)hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000266 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000267 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000268 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000269
Guido van Rossum16e93a81997-01-28 00:00:11 +0000270 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000271 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000272 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000273 if (ep->me_hash == hash) {
Tim Peters453163d2001-06-03 04:54:32 +0000274 startkey = ep->me_key;
275 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000276 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000277 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000278 if (ep0 == mp->ma_table && ep->me_key == startkey) {
279 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000280 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000281 }
282 else {
283 /* The compare did major nasty stuff to the
284 * dict: start over.
285 * XXX A clever adversary could prevent this
286 * XXX from terminating.
287 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000288 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000289 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000290 }
291 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000292 }
Tim Peters15d49292001-05-27 07:39:22 +0000293
Tim Peters342c65e2001-05-13 06:43:53 +0000294 /* In the loop, me_key == dummy is by far (factor of 100s) the
295 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000296 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
297 i = (i << 2) + i + perturb + 1;
298 ep = &ep0[i & mask];
Armin Rigo35f6d362006-06-01 13:19:12 +0000299 if (ep->me_key == NULL)
300 return freeslot == NULL ? ep : freeslot;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000301 if (ep->me_key == key)
Armin Rigo35f6d362006-06-01 13:19:12 +0000302 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000303 if (ep->me_hash == hash && ep->me_key != dummy) {
Tim Peters453163d2001-06-03 04:54:32 +0000304 startkey = ep->me_key;
305 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000306 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000307 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000308 if (ep0 == mp->ma_table && ep->me_key == startkey) {
309 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000310 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000311 }
312 else {
313 /* The compare did major nasty stuff to the
314 * dict: start over.
315 * XXX A clever adversary could prevent this
316 * XXX from terminating.
317 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000318 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000319 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000320 }
Tim Peters342c65e2001-05-13 06:43:53 +0000321 else if (ep->me_key == dummy && freeslot == NULL)
322 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000323 }
Neal Norwitza5ccda92006-10-28 21:16:54 +0000324 assert(0); /* NOT REACHED */
325 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000326}
327
328/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000329 * Hacked up version of lookdict which can assume keys are always strings;
Tim Petersd770ebd2006-06-01 15:50:44 +0000330 * this assumption allows testing for errors during PyObject_RichCompareBool()
331 * to be dropped; string-string comparisons never raise exceptions. This also
332 * means we don't need to go through PyObject_RichCompareBool(); we can always
333 * use _PyString_Eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000334 *
Tim Petersd770ebd2006-06-01 15:50:44 +0000335 * This is valuable because dicts with only string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000336 */
337static dictentry *
338lookdict_string(dictobject *mp, PyObject *key, register long hash)
339{
Tim Petersd770ebd2006-06-01 15:50:44 +0000340 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000341 register size_t perturb;
Fred Drake1bff34a2000-08-31 19:31:38 +0000342 register dictentry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000343 register size_t mask = (size_t)mp->ma_mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000344 dictentry *ep0 = mp->ma_table;
345 register dictentry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000346
Tim Peters0ab085c2001-09-14 00:25:33 +0000347 /* Make sure this function doesn't have to handle non-string keys,
348 including subclasses of str; e.g., one reason to subclass
349 strings is to override __eq__, and for speed we don't cater to
350 that here. */
351 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000352#ifdef SHOW_CONVERSION_COUNTS
353 ++converted;
354#endif
355 mp->ma_lookup = lookdict;
356 return lookdict(mp, key, hash);
357 }
Tim Peters2f228e72001-05-13 00:19:31 +0000358 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000359 ep = &ep0[i];
360 if (ep->me_key == NULL || ep->me_key == key)
361 return ep;
362 if (ep->me_key == dummy)
363 freeslot = ep;
364 else {
Tim Petersd770ebd2006-06-01 15:50:44 +0000365 if (ep->me_hash == hash && _PyString_Eq(ep->me_key, key))
Fred Drake1bff34a2000-08-31 19:31:38 +0000366 return ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000367 freeslot = NULL;
368 }
Tim Peters15d49292001-05-27 07:39:22 +0000369
Tim Peters342c65e2001-05-13 06:43:53 +0000370 /* In the loop, me_key == dummy is by far (factor of 100s) the
371 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000372 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
373 i = (i << 2) + i + perturb + 1;
374 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000375 if (ep->me_key == NULL)
376 return freeslot == NULL ? ep : freeslot;
377 if (ep->me_key == key
378 || (ep->me_hash == hash
379 && ep->me_key != dummy
Martin v. Löwiscd353062001-05-24 16:56:35 +0000380 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000381 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000382 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000383 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000384 }
Neal Norwitza5ccda92006-10-28 21:16:54 +0000385 assert(0); /* NOT REACHED */
386 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000387}
388
389/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000390Internal routine to insert a new item into the table.
391Used both by the internal resize routine and by the public insert routine.
392Eats a reference to key and one to value.
Tim Petersd770ebd2006-06-01 15:50:44 +0000393Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000394*/
Armin Rigo35f6d362006-06-01 13:19:12 +0000395static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000396insertdict(register dictobject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000397{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000399 register dictentry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000400 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
401
402 assert(mp->ma_lookup != NULL);
403 ep = mp->ma_lookup(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000404 if (ep == NULL) {
405 Py_DECREF(key);
406 Py_DECREF(value);
407 return -1;
408 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000409 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000410 old_value = ep->me_value;
411 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412 Py_DECREF(old_value); /* which **CAN** re-enter */
413 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000414 }
415 else {
416 if (ep->me_key == NULL)
417 mp->ma_fill++;
Raymond Hettinger07ead172005-02-05 23:42:57 +0000418 else {
419 assert(ep->me_key == dummy);
420 Py_DECREF(dummy);
421 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000422 ep->me_key = key;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000423 ep->me_hash = (Py_ssize_t)hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000424 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000425 mp->ma_used++;
426 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000427 return 0;
428}
429
430/*
431Internal routine used by dictresize() to insert an item which is
432known to be absent from the dict. This routine also assumes that
433the dict contains no deleted entries. Besides the performance benefit,
434using insertdict() in dictresize() is dangerous (SF bug #1456209).
Tim Petersd770ebd2006-06-01 15:50:44 +0000435Note that no refcounts are changed by this routine; if needed, the caller
436is responsible for incref'ing `key` and `value`.
Armin Rigo35f6d362006-06-01 13:19:12 +0000437*/
438static void
439insertdict_clean(register dictobject *mp, PyObject *key, long hash,
440 PyObject *value)
441{
Tim Petersd770ebd2006-06-01 15:50:44 +0000442 register size_t i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000443 register size_t perturb;
Tim Petersd770ebd2006-06-01 15:50:44 +0000444 register size_t mask = (size_t)mp->ma_mask;
Armin Rigo35f6d362006-06-01 13:19:12 +0000445 dictentry *ep0 = mp->ma_table;
446 register dictentry *ep;
447
448 i = hash & mask;
449 ep = &ep0[i];
450 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
451 i = (i << 2) + i + perturb + 1;
452 ep = &ep0[i & mask];
453 }
Tim Petersd770ebd2006-06-01 15:50:44 +0000454 assert(ep->me_value == NULL);
Armin Rigo35f6d362006-06-01 13:19:12 +0000455 mp->ma_fill++;
456 ep->me_key = key;
457 ep->me_hash = (Py_ssize_t)hash;
458 ep->me_value = value;
459 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000460}
461
462/*
463Restructure the table by allocating a new table and reinserting all
464items again. When entries have been deleted, the new table may
465actually be smaller than the old one.
466*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000467static int
Tim Peters9b10f7e2006-05-30 04:16:25 +0000468dictresize(dictobject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000469{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000470 Py_ssize_t newsize;
Tim Peters0c6010b2001-05-23 23:33:57 +0000471 dictentry *oldtable, *newtable, *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000472 Py_ssize_t i;
Tim Peters0c6010b2001-05-23 23:33:57 +0000473 int is_oldtable_malloced;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000474 dictentry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000475
476 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000477
Tim Peterseb28ef22001-06-02 05:27:19 +0000478 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000479 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000480 newsize <= minused && newsize > 0;
481 newsize <<= 1)
482 ;
483 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000485 return -1;
486 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000487
488 /* Get space for a new table. */
489 oldtable = mp->ma_table;
490 assert(oldtable != NULL);
491 is_oldtable_malloced = oldtable != mp->ma_smalltable;
492
Tim Peters6d6c1a32001-08-02 04:15:00 +0000493 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000494 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000495 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000496 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000497 if (mp->ma_fill == mp->ma_used) {
498 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000499 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000500 }
501 /* We're not going to resize it, but rebuild the
502 table anyway to purge old dummy entries.
503 Subtle: This is *necessary* if fill==size,
504 as lookdict needs at least one virgin slot to
505 terminate failing searches. If fill < size, it's
506 merely desirable, as dummies slow searches. */
507 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000508 memcpy(small_copy, oldtable, sizeof(small_copy));
509 oldtable = small_copy;
510 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000511 }
512 else {
513 newtable = PyMem_NEW(dictentry, newsize);
514 if (newtable == NULL) {
515 PyErr_NoMemory();
516 return -1;
517 }
518 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000519
520 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000521 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000522 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000523 mp->ma_mask = newsize - 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000524 memset(newtable, 0, sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000525 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000526 i = mp->ma_fill;
527 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000528
Tim Peters19283142001-05-17 22:25:34 +0000529 /* Copy the data over; this is refcount-neutral for active entries;
530 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000531 for (ep = oldtable; i > 0; ep++) {
532 if (ep->me_value != NULL) { /* active entry */
533 --i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000534 insertdict_clean(mp, ep->me_key, (long)ep->me_hash,
535 ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000536 }
Tim Peters19283142001-05-17 22:25:34 +0000537 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000538 --i;
Tim Peters19283142001-05-17 22:25:34 +0000539 assert(ep->me_key == dummy);
540 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000541 }
Tim Peters19283142001-05-17 22:25:34 +0000542 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000543 }
544
Tim Peters0c6010b2001-05-23 23:33:57 +0000545 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000546 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000547 return 0;
548}
549
Tim Petersd770ebd2006-06-01 15:50:44 +0000550/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
551 * that may occur (originally dicts supported only string keys, and exceptions
552 * weren't possible). So, while the original intent was that a NULL return
Andrew M. Kuchling0067b5f2006-08-04 20:37:43 +0000553 * meant the key wasn't present, in reality it can mean that, or that an error
Tim Petersd770ebd2006-06-01 15:50:44 +0000554 * (suppressed) occurred while computing the key's hash, or that some error
555 * (suppressed) occurred when comparing keys in the dict's internal probe
556 * sequence. A nasty example of the latter is when a Python-coded comparison
557 * function hits a stack-depth error, which can cause this to return NULL
558 * even if the key is present.
559 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000561PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000562{
563 long hash;
Fred Drake1bff34a2000-08-31 19:31:38 +0000564 dictobject *mp = (dictobject *)op;
Armin Rigo35f6d362006-06-01 13:19:12 +0000565 dictentry *ep;
566 PyThreadState *tstate;
Tim Petersd770ebd2006-06-01 15:50:44 +0000567 if (!PyDict_Check(op))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000568 return NULL;
Tim Peters0ab085c2001-09-14 00:25:33 +0000569 if (!PyString_CheckExact(key) ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000571 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000573 if (hash == -1) {
574 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000575 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000576 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000577 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000578
579 /* We can arrive here with a NULL tstate during initialization:
580 try running "python -Wi" for an example related to string
581 interning. Let's just hope that no exception occurs then... */
Armin Rigoacd0d6d2006-06-10 10:57:40 +0000582 tstate = _PyThreadState_Current;
Armin Rigo35f6d362006-06-01 13:19:12 +0000583 if (tstate != NULL && tstate->curexc_type != NULL) {
584 /* preserve the existing exception */
585 PyObject *err_type, *err_value, *err_tb;
586 PyErr_Fetch(&err_type, &err_value, &err_tb);
587 ep = (mp->ma_lookup)(mp, key, hash);
588 /* ignore errors */
589 PyErr_Restore(err_type, err_value, err_tb);
590 if (ep == NULL)
591 return NULL;
592 }
593 else {
594 ep = (mp->ma_lookup)(mp, key, hash);
595 if (ep == NULL) {
596 PyErr_Clear();
597 return NULL;
598 }
599 }
600 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000601}
602
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000603/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000604 * dictionary if it's merely replacing the value for an existing key.
605 * This means that it's safe to loop over a dictionary with PyDict_Next()
606 * and occasionally replace a value -- but you can't insert new keys or
607 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000608 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000609int
Tim Peters1f5871e2000-07-04 17:44:48 +0000610PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000611{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000612 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000613 register long hash;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000614 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000615
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 if (!PyDict_Check(op)) {
617 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000618 return -1;
619 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000620 assert(key);
621 assert(value);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000622 mp = (dictobject *)op;
Tim Peters0ab085c2001-09-14 00:25:33 +0000623 if (PyString_CheckExact(key)) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000624 hash = ((PyStringObject *)key)->ob_shash;
625 if (hash == -1)
626 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000627 }
Tim Peters1f7df352002-03-29 03:29:08 +0000628 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000630 if (hash == -1)
631 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000632 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000633 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000634 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 Py_INCREF(value);
636 Py_INCREF(key);
Armin Rigo35f6d362006-06-01 13:19:12 +0000637 if (insertdict(mp, key, hash, value) != 0)
638 return -1;
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000639 /* If we added a key, we can safely resize. Otherwise just return!
640 * If fill >= 2/3 size, adjust size. Normally, this doubles or
641 * quaduples the size, but it's also possible for the dict to shrink
Tim Peters60b29962006-01-01 01:19:23 +0000642 * (if ma_fill is much larger than ma_used, meaning a lot of dict
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000643 * keys have been * deleted).
Tim Peters60b29962006-01-01 01:19:23 +0000644 *
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000645 * Quadrupling the size improves average dictionary sparseness
646 * (reducing collisions) at the cost of some memory and iteration
647 * speed (which loops over every possible entry). It also halves
Neal Norwitz80af59c2006-05-30 04:19:21 +0000648 * the number of expensive resize operations in a growing dictionary.
Tim Peters60b29962006-01-01 01:19:23 +0000649 *
650 * Very large dictionaries (over 50K items) use doubling instead.
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000651 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000652 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000653 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
654 return 0;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000655 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000656}
657
658int
Tim Peters1f5871e2000-07-04 17:44:48 +0000659PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000660{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000661 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000662 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000663 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000665
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666 if (!PyDict_Check(op)) {
667 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000668 return -1;
669 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000670 assert(key);
Tim Peters0ab085c2001-09-14 00:25:33 +0000671 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000672 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000674 if (hash == -1)
675 return -1;
676 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000677 mp = (dictobject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000678 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000679 if (ep == NULL)
680 return -1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000681 if (ep->me_value == NULL) {
Georg Brandlb9f4ad32006-10-29 18:31:42 +0000682 set_key_error(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000683 return -1;
684 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000685 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000686 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000687 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000688 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000689 ep->me_value = NULL;
690 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000691 Py_DECREF(old_value);
692 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000693 return 0;
694}
695
Guido van Rossum25831651993-05-19 14:50:45 +0000696void
Tim Peters1f5871e2000-07-04 17:44:48 +0000697PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000698{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000699 dictobject *mp;
Tim Petersdea48ec2001-05-22 20:40:22 +0000700 dictentry *ep, *table;
701 int table_is_malloced;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000702 Py_ssize_t fill;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000703 dictentry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000704#ifdef Py_DEBUG
Tim Peters9b10f7e2006-05-30 04:16:25 +0000705 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000706#endif
707
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000709 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000710 mp = (dictobject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000711#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000712 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000713 i = 0;
714#endif
715
716 table = mp->ma_table;
717 assert(table != NULL);
718 table_is_malloced = table != mp->ma_smalltable;
719
720 /* This is delicate. During the process of clearing the dict,
721 * decrefs can cause the dict to mutate. To avoid fatal confusion
722 * (voice of experience), we have to make the dict empty before
723 * clearing the slots, and never refer to anything via mp->xxx while
724 * clearing.
725 */
726 fill = mp->ma_fill;
727 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000728 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000729
730 else if (fill > 0) {
731 /* It's a small table with something that needs to be cleared.
732 * Afraid the only safe way is to copy the dict entries into
733 * another small table first.
734 */
735 memcpy(small_copy, table, sizeof(small_copy));
736 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000737 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000738 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000739 /* else it's a small table that's already empty */
740
741 /* Now we can finally clear things. If C had refcounts, we could
742 * assert that the refcount on table is 1 now, i.e. that this function
743 * has unique access to it, so decref side-effects can't alter it.
744 */
745 for (ep = table; fill > 0; ++ep) {
746#ifdef Py_DEBUG
747 assert(i < n);
748 ++i;
749#endif
750 if (ep->me_key) {
751 --fill;
752 Py_DECREF(ep->me_key);
753 Py_XDECREF(ep->me_value);
754 }
755#ifdef Py_DEBUG
756 else
757 assert(ep->me_value == NULL);
758#endif
759 }
760
761 if (table_is_malloced)
762 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000763}
764
Tim Peters080c88b2003-02-15 03:01:11 +0000765/*
766 * Iterate over a dict. Use like so:
767 *
Tim Peters9b10f7e2006-05-30 04:16:25 +0000768 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000769 * PyObject *key, *value;
770 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000771 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000772 * Refer to borrowed references in key and value.
773 * }
774 *
775 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000776 * mutates the dict. One exception: it is safe if the loop merely changes
777 * the values associated with the keys (but doesn't insert new keys or
778 * delete keys), via PyDict_SetItem().
779 */
Guido van Rossum25831651993-05-19 14:50:45 +0000780int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000781PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000782{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000783 register Py_ssize_t i;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000784 register Py_ssize_t mask;
Raymond Hettinger43442782004-03-17 21:55:03 +0000785 register dictentry *ep;
786
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000788 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000789 i = *ppos;
790 if (i < 0)
791 return 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000792 ep = ((dictobject *)op)->ma_table;
793 mask = ((dictobject *)op)->ma_mask;
794 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000795 i++;
796 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000797 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000798 return 0;
799 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000800 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000801 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000802 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000803 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000804}
805
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000806/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
807int
808_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, long *phash)
809{
810 register Py_ssize_t i;
811 register Py_ssize_t mask;
812 register dictentry *ep;
813
814 if (!PyDict_Check(op))
815 return 0;
816 i = *ppos;
817 if (i < 0)
818 return 0;
819 ep = ((dictobject *)op)->ma_table;
820 mask = ((dictobject *)op)->ma_mask;
821 while (i <= mask && ep[i].me_value == NULL)
822 i++;
823 *ppos = i+1;
824 if (i > mask)
825 return 0;
826 *phash = (long)(ep[i].me_hash);
827 if (pkey)
828 *pkey = ep[i].me_key;
829 if (pvalue)
830 *pvalue = ep[i].me_value;
831 return 1;
832}
833
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000834/* Methods */
835
836static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000837dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000838{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000839 register dictentry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000840 Py_ssize_t fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000841 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000842 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000843 for (ep = mp->ma_table; fill > 0; ep++) {
844 if (ep->me_key) {
845 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000847 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000848 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000849 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000850 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000851 PyMem_DEL(mp->ma_table);
Raymond Hettinger43442782004-03-17 21:55:03 +0000852 if (num_free_dicts < MAXFREEDICTS && mp->ob_type == &PyDict_Type)
853 free_dicts[num_free_dicts++] = mp;
Tim Peters60b29962006-01-01 01:19:23 +0000854 else
Raymond Hettinger43442782004-03-17 21:55:03 +0000855 mp->ob_type->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000856 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000857}
858
859static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000860dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000861{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000862 register Py_ssize_t i;
863 register Py_ssize_t any;
Tim Peters33f4a6a2006-05-30 05:23:59 +0000864 int status;
Guido van Rossum255443b1998-04-10 22:47:14 +0000865
Tim Peters33f4a6a2006-05-30 05:23:59 +0000866 status = Py_ReprEnter((PyObject*)mp);
867 if (status != 0) {
868 if (status < 0)
869 return status;
Guido van Rossum255443b1998-04-10 22:47:14 +0000870 fprintf(fp, "{...}");
871 return 0;
872 }
873
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000874 fprintf(fp, "{");
875 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000876 for (i = 0; i <= mp->ma_mask; i++) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000877 dictentry *ep = mp->ma_table + i;
878 PyObject *pvalue = ep->me_value;
879 if (pvalue != NULL) {
880 /* Prevent PyObject_Repr from deleting value during
881 key format */
882 Py_INCREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000883 if (any++ > 0)
884 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000885 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000886 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000887 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000888 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000889 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000890 fprintf(fp, ": ");
Tim Peters19b77cf2001-06-02 08:27:39 +0000891 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000892 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000893 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000894 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000895 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000896 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000897 }
898 }
899 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000900 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000901 return 0;
902}
903
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000905dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000906{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000907 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000908 PyObject *s, *temp, *colon = NULL;
909 PyObject *pieces = NULL, *result = NULL;
910 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +0000911
Tim Petersa7259592001-06-16 05:11:17 +0000912 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +0000913 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000914 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +0000915 }
916
Tim Petersa7259592001-06-16 05:11:17 +0000917 if (mp->ma_used == 0) {
918 result = PyString_FromString("{}");
919 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000920 }
Tim Petersa7259592001-06-16 05:11:17 +0000921
922 pieces = PyList_New(0);
923 if (pieces == NULL)
924 goto Done;
925
926 colon = PyString_FromString(": ");
927 if (colon == NULL)
928 goto Done;
929
930 /* Do repr() on each key+value pair, and insert ": " between them.
931 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +0000932 i = 0;
933 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +0000934 int status;
935 /* Prevent repr from deleting value during key format. */
936 Py_INCREF(value);
937 s = PyObject_Repr(key);
938 PyString_Concat(&s, colon);
939 PyString_ConcatAndDel(&s, PyObject_Repr(value));
940 Py_DECREF(value);
941 if (s == NULL)
942 goto Done;
943 status = PyList_Append(pieces, s);
944 Py_DECREF(s); /* append created a new ref */
945 if (status < 0)
946 goto Done;
947 }
948
949 /* Add "{}" decorations to the first and last items. */
950 assert(PyList_GET_SIZE(pieces) > 0);
951 s = PyString_FromString("{");
952 if (s == NULL)
953 goto Done;
954 temp = PyList_GET_ITEM(pieces, 0);
955 PyString_ConcatAndDel(&s, temp);
956 PyList_SET_ITEM(pieces, 0, s);
957 if (s == NULL)
958 goto Done;
959
960 s = PyString_FromString("}");
961 if (s == NULL)
962 goto Done;
963 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
964 PyString_ConcatAndDel(&temp, s);
965 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
966 if (temp == NULL)
967 goto Done;
968
969 /* Paste them all together with ", " between. */
970 s = PyString_FromString(", ");
971 if (s == NULL)
972 goto Done;
973 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +0000974 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000975
976Done:
977 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +0000979 Py_ReprLeave((PyObject *)mp);
980 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000981}
982
Martin v. Löwis18e16552006-02-15 17:27:45 +0000983static Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +0000984dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000985{
986 return mp->ma_used;
987}
988
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000990dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000991{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000993 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +0000994 dictentry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000995 assert(mp->ma_table != NULL);
Tim Peters0ab085c2001-09-14 00:25:33 +0000996 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000997 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000998 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000999 if (hash == -1)
1000 return NULL;
1001 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001002 ep = (mp->ma_lookup)(mp, key, hash);
1003 if (ep == NULL)
1004 return NULL;
1005 v = ep->me_value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001006 if (v == NULL) {
1007 if (!PyDict_CheckExact(mp)) {
1008 /* Look up __missing__ method if we're a subclass. */
Guido van Rossum4b92a822006-02-25 23:32:30 +00001009 PyObject *missing;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001010 static PyObject *missing_str = NULL;
1011 if (missing_str == NULL)
Tim Peters9b10f7e2006-05-30 04:16:25 +00001012 missing_str =
Guido van Rossum1968ad32006-02-25 22:38:04 +00001013 PyString_InternFromString("__missing__");
Guido van Rossum4b92a822006-02-25 23:32:30 +00001014 missing = _PyType_Lookup(mp->ob_type, missing_str);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001015 if (missing != NULL)
1016 return PyObject_CallFunctionObjArgs(missing,
1017 (PyObject *)mp, key, NULL);
1018 }
Georg Brandlb9f4ad32006-10-29 18:31:42 +00001019 set_key_error(key);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001020 return NULL;
1021 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001022 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001024 return v;
1025}
1026
1027static int
Tim Peters1f5871e2000-07-04 17:44:48 +00001028dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001029{
1030 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001031 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001032 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001034}
1035
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001036static PyMappingMethods dict_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001037 (lenfunc)dict_length, /*mp_length*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001038 (binaryfunc)dict_subscript, /*mp_subscript*/
1039 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001040};
1041
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001043dict_keys(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001044{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001046 register Py_ssize_t i, j;
Raymond Hettinger43442782004-03-17 21:55:03 +00001047 dictentry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001048 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001049
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001050 again:
1051 n = mp->ma_used;
1052 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001053 if (v == NULL)
1054 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001055 if (n != mp->ma_used) {
1056 /* Durnit. The allocations caused the dict to resize.
1057 * Just start over, this shouldn't normally happen.
1058 */
1059 Py_DECREF(v);
1060 goto again;
1061 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001062 ep = mp->ma_table;
1063 mask = mp->ma_mask;
1064 for (i = 0, j = 0; i <= mask; i++) {
1065 if (ep[i].me_value != NULL) {
1066 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001068 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001069 j++;
1070 }
1071 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001072 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001073 return v;
1074}
1075
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001077dict_values(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001078{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001080 register Py_ssize_t i, j;
Raymond Hettinger43442782004-03-17 21:55:03 +00001081 dictentry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001082 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001083
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001084 again:
1085 n = mp->ma_used;
1086 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001087 if (v == NULL)
1088 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001089 if (n != mp->ma_used) {
1090 /* Durnit. The allocations caused the dict to resize.
1091 * Just start over, this shouldn't normally happen.
1092 */
1093 Py_DECREF(v);
1094 goto again;
1095 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001096 ep = mp->ma_table;
1097 mask = mp->ma_mask;
1098 for (i = 0, j = 0; i <= mask; i++) {
1099 if (ep[i].me_value != NULL) {
1100 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001102 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001103 j++;
1104 }
1105 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001106 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001107 return v;
1108}
1109
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001110static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001111dict_items(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001112{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001113 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001114 register Py_ssize_t i, j, n;
1115 Py_ssize_t mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001116 PyObject *item, *key, *value;
Raymond Hettinger43442782004-03-17 21:55:03 +00001117 dictentry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001118
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001119 /* Preallocate the list of tuples, to avoid allocations during
1120 * the loop over the items, which could trigger GC, which
1121 * could resize the dict. :-(
1122 */
1123 again:
1124 n = mp->ma_used;
1125 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001126 if (v == NULL)
1127 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001128 for (i = 0; i < n; i++) {
1129 item = PyTuple_New(2);
1130 if (item == NULL) {
1131 Py_DECREF(v);
1132 return NULL;
1133 }
1134 PyList_SET_ITEM(v, i, item);
1135 }
1136 if (n != mp->ma_used) {
1137 /* Durnit. The allocations caused the dict to resize.
1138 * Just start over, this shouldn't normally happen.
1139 */
1140 Py_DECREF(v);
1141 goto again;
1142 }
1143 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001144 ep = mp->ma_table;
1145 mask = mp->ma_mask;
1146 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001147 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001148 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001149 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001150 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001151 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001153 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001154 j++;
1155 }
1156 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001157 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001158 return v;
1159}
1160
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001161static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001162dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001163{
1164 PyObject *seq;
1165 PyObject *value = Py_None;
1166 PyObject *it; /* iter(seq) */
1167 PyObject *key;
1168 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001169 int status;
1170
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001171 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001172 return NULL;
1173
1174 d = PyObject_CallObject(cls, NULL);
1175 if (d == NULL)
1176 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001177
1178 it = PyObject_GetIter(seq);
1179 if (it == NULL){
1180 Py_DECREF(d);
1181 return NULL;
1182 }
1183
1184 for (;;) {
1185 key = PyIter_Next(it);
1186 if (key == NULL) {
1187 if (PyErr_Occurred())
1188 goto Fail;
1189 break;
1190 }
Raymond Hettingere03e5b12002-12-07 08:10:51 +00001191 status = PyObject_SetItem(d, key, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001192 Py_DECREF(key);
1193 if (status < 0)
1194 goto Fail;
1195 }
1196
1197 Py_DECREF(it);
1198 return d;
1199
1200Fail:
1201 Py_DECREF(it);
1202 Py_DECREF(d);
1203 return NULL;
1204}
1205
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001206static int
1207dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001208{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001209 PyObject *arg = NULL;
1210 int result = 0;
1211
1212 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1213 result = -1;
1214
1215 else if (arg != NULL) {
1216 if (PyObject_HasAttrString(arg, "keys"))
1217 result = PyDict_Merge(self, arg, 1);
1218 else
1219 result = PyDict_MergeFromSeq2(self, arg, 1);
1220 }
1221 if (result == 0 && kwds != NULL)
1222 result = PyDict_Merge(self, kwds, 1);
1223 return result;
1224}
1225
1226static PyObject *
1227dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1228{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001229 if (dict_update_common(self, args, kwds, "update") != -1)
1230 Py_RETURN_NONE;
1231 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001232}
1233
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001234/* Update unconditionally replaces existing items.
1235 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001236 otherwise it leaves existing items unchanged.
1237
1238 PyDict_{Update,Merge} update/merge from a mapping object.
1239
Tim Petersf582b822001-12-11 18:51:08 +00001240 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001241 producing iterable objects of length 2.
1242*/
1243
Tim Petersf582b822001-12-11 18:51:08 +00001244int
Tim Peters1fc240e2001-10-26 05:06:50 +00001245PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1246{
1247 PyObject *it; /* iter(seq2) */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001248 Py_ssize_t i; /* index into seq2 of current element */
Tim Peters1fc240e2001-10-26 05:06:50 +00001249 PyObject *item; /* seq2[i] */
1250 PyObject *fast; /* item as a 2-tuple or 2-list */
1251
1252 assert(d != NULL);
1253 assert(PyDict_Check(d));
1254 assert(seq2 != NULL);
1255
1256 it = PyObject_GetIter(seq2);
1257 if (it == NULL)
1258 return -1;
1259
1260 for (i = 0; ; ++i) {
1261 PyObject *key, *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001262 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001263
1264 fast = NULL;
1265 item = PyIter_Next(it);
1266 if (item == NULL) {
1267 if (PyErr_Occurred())
1268 goto Fail;
1269 break;
1270 }
1271
1272 /* Convert item to sequence, and verify length 2. */
1273 fast = PySequence_Fast(item, "");
1274 if (fast == NULL) {
1275 if (PyErr_ExceptionMatches(PyExc_TypeError))
1276 PyErr_Format(PyExc_TypeError,
1277 "cannot convert dictionary update "
Neal Norwitzd3881b02006-05-30 04:25:05 +00001278 "sequence element #%zd to a sequence",
Tim Peters1fc240e2001-10-26 05:06:50 +00001279 i);
1280 goto Fail;
1281 }
1282 n = PySequence_Fast_GET_SIZE(fast);
1283 if (n != 2) {
1284 PyErr_Format(PyExc_ValueError,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001285 "dictionary update sequence element #%zd "
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00001286 "has length %zd; 2 is required",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00001287 i, n);
Tim Peters1fc240e2001-10-26 05:06:50 +00001288 goto Fail;
1289 }
1290
1291 /* Update/merge with this (key, value) pair. */
1292 key = PySequence_Fast_GET_ITEM(fast, 0);
1293 value = PySequence_Fast_GET_ITEM(fast, 1);
1294 if (override || PyDict_GetItem(d, key) == NULL) {
1295 int status = PyDict_SetItem(d, key, value);
1296 if (status < 0)
1297 goto Fail;
1298 }
1299 Py_DECREF(fast);
1300 Py_DECREF(item);
1301 }
1302
1303 i = 0;
1304 goto Return;
1305Fail:
1306 Py_XDECREF(item);
1307 Py_XDECREF(fast);
1308 i = -1;
1309Return:
1310 Py_DECREF(it);
Neal Norwitzd3881b02006-05-30 04:25:05 +00001311 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001312}
1313
Tim Peters6d6c1a32001-08-02 04:15:00 +00001314int
1315PyDict_Update(PyObject *a, PyObject *b)
1316{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001317 return PyDict_Merge(a, b, 1);
1318}
1319
1320int
1321PyDict_Merge(PyObject *a, PyObject *b, int override)
1322{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001323 register PyDictObject *mp, *other;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001324 register Py_ssize_t i;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001325 dictentry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001326
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001327 /* We accept for the argument either a concrete dictionary object,
1328 * or an abstract "mapping" object. For the former, we can do
1329 * things quite efficiently. For the latter, we only require that
1330 * PyMapping_Keys() and PyObject_GetItem() be supported.
1331 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001332 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1333 PyErr_BadInternalCall();
1334 return -1;
1335 }
1336 mp = (dictobject*)a;
Raymond Hettinger0922d712007-02-07 20:08:22 +00001337 if (PyDict_CheckExact(b)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001338 other = (dictobject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001339 if (other == mp || other->ma_used == 0)
1340 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001341 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001342 if (mp->ma_used == 0)
1343 /* Since the target dict is empty, PyDict_GetItem()
1344 * always returns NULL. Setting override to 1
1345 * skips the unnecessary test.
1346 */
1347 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001348 /* Do one big resize at the start, rather than
1349 * incrementally resizing as we insert new items. Expect
1350 * that there will be no (or few) overlapping keys.
1351 */
1352 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001353 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001354 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001355 }
1356 for (i = 0; i <= other->ma_mask; i++) {
1357 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001358 if (entry->me_value != NULL &&
1359 (override ||
1360 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001361 Py_INCREF(entry->me_key);
1362 Py_INCREF(entry->me_value);
Armin Rigo35f6d362006-06-01 13:19:12 +00001363 if (insertdict(mp, entry->me_key,
1364 (long)entry->me_hash,
1365 entry->me_value) != 0)
1366 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001367 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001368 }
1369 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001370 else {
1371 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001372 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001373 PyObject *iter;
1374 PyObject *key, *value;
1375 int status;
1376
1377 if (keys == NULL)
1378 /* Docstring says this is equivalent to E.keys() so
1379 * if E doesn't have a .keys() method we want
1380 * AttributeError to percolate up. Might as well
1381 * do the same for any other error.
1382 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001383 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001384
1385 iter = PyObject_GetIter(keys);
1386 Py_DECREF(keys);
1387 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001388 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001389
1390 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001391 if (!override && PyDict_GetItem(a, key) != NULL) {
1392 Py_DECREF(key);
1393 continue;
1394 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001395 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001396 if (value == NULL) {
1397 Py_DECREF(iter);
1398 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001399 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001400 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001401 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001402 Py_DECREF(key);
1403 Py_DECREF(value);
1404 if (status < 0) {
1405 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001406 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001407 }
1408 }
1409 Py_DECREF(iter);
1410 if (PyErr_Occurred())
1411 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001412 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001413 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001414 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001415}
1416
1417static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001418dict_copy(register dictobject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001419{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001420 return PyDict_Copy((PyObject*)mp);
1421}
1422
1423PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001424PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001425{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001426 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001427
1428 if (o == NULL || !PyDict_Check(o)) {
1429 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001430 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001431 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001432 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001433 if (copy == NULL)
1434 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001435 if (PyDict_Merge(copy, o, 1) == 0)
1436 return copy;
1437 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001438 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001439}
1440
Martin v. Löwis18e16552006-02-15 17:27:45 +00001441Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001442PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001443{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444 if (mp == NULL || !PyDict_Check(mp)) {
1445 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001446 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001447 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001448 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001449}
1450
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001452PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001453{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001454 if (mp == NULL || !PyDict_Check(mp)) {
1455 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001456 return NULL;
1457 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001458 return dict_keys((dictobject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001459}
1460
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001462PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001463{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001464 if (mp == NULL || !PyDict_Check(mp)) {
1465 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001466 return NULL;
1467 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001468 return dict_values((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001469}
1470
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001471PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001472PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001473{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474 if (mp == NULL || !PyDict_Check(mp)) {
1475 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001476 return NULL;
1477 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001478 return dict_items((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001479}
1480
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001481/* Subroutine which returns the smallest key in a for which b's value
1482 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001483 pval argument. Both are NULL if no key in a is found for which b's status
1484 differs. The refcounts on (and only on) non-NULL *pval and function return
1485 values must be decremented by the caller (characterize() increments them
1486 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1487 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001488
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001489static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001490characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001491{
Tim Peters95bf9392001-05-10 08:32:44 +00001492 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1493 PyObject *aval = NULL; /* a[akey] */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001494 Py_ssize_t i;
1495 int cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001496
Tim Petersafb6ae82001-06-04 21:00:21 +00001497 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001498 PyObject *thiskey, *thisaval, *thisbval;
1499 if (a->ma_table[i].me_value == NULL)
1500 continue;
1501 thiskey = a->ma_table[i].me_key;
1502 Py_INCREF(thiskey); /* keep alive across compares */
1503 if (akey != NULL) {
1504 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1505 if (cmp < 0) {
1506 Py_DECREF(thiskey);
1507 goto Fail;
1508 }
1509 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001510 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001511 a->ma_table[i].me_value == NULL)
1512 {
1513 /* Not the *smallest* a key; or maybe it is
1514 * but the compare shrunk the dict so we can't
1515 * find its associated value anymore; or
1516 * maybe it is but the compare deleted the
1517 * a[thiskey] entry.
Neal Norwitzd3881b02006-05-30 04:25:05 +00001518 */
Tim Peters95bf9392001-05-10 08:32:44 +00001519 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001520 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001521 }
Tim Peters95bf9392001-05-10 08:32:44 +00001522 }
1523
1524 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1525 thisaval = a->ma_table[i].me_value;
1526 assert(thisaval);
1527 Py_INCREF(thisaval); /* keep alive */
1528 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1529 if (thisbval == NULL)
1530 cmp = 0;
1531 else {
1532 /* both dicts have thiskey: same values? */
1533 cmp = PyObject_RichCompareBool(
1534 thisaval, thisbval, Py_EQ);
1535 if (cmp < 0) {
1536 Py_DECREF(thiskey);
1537 Py_DECREF(thisaval);
1538 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001539 }
1540 }
Tim Peters95bf9392001-05-10 08:32:44 +00001541 if (cmp == 0) {
1542 /* New winner. */
1543 Py_XDECREF(akey);
1544 Py_XDECREF(aval);
1545 akey = thiskey;
1546 aval = thisaval;
1547 }
1548 else {
1549 Py_DECREF(thiskey);
1550 Py_DECREF(thisaval);
1551 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001552 }
Tim Peters95bf9392001-05-10 08:32:44 +00001553 *pval = aval;
1554 return akey;
1555
1556Fail:
1557 Py_XDECREF(akey);
1558 Py_XDECREF(aval);
1559 *pval = NULL;
1560 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001561}
1562
1563static int
Tim Peters1f5871e2000-07-04 17:44:48 +00001564dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001565{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001567 int res;
1568
1569 /* Compare lengths first */
1570 if (a->ma_used < b->ma_used)
1571 return -1; /* a is shorter */
1572 else if (a->ma_used > b->ma_used)
1573 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001574
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001575 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001576 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001577 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001578 if (adiff == NULL) {
1579 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001580 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001581 * must be equal.
1582 */
1583 res = PyErr_Occurred() ? -1 : 0;
1584 goto Finished;
1585 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001586 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001587 if (bdiff == NULL && PyErr_Occurred()) {
1588 assert(!bval);
1589 res = -1;
1590 goto Finished;
1591 }
1592 res = 0;
1593 if (bdiff) {
1594 /* bdiff == NULL "should be" impossible now, but perhaps
1595 * the last comparison done by the characterize() on a had
1596 * the side effect of making the dicts equal!
1597 */
1598 res = PyObject_Compare(adiff, bdiff);
1599 }
1600 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001601 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001602
1603Finished:
1604 Py_XDECREF(adiff);
1605 Py_XDECREF(bdiff);
1606 Py_XDECREF(aval);
1607 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001608 return res;
1609}
1610
Tim Peterse63415e2001-05-08 04:38:29 +00001611/* Return 1 if dicts equal, 0 if not, -1 if error.
1612 * Gets out as soon as any difference is detected.
1613 * Uses only Py_EQ comparison.
1614 */
1615static int
1616dict_equal(dictobject *a, dictobject *b)
1617{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001618 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001619
1620 if (a->ma_used != b->ma_used)
1621 /* can't be equal if # of entries differ */
1622 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001623
Tim Peterse63415e2001-05-08 04:38:29 +00001624 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001625 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001626 PyObject *aval = a->ma_table[i].me_value;
1627 if (aval != NULL) {
1628 int cmp;
1629 PyObject *bval;
1630 PyObject *key = a->ma_table[i].me_key;
1631 /* temporarily bump aval's refcount to ensure it stays
1632 alive until we're done with it */
1633 Py_INCREF(aval);
Neal Norwitza22975f2006-09-05 02:24:03 +00001634 /* ditto for key */
1635 Py_INCREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001636 bval = PyDict_GetItem((PyObject *)b, key);
Neal Norwitza22975f2006-09-05 02:24:03 +00001637 Py_DECREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001638 if (bval == NULL) {
1639 Py_DECREF(aval);
1640 return 0;
1641 }
1642 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1643 Py_DECREF(aval);
1644 if (cmp <= 0) /* error or not equal */
1645 return cmp;
1646 }
1647 }
1648 return 1;
1649 }
1650
1651static PyObject *
1652dict_richcompare(PyObject *v, PyObject *w, int op)
1653{
1654 int cmp;
1655 PyObject *res;
1656
1657 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1658 res = Py_NotImplemented;
1659 }
1660 else if (op == Py_EQ || op == Py_NE) {
1661 cmp = dict_equal((dictobject *)v, (dictobject *)w);
1662 if (cmp < 0)
1663 return NULL;
1664 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1665 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001666 else
1667 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001668 Py_INCREF(res);
1669 return res;
1670 }
1671
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001672static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001673dict_has_key(register dictobject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001674{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001675 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +00001676 dictentry *ep;
Tim Petersd770ebd2006-06-01 15:50:44 +00001677
Tim Peters0ab085c2001-09-14 00:25:33 +00001678 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001679 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001680 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001681 if (hash == -1)
1682 return NULL;
1683 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001684 ep = (mp->ma_lookup)(mp, key, hash);
1685 if (ep == NULL)
1686 return NULL;
Tim Petersd770ebd2006-06-01 15:50:44 +00001687 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001688}
1689
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001690static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001691dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001692{
1693 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001694 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001695 PyObject *val = NULL;
1696 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +00001697 dictentry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001698
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001699 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001700 return NULL;
1701
Tim Peters0ab085c2001-09-14 00:25:33 +00001702 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001703 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001704 hash = PyObject_Hash(key);
1705 if (hash == -1)
1706 return NULL;
1707 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001708 ep = (mp->ma_lookup)(mp, key, hash);
1709 if (ep == NULL)
1710 return NULL;
1711 val = ep->me_value;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001712 if (val == NULL)
1713 val = failobj;
1714 Py_INCREF(val);
1715 return val;
1716}
1717
1718
1719static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001720dict_setdefault(register dictobject *mp, PyObject *args)
1721{
1722 PyObject *key;
1723 PyObject *failobj = Py_None;
1724 PyObject *val = NULL;
1725 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +00001726 dictentry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001727
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001728 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001729 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001730
Tim Peters0ab085c2001-09-14 00:25:33 +00001731 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001732 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001733 hash = PyObject_Hash(key);
1734 if (hash == -1)
1735 return NULL;
1736 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001737 ep = (mp->ma_lookup)(mp, key, hash);
1738 if (ep == NULL)
1739 return NULL;
1740 val = ep->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001741 if (val == NULL) {
1742 val = failobj;
1743 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1744 val = NULL;
1745 }
1746 Py_XINCREF(val);
1747 return val;
1748}
1749
1750
1751static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001752dict_clear(register dictobject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001753{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001754 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001755 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001756}
1757
Guido van Rossumba6ab842000-12-12 22:02:18 +00001758static PyObject *
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001759dict_pop(dictobject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001760{
1761 long hash;
1762 dictentry *ep;
1763 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001764 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001765
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001766 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1767 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001768 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001769 if (deflt) {
1770 Py_INCREF(deflt);
1771 return deflt;
1772 }
Guido van Rossume027d982002-04-12 15:11:59 +00001773 PyErr_SetString(PyExc_KeyError,
1774 "pop(): dictionary is empty");
1775 return NULL;
1776 }
1777 if (!PyString_CheckExact(key) ||
1778 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1779 hash = PyObject_Hash(key);
1780 if (hash == -1)
1781 return NULL;
1782 }
1783 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +00001784 if (ep == NULL)
1785 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001786 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001787 if (deflt) {
1788 Py_INCREF(deflt);
1789 return deflt;
1790 }
Georg Brandlb9f4ad32006-10-29 18:31:42 +00001791 set_key_error(key);
Guido van Rossume027d982002-04-12 15:11:59 +00001792 return NULL;
1793 }
1794 old_key = ep->me_key;
1795 Py_INCREF(dummy);
1796 ep->me_key = dummy;
1797 old_value = ep->me_value;
1798 ep->me_value = NULL;
1799 mp->ma_used--;
1800 Py_DECREF(old_key);
1801 return old_value;
1802}
1803
1804static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001805dict_popitem(dictobject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001806{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001807 Py_ssize_t i = 0;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001808 dictentry *ep;
1809 PyObject *res;
1810
Tim Petersf4b33f62001-06-02 05:42:29 +00001811 /* Allocate the result tuple before checking the size. Believe it
1812 * or not, this allocation could trigger a garbage collection which
1813 * could empty the dict, so if we checked the size first and that
1814 * happened, the result would be an infinite loop (searching for an
1815 * entry that no longer exists). Note that the usual popitem()
1816 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Tim Peters9b10f7e2006-05-30 04:16:25 +00001817 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00001818 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001819 */
1820 res = PyTuple_New(2);
1821 if (res == NULL)
1822 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001823 if (mp->ma_used == 0) {
1824 Py_DECREF(res);
1825 PyErr_SetString(PyExc_KeyError,
1826 "popitem(): dictionary is empty");
1827 return NULL;
1828 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001829 /* Set ep to "the first" dict entry with a value. We abuse the hash
1830 * field of slot 0 to hold a search finger:
1831 * If slot 0 has a value, use slot 0.
1832 * Else slot 0 is being used to hold a search finger,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001833 * and we use its hash value as the first index to look.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001834 */
1835 ep = &mp->ma_table[0];
1836 if (ep->me_value == NULL) {
Tim Peters9b10f7e2006-05-30 04:16:25 +00001837 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001838 /* The hash field may be a real hash value, or it may be a
1839 * legit search finger, or it may be a once-legit search
1840 * finger that's out of bounds now because it wrapped around
1841 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001842 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001843 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001844 i = 1; /* skip slot 0 */
1845 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1846 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001847 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001848 i = 1;
1849 }
1850 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001851 PyTuple_SET_ITEM(res, 0, ep->me_key);
1852 PyTuple_SET_ITEM(res, 1, ep->me_value);
1853 Py_INCREF(dummy);
1854 ep->me_key = dummy;
1855 ep->me_value = NULL;
1856 mp->ma_used--;
1857 assert(mp->ma_table[0].me_value == NULL);
1858 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001859 return res;
1860}
1861
Jeremy Hylton8caad492000-06-23 14:18:11 +00001862static int
1863dict_traverse(PyObject *op, visitproc visit, void *arg)
1864{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001865 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001866 PyObject *pk;
1867 PyObject *pv;
1868
1869 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Woutersc6e55062006-04-15 21:47:09 +00001870 Py_VISIT(pk);
1871 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00001872 }
1873 return 0;
1874}
1875
1876static int
1877dict_tp_clear(PyObject *op)
1878{
1879 PyDict_Clear(op);
1880 return 0;
1881}
1882
Tim Petersf7f88b12000-12-13 23:18:45 +00001883
Raymond Hettinger019a1482004-03-18 02:41:19 +00001884extern PyTypeObject PyDictIterKey_Type; /* Forward */
1885extern PyTypeObject PyDictIterValue_Type; /* Forward */
1886extern PyTypeObject PyDictIterItem_Type; /* Forward */
1887static PyObject *dictiter_new(dictobject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001888
1889static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001890dict_iterkeys(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001891{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001892 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001893}
1894
1895static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001896dict_itervalues(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001897{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001898 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001899}
1900
1901static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001902dict_iteritems(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001903{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001904 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001905}
1906
1907
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001908PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00001909"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00001910
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001911PyDoc_STRVAR(contains__doc__,
1912"D.__contains__(k) -> True if D has a key k, else False");
1913
1914PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1915
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001916PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001917"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001918
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001919PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001920"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 +00001921
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001922PyDoc_STRVAR(pop__doc__,
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001923"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
1924If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001925
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001926PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001927"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000019282-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00001929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001930PyDoc_STRVAR(keys__doc__,
1931"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00001932
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001933PyDoc_STRVAR(items__doc__,
1934"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00001935
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001936PyDoc_STRVAR(values__doc__,
1937"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00001938
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001939PyDoc_STRVAR(update__doc__,
Walter Dörwaldd70ad8a2004-05-28 20:59:21 +00001940"D.update(E, **F) -> None. Update D from E and F: for k in E: D[k] = E[k]\n\
1941(if E has keys else: for (k, v) in E: D[k] = v) then: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00001942
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001943PyDoc_STRVAR(fromkeys__doc__,
1944"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1945v defaults to None.");
1946
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001947PyDoc_STRVAR(clear__doc__,
1948"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001949
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001950PyDoc_STRVAR(copy__doc__,
1951"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001952
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001953PyDoc_STRVAR(iterkeys__doc__,
1954"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001955
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001956PyDoc_STRVAR(itervalues__doc__,
1957"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001958
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001959PyDoc_STRVAR(iteritems__doc__,
1960"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001961
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001962static PyMethodDef mapp_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001963 {"__contains__",(PyCFunction)dict_has_key, METH_O | METH_COEXIST,
1964 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00001965 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001966 getitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001967 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001968 has_key__doc__},
1969 {"get", (PyCFunction)dict_get, METH_VARARGS,
1970 get__doc__},
1971 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1972 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001973 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00001974 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001975 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001976 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001977 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001978 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001979 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001980 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001981 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001982 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001983 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001984 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001985 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
1986 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001987 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001988 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001989 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001990 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001991 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001992 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001993 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001994 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001995 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001996 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00001997 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001998};
1999
Tim Petersd770ebd2006-06-01 15:50:44 +00002000/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002001int
2002PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002003{
2004 long hash;
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002005 dictobject *mp = (dictobject *)op;
Armin Rigo35f6d362006-06-01 13:19:12 +00002006 dictentry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002007
Tim Peters0ab085c2001-09-14 00:25:33 +00002008 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00002009 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002010 hash = PyObject_Hash(key);
2011 if (hash == -1)
2012 return -1;
2013 }
Armin Rigo35f6d362006-06-01 13:19:12 +00002014 ep = (mp->ma_lookup)(mp, key, hash);
Tim Petersd770ebd2006-06-01 15:50:44 +00002015 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002016}
2017
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00002018/* Internal version of PyDict_Contains used when the hash value is already known */
2019int
2020_PyDict_Contains(PyObject *op, PyObject *key, long hash)
2021{
2022 dictobject *mp = (dictobject *)op;
2023 dictentry *ep;
2024
2025 ep = (mp->ma_lookup)(mp, key, hash);
2026 return ep == NULL ? -1 : (ep->me_value != NULL);
2027}
2028
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002029/* Hack to implement "key in dict" */
2030static PySequenceMethods dict_as_sequence = {
Georg Brandl347b3002006-03-30 11:57:00 +00002031 0, /* sq_length */
2032 0, /* sq_concat */
2033 0, /* sq_repeat */
2034 0, /* sq_item */
2035 0, /* sq_slice */
2036 0, /* sq_ass_item */
2037 0, /* sq_ass_slice */
2038 PyDict_Contains, /* sq_contains */
2039 0, /* sq_inplace_concat */
2040 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002041};
2042
Guido van Rossum09e563a2001-05-01 12:10:21 +00002043static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002044dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2045{
2046 PyObject *self;
2047
2048 assert(type != NULL && type->tp_alloc != NULL);
2049 self = type->tp_alloc(type, 0);
2050 if (self != NULL) {
2051 PyDictObject *d = (PyDictObject *)self;
2052 /* It's guaranteed that tp->alloc zeroed out the struct. */
2053 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2054 INIT_NONZERO_DICT_SLOTS(d);
2055 d->ma_lookup = lookdict_string;
2056#ifdef SHOW_CONVERSION_COUNTS
2057 ++created;
2058#endif
2059 }
2060 return self;
2061}
2062
Tim Peters25786c02001-09-02 08:22:48 +00002063static int
2064dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2065{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002066 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002067}
2068
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002069static long
2070dict_nohash(PyObject *self)
2071{
2072 PyErr_SetString(PyExc_TypeError, "dict objects are unhashable");
2073 return -1;
2074}
2075
Tim Peters6d6c1a32001-08-02 04:15:00 +00002076static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00002077dict_iter(dictobject *dict)
2078{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002079 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002080}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002081
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002082PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00002083"dict() -> new empty dictionary.\n"
2084"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00002085" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002086"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002087" d = {}\n"
2088" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002089" d[k] = v\n"
2090"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2091" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002092
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002093PyTypeObject PyDict_Type = {
2094 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002095 0,
Tim Petersa427a2b2001-10-29 22:25:45 +00002096 "dict",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002097 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002098 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00002099 (destructor)dict_dealloc, /* tp_dealloc */
2100 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002101 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00002102 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00002103 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00002104 (reprfunc)dict_repr, /* tp_repr */
2105 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002106 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00002107 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002108 dict_nohash, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00002109 0, /* tp_call */
2110 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002111 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00002112 0, /* tp_setattro */
2113 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002114 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00002115 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00002116 dictionary_doc, /* tp_doc */
Georg Brandl347b3002006-03-30 11:57:00 +00002117 dict_traverse, /* tp_traverse */
2118 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00002119 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002120 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00002121 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002122 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002123 mapp_methods, /* tp_methods */
2124 0, /* tp_members */
2125 0, /* tp_getset */
2126 0, /* tp_base */
2127 0, /* tp_dict */
2128 0, /* tp_descr_get */
2129 0, /* tp_descr_set */
2130 0, /* tp_dictoffset */
Georg Brandl347b3002006-03-30 11:57:00 +00002131 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002132 PyType_GenericAlloc, /* tp_alloc */
2133 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002134 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002135};
2136
Guido van Rossum3cca2451997-05-16 14:23:33 +00002137/* For backward compatibility with old dictionary interface */
2138
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002139PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002140PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002141{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002142 PyObject *kv, *rv;
2143 kv = PyString_FromString(key);
2144 if (kv == NULL)
2145 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002146 rv = PyDict_GetItem(v, kv);
2147 Py_DECREF(kv);
2148 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002149}
2150
2151int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002152PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002153{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002154 PyObject *kv;
2155 int err;
2156 kv = PyString_FromString(key);
2157 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002158 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00002159 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002160 err = PyDict_SetItem(v, kv, item);
2161 Py_DECREF(kv);
2162 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002163}
2164
2165int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002166PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002167{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002168 PyObject *kv;
2169 int err;
2170 kv = PyString_FromString(key);
2171 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002172 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002173 err = PyDict_DelItem(v, kv);
2174 Py_DECREF(kv);
2175 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002176}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002177
Raymond Hettinger019a1482004-03-18 02:41:19 +00002178/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002179
2180typedef struct {
2181 PyObject_HEAD
Guido van Rossum2147df72002-07-16 20:30:22 +00002182 dictobject *di_dict; /* Set to NULL when iterator is exhausted */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002183 Py_ssize_t di_used;
2184 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002185 PyObject* di_result; /* reusable result tuple for iteritems */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002186 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002187} dictiterobject;
2188
2189static PyObject *
Raymond Hettinger019a1482004-03-18 02:41:19 +00002190dictiter_new(dictobject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002191{
2192 dictiterobject *di;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002193 di = PyObject_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002194 if (di == NULL)
2195 return NULL;
2196 Py_INCREF(dict);
2197 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002198 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002199 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002200 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002201 if (itertype == &PyDictIterItem_Type) {
2202 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2203 if (di->di_result == NULL) {
2204 Py_DECREF(di);
2205 return NULL;
2206 }
2207 }
2208 else
2209 di->di_result = NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002210 return (PyObject *)di;
2211}
2212
2213static void
2214dictiter_dealloc(dictiterobject *di)
2215{
Guido van Rossum2147df72002-07-16 20:30:22 +00002216 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002217 Py_XDECREF(di->di_result);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002218 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002219}
2220
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002221static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002222dictiter_len(dictiterobject *di)
2223{
Tim Peters9b10f7e2006-05-30 04:16:25 +00002224 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002225 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002226 len = di->len;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002227 return PyInt_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002228}
2229
Armin Rigof5b3e362006-02-11 21:32:43 +00002230PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002231
2232static PyMethodDef dictiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002233 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002234 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002235};
2236
Raymond Hettinger019a1482004-03-18 02:41:19 +00002237static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002238{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002239 PyObject *key;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002240 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002241 register dictentry *ep;
2242 dictobject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002243
Raymond Hettinger019a1482004-03-18 02:41:19 +00002244 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002245 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002246 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002247
Raymond Hettinger019a1482004-03-18 02:41:19 +00002248 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002249 PyErr_SetString(PyExc_RuntimeError,
2250 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002251 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002252 return NULL;
2253 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002254
Raymond Hettinger019a1482004-03-18 02:41:19 +00002255 i = di->di_pos;
2256 if (i < 0)
2257 goto fail;
2258 ep = d->ma_table;
2259 mask = d->ma_mask;
2260 while (i <= mask && ep[i].me_value == NULL)
2261 i++;
2262 di->di_pos = i+1;
2263 if (i > mask)
2264 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002265 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002266 key = ep[i].me_key;
2267 Py_INCREF(key);
2268 return key;
2269
2270fail:
2271 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002272 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002273 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002274}
2275
Raymond Hettinger019a1482004-03-18 02:41:19 +00002276PyTypeObject PyDictIterKey_Type = {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002277 PyObject_HEAD_INIT(&PyType_Type)
2278 0, /* ob_size */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002279 "dictionary-keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002280 sizeof(dictiterobject), /* tp_basicsize */
2281 0, /* tp_itemsize */
2282 /* methods */
2283 (destructor)dictiter_dealloc, /* tp_dealloc */
2284 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002285 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002286 0, /* tp_setattr */
2287 0, /* tp_compare */
2288 0, /* tp_repr */
2289 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002290 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002291 0, /* tp_as_mapping */
2292 0, /* tp_hash */
2293 0, /* tp_call */
2294 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002295 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002296 0, /* tp_setattro */
2297 0, /* tp_as_buffer */
2298 Py_TPFLAGS_DEFAULT, /* tp_flags */
2299 0, /* tp_doc */
2300 0, /* tp_traverse */
2301 0, /* tp_clear */
2302 0, /* tp_richcompare */
2303 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002304 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002305 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002306 dictiter_methods, /* tp_methods */
2307 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002308};
2309
2310static PyObject *dictiter_iternextvalue(dictiterobject *di)
2311{
2312 PyObject *value;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002313 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002314 register dictentry *ep;
2315 dictobject *d = di->di_dict;
2316
2317 if (d == NULL)
2318 return NULL;
2319 assert (PyDict_Check(d));
2320
2321 if (di->di_used != d->ma_used) {
2322 PyErr_SetString(PyExc_RuntimeError,
2323 "dictionary changed size during iteration");
2324 di->di_used = -1; /* Make this state sticky */
2325 return NULL;
2326 }
2327
2328 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002329 mask = d->ma_mask;
2330 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002331 goto fail;
2332 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002333 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002334 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002335 if (i > mask)
2336 goto fail;
2337 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002338 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002339 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002340 Py_INCREF(value);
2341 return value;
2342
2343fail:
2344 Py_DECREF(d);
2345 di->di_dict = NULL;
2346 return NULL;
2347}
2348
2349PyTypeObject PyDictIterValue_Type = {
2350 PyObject_HEAD_INIT(&PyType_Type)
2351 0, /* ob_size */
2352 "dictionary-valueiterator", /* tp_name */
2353 sizeof(dictiterobject), /* tp_basicsize */
2354 0, /* tp_itemsize */
2355 /* methods */
2356 (destructor)dictiter_dealloc, /* tp_dealloc */
2357 0, /* tp_print */
2358 0, /* tp_getattr */
2359 0, /* tp_setattr */
2360 0, /* tp_compare */
2361 0, /* tp_repr */
2362 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002363 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002364 0, /* tp_as_mapping */
2365 0, /* tp_hash */
2366 0, /* tp_call */
2367 0, /* tp_str */
2368 PyObject_GenericGetAttr, /* tp_getattro */
2369 0, /* tp_setattro */
2370 0, /* tp_as_buffer */
2371 Py_TPFLAGS_DEFAULT, /* tp_flags */
2372 0, /* tp_doc */
2373 0, /* tp_traverse */
2374 0, /* tp_clear */
2375 0, /* tp_richcompare */
2376 0, /* tp_weaklistoffset */
2377 PyObject_SelfIter, /* tp_iter */
2378 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002379 dictiter_methods, /* tp_methods */
2380 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002381};
2382
2383static PyObject *dictiter_iternextitem(dictiterobject *di)
2384{
2385 PyObject *key, *value, *result = di->di_result;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002386 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002387 register dictentry *ep;
2388 dictobject *d = di->di_dict;
2389
2390 if (d == NULL)
2391 return NULL;
2392 assert (PyDict_Check(d));
2393
2394 if (di->di_used != d->ma_used) {
2395 PyErr_SetString(PyExc_RuntimeError,
2396 "dictionary changed size during iteration");
2397 di->di_used = -1; /* Make this state sticky */
2398 return NULL;
2399 }
2400
2401 i = di->di_pos;
2402 if (i < 0)
2403 goto fail;
2404 ep = d->ma_table;
2405 mask = d->ma_mask;
2406 while (i <= mask && ep[i].me_value == NULL)
2407 i++;
2408 di->di_pos = i+1;
2409 if (i > mask)
2410 goto fail;
2411
2412 if (result->ob_refcnt == 1) {
2413 Py_INCREF(result);
2414 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2415 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2416 } else {
2417 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002418 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002419 return NULL;
2420 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002421 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002422 key = ep[i].me_key;
2423 value = ep[i].me_value;
2424 Py_INCREF(key);
2425 Py_INCREF(value);
2426 PyTuple_SET_ITEM(result, 0, key);
2427 PyTuple_SET_ITEM(result, 1, value);
2428 return result;
2429
2430fail:
2431 Py_DECREF(d);
2432 di->di_dict = NULL;
2433 return NULL;
2434}
2435
2436PyTypeObject PyDictIterItem_Type = {
2437 PyObject_HEAD_INIT(&PyType_Type)
2438 0, /* ob_size */
2439 "dictionary-itemiterator", /* tp_name */
2440 sizeof(dictiterobject), /* tp_basicsize */
2441 0, /* tp_itemsize */
2442 /* methods */
2443 (destructor)dictiter_dealloc, /* tp_dealloc */
2444 0, /* tp_print */
2445 0, /* tp_getattr */
2446 0, /* tp_setattr */
2447 0, /* tp_compare */
2448 0, /* tp_repr */
2449 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002450 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002451 0, /* tp_as_mapping */
2452 0, /* tp_hash */
2453 0, /* tp_call */
2454 0, /* tp_str */
2455 PyObject_GenericGetAttr, /* tp_getattro */
2456 0, /* tp_setattro */
2457 0, /* tp_as_buffer */
2458 Py_TPFLAGS_DEFAULT, /* tp_flags */
2459 0, /* tp_doc */
2460 0, /* tp_traverse */
2461 0, /* tp_clear */
2462 0, /* tp_richcompare */
2463 0, /* tp_weaklistoffset */
2464 PyObject_SelfIter, /* tp_iter */
2465 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002466 dictiter_methods, /* tp_methods */
2467 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002468};