blob: bfb891c75552bbe5721077b1a39c6e954f68a015 [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
Guido van Rossum16e93a81997-01-28 00:00:11 +000012
Georg Brandlb9f4ad32006-10-29 18:31:42 +000013/* Set a key error with the specified argument, wrapping it in a
14 * tuple automatically so that tuple keys are not unpacked as the
15 * exception arguments. */
16static void
17set_key_error(PyObject *arg)
18{
19 PyObject *tup;
20 tup = PyTuple_Pack(1, arg);
21 if (!tup)
22 return; /* caller will expect error to be set anyway */
23 PyErr_SetObject(PyExc_KeyError, tup);
Neal Norwitz7b932da2006-10-29 23:39:03 +000024 Py_DECREF(tup);
Georg Brandlb9f4ad32006-10-29 18:31:42 +000025}
26
Tim Peterseb28ef22001-06-02 05:27:19 +000027/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000028#undef SHOW_CONVERSION_COUNTS
29
Tim Peterseb28ef22001-06-02 05:27:19 +000030/* See large comment block below. This must be >= 1. */
31#define PERTURB_SHIFT 5
32
Guido van Rossum16e93a81997-01-28 00:00:11 +000033/*
Tim Peterseb28ef22001-06-02 05:27:19 +000034Major subtleties ahead: Most hash schemes depend on having a "good" hash
35function, in the sense of simulating randomness. Python doesn't: its most
36important hash functions (for strings and ints) are very regular in common
37cases:
Tim Peters15d49292001-05-27 07:39:22 +000038
Tim Peterseb28ef22001-06-02 05:27:19 +000039>>> map(hash, (0, 1, 2, 3))
40[0, 1, 2, 3]
41>>> map(hash, ("namea", "nameb", "namec", "named"))
42[-1658398457, -1658398460, -1658398459, -1658398462]
43>>>
Tim Peters15d49292001-05-27 07:39:22 +000044
Tim Peterseb28ef22001-06-02 05:27:19 +000045This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
46the low-order i bits as the initial table index is extremely fast, and there
47are no collisions at all for dicts indexed by a contiguous range of ints.
48The same is approximately true when keys are "consecutive" strings. So this
49gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000050
Tim Peterseb28ef22001-06-02 05:27:19 +000051OTOH, when collisions occur, the tendency to fill contiguous slices of the
52hash table makes a good collision resolution strategy crucial. Taking only
53the last i bits of the hash code is also vulnerable: for example, consider
54[i << 16 for i in range(20000)] as a set of keys. Since ints are their own
55hash codes, and this fits in a dict of size 2**15, the last 15 bits of every
56hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000057
Tim Peterseb28ef22001-06-02 05:27:19 +000058But catering to unusual cases should not slow the usual ones, so we just take
59the last i bits anyway. It's up to collision resolution to do the rest. If
60we *usually* find the key we're looking for on the first try (and, it turns
61out, we usually do -- the table load factor is kept under 2/3, so the odds
62are solidly in our favor), then it makes best sense to keep the initial index
63computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000064
Tim Peterseb28ef22001-06-02 05:27:19 +000065The first half of collision resolution is to visit table indices via this
66recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000067
Tim Peterseb28ef22001-06-02 05:27:19 +000068 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000069
Tim Peterseb28ef22001-06-02 05:27:19 +000070For any initial j in range(2**i), repeating that 2**i times generates each
71int in range(2**i) exactly once (see any text on random-number generation for
72proof). By itself, this doesn't help much: like linear probing (setting
73j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
74order. This would be bad, except that's not the only thing we do, and it's
75actually *good* in the common cases where hash keys are consecutive. In an
76example that's really too small to make this entirely clear, for a table of
77size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000078
Tim Peterseb28ef22001-06-02 05:27:19 +000079 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
80
81If two things come in at index 5, the first place we look after is index 2,
82not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
83Linear probing is deadly in this case because there the fixed probe order
84is the *same* as the order consecutive keys are likely to arrive. But it's
85extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
86and certain that consecutive hash codes do not.
87
88The other half of the strategy is to get the other bits of the hash code
89into play. This is done by initializing a (unsigned) vrbl "perturb" to the
90full hash code, and changing the recurrence to:
91
92 j = (5*j) + 1 + perturb;
93 perturb >>= PERTURB_SHIFT;
94 use j % 2**i as the next table index;
95
96Now the probe sequence depends (eventually) on every bit in the hash code,
97and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
98because it quickly magnifies small differences in the bits that didn't affect
99the initial index. Note that because perturb is unsigned, if the recurrence
100is executed often enough perturb eventually becomes and remains 0. At that
101point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
102that's certain to find an empty slot eventually (since it generates every int
103in range(2**i), and we make sure there's always at least one empty slot).
104
105Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
106small so that the high bits of the hash code continue to affect the probe
107sequence across iterations; but you want it large so that in really bad cases
108the high-order hash bits have an effect on early iterations. 5 was "the
109best" in minimizing total collisions across experiments Tim Peters ran (on
110both normal and pathological cases), but 4 and 6 weren't significantly worse.
111
112Historical: Reimer Behrends contributed the idea of using a polynomial-based
113approach, using repeated multiplication by x in GF(2**n) where an irreducible
114polynomial for each table size was chosen such that x was a primitive root.
115Christian Tismer later extended that to use division by x instead, as an
116efficient way to get the high bits of the hash code into play. This scheme
117also gave excellent collision statistics, but was more expensive: two
118if-tests were required inside the loop; computing "the next" index took about
119the same number of operations but without as much potential parallelism
120(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
121above, and then shifting perturb can be done while the table index is being
Brett Cannon77ae87c2007-10-10 00:07:50 +0000122masked); and the PyDictObject struct required a member to hold the table's
Tim Peterseb28ef22001-06-02 05:27:19 +0000123polynomial. In Tim's experiments the current scheme ran faster, produced
124equally good collision statistics, needed less code & used less memory.
Tim Peters9b10f7e2006-05-30 04:16:25 +0000125
126Theoretical Python 2.5 headache: hash codes are only C "long", but
127sizeof(Py_ssize_t) > sizeof(long) may be possible. In that case, and if a
128dict is genuinely huge, then only the slots directly reachable via indexing
129by a C long can be the first slot in a probe sequence. The probe sequence
130will still eventually reach every slot in the table, but the collision rate
131on initial probes may be much higher than this scheme was designed for.
132Getting a hash code as fat as Py_ssize_t is the only real cure. But in
133practice, this probably won't make a lick of difference for many years (at
134which point everyone will have terabytes of RAM on 64-bit boxes).
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000135*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000136
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000137/* Object used as dummy key to fill deleted entries */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000138static PyObject *dummy = NULL; /* Initialized by first call to newPyDictObject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000139
Armin Rigoe1709372006-04-12 17:06:05 +0000140#ifdef Py_REF_DEBUG
141PyObject *
142_PyDict_Dummy(void)
143{
144 return dummy;
145}
146#endif
147
Fred Drake1bff34a2000-08-31 19:31:38 +0000148/* forward declarations */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000149static PyDictEntry *
150lookdict_string(PyDictObject *mp, PyObject *key, long hash);
Fred Drake1bff34a2000-08-31 19:31:38 +0000151
152#ifdef SHOW_CONVERSION_COUNTS
153static long created = 0L;
154static long converted = 0L;
155
156static void
157show_counts(void)
158{
159 fprintf(stderr, "created %ld string dicts\n", created);
160 fprintf(stderr, "converted %ld to normal dicts\n", converted);
161 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
162}
163#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000164
Tim Peters6d6c1a32001-08-02 04:15:00 +0000165/* Initialization macros.
166 There are two ways to create a dict: PyDict_New() is the main C API
167 function, and the tp_new slot maps to dict_new(). In the latter case we
168 can save a little time over what PyDict_New does because it's guaranteed
169 that the PyDictObject struct is already zeroed out.
170 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
171 an excellent reason not to).
172*/
173
174#define INIT_NONZERO_DICT_SLOTS(mp) do { \
Tim Petersdea48ec2001-05-22 20:40:22 +0000175 (mp)->ma_table = (mp)->ma_smalltable; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000176 (mp)->ma_mask = PyDict_MINSIZE - 1; \
177 } while(0)
178
179#define EMPTY_TO_MINSIZE(mp) do { \
180 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000181 (mp)->ma_used = (mp)->ma_fill = 0; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000182 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000183 } while(0)
184
Raymond Hettinger43442782004-03-17 21:55:03 +0000185/* Dictionary reuse scheme to save calls to malloc, free, and memset */
186#define MAXFREEDICTS 80
187static PyDictObject *free_dicts[MAXFREEDICTS];
188static int num_free_dicts = 0;
189
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000191PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000192{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000193 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000194 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000196 if (dummy == NULL)
197 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000198#ifdef SHOW_CONVERSION_COUNTS
199 Py_AtExit(show_counts);
200#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000201 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000202 if (num_free_dicts) {
203 mp = free_dicts[--num_free_dicts];
204 assert (mp != NULL);
Martin v. Löwis68192102007-07-21 06:55:02 +0000205 assert (Py_Type(mp) == &PyDict_Type);
Raymond Hettinger43442782004-03-17 21:55:03 +0000206 _Py_NewReference((PyObject *)mp);
207 if (mp->ma_fill) {
208 EMPTY_TO_MINSIZE(mp);
209 }
210 assert (mp->ma_used == 0);
211 assert (mp->ma_table == mp->ma_smalltable);
212 assert (mp->ma_mask == PyDict_MINSIZE - 1);
213 } else {
Brett Cannon77ae87c2007-10-10 00:07:50 +0000214 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
Raymond Hettinger43442782004-03-17 21:55:03 +0000215 if (mp == NULL)
216 return NULL;
217 EMPTY_TO_MINSIZE(mp);
218 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000219 mp->ma_lookup = lookdict_string;
220#ifdef SHOW_CONVERSION_COUNTS
221 ++created;
222#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000223 _PyObject_GC_TRACK(mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000225}
226
227/*
228The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000229This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000230Open addressing is preferred over chaining since the link overhead for
231chaining would be substantial (100% with typical malloc overhead).
232
Tim Peterseb28ef22001-06-02 05:27:19 +0000233The initial probe index is computed as hash mod the table size. Subsequent
234probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000235
236All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000237
Tim Peterseb28ef22001-06-02 05:27:19 +0000238(The details in this version are due to Tim Peters, building on many past
239contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
240Christian Tismer).
Fred Drake1bff34a2000-08-31 19:31:38 +0000241
Tim Petersd770ebd2006-06-01 15:50:44 +0000242lookdict() is general-purpose, and may return NULL if (and only if) a
243comparison raises an exception (this was new in Python 2.5).
244lookdict_string() below is specialized to string keys, comparison of which can
245never raise an exception; that function can never return NULL. For both, when
Brett Cannon77ae87c2007-10-10 00:07:50 +0000246the key isn't found a PyDictEntry* is returned for which the me_value field is
Tim Petersd770ebd2006-06-01 15:50:44 +0000247NULL; this is the slot in the dict at which the key would have been found, and
248the caller can (if it wishes) add the <key, value> pair to the returned
Brett Cannon77ae87c2007-10-10 00:07:50 +0000249PyDictEntry*.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000250*/
Brett Cannon77ae87c2007-10-10 00:07:50 +0000251static PyDictEntry *
252lookdict(PyDictObject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000253{
Tim Petersd770ebd2006-06-01 15:50:44 +0000254 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000255 register size_t perturb;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000256 register PyDictEntry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000257 register size_t mask = (size_t)mp->ma_mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000258 PyDictEntry *ep0 = mp->ma_table;
259 register PyDictEntry *ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000260 register int cmp;
Tim Peters453163d2001-06-03 04:54:32 +0000261 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000262
Tim Petersd770ebd2006-06-01 15:50:44 +0000263 i = (size_t)hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000264 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000265 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000266 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000267
Guido van Rossum16e93a81997-01-28 00:00:11 +0000268 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000269 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000270 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000271 if (ep->me_hash == hash) {
Tim Peters453163d2001-06-03 04:54:32 +0000272 startkey = ep->me_key;
273 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000274 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000275 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000276 if (ep0 == mp->ma_table && ep->me_key == startkey) {
277 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000278 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000279 }
280 else {
281 /* The compare did major nasty stuff to the
282 * dict: start over.
283 * XXX A clever adversary could prevent this
284 * XXX from terminating.
285 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000286 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000287 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000288 }
289 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000290 }
Tim Peters15d49292001-05-27 07:39:22 +0000291
Tim Peters342c65e2001-05-13 06:43:53 +0000292 /* In the loop, me_key == dummy is by far (factor of 100s) the
293 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000294 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
295 i = (i << 2) + i + perturb + 1;
296 ep = &ep0[i & mask];
Armin Rigo35f6d362006-06-01 13:19:12 +0000297 if (ep->me_key == NULL)
298 return freeslot == NULL ? ep : freeslot;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000299 if (ep->me_key == key)
Armin Rigo35f6d362006-06-01 13:19:12 +0000300 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000301 if (ep->me_hash == hash && ep->me_key != dummy) {
Tim Peters453163d2001-06-03 04:54:32 +0000302 startkey = ep->me_key;
303 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000304 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000305 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000306 if (ep0 == mp->ma_table && ep->me_key == startkey) {
307 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000308 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000309 }
310 else {
311 /* The compare did major nasty stuff to the
312 * dict: start over.
313 * XXX A clever adversary could prevent this
314 * XXX from terminating.
315 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000316 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000317 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000318 }
Tim Peters342c65e2001-05-13 06:43:53 +0000319 else if (ep->me_key == dummy && freeslot == NULL)
320 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000321 }
Neal Norwitza5ccda92006-10-28 21:16:54 +0000322 assert(0); /* NOT REACHED */
323 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000324}
325
326/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000327 * Hacked up version of lookdict which can assume keys are always strings;
Tim Petersd770ebd2006-06-01 15:50:44 +0000328 * this assumption allows testing for errors during PyObject_RichCompareBool()
329 * to be dropped; string-string comparisons never raise exceptions. This also
330 * means we don't need to go through PyObject_RichCompareBool(); we can always
331 * use _PyString_Eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000332 *
Tim Petersd770ebd2006-06-01 15:50:44 +0000333 * This is valuable because dicts with only string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000334 */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000335static PyDictEntry *
336lookdict_string(PyDictObject *mp, PyObject *key, register long hash)
Fred Drake1bff34a2000-08-31 19:31:38 +0000337{
Tim Petersd770ebd2006-06-01 15:50:44 +0000338 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000339 register size_t perturb;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000340 register PyDictEntry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000341 register size_t mask = (size_t)mp->ma_mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000342 PyDictEntry *ep0 = mp->ma_table;
343 register PyDictEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000344
Tim Peters0ab085c2001-09-14 00:25:33 +0000345 /* Make sure this function doesn't have to handle non-string keys,
346 including subclasses of str; e.g., one reason to subclass
347 strings is to override __eq__, and for speed we don't cater to
348 that here. */
349 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000350#ifdef SHOW_CONVERSION_COUNTS
351 ++converted;
352#endif
353 mp->ma_lookup = lookdict;
354 return lookdict(mp, key, hash);
355 }
Tim Peters2f228e72001-05-13 00:19:31 +0000356 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000357 ep = &ep0[i];
358 if (ep->me_key == NULL || ep->me_key == key)
359 return ep;
360 if (ep->me_key == dummy)
361 freeslot = ep;
362 else {
Tim Petersd770ebd2006-06-01 15:50:44 +0000363 if (ep->me_hash == hash && _PyString_Eq(ep->me_key, key))
Fred Drake1bff34a2000-08-31 19:31:38 +0000364 return ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000365 freeslot = NULL;
366 }
Tim Peters15d49292001-05-27 07:39:22 +0000367
Tim Peters342c65e2001-05-13 06:43:53 +0000368 /* In the loop, me_key == dummy is by far (factor of 100s) the
369 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000370 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
371 i = (i << 2) + i + perturb + 1;
372 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000373 if (ep->me_key == NULL)
374 return freeslot == NULL ? ep : freeslot;
375 if (ep->me_key == key
376 || (ep->me_hash == hash
377 && ep->me_key != dummy
Martin v. Löwiscd353062001-05-24 16:56:35 +0000378 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000379 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000380 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000381 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000382 }
Neal Norwitza5ccda92006-10-28 21:16:54 +0000383 assert(0); /* NOT REACHED */
384 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000385}
386
387/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000388Internal routine to insert a new item into the table.
389Used both by the internal resize routine and by the public insert routine.
390Eats a reference to key and one to value.
Tim Petersd770ebd2006-06-01 15:50:44 +0000391Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000392*/
Armin Rigo35f6d362006-06-01 13:19:12 +0000393static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000394insertdict(register PyDictObject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000395{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 PyObject *old_value;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000397 register PyDictEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000398 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
399
400 assert(mp->ma_lookup != NULL);
401 ep = mp->ma_lookup(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000402 if (ep == NULL) {
403 Py_DECREF(key);
404 Py_DECREF(value);
405 return -1;
406 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000407 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000408 old_value = ep->me_value;
409 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 Py_DECREF(old_value); /* which **CAN** re-enter */
411 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000412 }
413 else {
414 if (ep->me_key == NULL)
415 mp->ma_fill++;
Raymond Hettinger07ead172005-02-05 23:42:57 +0000416 else {
417 assert(ep->me_key == dummy);
418 Py_DECREF(dummy);
419 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000420 ep->me_key = key;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000421 ep->me_hash = (Py_ssize_t)hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000422 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000423 mp->ma_used++;
424 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000425 return 0;
426}
427
428/*
429Internal routine used by dictresize() to insert an item which is
430known to be absent from the dict. This routine also assumes that
431the dict contains no deleted entries. Besides the performance benefit,
432using insertdict() in dictresize() is dangerous (SF bug #1456209).
Tim Petersd770ebd2006-06-01 15:50:44 +0000433Note that no refcounts are changed by this routine; if needed, the caller
434is responsible for incref'ing `key` and `value`.
Armin Rigo35f6d362006-06-01 13:19:12 +0000435*/
436static void
Brett Cannon77ae87c2007-10-10 00:07:50 +0000437insertdict_clean(register PyDictObject *mp, PyObject *key, long hash,
Armin Rigo35f6d362006-06-01 13:19:12 +0000438 PyObject *value)
439{
Tim Petersd770ebd2006-06-01 15:50:44 +0000440 register size_t i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000441 register size_t perturb;
Tim Petersd770ebd2006-06-01 15:50:44 +0000442 register size_t mask = (size_t)mp->ma_mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000443 PyDictEntry *ep0 = mp->ma_table;
444 register PyDictEntry *ep;
Armin Rigo35f6d362006-06-01 13:19:12 +0000445
446 i = hash & mask;
447 ep = &ep0[i];
448 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
449 i = (i << 2) + i + perturb + 1;
450 ep = &ep0[i & mask];
451 }
Tim Petersd770ebd2006-06-01 15:50:44 +0000452 assert(ep->me_value == NULL);
Armin Rigo35f6d362006-06-01 13:19:12 +0000453 mp->ma_fill++;
454 ep->me_key = key;
455 ep->me_hash = (Py_ssize_t)hash;
456 ep->me_value = value;
457 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000458}
459
460/*
461Restructure the table by allocating a new table and reinserting all
462items again. When entries have been deleted, the new table may
463actually be smaller than the old one.
464*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000465static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000466dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000467{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000468 Py_ssize_t newsize;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000469 PyDictEntry *oldtable, *newtable, *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000470 Py_ssize_t i;
Tim Peters0c6010b2001-05-23 23:33:57 +0000471 int is_oldtable_malloced;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000472 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000473
474 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000475
Tim Peterseb28ef22001-06-02 05:27:19 +0000476 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000477 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000478 newsize <= minused && newsize > 0;
479 newsize <<= 1)
480 ;
481 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000483 return -1;
484 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000485
486 /* Get space for a new table. */
487 oldtable = mp->ma_table;
488 assert(oldtable != NULL);
489 is_oldtable_malloced = oldtable != mp->ma_smalltable;
490
Tim Peters6d6c1a32001-08-02 04:15:00 +0000491 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000492 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000493 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000494 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000495 if (mp->ma_fill == mp->ma_used) {
496 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000497 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000498 }
499 /* We're not going to resize it, but rebuild the
500 table anyway to purge old dummy entries.
501 Subtle: This is *necessary* if fill==size,
502 as lookdict needs at least one virgin slot to
503 terminate failing searches. If fill < size, it's
504 merely desirable, as dummies slow searches. */
505 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000506 memcpy(small_copy, oldtable, sizeof(small_copy));
507 oldtable = small_copy;
508 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000509 }
510 else {
Brett Cannon77ae87c2007-10-10 00:07:50 +0000511 newtable = PyMem_NEW(PyDictEntry, newsize);
Tim Petersdea48ec2001-05-22 20:40:22 +0000512 if (newtable == NULL) {
513 PyErr_NoMemory();
514 return -1;
515 }
516 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000517
518 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000519 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000520 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000521 mp->ma_mask = newsize - 1;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000522 memset(newtable, 0, sizeof(PyDictEntry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000523 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000524 i = mp->ma_fill;
525 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000526
Tim Peters19283142001-05-17 22:25:34 +0000527 /* Copy the data over; this is refcount-neutral for active entries;
528 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000529 for (ep = oldtable; i > 0; ep++) {
530 if (ep->me_value != NULL) { /* active entry */
531 --i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000532 insertdict_clean(mp, ep->me_key, (long)ep->me_hash,
533 ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000534 }
Tim Peters19283142001-05-17 22:25:34 +0000535 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000536 --i;
Tim Peters19283142001-05-17 22:25:34 +0000537 assert(ep->me_key == dummy);
538 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000539 }
Tim Peters19283142001-05-17 22:25:34 +0000540 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000541 }
542
Tim Peters0c6010b2001-05-23 23:33:57 +0000543 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000544 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000545 return 0;
546}
547
Tim Petersd770ebd2006-06-01 15:50:44 +0000548/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
549 * that may occur (originally dicts supported only string keys, and exceptions
550 * weren't possible). So, while the original intent was that a NULL return
Andrew M. Kuchling0067b5f2006-08-04 20:37:43 +0000551 * meant the key wasn't present, in reality it can mean that, or that an error
Tim Petersd770ebd2006-06-01 15:50:44 +0000552 * (suppressed) occurred while computing the key's hash, or that some error
553 * (suppressed) occurred when comparing keys in the dict's internal probe
554 * sequence. A nasty example of the latter is when a Python-coded comparison
555 * function hits a stack-depth error, which can cause this to return NULL
556 * even if the key is present.
557 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000559PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000560{
561 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000562 PyDictObject *mp = (PyDictObject *)op;
563 PyDictEntry *ep;
Armin Rigo35f6d362006-06-01 13:19:12 +0000564 PyThreadState *tstate;
Tim Petersd770ebd2006-06-01 15:50:44 +0000565 if (!PyDict_Check(op))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000566 return NULL;
Tim Peters0ab085c2001-09-14 00:25:33 +0000567 if (!PyString_CheckExact(key) ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000569 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000571 if (hash == -1) {
572 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000573 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000574 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000575 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000576
577 /* We can arrive here with a NULL tstate during initialization:
578 try running "python -Wi" for an example related to string
579 interning. Let's just hope that no exception occurs then... */
Armin Rigoacd0d6d2006-06-10 10:57:40 +0000580 tstate = _PyThreadState_Current;
Armin Rigo35f6d362006-06-01 13:19:12 +0000581 if (tstate != NULL && tstate->curexc_type != NULL) {
582 /* preserve the existing exception */
583 PyObject *err_type, *err_value, *err_tb;
584 PyErr_Fetch(&err_type, &err_value, &err_tb);
585 ep = (mp->ma_lookup)(mp, key, hash);
586 /* ignore errors */
587 PyErr_Restore(err_type, err_value, err_tb);
588 if (ep == NULL)
589 return NULL;
590 }
591 else {
592 ep = (mp->ma_lookup)(mp, key, hash);
593 if (ep == NULL) {
594 PyErr_Clear();
595 return NULL;
596 }
597 }
598 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000599}
600
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000601/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000602 * dictionary if it's merely replacing the value for an existing key.
603 * This means that it's safe to loop over a dictionary with PyDict_Next()
604 * and occasionally replace a value -- but you can't insert new keys or
605 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000606 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000607int
Tim Peters1f5871e2000-07-04 17:44:48 +0000608PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000609{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000610 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000611 register long hash;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000612 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000613
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000614 if (!PyDict_Check(op)) {
615 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000616 return -1;
617 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000618 assert(key);
619 assert(value);
Brett Cannon77ae87c2007-10-10 00:07:50 +0000620 mp = (PyDictObject *)op;
Tim Peters0ab085c2001-09-14 00:25:33 +0000621 if (PyString_CheckExact(key)) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000622 hash = ((PyStringObject *)key)->ob_shash;
623 if (hash == -1)
624 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000625 }
Tim Peters1f7df352002-03-29 03:29:08 +0000626 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000628 if (hash == -1)
629 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000630 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000631 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000632 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633 Py_INCREF(value);
634 Py_INCREF(key);
Armin Rigo35f6d362006-06-01 13:19:12 +0000635 if (insertdict(mp, key, hash, value) != 0)
636 return -1;
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000637 /* If we added a key, we can safely resize. Otherwise just return!
638 * If fill >= 2/3 size, adjust size. Normally, this doubles or
639 * quaduples the size, but it's also possible for the dict to shrink
Tim Peters60b29962006-01-01 01:19:23 +0000640 * (if ma_fill is much larger than ma_used, meaning a lot of dict
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000641 * keys have been * deleted).
Tim Peters60b29962006-01-01 01:19:23 +0000642 *
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000643 * Quadrupling the size improves average dictionary sparseness
644 * (reducing collisions) at the cost of some memory and iteration
645 * speed (which loops over every possible entry). It also halves
Neal Norwitz80af59c2006-05-30 04:19:21 +0000646 * the number of expensive resize operations in a growing dictionary.
Tim Peters60b29962006-01-01 01:19:23 +0000647 *
648 * Very large dictionaries (over 50K items) use doubling instead.
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000649 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000650 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000651 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
652 return 0;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000653 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000654}
655
656int
Tim Peters1f5871e2000-07-04 17:44:48 +0000657PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000658{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000659 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000660 register long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000661 register PyDictEntry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000663
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 if (!PyDict_Check(op)) {
665 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000666 return -1;
667 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000668 assert(key);
Tim Peters0ab085c2001-09-14 00:25:33 +0000669 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000670 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000672 if (hash == -1)
673 return -1;
674 }
Brett Cannon77ae87c2007-10-10 00:07:50 +0000675 mp = (PyDictObject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000676 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000677 if (ep == NULL)
678 return -1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000679 if (ep->me_value == NULL) {
Georg Brandlb9f4ad32006-10-29 18:31:42 +0000680 set_key_error(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000681 return -1;
682 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000683 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000684 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000685 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000686 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000687 ep->me_value = NULL;
688 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000689 Py_DECREF(old_value);
690 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000691 return 0;
692}
693
Guido van Rossum25831651993-05-19 14:50:45 +0000694void
Tim Peters1f5871e2000-07-04 17:44:48 +0000695PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000696{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000697 PyDictObject *mp;
698 PyDictEntry *ep, *table;
Tim Petersdea48ec2001-05-22 20:40:22 +0000699 int table_is_malloced;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000700 Py_ssize_t fill;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000701 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000702#ifdef Py_DEBUG
Tim Peters9b10f7e2006-05-30 04:16:25 +0000703 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000704#endif
705
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000706 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000707 return;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000708 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000709#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000710 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000711 i = 0;
712#endif
713
714 table = mp->ma_table;
715 assert(table != NULL);
716 table_is_malloced = table != mp->ma_smalltable;
717
718 /* This is delicate. During the process of clearing the dict,
719 * decrefs can cause the dict to mutate. To avoid fatal confusion
720 * (voice of experience), we have to make the dict empty before
721 * clearing the slots, and never refer to anything via mp->xxx while
722 * clearing.
723 */
724 fill = mp->ma_fill;
725 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000726 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000727
728 else if (fill > 0) {
729 /* It's a small table with something that needs to be cleared.
730 * Afraid the only safe way is to copy the dict entries into
731 * another small table first.
732 */
733 memcpy(small_copy, table, sizeof(small_copy));
734 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000735 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000736 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000737 /* else it's a small table that's already empty */
738
739 /* Now we can finally clear things. If C had refcounts, we could
740 * assert that the refcount on table is 1 now, i.e. that this function
741 * has unique access to it, so decref side-effects can't alter it.
742 */
743 for (ep = table; fill > 0; ++ep) {
744#ifdef Py_DEBUG
745 assert(i < n);
746 ++i;
747#endif
748 if (ep->me_key) {
749 --fill;
750 Py_DECREF(ep->me_key);
751 Py_XDECREF(ep->me_value);
752 }
753#ifdef Py_DEBUG
754 else
755 assert(ep->me_value == NULL);
756#endif
757 }
758
759 if (table_is_malloced)
760 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000761}
762
Tim Peters080c88b2003-02-15 03:01:11 +0000763/*
764 * Iterate over a dict. Use like so:
765 *
Tim Peters9b10f7e2006-05-30 04:16:25 +0000766 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000767 * PyObject *key, *value;
768 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000769 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000770 * Refer to borrowed references in key and value.
771 * }
772 *
773 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000774 * mutates the dict. One exception: it is safe if the loop merely changes
775 * the values associated with the keys (but doesn't insert new keys or
776 * delete keys), via PyDict_SetItem().
777 */
Guido van Rossum25831651993-05-19 14:50:45 +0000778int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000779PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000780{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000781 register Py_ssize_t i;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000782 register Py_ssize_t mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000783 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000784
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000786 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000787 i = *ppos;
788 if (i < 0)
789 return 0;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000790 ep = ((PyDictObject *)op)->ma_table;
791 mask = ((PyDictObject *)op)->ma_mask;
Raymond Hettinger43442782004-03-17 21:55:03 +0000792 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000793 i++;
794 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000795 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000796 return 0;
797 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000798 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000799 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000800 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000801 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000802}
803
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000804/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
805int
806_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, long *phash)
807{
808 register Py_ssize_t i;
809 register Py_ssize_t mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000810 register PyDictEntry *ep;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000811
812 if (!PyDict_Check(op))
813 return 0;
814 i = *ppos;
815 if (i < 0)
816 return 0;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000817 ep = ((PyDictObject *)op)->ma_table;
818 mask = ((PyDictObject *)op)->ma_mask;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000819 while (i <= mask && ep[i].me_value == NULL)
820 i++;
821 *ppos = i+1;
822 if (i > mask)
823 return 0;
824 *phash = (long)(ep[i].me_hash);
825 if (pkey)
826 *pkey = ep[i].me_key;
827 if (pvalue)
828 *pvalue = ep[i].me_value;
829 return 1;
830}
831
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000832/* Methods */
833
834static void
Brett Cannon77ae87c2007-10-10 00:07:50 +0000835dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000836{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000837 register PyDictEntry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000838 Py_ssize_t fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000839 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000840 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000841 for (ep = mp->ma_table; fill > 0; ep++) {
842 if (ep->me_key) {
843 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000845 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000846 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000847 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000848 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000849 PyMem_DEL(mp->ma_table);
Martin v. Löwis68192102007-07-21 06:55:02 +0000850 if (num_free_dicts < MAXFREEDICTS && Py_Type(mp) == &PyDict_Type)
Raymond Hettinger43442782004-03-17 21:55:03 +0000851 free_dicts[num_free_dicts++] = mp;
Tim Peters60b29962006-01-01 01:19:23 +0000852 else
Martin v. Löwis68192102007-07-21 06:55:02 +0000853 Py_Type(mp)->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000854 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000855}
856
857static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000858dict_print(register PyDictObject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000859{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000860 register Py_ssize_t i;
861 register Py_ssize_t any;
Tim Peters33f4a6a2006-05-30 05:23:59 +0000862 int status;
Guido van Rossum255443b1998-04-10 22:47:14 +0000863
Tim Peters33f4a6a2006-05-30 05:23:59 +0000864 status = Py_ReprEnter((PyObject*)mp);
865 if (status != 0) {
866 if (status < 0)
867 return status;
Brett Cannon01531592007-09-17 03:28:34 +0000868 Py_BEGIN_ALLOW_THREADS
Guido van Rossum255443b1998-04-10 22:47:14 +0000869 fprintf(fp, "{...}");
Brett Cannon01531592007-09-17 03:28:34 +0000870 Py_END_ALLOW_THREADS
Guido van Rossum255443b1998-04-10 22:47:14 +0000871 return 0;
872 }
873
Brett Cannon01531592007-09-17 03:28:34 +0000874 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000875 fprintf(fp, "{");
Brett Cannon01531592007-09-17 03:28:34 +0000876 Py_END_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000877 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000878 for (i = 0; i <= mp->ma_mask; i++) {
Brett Cannon77ae87c2007-10-10 00:07:50 +0000879 PyDictEntry *ep = mp->ma_table + i;
Tim Peters23cf6be2001-06-02 08:02:56 +0000880 PyObject *pvalue = ep->me_value;
881 if (pvalue != NULL) {
882 /* Prevent PyObject_Repr from deleting value during
883 key format */
884 Py_INCREF(pvalue);
Brett Cannon01531592007-09-17 03:28:34 +0000885 if (any++ > 0) {
886 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000887 fprintf(fp, ", ");
Brett Cannon01531592007-09-17 03:28:34 +0000888 Py_END_ALLOW_THREADS
889 }
Guido van Rossum255443b1998-04-10 22:47:14 +0000890 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000891 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000892 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000893 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000894 }
Brett Cannon01531592007-09-17 03:28:34 +0000895 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000896 fprintf(fp, ": ");
Brett Cannon01531592007-09-17 03:28:34 +0000897 Py_END_ALLOW_THREADS
Tim Peters19b77cf2001-06-02 08:27:39 +0000898 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000899 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000900 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000901 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000902 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000903 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000904 }
905 }
Brett Cannon01531592007-09-17 03:28:34 +0000906 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000907 fprintf(fp, "}");
Brett Cannon01531592007-09-17 03:28:34 +0000908 Py_END_ALLOW_THREADS
Guido van Rossum255443b1998-04-10 22:47:14 +0000909 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000910 return 0;
911}
912
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000913static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +0000914dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000915{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000916 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000917 PyObject *s, *temp, *colon = NULL;
918 PyObject *pieces = NULL, *result = NULL;
919 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +0000920
Tim Petersa7259592001-06-16 05:11:17 +0000921 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +0000922 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000923 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +0000924 }
925
Tim Petersa7259592001-06-16 05:11:17 +0000926 if (mp->ma_used == 0) {
927 result = PyString_FromString("{}");
928 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000929 }
Tim Petersa7259592001-06-16 05:11:17 +0000930
931 pieces = PyList_New(0);
932 if (pieces == NULL)
933 goto Done;
934
935 colon = PyString_FromString(": ");
936 if (colon == NULL)
937 goto Done;
938
939 /* Do repr() on each key+value pair, and insert ": " between them.
940 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +0000941 i = 0;
942 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +0000943 int status;
944 /* Prevent repr from deleting value during key format. */
945 Py_INCREF(value);
946 s = PyObject_Repr(key);
947 PyString_Concat(&s, colon);
948 PyString_ConcatAndDel(&s, PyObject_Repr(value));
949 Py_DECREF(value);
950 if (s == NULL)
951 goto Done;
952 status = PyList_Append(pieces, s);
953 Py_DECREF(s); /* append created a new ref */
954 if (status < 0)
955 goto Done;
956 }
957
958 /* Add "{}" decorations to the first and last items. */
959 assert(PyList_GET_SIZE(pieces) > 0);
960 s = PyString_FromString("{");
961 if (s == NULL)
962 goto Done;
963 temp = PyList_GET_ITEM(pieces, 0);
964 PyString_ConcatAndDel(&s, temp);
965 PyList_SET_ITEM(pieces, 0, s);
966 if (s == NULL)
967 goto Done;
968
969 s = PyString_FromString("}");
970 if (s == NULL)
971 goto Done;
972 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
973 PyString_ConcatAndDel(&temp, s);
974 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
975 if (temp == NULL)
976 goto Done;
977
978 /* Paste them all together with ", " between. */
979 s = PyString_FromString(", ");
980 if (s == NULL)
981 goto Done;
982 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +0000983 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000984
985Done:
986 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +0000988 Py_ReprLeave((PyObject *)mp);
989 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000990}
991
Martin v. Löwis18e16552006-02-15 17:27:45 +0000992static Py_ssize_t
Brett Cannon77ae87c2007-10-10 00:07:50 +0000993dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000994{
995 return mp->ma_used;
996}
997
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000998static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +0000999dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001000{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001002 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001003 PyDictEntry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +00001004 assert(mp->ma_table != NULL);
Tim Peters0ab085c2001-09-14 00:25:33 +00001005 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001006 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001007 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001008 if (hash == -1)
1009 return NULL;
1010 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001011 ep = (mp->ma_lookup)(mp, key, hash);
1012 if (ep == NULL)
1013 return NULL;
1014 v = ep->me_value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001015 if (v == NULL) {
1016 if (!PyDict_CheckExact(mp)) {
1017 /* Look up __missing__ method if we're a subclass. */
Guido van Rossum4b92a822006-02-25 23:32:30 +00001018 PyObject *missing;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001019 static PyObject *missing_str = NULL;
1020 if (missing_str == NULL)
Tim Peters9b10f7e2006-05-30 04:16:25 +00001021 missing_str =
Guido van Rossum1968ad32006-02-25 22:38:04 +00001022 PyString_InternFromString("__missing__");
Martin v. Löwis68192102007-07-21 06:55:02 +00001023 missing = _PyType_Lookup(Py_Type(mp), missing_str);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001024 if (missing != NULL)
1025 return PyObject_CallFunctionObjArgs(missing,
1026 (PyObject *)mp, key, NULL);
1027 }
Georg Brandlb9f4ad32006-10-29 18:31:42 +00001028 set_key_error(key);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001029 return NULL;
1030 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001031 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001033 return v;
1034}
1035
1036static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001037dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001038{
1039 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001040 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001041 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001043}
1044
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001045static PyMappingMethods dict_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001046 (lenfunc)dict_length, /*mp_length*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001047 (binaryfunc)dict_subscript, /*mp_subscript*/
1048 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001049};
1050
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001051static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001052dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001053{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001054 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001055 register Py_ssize_t i, j;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001056 PyDictEntry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001057 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001058
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001059 again:
1060 n = mp->ma_used;
1061 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001062 if (v == NULL)
1063 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001064 if (n != mp->ma_used) {
1065 /* Durnit. The allocations caused the dict to resize.
1066 * Just start over, this shouldn't normally happen.
1067 */
1068 Py_DECREF(v);
1069 goto again;
1070 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001071 ep = mp->ma_table;
1072 mask = mp->ma_mask;
1073 for (i = 0, j = 0; i <= mask; i++) {
1074 if (ep[i].me_value != NULL) {
1075 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001077 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001078 j++;
1079 }
1080 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001081 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001082 return v;
1083}
1084
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001086dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001087{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001088 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001089 register Py_ssize_t i, j;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001090 PyDictEntry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001091 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001092
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001093 again:
1094 n = mp->ma_used;
1095 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001096 if (v == NULL)
1097 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001098 if (n != mp->ma_used) {
1099 /* Durnit. The allocations caused the dict to resize.
1100 * Just start over, this shouldn't normally happen.
1101 */
1102 Py_DECREF(v);
1103 goto again;
1104 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001105 ep = mp->ma_table;
1106 mask = mp->ma_mask;
1107 for (i = 0, j = 0; i <= mask; i++) {
1108 if (ep[i].me_value != NULL) {
1109 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001110 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001111 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001112 j++;
1113 }
1114 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001115 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001116 return v;
1117}
1118
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001119static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001120dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001121{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001123 register Py_ssize_t i, j, n;
1124 Py_ssize_t mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001125 PyObject *item, *key, *value;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001126 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001127
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001128 /* Preallocate the list of tuples, to avoid allocations during
1129 * the loop over the items, which could trigger GC, which
1130 * could resize the dict. :-(
1131 */
1132 again:
1133 n = mp->ma_used;
1134 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001135 if (v == NULL)
1136 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001137 for (i = 0; i < n; i++) {
1138 item = PyTuple_New(2);
1139 if (item == NULL) {
1140 Py_DECREF(v);
1141 return NULL;
1142 }
1143 PyList_SET_ITEM(v, i, item);
1144 }
1145 if (n != mp->ma_used) {
1146 /* Durnit. The allocations caused the dict to resize.
1147 * Just start over, this shouldn't normally happen.
1148 */
1149 Py_DECREF(v);
1150 goto again;
1151 }
1152 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001153 ep = mp->ma_table;
1154 mask = mp->ma_mask;
1155 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001156 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001157 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001158 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001159 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001160 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001161 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001162 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001163 j++;
1164 }
1165 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001166 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001167 return v;
1168}
1169
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001170static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001171dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001172{
1173 PyObject *seq;
1174 PyObject *value = Py_None;
1175 PyObject *it; /* iter(seq) */
1176 PyObject *key;
1177 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001178 int status;
1179
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001180 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001181 return NULL;
1182
1183 d = PyObject_CallObject(cls, NULL);
1184 if (d == NULL)
1185 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001186
Raymond Hettingercdcf8872007-11-07 02:26:17 +00001187 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1188 PyDictObject *mp = (PyDictObject *)d;
1189 PyObject *oldvalue;
1190 Py_ssize_t pos = 0;
1191 PyObject *key;
1192 long hash;
1193
Raymond Hettinger34448792007-11-09 23:14:44 +00001194 if (dictresize(mp, PySet_GET_SIZE(seq)))
Raymond Hettingercdcf8872007-11-07 02:26:17 +00001195 return NULL;
1196
1197 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1198 Py_INCREF(key);
1199 Py_INCREF(value);
1200 if (insertdict(mp, key, hash, value))
1201 return NULL;
1202 }
1203 return d;
1204 }
1205
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001206 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001207 PyDictObject *mp = (PyDictObject *)d;
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001208 Py_ssize_t pos = 0;
1209 PyObject *key;
1210 long hash;
1211
1212 if (dictresize(mp, PySet_GET_SIZE(seq)))
1213 return NULL;
1214
1215 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1216 Py_INCREF(key);
Raymond Hettingere3146f52007-03-21 20:33:57 +00001217 Py_INCREF(value);
1218 if (insertdict(mp, key, hash, value))
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001219 return NULL;
1220 }
1221 return d;
1222 }
1223
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001224 it = PyObject_GetIter(seq);
1225 if (it == NULL){
1226 Py_DECREF(d);
1227 return NULL;
1228 }
1229
Raymond Hettinger34448792007-11-09 23:14:44 +00001230 if (PyDict_CheckExact(d)) {
1231 while ((key = PyIter_Next(it)) != NULL) {
1232 status = PyDict_SetItem(d, key, value);
1233 Py_DECREF(key);
1234 if (status < 0)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001235 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001236 }
Raymond Hettinger34448792007-11-09 23:14:44 +00001237 } else {
1238 while ((key = PyIter_Next(it)) != NULL) {
1239 status = PyObject_SetItem(d, key, value);
1240 Py_DECREF(key);
1241 if (status < 0)
1242 goto Fail;
1243 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001244 }
1245
Raymond Hettinger34448792007-11-09 23:14:44 +00001246 if (PyErr_Occurred())
1247 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001248 Py_DECREF(it);
1249 return d;
1250
1251Fail:
1252 Py_DECREF(it);
1253 Py_DECREF(d);
1254 return NULL;
1255}
1256
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001257static int
1258dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001259{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001260 PyObject *arg = NULL;
1261 int result = 0;
1262
1263 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1264 result = -1;
1265
1266 else if (arg != NULL) {
1267 if (PyObject_HasAttrString(arg, "keys"))
1268 result = PyDict_Merge(self, arg, 1);
1269 else
1270 result = PyDict_MergeFromSeq2(self, arg, 1);
1271 }
1272 if (result == 0 && kwds != NULL)
1273 result = PyDict_Merge(self, kwds, 1);
1274 return result;
1275}
1276
1277static PyObject *
1278dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1279{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001280 if (dict_update_common(self, args, kwds, "update") != -1)
1281 Py_RETURN_NONE;
1282 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001283}
1284
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001285/* Update unconditionally replaces existing items.
1286 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001287 otherwise it leaves existing items unchanged.
1288
1289 PyDict_{Update,Merge} update/merge from a mapping object.
1290
Tim Petersf582b822001-12-11 18:51:08 +00001291 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001292 producing iterable objects of length 2.
1293*/
1294
Tim Petersf582b822001-12-11 18:51:08 +00001295int
Tim Peters1fc240e2001-10-26 05:06:50 +00001296PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1297{
1298 PyObject *it; /* iter(seq2) */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001299 Py_ssize_t i; /* index into seq2 of current element */
Tim Peters1fc240e2001-10-26 05:06:50 +00001300 PyObject *item; /* seq2[i] */
1301 PyObject *fast; /* item as a 2-tuple or 2-list */
1302
1303 assert(d != NULL);
1304 assert(PyDict_Check(d));
1305 assert(seq2 != NULL);
1306
1307 it = PyObject_GetIter(seq2);
1308 if (it == NULL)
1309 return -1;
1310
1311 for (i = 0; ; ++i) {
1312 PyObject *key, *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001313 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001314
1315 fast = NULL;
1316 item = PyIter_Next(it);
1317 if (item == NULL) {
1318 if (PyErr_Occurred())
1319 goto Fail;
1320 break;
1321 }
1322
1323 /* Convert item to sequence, and verify length 2. */
1324 fast = PySequence_Fast(item, "");
1325 if (fast == NULL) {
1326 if (PyErr_ExceptionMatches(PyExc_TypeError))
1327 PyErr_Format(PyExc_TypeError,
1328 "cannot convert dictionary update "
Neal Norwitzd3881b02006-05-30 04:25:05 +00001329 "sequence element #%zd to a sequence",
Tim Peters1fc240e2001-10-26 05:06:50 +00001330 i);
1331 goto Fail;
1332 }
1333 n = PySequence_Fast_GET_SIZE(fast);
1334 if (n != 2) {
1335 PyErr_Format(PyExc_ValueError,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001336 "dictionary update sequence element #%zd "
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00001337 "has length %zd; 2 is required",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00001338 i, n);
Tim Peters1fc240e2001-10-26 05:06:50 +00001339 goto Fail;
1340 }
1341
1342 /* Update/merge with this (key, value) pair. */
1343 key = PySequence_Fast_GET_ITEM(fast, 0);
1344 value = PySequence_Fast_GET_ITEM(fast, 1);
1345 if (override || PyDict_GetItem(d, key) == NULL) {
1346 int status = PyDict_SetItem(d, key, value);
1347 if (status < 0)
1348 goto Fail;
1349 }
1350 Py_DECREF(fast);
1351 Py_DECREF(item);
1352 }
1353
1354 i = 0;
1355 goto Return;
1356Fail:
1357 Py_XDECREF(item);
1358 Py_XDECREF(fast);
1359 i = -1;
1360Return:
1361 Py_DECREF(it);
Neal Norwitzd3881b02006-05-30 04:25:05 +00001362 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001363}
1364
Tim Peters6d6c1a32001-08-02 04:15:00 +00001365int
1366PyDict_Update(PyObject *a, PyObject *b)
1367{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001368 return PyDict_Merge(a, b, 1);
1369}
1370
1371int
1372PyDict_Merge(PyObject *a, PyObject *b, int override)
1373{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001374 register PyDictObject *mp, *other;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001375 register Py_ssize_t i;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001376 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001377
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001378 /* We accept for the argument either a concrete dictionary object,
1379 * or an abstract "mapping" object. For the former, we can do
1380 * things quite efficiently. For the latter, we only require that
1381 * PyMapping_Keys() and PyObject_GetItem() be supported.
1382 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001383 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1384 PyErr_BadInternalCall();
1385 return -1;
1386 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001387 mp = (PyDictObject*)a;
Raymond Hettinger0922d712007-02-07 20:08:22 +00001388 if (PyDict_CheckExact(b)) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001389 other = (PyDictObject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001390 if (other == mp || other->ma_used == 0)
1391 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001392 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001393 if (mp->ma_used == 0)
1394 /* Since the target dict is empty, PyDict_GetItem()
1395 * always returns NULL. Setting override to 1
1396 * skips the unnecessary test.
1397 */
1398 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001399 /* Do one big resize at the start, rather than
1400 * incrementally resizing as we insert new items. Expect
1401 * that there will be no (or few) overlapping keys.
1402 */
1403 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001404 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001405 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001406 }
1407 for (i = 0; i <= other->ma_mask; i++) {
1408 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001409 if (entry->me_value != NULL &&
1410 (override ||
1411 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001412 Py_INCREF(entry->me_key);
1413 Py_INCREF(entry->me_value);
Armin Rigo35f6d362006-06-01 13:19:12 +00001414 if (insertdict(mp, entry->me_key,
1415 (long)entry->me_hash,
1416 entry->me_value) != 0)
1417 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001418 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001419 }
1420 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001421 else {
1422 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001423 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001424 PyObject *iter;
1425 PyObject *key, *value;
1426 int status;
1427
1428 if (keys == NULL)
1429 /* Docstring says this is equivalent to E.keys() so
1430 * if E doesn't have a .keys() method we want
1431 * AttributeError to percolate up. Might as well
1432 * do the same for any other error.
1433 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001434 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001435
1436 iter = PyObject_GetIter(keys);
1437 Py_DECREF(keys);
1438 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001439 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001440
1441 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001442 if (!override && PyDict_GetItem(a, key) != NULL) {
1443 Py_DECREF(key);
1444 continue;
1445 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001446 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001447 if (value == NULL) {
1448 Py_DECREF(iter);
1449 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001450 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001451 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001452 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001453 Py_DECREF(key);
1454 Py_DECREF(value);
1455 if (status < 0) {
1456 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001457 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001458 }
1459 }
1460 Py_DECREF(iter);
1461 if (PyErr_Occurred())
1462 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001463 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001464 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001465 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001466}
1467
1468static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001469dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001470{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001471 return PyDict_Copy((PyObject*)mp);
1472}
1473
1474PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001475PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001476{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001477 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001478
1479 if (o == NULL || !PyDict_Check(o)) {
1480 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001481 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001482 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001483 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001484 if (copy == NULL)
1485 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001486 if (PyDict_Merge(copy, o, 1) == 0)
1487 return copy;
1488 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001489 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001490}
1491
Martin v. Löwis18e16552006-02-15 17:27:45 +00001492Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001493PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001494{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001495 if (mp == NULL || !PyDict_Check(mp)) {
1496 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001497 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001498 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001499 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001500}
1501
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001503PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001504{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001505 if (mp == NULL || !PyDict_Check(mp)) {
1506 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001507 return NULL;
1508 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001509 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001510}
1511
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001512PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001513PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001514{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001515 if (mp == NULL || !PyDict_Check(mp)) {
1516 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001517 return NULL;
1518 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001519 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001520}
1521
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001522PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001523PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001524{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001525 if (mp == NULL || !PyDict_Check(mp)) {
1526 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001527 return NULL;
1528 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001529 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001530}
1531
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001532/* Subroutine which returns the smallest key in a for which b's value
1533 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001534 pval argument. Both are NULL if no key in a is found for which b's status
1535 differs. The refcounts on (and only on) non-NULL *pval and function return
1536 values must be decremented by the caller (characterize() increments them
1537 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1538 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001539
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001540static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001541characterize(PyDictObject *a, PyDictObject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001542{
Tim Peters95bf9392001-05-10 08:32:44 +00001543 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1544 PyObject *aval = NULL; /* a[akey] */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001545 Py_ssize_t i;
1546 int cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001547
Tim Petersafb6ae82001-06-04 21:00:21 +00001548 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001549 PyObject *thiskey, *thisaval, *thisbval;
1550 if (a->ma_table[i].me_value == NULL)
1551 continue;
1552 thiskey = a->ma_table[i].me_key;
1553 Py_INCREF(thiskey); /* keep alive across compares */
1554 if (akey != NULL) {
1555 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1556 if (cmp < 0) {
1557 Py_DECREF(thiskey);
1558 goto Fail;
1559 }
1560 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001561 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001562 a->ma_table[i].me_value == NULL)
1563 {
1564 /* Not the *smallest* a key; or maybe it is
1565 * but the compare shrunk the dict so we can't
1566 * find its associated value anymore; or
1567 * maybe it is but the compare deleted the
1568 * a[thiskey] entry.
Neal Norwitzd3881b02006-05-30 04:25:05 +00001569 */
Tim Peters95bf9392001-05-10 08:32:44 +00001570 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001571 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001572 }
Tim Peters95bf9392001-05-10 08:32:44 +00001573 }
1574
1575 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1576 thisaval = a->ma_table[i].me_value;
1577 assert(thisaval);
1578 Py_INCREF(thisaval); /* keep alive */
1579 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1580 if (thisbval == NULL)
1581 cmp = 0;
1582 else {
1583 /* both dicts have thiskey: same values? */
1584 cmp = PyObject_RichCompareBool(
1585 thisaval, thisbval, Py_EQ);
1586 if (cmp < 0) {
1587 Py_DECREF(thiskey);
1588 Py_DECREF(thisaval);
1589 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001590 }
1591 }
Tim Peters95bf9392001-05-10 08:32:44 +00001592 if (cmp == 0) {
1593 /* New winner. */
1594 Py_XDECREF(akey);
1595 Py_XDECREF(aval);
1596 akey = thiskey;
1597 aval = thisaval;
1598 }
1599 else {
1600 Py_DECREF(thiskey);
1601 Py_DECREF(thisaval);
1602 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001603 }
Tim Peters95bf9392001-05-10 08:32:44 +00001604 *pval = aval;
1605 return akey;
1606
1607Fail:
1608 Py_XDECREF(akey);
1609 Py_XDECREF(aval);
1610 *pval = NULL;
1611 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001612}
1613
1614static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001615dict_compare(PyDictObject *a, PyDictObject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001616{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001617 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001618 int res;
1619
1620 /* Compare lengths first */
1621 if (a->ma_used < b->ma_used)
1622 return -1; /* a is shorter */
1623 else if (a->ma_used > b->ma_used)
1624 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001625
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001626 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001627 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001628 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001629 if (adiff == NULL) {
1630 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001631 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001632 * must be equal.
1633 */
1634 res = PyErr_Occurred() ? -1 : 0;
1635 goto Finished;
1636 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001637 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001638 if (bdiff == NULL && PyErr_Occurred()) {
1639 assert(!bval);
1640 res = -1;
1641 goto Finished;
1642 }
1643 res = 0;
1644 if (bdiff) {
1645 /* bdiff == NULL "should be" impossible now, but perhaps
1646 * the last comparison done by the characterize() on a had
1647 * the side effect of making the dicts equal!
1648 */
1649 res = PyObject_Compare(adiff, bdiff);
1650 }
1651 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001652 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001653
1654Finished:
1655 Py_XDECREF(adiff);
1656 Py_XDECREF(bdiff);
1657 Py_XDECREF(aval);
1658 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001659 return res;
1660}
1661
Tim Peterse63415e2001-05-08 04:38:29 +00001662/* Return 1 if dicts equal, 0 if not, -1 if error.
1663 * Gets out as soon as any difference is detected.
1664 * Uses only Py_EQ comparison.
1665 */
1666static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001667dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001668{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001669 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001670
1671 if (a->ma_used != b->ma_used)
1672 /* can't be equal if # of entries differ */
1673 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001674
Tim Peterse63415e2001-05-08 04:38:29 +00001675 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001676 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001677 PyObject *aval = a->ma_table[i].me_value;
1678 if (aval != NULL) {
1679 int cmp;
1680 PyObject *bval;
1681 PyObject *key = a->ma_table[i].me_key;
1682 /* temporarily bump aval's refcount to ensure it stays
1683 alive until we're done with it */
1684 Py_INCREF(aval);
Neal Norwitza22975f2006-09-05 02:24:03 +00001685 /* ditto for key */
1686 Py_INCREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001687 bval = PyDict_GetItem((PyObject *)b, key);
Neal Norwitza22975f2006-09-05 02:24:03 +00001688 Py_DECREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001689 if (bval == NULL) {
1690 Py_DECREF(aval);
1691 return 0;
1692 }
1693 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1694 Py_DECREF(aval);
1695 if (cmp <= 0) /* error or not equal */
1696 return cmp;
1697 }
1698 }
1699 return 1;
1700 }
1701
1702static PyObject *
1703dict_richcompare(PyObject *v, PyObject *w, int op)
1704{
1705 int cmp;
1706 PyObject *res;
1707
1708 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1709 res = Py_NotImplemented;
1710 }
1711 else if (op == Py_EQ || op == Py_NE) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001712 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
Tim Peterse63415e2001-05-08 04:38:29 +00001713 if (cmp < 0)
1714 return NULL;
1715 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1716 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001717 else
1718 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001719 Py_INCREF(res);
1720 return res;
1721 }
1722
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001723static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001724dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001725{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001726 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001727 PyDictEntry *ep;
Tim Petersd770ebd2006-06-01 15:50:44 +00001728
Tim Peters0ab085c2001-09-14 00:25:33 +00001729 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001730 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001731 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001732 if (hash == -1)
1733 return NULL;
1734 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001735 ep = (mp->ma_lookup)(mp, key, hash);
1736 if (ep == NULL)
1737 return NULL;
Tim Petersd770ebd2006-06-01 15:50:44 +00001738 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001739}
1740
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001741static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001742dict_has_key(register PyDictObject *mp, PyObject *key)
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +00001743{
1744 if (Py_Py3kWarningFlag &&
1745 PyErr_Warn(PyExc_DeprecationWarning,
1746 "dict.has_key() not supported in 3.x") < 0)
1747 return NULL;
1748 return dict_contains(mp, key);
1749}
1750
1751static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001752dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001753{
1754 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001755 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001756 PyObject *val = NULL;
1757 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001758 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001759
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001760 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001761 return NULL;
1762
Tim Peters0ab085c2001-09-14 00:25:33 +00001763 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001764 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001765 hash = PyObject_Hash(key);
1766 if (hash == -1)
1767 return NULL;
1768 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001769 ep = (mp->ma_lookup)(mp, key, hash);
1770 if (ep == NULL)
1771 return NULL;
1772 val = ep->me_value;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001773 if (val == NULL)
1774 val = failobj;
1775 Py_INCREF(val);
1776 return val;
1777}
1778
1779
1780static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001781dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001782{
1783 PyObject *key;
1784 PyObject *failobj = Py_None;
1785 PyObject *val = NULL;
1786 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001787 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001788
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001789 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001790 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001791
Tim Peters0ab085c2001-09-14 00:25:33 +00001792 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001793 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001794 hash = PyObject_Hash(key);
1795 if (hash == -1)
1796 return NULL;
1797 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001798 ep = (mp->ma_lookup)(mp, key, hash);
1799 if (ep == NULL)
1800 return NULL;
1801 val = ep->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001802 if (val == NULL) {
1803 val = failobj;
1804 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1805 val = NULL;
1806 }
1807 Py_XINCREF(val);
1808 return val;
1809}
1810
1811
1812static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001813dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001814{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001815 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001816 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001817}
1818
Guido van Rossumba6ab842000-12-12 22:02:18 +00001819static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001820dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001821{
1822 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001823 PyDictEntry *ep;
Guido van Rossume027d982002-04-12 15:11:59 +00001824 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001825 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001826
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001827 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1828 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001829 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001830 if (deflt) {
1831 Py_INCREF(deflt);
1832 return deflt;
1833 }
Guido van Rossume027d982002-04-12 15:11:59 +00001834 PyErr_SetString(PyExc_KeyError,
1835 "pop(): dictionary is empty");
1836 return NULL;
1837 }
1838 if (!PyString_CheckExact(key) ||
1839 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1840 hash = PyObject_Hash(key);
1841 if (hash == -1)
1842 return NULL;
1843 }
1844 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +00001845 if (ep == NULL)
1846 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001847 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001848 if (deflt) {
1849 Py_INCREF(deflt);
1850 return deflt;
1851 }
Georg Brandlb9f4ad32006-10-29 18:31:42 +00001852 set_key_error(key);
Guido van Rossume027d982002-04-12 15:11:59 +00001853 return NULL;
1854 }
1855 old_key = ep->me_key;
1856 Py_INCREF(dummy);
1857 ep->me_key = dummy;
1858 old_value = ep->me_value;
1859 ep->me_value = NULL;
1860 mp->ma_used--;
1861 Py_DECREF(old_key);
1862 return old_value;
1863}
1864
1865static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001866dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001867{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001868 Py_ssize_t i = 0;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001869 PyDictEntry *ep;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001870 PyObject *res;
1871
Tim Petersf4b33f62001-06-02 05:42:29 +00001872 /* Allocate the result tuple before checking the size. Believe it
1873 * or not, this allocation could trigger a garbage collection which
1874 * could empty the dict, so if we checked the size first and that
1875 * happened, the result would be an infinite loop (searching for an
1876 * entry that no longer exists). Note that the usual popitem()
1877 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Tim Peters9b10f7e2006-05-30 04:16:25 +00001878 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00001879 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001880 */
1881 res = PyTuple_New(2);
1882 if (res == NULL)
1883 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001884 if (mp->ma_used == 0) {
1885 Py_DECREF(res);
1886 PyErr_SetString(PyExc_KeyError,
1887 "popitem(): dictionary is empty");
1888 return NULL;
1889 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001890 /* Set ep to "the first" dict entry with a value. We abuse the hash
1891 * field of slot 0 to hold a search finger:
1892 * If slot 0 has a value, use slot 0.
1893 * Else slot 0 is being used to hold a search finger,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001894 * and we use its hash value as the first index to look.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001895 */
1896 ep = &mp->ma_table[0];
1897 if (ep->me_value == NULL) {
Tim Peters9b10f7e2006-05-30 04:16:25 +00001898 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001899 /* The hash field may be a real hash value, or it may be a
1900 * legit search finger, or it may be a once-legit search
1901 * finger that's out of bounds now because it wrapped around
1902 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001903 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001904 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001905 i = 1; /* skip slot 0 */
1906 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1907 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001908 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001909 i = 1;
1910 }
1911 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001912 PyTuple_SET_ITEM(res, 0, ep->me_key);
1913 PyTuple_SET_ITEM(res, 1, ep->me_value);
1914 Py_INCREF(dummy);
1915 ep->me_key = dummy;
1916 ep->me_value = NULL;
1917 mp->ma_used--;
1918 assert(mp->ma_table[0].me_value == NULL);
1919 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001920 return res;
1921}
1922
Jeremy Hylton8caad492000-06-23 14:18:11 +00001923static int
1924dict_traverse(PyObject *op, visitproc visit, void *arg)
1925{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001926 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001927 PyObject *pk;
1928 PyObject *pv;
1929
1930 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Woutersc6e55062006-04-15 21:47:09 +00001931 Py_VISIT(pk);
1932 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00001933 }
1934 return 0;
1935}
1936
1937static int
1938dict_tp_clear(PyObject *op)
1939{
1940 PyDict_Clear(op);
1941 return 0;
1942}
1943
Tim Petersf7f88b12000-12-13 23:18:45 +00001944
Raymond Hettinger019a1482004-03-18 02:41:19 +00001945extern PyTypeObject PyDictIterKey_Type; /* Forward */
1946extern PyTypeObject PyDictIterValue_Type; /* Forward */
1947extern PyTypeObject PyDictIterItem_Type; /* Forward */
Brett Cannon77ae87c2007-10-10 00:07:50 +00001948static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001949
1950static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001951dict_iterkeys(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001952{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001953 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001954}
1955
1956static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001957dict_itervalues(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001958{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001959 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001960}
1961
1962static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001963dict_iteritems(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001964{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001965 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001966}
1967
1968
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001969PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00001970"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00001971
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001972PyDoc_STRVAR(contains__doc__,
1973"D.__contains__(k) -> True if D has a key k, else False");
1974
1975PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1976
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001977PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001978"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001979
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001980PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001981"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 +00001982
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001983PyDoc_STRVAR(pop__doc__,
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001984"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
1985If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001986
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001987PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001988"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000019892-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00001990
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001991PyDoc_STRVAR(keys__doc__,
1992"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00001993
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001994PyDoc_STRVAR(items__doc__,
1995"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00001996
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001997PyDoc_STRVAR(values__doc__,
1998"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00001999
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002000PyDoc_STRVAR(update__doc__,
Walter Dörwaldd70ad8a2004-05-28 20:59:21 +00002001"D.update(E, **F) -> None. Update D from E and F: for k in E: D[k] = E[k]\n\
2002(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 +00002003
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002004PyDoc_STRVAR(fromkeys__doc__,
2005"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
2006v defaults to None.");
2007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002008PyDoc_STRVAR(clear__doc__,
2009"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002010
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002011PyDoc_STRVAR(copy__doc__,
2012"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002013
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002014PyDoc_STRVAR(iterkeys__doc__,
2015"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002016
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002017PyDoc_STRVAR(itervalues__doc__,
2018"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002019
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002020PyDoc_STRVAR(iteritems__doc__,
2021"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002022
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002023static PyMethodDef mapp_methods[] = {
Neal Norwitzc7926292007-05-23 06:57:35 +00002024 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002025 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00002026 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002027 getitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002028 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00002029 has_key__doc__},
2030 {"get", (PyCFunction)dict_get, METH_VARARGS,
2031 get__doc__},
2032 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2033 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002034 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00002035 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002036 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002037 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002038 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002039 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002040 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002041 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002042 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002043 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002044 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002045 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002046 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2047 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002048 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002049 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002050 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002051 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002052 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002053 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002054 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002055 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002056 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002057 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00002058 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002059};
2060
Tim Petersd770ebd2006-06-01 15:50:44 +00002061/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002062int
2063PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002064{
2065 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002066 PyDictObject *mp = (PyDictObject *)op;
2067 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002068
Tim Peters0ab085c2001-09-14 00:25:33 +00002069 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00002070 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002071 hash = PyObject_Hash(key);
2072 if (hash == -1)
2073 return -1;
2074 }
Armin Rigo35f6d362006-06-01 13:19:12 +00002075 ep = (mp->ma_lookup)(mp, key, hash);
Tim Petersd770ebd2006-06-01 15:50:44 +00002076 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002077}
2078
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00002079/* Internal version of PyDict_Contains used when the hash value is already known */
2080int
2081_PyDict_Contains(PyObject *op, PyObject *key, long hash)
2082{
Brett Cannon77ae87c2007-10-10 00:07:50 +00002083 PyDictObject *mp = (PyDictObject *)op;
2084 PyDictEntry *ep;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00002085
2086 ep = (mp->ma_lookup)(mp, key, hash);
2087 return ep == NULL ? -1 : (ep->me_value != NULL);
2088}
2089
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002090/* Hack to implement "key in dict" */
2091static PySequenceMethods dict_as_sequence = {
Georg Brandl347b3002006-03-30 11:57:00 +00002092 0, /* sq_length */
2093 0, /* sq_concat */
2094 0, /* sq_repeat */
2095 0, /* sq_item */
2096 0, /* sq_slice */
2097 0, /* sq_ass_item */
2098 0, /* sq_ass_slice */
2099 PyDict_Contains, /* sq_contains */
2100 0, /* sq_inplace_concat */
2101 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002102};
2103
Guido van Rossum09e563a2001-05-01 12:10:21 +00002104static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002105dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2106{
2107 PyObject *self;
2108
2109 assert(type != NULL && type->tp_alloc != NULL);
2110 self = type->tp_alloc(type, 0);
2111 if (self != NULL) {
2112 PyDictObject *d = (PyDictObject *)self;
2113 /* It's guaranteed that tp->alloc zeroed out the struct. */
2114 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2115 INIT_NONZERO_DICT_SLOTS(d);
2116 d->ma_lookup = lookdict_string;
2117#ifdef SHOW_CONVERSION_COUNTS
2118 ++created;
2119#endif
2120 }
2121 return self;
2122}
2123
Tim Peters25786c02001-09-02 08:22:48 +00002124static int
2125dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2126{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002127 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002128}
2129
Tim Peters6d6c1a32001-08-02 04:15:00 +00002130static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002131dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002132{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002133 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002134}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002135
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002136PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00002137"dict() -> new empty dictionary.\n"
2138"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00002139" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002140"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002141" d = {}\n"
2142" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002143" d[k] = v\n"
2144"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2145" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002146
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002147PyTypeObject PyDict_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002148 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Petersa427a2b2001-10-29 22:25:45 +00002149 "dict",
Brett Cannon77ae87c2007-10-10 00:07:50 +00002150 sizeof(PyDictObject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002151 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00002152 (destructor)dict_dealloc, /* tp_dealloc */
2153 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002154 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00002155 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00002156 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00002157 (reprfunc)dict_repr, /* tp_repr */
2158 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002159 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00002160 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossum64c06e32007-11-22 00:55:51 +00002161 0, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00002162 0, /* tp_call */
2163 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002164 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00002165 0, /* tp_setattro */
2166 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002167 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00002168 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00002169 dictionary_doc, /* tp_doc */
Georg Brandl347b3002006-03-30 11:57:00 +00002170 dict_traverse, /* tp_traverse */
2171 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00002172 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002173 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00002174 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002175 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002176 mapp_methods, /* tp_methods */
2177 0, /* tp_members */
2178 0, /* tp_getset */
2179 0, /* tp_base */
2180 0, /* tp_dict */
2181 0, /* tp_descr_get */
2182 0, /* tp_descr_set */
2183 0, /* tp_dictoffset */
Georg Brandl347b3002006-03-30 11:57:00 +00002184 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002185 PyType_GenericAlloc, /* tp_alloc */
2186 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002187 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002188};
2189
Guido van Rossum3cca2451997-05-16 14:23:33 +00002190/* For backward compatibility with old dictionary interface */
2191
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002192PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002193PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002194{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002195 PyObject *kv, *rv;
2196 kv = PyString_FromString(key);
2197 if (kv == NULL)
2198 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002199 rv = PyDict_GetItem(v, kv);
2200 Py_DECREF(kv);
2201 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002202}
2203
2204int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002205PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002206{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002207 PyObject *kv;
2208 int err;
2209 kv = PyString_FromString(key);
2210 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002211 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00002212 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002213 err = PyDict_SetItem(v, kv, item);
2214 Py_DECREF(kv);
2215 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002216}
2217
2218int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002219PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002220{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002221 PyObject *kv;
2222 int err;
2223 kv = PyString_FromString(key);
2224 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002225 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002226 err = PyDict_DelItem(v, kv);
2227 Py_DECREF(kv);
2228 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002229}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002230
Raymond Hettinger019a1482004-03-18 02:41:19 +00002231/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002232
2233typedef struct {
2234 PyObject_HEAD
Brett Cannon77ae87c2007-10-10 00:07:50 +00002235 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002236 Py_ssize_t di_used;
2237 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002238 PyObject* di_result; /* reusable result tuple for iteritems */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002239 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002240} dictiterobject;
2241
2242static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002243dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002244{
2245 dictiterobject *di;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002246 di = PyObject_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002247 if (di == NULL)
2248 return NULL;
2249 Py_INCREF(dict);
2250 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002251 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002252 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002253 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002254 if (itertype == &PyDictIterItem_Type) {
2255 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2256 if (di->di_result == NULL) {
2257 Py_DECREF(di);
2258 return NULL;
2259 }
2260 }
2261 else
2262 di->di_result = NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002263 return (PyObject *)di;
2264}
2265
2266static void
2267dictiter_dealloc(dictiterobject *di)
2268{
Guido van Rossum2147df72002-07-16 20:30:22 +00002269 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002270 Py_XDECREF(di->di_result);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002271 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002272}
2273
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002274static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002275dictiter_len(dictiterobject *di)
2276{
Tim Peters9b10f7e2006-05-30 04:16:25 +00002277 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002278 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002279 len = di->len;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002280 return PyInt_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002281}
2282
Armin Rigof5b3e362006-02-11 21:32:43 +00002283PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002284
2285static PyMethodDef dictiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002286 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002287 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002288};
2289
Raymond Hettinger019a1482004-03-18 02:41:19 +00002290static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002291{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002292 PyObject *key;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002293 register Py_ssize_t i, mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002294 register PyDictEntry *ep;
2295 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002296
Raymond Hettinger019a1482004-03-18 02:41:19 +00002297 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002298 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002299 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002300
Raymond Hettinger019a1482004-03-18 02:41:19 +00002301 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002302 PyErr_SetString(PyExc_RuntimeError,
2303 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002304 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002305 return NULL;
2306 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002307
Raymond Hettinger019a1482004-03-18 02:41:19 +00002308 i = di->di_pos;
2309 if (i < 0)
2310 goto fail;
2311 ep = d->ma_table;
2312 mask = d->ma_mask;
2313 while (i <= mask && ep[i].me_value == NULL)
2314 i++;
2315 di->di_pos = i+1;
2316 if (i > mask)
2317 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002318 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002319 key = ep[i].me_key;
2320 Py_INCREF(key);
2321 return key;
2322
2323fail:
2324 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002325 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002326 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002327}
2328
Raymond Hettinger019a1482004-03-18 02:41:19 +00002329PyTypeObject PyDictIterKey_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002330 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002331 "dictionary-keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002332 sizeof(dictiterobject), /* tp_basicsize */
2333 0, /* tp_itemsize */
2334 /* methods */
2335 (destructor)dictiter_dealloc, /* tp_dealloc */
2336 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002337 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002338 0, /* tp_setattr */
2339 0, /* tp_compare */
2340 0, /* tp_repr */
2341 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002342 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002343 0, /* tp_as_mapping */
2344 0, /* tp_hash */
2345 0, /* tp_call */
2346 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002347 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002348 0, /* tp_setattro */
2349 0, /* tp_as_buffer */
2350 Py_TPFLAGS_DEFAULT, /* tp_flags */
2351 0, /* tp_doc */
2352 0, /* tp_traverse */
2353 0, /* tp_clear */
2354 0, /* tp_richcompare */
2355 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002356 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002357 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002358 dictiter_methods, /* tp_methods */
2359 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002360};
2361
2362static PyObject *dictiter_iternextvalue(dictiterobject *di)
2363{
2364 PyObject *value;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002365 register Py_ssize_t i, mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002366 register PyDictEntry *ep;
2367 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002368
2369 if (d == NULL)
2370 return NULL;
2371 assert (PyDict_Check(d));
2372
2373 if (di->di_used != d->ma_used) {
2374 PyErr_SetString(PyExc_RuntimeError,
2375 "dictionary changed size during iteration");
2376 di->di_used = -1; /* Make this state sticky */
2377 return NULL;
2378 }
2379
2380 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002381 mask = d->ma_mask;
2382 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002383 goto fail;
2384 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002385 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002386 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002387 if (i > mask)
2388 goto fail;
2389 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002390 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002391 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002392 Py_INCREF(value);
2393 return value;
2394
2395fail:
2396 Py_DECREF(d);
2397 di->di_dict = NULL;
2398 return NULL;
2399}
2400
2401PyTypeObject PyDictIterValue_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002402 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002403 "dictionary-valueiterator", /* tp_name */
2404 sizeof(dictiterobject), /* tp_basicsize */
2405 0, /* tp_itemsize */
2406 /* methods */
2407 (destructor)dictiter_dealloc, /* tp_dealloc */
2408 0, /* tp_print */
2409 0, /* tp_getattr */
2410 0, /* tp_setattr */
2411 0, /* tp_compare */
2412 0, /* tp_repr */
2413 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002414 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002415 0, /* tp_as_mapping */
2416 0, /* tp_hash */
2417 0, /* tp_call */
2418 0, /* tp_str */
2419 PyObject_GenericGetAttr, /* tp_getattro */
2420 0, /* tp_setattro */
2421 0, /* tp_as_buffer */
2422 Py_TPFLAGS_DEFAULT, /* tp_flags */
2423 0, /* tp_doc */
2424 0, /* tp_traverse */
2425 0, /* tp_clear */
2426 0, /* tp_richcompare */
2427 0, /* tp_weaklistoffset */
2428 PyObject_SelfIter, /* tp_iter */
2429 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002430 dictiter_methods, /* tp_methods */
2431 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002432};
2433
2434static PyObject *dictiter_iternextitem(dictiterobject *di)
2435{
2436 PyObject *key, *value, *result = di->di_result;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002437 register Py_ssize_t i, mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002438 register PyDictEntry *ep;
2439 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002440
2441 if (d == NULL)
2442 return NULL;
2443 assert (PyDict_Check(d));
2444
2445 if (di->di_used != d->ma_used) {
2446 PyErr_SetString(PyExc_RuntimeError,
2447 "dictionary changed size during iteration");
2448 di->di_used = -1; /* Make this state sticky */
2449 return NULL;
2450 }
2451
2452 i = di->di_pos;
2453 if (i < 0)
2454 goto fail;
2455 ep = d->ma_table;
2456 mask = d->ma_mask;
2457 while (i <= mask && ep[i].me_value == NULL)
2458 i++;
2459 di->di_pos = i+1;
2460 if (i > mask)
2461 goto fail;
2462
2463 if (result->ob_refcnt == 1) {
2464 Py_INCREF(result);
2465 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2466 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2467 } else {
2468 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002469 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002470 return NULL;
2471 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002472 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002473 key = ep[i].me_key;
2474 value = ep[i].me_value;
2475 Py_INCREF(key);
2476 Py_INCREF(value);
2477 PyTuple_SET_ITEM(result, 0, key);
2478 PyTuple_SET_ITEM(result, 1, value);
2479 return result;
2480
2481fail:
2482 Py_DECREF(d);
2483 di->di_dict = NULL;
2484 return NULL;
2485}
2486
2487PyTypeObject PyDictIterItem_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002488 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002489 "dictionary-itemiterator", /* tp_name */
2490 sizeof(dictiterobject), /* tp_basicsize */
2491 0, /* tp_itemsize */
2492 /* methods */
2493 (destructor)dictiter_dealloc, /* tp_dealloc */
2494 0, /* tp_print */
2495 0, /* tp_getattr */
2496 0, /* tp_setattr */
2497 0, /* tp_compare */
2498 0, /* tp_repr */
2499 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002500 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002501 0, /* tp_as_mapping */
2502 0, /* tp_hash */
2503 0, /* tp_call */
2504 0, /* tp_str */
2505 PyObject_GenericGetAttr, /* tp_getattro */
2506 0, /* tp_setattro */
2507 0, /* tp_as_buffer */
2508 Py_TPFLAGS_DEFAULT, /* tp_flags */
2509 0, /* tp_doc */
2510 0, /* tp_traverse */
2511 0, /* tp_clear */
2512 0, /* tp_richcompare */
2513 0, /* tp_weaklistoffset */
2514 PyObject_SelfIter, /* tp_iter */
2515 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002516 dictiter_methods, /* tp_methods */
2517 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002518};