blob: 1035e5fd5d6582002c9d05f27de7d60bb9b1b302 [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);
Christian Heimese93237d2007-12-19 02:37:44 +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;
Georg Brandlede3a322007-11-29 18:33:01 +0000273 Py_INCREF(startkey);
Tim Peters453163d2001-06-03 04:54:32 +0000274 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Georg Brandlede3a322007-11-29 18:33:01 +0000275 Py_DECREF(startkey);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000276 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000277 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000278 if (ep0 == mp->ma_table && ep->me_key == startkey) {
279 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000280 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000281 }
282 else {
283 /* The compare did major nasty stuff to the
284 * dict: start over.
285 * XXX A clever adversary could prevent this
286 * XXX from terminating.
287 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000288 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000289 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000290 }
291 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000292 }
Tim Peters15d49292001-05-27 07:39:22 +0000293
Tim Peters342c65e2001-05-13 06:43:53 +0000294 /* In the loop, me_key == dummy is by far (factor of 100s) the
295 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000296 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
297 i = (i << 2) + i + perturb + 1;
298 ep = &ep0[i & mask];
Armin Rigo35f6d362006-06-01 13:19:12 +0000299 if (ep->me_key == NULL)
300 return freeslot == NULL ? ep : freeslot;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000301 if (ep->me_key == key)
Armin Rigo35f6d362006-06-01 13:19:12 +0000302 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000303 if (ep->me_hash == hash && ep->me_key != dummy) {
Tim Peters453163d2001-06-03 04:54:32 +0000304 startkey = ep->me_key;
Georg Brandlede3a322007-11-29 18:33:01 +0000305 Py_INCREF(startkey);
Tim Peters453163d2001-06-03 04:54:32 +0000306 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Georg Brandlede3a322007-11-29 18:33:01 +0000307 Py_DECREF(startkey);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000308 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000309 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000310 if (ep0 == mp->ma_table && ep->me_key == startkey) {
311 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000312 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000313 }
314 else {
315 /* The compare did major nasty stuff to the
316 * dict: start over.
317 * XXX A clever adversary could prevent this
318 * XXX from terminating.
319 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000320 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000321 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000322 }
Tim Peters342c65e2001-05-13 06:43:53 +0000323 else if (ep->me_key == dummy && freeslot == NULL)
324 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000325 }
Neal Norwitza5ccda92006-10-28 21:16:54 +0000326 assert(0); /* NOT REACHED */
327 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000328}
329
330/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000331 * Hacked up version of lookdict which can assume keys are always strings;
Tim Petersd770ebd2006-06-01 15:50:44 +0000332 * this assumption allows testing for errors during PyObject_RichCompareBool()
333 * to be dropped; string-string comparisons never raise exceptions. This also
334 * means we don't need to go through PyObject_RichCompareBool(); we can always
335 * use _PyString_Eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000336 *
Tim Petersd770ebd2006-06-01 15:50:44 +0000337 * This is valuable because dicts with only string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000338 */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000339static PyDictEntry *
340lookdict_string(PyDictObject *mp, PyObject *key, register long hash)
Fred Drake1bff34a2000-08-31 19:31:38 +0000341{
Tim Petersd770ebd2006-06-01 15:50:44 +0000342 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000343 register size_t perturb;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000344 register PyDictEntry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000345 register size_t mask = (size_t)mp->ma_mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000346 PyDictEntry *ep0 = mp->ma_table;
347 register PyDictEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000348
Tim Peters0ab085c2001-09-14 00:25:33 +0000349 /* Make sure this function doesn't have to handle non-string keys,
350 including subclasses of str; e.g., one reason to subclass
351 strings is to override __eq__, and for speed we don't cater to
352 that here. */
353 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000354#ifdef SHOW_CONVERSION_COUNTS
355 ++converted;
356#endif
357 mp->ma_lookup = lookdict;
358 return lookdict(mp, key, hash);
359 }
Tim Peters2f228e72001-05-13 00:19:31 +0000360 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000361 ep = &ep0[i];
362 if (ep->me_key == NULL || ep->me_key == key)
363 return ep;
364 if (ep->me_key == dummy)
365 freeslot = ep;
366 else {
Tim Petersd770ebd2006-06-01 15:50:44 +0000367 if (ep->me_hash == hash && _PyString_Eq(ep->me_key, key))
Fred Drake1bff34a2000-08-31 19:31:38 +0000368 return ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000369 freeslot = NULL;
370 }
Tim Peters15d49292001-05-27 07:39:22 +0000371
Tim Peters342c65e2001-05-13 06:43:53 +0000372 /* In the loop, me_key == dummy is by far (factor of 100s) the
373 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000374 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
375 i = (i << 2) + i + perturb + 1;
376 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000377 if (ep->me_key == NULL)
378 return freeslot == NULL ? ep : freeslot;
379 if (ep->me_key == key
380 || (ep->me_hash == hash
381 && ep->me_key != dummy
Martin v. Löwiscd353062001-05-24 16:56:35 +0000382 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000383 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000384 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000385 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000386 }
Neal Norwitza5ccda92006-10-28 21:16:54 +0000387 assert(0); /* NOT REACHED */
388 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000389}
390
391/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000392Internal routine to insert a new item into the table.
393Used both by the internal resize routine and by the public insert routine.
394Eats a reference to key and one to value.
Tim Petersd770ebd2006-06-01 15:50:44 +0000395Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000396*/
Armin Rigo35f6d362006-06-01 13:19:12 +0000397static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000398insertdict(register PyDictObject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000399{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400 PyObject *old_value;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000401 register PyDictEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000402 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
403
404 assert(mp->ma_lookup != NULL);
405 ep = mp->ma_lookup(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000406 if (ep == NULL) {
407 Py_DECREF(key);
408 Py_DECREF(value);
409 return -1;
410 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000411 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000412 old_value = ep->me_value;
413 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 Py_DECREF(old_value); /* which **CAN** re-enter */
415 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000416 }
417 else {
418 if (ep->me_key == NULL)
419 mp->ma_fill++;
Raymond Hettinger07ead172005-02-05 23:42:57 +0000420 else {
421 assert(ep->me_key == dummy);
422 Py_DECREF(dummy);
423 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000424 ep->me_key = key;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000425 ep->me_hash = (Py_ssize_t)hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000426 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000427 mp->ma_used++;
428 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000429 return 0;
430}
431
432/*
433Internal routine used by dictresize() to insert an item which is
434known to be absent from the dict. This routine also assumes that
435the dict contains no deleted entries. Besides the performance benefit,
436using insertdict() in dictresize() is dangerous (SF bug #1456209).
Tim Petersd770ebd2006-06-01 15:50:44 +0000437Note that no refcounts are changed by this routine; if needed, the caller
438is responsible for incref'ing `key` and `value`.
Armin Rigo35f6d362006-06-01 13:19:12 +0000439*/
440static void
Brett Cannon77ae87c2007-10-10 00:07:50 +0000441insertdict_clean(register PyDictObject *mp, PyObject *key, long hash,
Armin Rigo35f6d362006-06-01 13:19:12 +0000442 PyObject *value)
443{
Tim Petersd770ebd2006-06-01 15:50:44 +0000444 register size_t i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000445 register size_t perturb;
Tim Petersd770ebd2006-06-01 15:50:44 +0000446 register size_t mask = (size_t)mp->ma_mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000447 PyDictEntry *ep0 = mp->ma_table;
448 register PyDictEntry *ep;
Armin Rigo35f6d362006-06-01 13:19:12 +0000449
450 i = hash & mask;
451 ep = &ep0[i];
452 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
453 i = (i << 2) + i + perturb + 1;
454 ep = &ep0[i & mask];
455 }
Tim Petersd770ebd2006-06-01 15:50:44 +0000456 assert(ep->me_value == NULL);
Armin Rigo35f6d362006-06-01 13:19:12 +0000457 mp->ma_fill++;
458 ep->me_key = key;
459 ep->me_hash = (Py_ssize_t)hash;
460 ep->me_value = value;
461 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000462}
463
464/*
465Restructure the table by allocating a new table and reinserting all
466items again. When entries have been deleted, the new table may
467actually be smaller than the old one.
468*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000469static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000470dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000471{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000472 Py_ssize_t newsize;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000473 PyDictEntry *oldtable, *newtable, *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000474 Py_ssize_t i;
Tim Peters0c6010b2001-05-23 23:33:57 +0000475 int is_oldtable_malloced;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000476 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000477
478 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000479
Tim Peterseb28ef22001-06-02 05:27:19 +0000480 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000481 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000482 newsize <= minused && newsize > 0;
483 newsize <<= 1)
484 ;
485 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000487 return -1;
488 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000489
490 /* Get space for a new table. */
491 oldtable = mp->ma_table;
492 assert(oldtable != NULL);
493 is_oldtable_malloced = oldtable != mp->ma_smalltable;
494
Tim Peters6d6c1a32001-08-02 04:15:00 +0000495 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000496 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000497 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000498 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000499 if (mp->ma_fill == mp->ma_used) {
500 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000501 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000502 }
503 /* We're not going to resize it, but rebuild the
504 table anyway to purge old dummy entries.
505 Subtle: This is *necessary* if fill==size,
506 as lookdict needs at least one virgin slot to
507 terminate failing searches. If fill < size, it's
508 merely desirable, as dummies slow searches. */
509 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000510 memcpy(small_copy, oldtable, sizeof(small_copy));
511 oldtable = small_copy;
512 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000513 }
514 else {
Brett Cannon77ae87c2007-10-10 00:07:50 +0000515 newtable = PyMem_NEW(PyDictEntry, newsize);
Tim Petersdea48ec2001-05-22 20:40:22 +0000516 if (newtable == NULL) {
517 PyErr_NoMemory();
518 return -1;
519 }
520 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000521
522 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000523 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000524 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000525 mp->ma_mask = newsize - 1;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000526 memset(newtable, 0, sizeof(PyDictEntry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000527 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000528 i = mp->ma_fill;
529 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000530
Tim Peters19283142001-05-17 22:25:34 +0000531 /* Copy the data over; this is refcount-neutral for active entries;
532 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000533 for (ep = oldtable; i > 0; ep++) {
534 if (ep->me_value != NULL) { /* active entry */
535 --i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000536 insertdict_clean(mp, ep->me_key, (long)ep->me_hash,
537 ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000538 }
Tim Peters19283142001-05-17 22:25:34 +0000539 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000540 --i;
Tim Peters19283142001-05-17 22:25:34 +0000541 assert(ep->me_key == dummy);
542 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000543 }
Tim Peters19283142001-05-17 22:25:34 +0000544 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000545 }
546
Tim Peters0c6010b2001-05-23 23:33:57 +0000547 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000548 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000549 return 0;
550}
551
Raymond Hettingerfd7ed402007-12-18 21:24:09 +0000552/* Create a new dictionary pre-sized to hold an estimated number of elements.
553 Underestimates are okay because the dictionary will resize as necessary.
554 Overestimates just mean the dictionary will be more sparse than usual.
555*/
556
557PyObject *
558_PyDict_NewPresized(Py_ssize_t minused)
559{
560 PyObject *op = PyDict_New();
561
562 if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
563 Py_DECREF(op);
564 return NULL;
565 }
566 return op;
567}
568
Tim Petersd770ebd2006-06-01 15:50:44 +0000569/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
570 * that may occur (originally dicts supported only string keys, and exceptions
571 * weren't possible). So, while the original intent was that a NULL return
Andrew M. Kuchling0067b5f2006-08-04 20:37:43 +0000572 * meant the key wasn't present, in reality it can mean that, or that an error
Tim Petersd770ebd2006-06-01 15:50:44 +0000573 * (suppressed) occurred while computing the key's hash, or that some error
574 * (suppressed) occurred when comparing keys in the dict's internal probe
575 * sequence. A nasty example of the latter is when a Python-coded comparison
576 * function hits a stack-depth error, which can cause this to return NULL
577 * even if the key is present.
578 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000580PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000581{
582 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000583 PyDictObject *mp = (PyDictObject *)op;
584 PyDictEntry *ep;
Armin Rigo35f6d362006-06-01 13:19:12 +0000585 PyThreadState *tstate;
Tim Petersd770ebd2006-06-01 15:50:44 +0000586 if (!PyDict_Check(op))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000587 return NULL;
Tim Peters0ab085c2001-09-14 00:25:33 +0000588 if (!PyString_CheckExact(key) ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000590 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000592 if (hash == -1) {
593 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000594 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000595 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000596 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000597
598 /* We can arrive here with a NULL tstate during initialization:
599 try running "python -Wi" for an example related to string
600 interning. Let's just hope that no exception occurs then... */
Armin Rigoacd0d6d2006-06-10 10:57:40 +0000601 tstate = _PyThreadState_Current;
Armin Rigo35f6d362006-06-01 13:19:12 +0000602 if (tstate != NULL && tstate->curexc_type != NULL) {
603 /* preserve the existing exception */
604 PyObject *err_type, *err_value, *err_tb;
605 PyErr_Fetch(&err_type, &err_value, &err_tb);
606 ep = (mp->ma_lookup)(mp, key, hash);
607 /* ignore errors */
608 PyErr_Restore(err_type, err_value, err_tb);
609 if (ep == NULL)
610 return NULL;
611 }
612 else {
613 ep = (mp->ma_lookup)(mp, key, hash);
614 if (ep == NULL) {
615 PyErr_Clear();
616 return NULL;
617 }
618 }
619 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000620}
621
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000622/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000623 * dictionary if it's merely replacing the value for an existing key.
624 * This means that it's safe to loop over a dictionary with PyDict_Next()
625 * and occasionally replace a value -- but you can't insert new keys or
626 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000627 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000628int
Tim Peters1f5871e2000-07-04 17:44:48 +0000629PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000630{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000631 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000632 register long hash;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000633 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000634
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 if (!PyDict_Check(op)) {
636 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000637 return -1;
638 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000639 assert(key);
640 assert(value);
Brett Cannon77ae87c2007-10-10 00:07:50 +0000641 mp = (PyDictObject *)op;
Tim Peters0ab085c2001-09-14 00:25:33 +0000642 if (PyString_CheckExact(key)) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000643 hash = ((PyStringObject *)key)->ob_shash;
644 if (hash == -1)
645 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000646 }
Tim Peters1f7df352002-03-29 03:29:08 +0000647 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000649 if (hash == -1)
650 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000651 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000652 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000653 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 Py_INCREF(value);
655 Py_INCREF(key);
Armin Rigo35f6d362006-06-01 13:19:12 +0000656 if (insertdict(mp, key, hash, value) != 0)
657 return -1;
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000658 /* If we added a key, we can safely resize. Otherwise just return!
659 * If fill >= 2/3 size, adjust size. Normally, this doubles or
660 * quaduples the size, but it's also possible for the dict to shrink
Tim Peters60b29962006-01-01 01:19:23 +0000661 * (if ma_fill is much larger than ma_used, meaning a lot of dict
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000662 * keys have been * deleted).
Tim Peters60b29962006-01-01 01:19:23 +0000663 *
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000664 * Quadrupling the size improves average dictionary sparseness
665 * (reducing collisions) at the cost of some memory and iteration
666 * speed (which loops over every possible entry). It also halves
Neal Norwitz80af59c2006-05-30 04:19:21 +0000667 * the number of expensive resize operations in a growing dictionary.
Tim Peters60b29962006-01-01 01:19:23 +0000668 *
669 * Very large dictionaries (over 50K items) use doubling instead.
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000670 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000671 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000672 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
673 return 0;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000674 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000675}
676
677int
Tim Peters1f5871e2000-07-04 17:44:48 +0000678PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000679{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000680 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000681 register long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000682 register PyDictEntry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000684
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685 if (!PyDict_Check(op)) {
686 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000687 return -1;
688 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000689 assert(key);
Tim Peters0ab085c2001-09-14 00:25:33 +0000690 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000691 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000693 if (hash == -1)
694 return -1;
695 }
Brett Cannon77ae87c2007-10-10 00:07:50 +0000696 mp = (PyDictObject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000697 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000698 if (ep == NULL)
699 return -1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000700 if (ep->me_value == NULL) {
Georg Brandlb9f4ad32006-10-29 18:31:42 +0000701 set_key_error(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000702 return -1;
703 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000704 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000706 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000707 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000708 ep->me_value = NULL;
709 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000710 Py_DECREF(old_value);
711 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000712 return 0;
713}
714
Guido van Rossum25831651993-05-19 14:50:45 +0000715void
Tim Peters1f5871e2000-07-04 17:44:48 +0000716PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000717{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000718 PyDictObject *mp;
719 PyDictEntry *ep, *table;
Tim Petersdea48ec2001-05-22 20:40:22 +0000720 int table_is_malloced;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000721 Py_ssize_t fill;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000722 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000723#ifdef Py_DEBUG
Tim Peters9b10f7e2006-05-30 04:16:25 +0000724 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000725#endif
726
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000728 return;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000729 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000730#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000731 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000732 i = 0;
733#endif
734
735 table = mp->ma_table;
736 assert(table != NULL);
737 table_is_malloced = table != mp->ma_smalltable;
738
739 /* This is delicate. During the process of clearing the dict,
740 * decrefs can cause the dict to mutate. To avoid fatal confusion
741 * (voice of experience), we have to make the dict empty before
742 * clearing the slots, and never refer to anything via mp->xxx while
743 * clearing.
744 */
745 fill = mp->ma_fill;
746 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000747 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000748
749 else if (fill > 0) {
750 /* It's a small table with something that needs to be cleared.
751 * Afraid the only safe way is to copy the dict entries into
752 * another small table first.
753 */
754 memcpy(small_copy, table, sizeof(small_copy));
755 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000756 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000757 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000758 /* else it's a small table that's already empty */
759
760 /* Now we can finally clear things. If C had refcounts, we could
761 * assert that the refcount on table is 1 now, i.e. that this function
762 * has unique access to it, so decref side-effects can't alter it.
763 */
764 for (ep = table; fill > 0; ++ep) {
765#ifdef Py_DEBUG
766 assert(i < n);
767 ++i;
768#endif
769 if (ep->me_key) {
770 --fill;
771 Py_DECREF(ep->me_key);
772 Py_XDECREF(ep->me_value);
773 }
774#ifdef Py_DEBUG
775 else
776 assert(ep->me_value == NULL);
777#endif
778 }
779
780 if (table_is_malloced)
781 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000782}
783
Tim Peters080c88b2003-02-15 03:01:11 +0000784/*
785 * Iterate over a dict. Use like so:
786 *
Tim Peters9b10f7e2006-05-30 04:16:25 +0000787 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000788 * PyObject *key, *value;
789 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000790 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000791 * Refer to borrowed references in key and value.
792 * }
793 *
794 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000795 * mutates the dict. One exception: it is safe if the loop merely changes
796 * the values associated with the keys (but doesn't insert new keys or
797 * delete keys), via PyDict_SetItem().
798 */
Guido van Rossum25831651993-05-19 14:50:45 +0000799int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000800PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000801{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000802 register Py_ssize_t i;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000803 register Py_ssize_t mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000804 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000805
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000807 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000808 i = *ppos;
809 if (i < 0)
810 return 0;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000811 ep = ((PyDictObject *)op)->ma_table;
812 mask = ((PyDictObject *)op)->ma_mask;
Raymond Hettinger43442782004-03-17 21:55:03 +0000813 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000814 i++;
815 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000816 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000817 return 0;
818 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000819 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000820 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000821 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000822 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000823}
824
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000825/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
826int
827_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, long *phash)
828{
829 register Py_ssize_t i;
830 register Py_ssize_t mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000831 register PyDictEntry *ep;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000832
833 if (!PyDict_Check(op))
834 return 0;
835 i = *ppos;
836 if (i < 0)
837 return 0;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000838 ep = ((PyDictObject *)op)->ma_table;
839 mask = ((PyDictObject *)op)->ma_mask;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000840 while (i <= mask && ep[i].me_value == NULL)
841 i++;
842 *ppos = i+1;
843 if (i > mask)
844 return 0;
845 *phash = (long)(ep[i].me_hash);
846 if (pkey)
847 *pkey = ep[i].me_key;
848 if (pvalue)
849 *pvalue = ep[i].me_value;
850 return 1;
851}
852
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000853/* Methods */
854
855static void
Brett Cannon77ae87c2007-10-10 00:07:50 +0000856dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000857{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000858 register PyDictEntry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000859 Py_ssize_t fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000860 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000861 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000862 for (ep = mp->ma_table; fill > 0; ep++) {
863 if (ep->me_key) {
864 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000866 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000867 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000868 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000869 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000870 PyMem_DEL(mp->ma_table);
Christian Heimese93237d2007-12-19 02:37:44 +0000871 if (num_free_dicts < MAXFREEDICTS && Py_TYPE(mp) == &PyDict_Type)
Raymond Hettinger43442782004-03-17 21:55:03 +0000872 free_dicts[num_free_dicts++] = mp;
Tim Peters60b29962006-01-01 01:19:23 +0000873 else
Christian Heimese93237d2007-12-19 02:37:44 +0000874 Py_TYPE(mp)->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000875 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000876}
877
878static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000879dict_print(register PyDictObject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000880{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000881 register Py_ssize_t i;
882 register Py_ssize_t any;
Tim Peters33f4a6a2006-05-30 05:23:59 +0000883 int status;
Guido van Rossum255443b1998-04-10 22:47:14 +0000884
Tim Peters33f4a6a2006-05-30 05:23:59 +0000885 status = Py_ReprEnter((PyObject*)mp);
886 if (status != 0) {
887 if (status < 0)
888 return status;
Brett Cannon01531592007-09-17 03:28:34 +0000889 Py_BEGIN_ALLOW_THREADS
Guido van Rossum255443b1998-04-10 22:47:14 +0000890 fprintf(fp, "{...}");
Brett Cannon01531592007-09-17 03:28:34 +0000891 Py_END_ALLOW_THREADS
Guido van Rossum255443b1998-04-10 22:47:14 +0000892 return 0;
893 }
894
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
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000898 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000899 for (i = 0; i <= mp->ma_mask; i++) {
Brett Cannon77ae87c2007-10-10 00:07:50 +0000900 PyDictEntry *ep = mp->ma_table + i;
Tim Peters23cf6be2001-06-02 08:02:56 +0000901 PyObject *pvalue = ep->me_value;
902 if (pvalue != NULL) {
903 /* Prevent PyObject_Repr from deleting value during
904 key format */
905 Py_INCREF(pvalue);
Brett Cannon01531592007-09-17 03:28:34 +0000906 if (any++ > 0) {
907 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000908 fprintf(fp, ", ");
Brett Cannon01531592007-09-17 03:28:34 +0000909 Py_END_ALLOW_THREADS
910 }
Guido van Rossum255443b1998-04-10 22:47:14 +0000911 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000912 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000913 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000914 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000915 }
Brett Cannon01531592007-09-17 03:28:34 +0000916 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000917 fprintf(fp, ": ");
Brett Cannon01531592007-09-17 03:28:34 +0000918 Py_END_ALLOW_THREADS
Tim Peters19b77cf2001-06-02 08:27:39 +0000919 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000920 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000921 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000922 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000923 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000924 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000925 }
926 }
Brett Cannon01531592007-09-17 03:28:34 +0000927 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000928 fprintf(fp, "}");
Brett Cannon01531592007-09-17 03:28:34 +0000929 Py_END_ALLOW_THREADS
Guido van Rossum255443b1998-04-10 22:47:14 +0000930 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000931 return 0;
932}
933
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000934static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +0000935dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000936{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000937 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000938 PyObject *s, *temp, *colon = NULL;
939 PyObject *pieces = NULL, *result = NULL;
940 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +0000941
Tim Petersa7259592001-06-16 05:11:17 +0000942 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +0000943 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000944 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +0000945 }
946
Tim Petersa7259592001-06-16 05:11:17 +0000947 if (mp->ma_used == 0) {
948 result = PyString_FromString("{}");
949 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000950 }
Tim Petersa7259592001-06-16 05:11:17 +0000951
952 pieces = PyList_New(0);
953 if (pieces == NULL)
954 goto Done;
955
956 colon = PyString_FromString(": ");
957 if (colon == NULL)
958 goto Done;
959
960 /* Do repr() on each key+value pair, and insert ": " between them.
961 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +0000962 i = 0;
963 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +0000964 int status;
965 /* Prevent repr from deleting value during key format. */
966 Py_INCREF(value);
967 s = PyObject_Repr(key);
968 PyString_Concat(&s, colon);
969 PyString_ConcatAndDel(&s, PyObject_Repr(value));
970 Py_DECREF(value);
971 if (s == NULL)
972 goto Done;
973 status = PyList_Append(pieces, s);
974 Py_DECREF(s); /* append created a new ref */
975 if (status < 0)
976 goto Done;
977 }
978
979 /* Add "{}" decorations to the first and last items. */
980 assert(PyList_GET_SIZE(pieces) > 0);
981 s = PyString_FromString("{");
982 if (s == NULL)
983 goto Done;
984 temp = PyList_GET_ITEM(pieces, 0);
985 PyString_ConcatAndDel(&s, temp);
986 PyList_SET_ITEM(pieces, 0, s);
987 if (s == NULL)
988 goto Done;
989
990 s = PyString_FromString("}");
991 if (s == NULL)
992 goto Done;
993 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
994 PyString_ConcatAndDel(&temp, s);
995 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
996 if (temp == NULL)
997 goto Done;
998
999 /* Paste them all together with ", " between. */
1000 s = PyString_FromString(", ");
1001 if (s == NULL)
1002 goto Done;
1003 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +00001004 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001005
1006Done:
1007 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001008 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +00001009 Py_ReprLeave((PyObject *)mp);
1010 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001011}
1012
Martin v. Löwis18e16552006-02-15 17:27:45 +00001013static Py_ssize_t
Brett Cannon77ae87c2007-10-10 00:07:50 +00001014dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001015{
1016 return mp->ma_used;
1017}
1018
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001019static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001020dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001021{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001023 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001024 PyDictEntry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +00001025 assert(mp->ma_table != NULL);
Tim Peters0ab085c2001-09-14 00:25:33 +00001026 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001027 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001029 if (hash == -1)
1030 return NULL;
1031 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001032 ep = (mp->ma_lookup)(mp, key, hash);
1033 if (ep == NULL)
1034 return NULL;
1035 v = ep->me_value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001036 if (v == NULL) {
1037 if (!PyDict_CheckExact(mp)) {
1038 /* Look up __missing__ method if we're a subclass. */
Guido van Rossum4b92a822006-02-25 23:32:30 +00001039 PyObject *missing;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001040 static PyObject *missing_str = NULL;
1041 if (missing_str == NULL)
Tim Peters9b10f7e2006-05-30 04:16:25 +00001042 missing_str =
Guido van Rossum1968ad32006-02-25 22:38:04 +00001043 PyString_InternFromString("__missing__");
Christian Heimese93237d2007-12-19 02:37:44 +00001044 missing = _PyType_Lookup(Py_TYPE(mp), missing_str);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001045 if (missing != NULL)
1046 return PyObject_CallFunctionObjArgs(missing,
1047 (PyObject *)mp, key, NULL);
1048 }
Georg Brandlb9f4ad32006-10-29 18:31:42 +00001049 set_key_error(key);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001050 return NULL;
1051 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001052 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001054 return v;
1055}
1056
1057static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001058dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001059{
1060 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001062 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001063 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001064}
1065
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001066static PyMappingMethods dict_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001067 (lenfunc)dict_length, /*mp_length*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001068 (binaryfunc)dict_subscript, /*mp_subscript*/
1069 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001070};
1071
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001072static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001073dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001074{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001076 register Py_ssize_t i, j;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001077 PyDictEntry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001078 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001079
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001080 again:
1081 n = mp->ma_used;
1082 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001083 if (v == NULL)
1084 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001085 if (n != mp->ma_used) {
1086 /* Durnit. The allocations caused the dict to resize.
1087 * Just start over, this shouldn't normally happen.
1088 */
1089 Py_DECREF(v);
1090 goto again;
1091 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001092 ep = mp->ma_table;
1093 mask = mp->ma_mask;
1094 for (i = 0, j = 0; i <= mask; i++) {
1095 if (ep[i].me_value != NULL) {
1096 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001097 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001098 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001099 j++;
1100 }
1101 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001102 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001103 return v;
1104}
1105
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001106static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001107dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001108{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001110 register Py_ssize_t i, j;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001111 PyDictEntry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001112 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001113
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001114 again:
1115 n = mp->ma_used;
1116 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001117 if (v == NULL)
1118 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001119 if (n != mp->ma_used) {
1120 /* Durnit. The allocations caused the dict to resize.
1121 * Just start over, this shouldn't normally happen.
1122 */
1123 Py_DECREF(v);
1124 goto again;
1125 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001126 ep = mp->ma_table;
1127 mask = mp->ma_mask;
1128 for (i = 0, j = 0; i <= mask; i++) {
1129 if (ep[i].me_value != NULL) {
1130 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001131 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001132 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001133 j++;
1134 }
1135 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001136 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001137 return v;
1138}
1139
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001141dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001142{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001144 register Py_ssize_t i, j, n;
1145 Py_ssize_t mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001146 PyObject *item, *key, *value;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001147 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001148
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001149 /* Preallocate the list of tuples, to avoid allocations during
1150 * the loop over the items, which could trigger GC, which
1151 * could resize the dict. :-(
1152 */
1153 again:
1154 n = mp->ma_used;
1155 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001156 if (v == NULL)
1157 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001158 for (i = 0; i < n; i++) {
1159 item = PyTuple_New(2);
1160 if (item == NULL) {
1161 Py_DECREF(v);
1162 return NULL;
1163 }
1164 PyList_SET_ITEM(v, i, item);
1165 }
1166 if (n != mp->ma_used) {
1167 /* Durnit. The allocations caused the dict to resize.
1168 * Just start over, this shouldn't normally happen.
1169 */
1170 Py_DECREF(v);
1171 goto again;
1172 }
1173 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001174 ep = mp->ma_table;
1175 mask = mp->ma_mask;
1176 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001177 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001178 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001179 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001180 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001181 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001182 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001183 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001184 j++;
1185 }
1186 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001187 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001188 return v;
1189}
1190
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001191static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001192dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001193{
1194 PyObject *seq;
1195 PyObject *value = Py_None;
1196 PyObject *it; /* iter(seq) */
1197 PyObject *key;
1198 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001199 int status;
1200
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001201 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001202 return NULL;
1203
1204 d = PyObject_CallObject(cls, NULL);
1205 if (d == NULL)
1206 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001207
Raymond Hettingercdcf8872007-11-07 02:26:17 +00001208 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1209 PyDictObject *mp = (PyDictObject *)d;
1210 PyObject *oldvalue;
1211 Py_ssize_t pos = 0;
1212 PyObject *key;
1213 long hash;
1214
Raymond Hettinger34448792007-11-09 23:14:44 +00001215 if (dictresize(mp, PySet_GET_SIZE(seq)))
Raymond Hettingercdcf8872007-11-07 02:26:17 +00001216 return NULL;
1217
1218 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1219 Py_INCREF(key);
1220 Py_INCREF(value);
1221 if (insertdict(mp, key, hash, value))
1222 return NULL;
1223 }
1224 return d;
1225 }
1226
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001227 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001228 PyDictObject *mp = (PyDictObject *)d;
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001229 Py_ssize_t pos = 0;
1230 PyObject *key;
1231 long hash;
1232
1233 if (dictresize(mp, PySet_GET_SIZE(seq)))
1234 return NULL;
1235
1236 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1237 Py_INCREF(key);
Raymond Hettingere3146f52007-03-21 20:33:57 +00001238 Py_INCREF(value);
1239 if (insertdict(mp, key, hash, value))
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001240 return NULL;
1241 }
1242 return d;
1243 }
1244
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001245 it = PyObject_GetIter(seq);
1246 if (it == NULL){
1247 Py_DECREF(d);
1248 return NULL;
1249 }
1250
Raymond Hettinger34448792007-11-09 23:14:44 +00001251 if (PyDict_CheckExact(d)) {
1252 while ((key = PyIter_Next(it)) != NULL) {
1253 status = PyDict_SetItem(d, key, value);
1254 Py_DECREF(key);
1255 if (status < 0)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001256 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001257 }
Raymond Hettinger34448792007-11-09 23:14:44 +00001258 } else {
1259 while ((key = PyIter_Next(it)) != NULL) {
1260 status = PyObject_SetItem(d, key, value);
1261 Py_DECREF(key);
1262 if (status < 0)
1263 goto Fail;
1264 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001265 }
1266
Raymond Hettinger34448792007-11-09 23:14:44 +00001267 if (PyErr_Occurred())
1268 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001269 Py_DECREF(it);
1270 return d;
1271
1272Fail:
1273 Py_DECREF(it);
1274 Py_DECREF(d);
1275 return NULL;
1276}
1277
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001278static int
1279dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001280{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001281 PyObject *arg = NULL;
1282 int result = 0;
1283
1284 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1285 result = -1;
1286
1287 else if (arg != NULL) {
1288 if (PyObject_HasAttrString(arg, "keys"))
1289 result = PyDict_Merge(self, arg, 1);
1290 else
1291 result = PyDict_MergeFromSeq2(self, arg, 1);
1292 }
1293 if (result == 0 && kwds != NULL)
1294 result = PyDict_Merge(self, kwds, 1);
1295 return result;
1296}
1297
1298static PyObject *
1299dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1300{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001301 if (dict_update_common(self, args, kwds, "update") != -1)
1302 Py_RETURN_NONE;
1303 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001304}
1305
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001306/* Update unconditionally replaces existing items.
1307 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001308 otherwise it leaves existing items unchanged.
1309
1310 PyDict_{Update,Merge} update/merge from a mapping object.
1311
Tim Petersf582b822001-12-11 18:51:08 +00001312 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001313 producing iterable objects of length 2.
1314*/
1315
Tim Petersf582b822001-12-11 18:51:08 +00001316int
Tim Peters1fc240e2001-10-26 05:06:50 +00001317PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1318{
1319 PyObject *it; /* iter(seq2) */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001320 Py_ssize_t i; /* index into seq2 of current element */
Tim Peters1fc240e2001-10-26 05:06:50 +00001321 PyObject *item; /* seq2[i] */
1322 PyObject *fast; /* item as a 2-tuple or 2-list */
1323
1324 assert(d != NULL);
1325 assert(PyDict_Check(d));
1326 assert(seq2 != NULL);
1327
1328 it = PyObject_GetIter(seq2);
1329 if (it == NULL)
1330 return -1;
1331
1332 for (i = 0; ; ++i) {
1333 PyObject *key, *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001334 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001335
1336 fast = NULL;
1337 item = PyIter_Next(it);
1338 if (item == NULL) {
1339 if (PyErr_Occurred())
1340 goto Fail;
1341 break;
1342 }
1343
1344 /* Convert item to sequence, and verify length 2. */
1345 fast = PySequence_Fast(item, "");
1346 if (fast == NULL) {
1347 if (PyErr_ExceptionMatches(PyExc_TypeError))
1348 PyErr_Format(PyExc_TypeError,
1349 "cannot convert dictionary update "
Neal Norwitzd3881b02006-05-30 04:25:05 +00001350 "sequence element #%zd to a sequence",
Tim Peters1fc240e2001-10-26 05:06:50 +00001351 i);
1352 goto Fail;
1353 }
1354 n = PySequence_Fast_GET_SIZE(fast);
1355 if (n != 2) {
1356 PyErr_Format(PyExc_ValueError,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001357 "dictionary update sequence element #%zd "
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00001358 "has length %zd; 2 is required",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00001359 i, n);
Tim Peters1fc240e2001-10-26 05:06:50 +00001360 goto Fail;
1361 }
1362
1363 /* Update/merge with this (key, value) pair. */
1364 key = PySequence_Fast_GET_ITEM(fast, 0);
1365 value = PySequence_Fast_GET_ITEM(fast, 1);
1366 if (override || PyDict_GetItem(d, key) == NULL) {
1367 int status = PyDict_SetItem(d, key, value);
1368 if (status < 0)
1369 goto Fail;
1370 }
1371 Py_DECREF(fast);
1372 Py_DECREF(item);
1373 }
1374
1375 i = 0;
1376 goto Return;
1377Fail:
1378 Py_XDECREF(item);
1379 Py_XDECREF(fast);
1380 i = -1;
1381Return:
1382 Py_DECREF(it);
Neal Norwitzd3881b02006-05-30 04:25:05 +00001383 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001384}
1385
Tim Peters6d6c1a32001-08-02 04:15:00 +00001386int
1387PyDict_Update(PyObject *a, PyObject *b)
1388{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001389 return PyDict_Merge(a, b, 1);
1390}
1391
1392int
1393PyDict_Merge(PyObject *a, PyObject *b, int override)
1394{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001395 register PyDictObject *mp, *other;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001396 register Py_ssize_t i;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001397 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001398
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001399 /* We accept for the argument either a concrete dictionary object,
1400 * or an abstract "mapping" object. For the former, we can do
1401 * things quite efficiently. For the latter, we only require that
1402 * PyMapping_Keys() and PyObject_GetItem() be supported.
1403 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001404 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1405 PyErr_BadInternalCall();
1406 return -1;
1407 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001408 mp = (PyDictObject*)a;
Raymond Hettinger0922d712007-02-07 20:08:22 +00001409 if (PyDict_CheckExact(b)) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001410 other = (PyDictObject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001411 if (other == mp || other->ma_used == 0)
1412 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001413 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001414 if (mp->ma_used == 0)
1415 /* Since the target dict is empty, PyDict_GetItem()
1416 * always returns NULL. Setting override to 1
1417 * skips the unnecessary test.
1418 */
1419 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001420 /* Do one big resize at the start, rather than
1421 * incrementally resizing as we insert new items. Expect
1422 * that there will be no (or few) overlapping keys.
1423 */
1424 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001425 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001426 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001427 }
1428 for (i = 0; i <= other->ma_mask; i++) {
1429 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001430 if (entry->me_value != NULL &&
1431 (override ||
1432 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001433 Py_INCREF(entry->me_key);
1434 Py_INCREF(entry->me_value);
Armin Rigo35f6d362006-06-01 13:19:12 +00001435 if (insertdict(mp, entry->me_key,
1436 (long)entry->me_hash,
1437 entry->me_value) != 0)
1438 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001439 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001440 }
1441 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001442 else {
1443 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001444 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001445 PyObject *iter;
1446 PyObject *key, *value;
1447 int status;
1448
1449 if (keys == NULL)
1450 /* Docstring says this is equivalent to E.keys() so
1451 * if E doesn't have a .keys() method we want
1452 * AttributeError to percolate up. Might as well
1453 * do the same for any other error.
1454 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001455 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001456
1457 iter = PyObject_GetIter(keys);
1458 Py_DECREF(keys);
1459 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001460 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001461
1462 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001463 if (!override && PyDict_GetItem(a, key) != NULL) {
1464 Py_DECREF(key);
1465 continue;
1466 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001467 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001468 if (value == NULL) {
1469 Py_DECREF(iter);
1470 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001471 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001472 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001473 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001474 Py_DECREF(key);
1475 Py_DECREF(value);
1476 if (status < 0) {
1477 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001478 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001479 }
1480 }
1481 Py_DECREF(iter);
1482 if (PyErr_Occurred())
1483 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001484 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001485 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001486 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001487}
1488
1489static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001490dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001491{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001492 return PyDict_Copy((PyObject*)mp);
1493}
1494
1495PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001496PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001497{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001498 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001499
1500 if (o == NULL || !PyDict_Check(o)) {
1501 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001502 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001503 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001504 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001505 if (copy == NULL)
1506 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001507 if (PyDict_Merge(copy, o, 1) == 0)
1508 return copy;
1509 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001510 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001511}
1512
Martin v. Löwis18e16552006-02-15 17:27:45 +00001513Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001514PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001515{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001516 if (mp == NULL || !PyDict_Check(mp)) {
1517 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001518 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001519 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001520 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001521}
1522
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001523PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001524PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001525{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001526 if (mp == NULL || !PyDict_Check(mp)) {
1527 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001528 return NULL;
1529 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001530 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001531}
1532
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001533PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001534PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001535{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 if (mp == NULL || !PyDict_Check(mp)) {
1537 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001538 return NULL;
1539 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001540 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001541}
1542
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001544PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001545{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546 if (mp == NULL || !PyDict_Check(mp)) {
1547 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001548 return NULL;
1549 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001550 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001551}
1552
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001553/* Subroutine which returns the smallest key in a for which b's value
1554 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001555 pval argument. Both are NULL if no key in a is found for which b's status
1556 differs. The refcounts on (and only on) non-NULL *pval and function return
1557 values must be decremented by the caller (characterize() increments them
1558 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1559 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001560
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001561static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001562characterize(PyDictObject *a, PyDictObject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001563{
Tim Peters95bf9392001-05-10 08:32:44 +00001564 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1565 PyObject *aval = NULL; /* a[akey] */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001566 Py_ssize_t i;
1567 int cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001568
Tim Petersafb6ae82001-06-04 21:00:21 +00001569 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001570 PyObject *thiskey, *thisaval, *thisbval;
1571 if (a->ma_table[i].me_value == NULL)
1572 continue;
1573 thiskey = a->ma_table[i].me_key;
1574 Py_INCREF(thiskey); /* keep alive across compares */
1575 if (akey != NULL) {
1576 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1577 if (cmp < 0) {
1578 Py_DECREF(thiskey);
1579 goto Fail;
1580 }
1581 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001582 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001583 a->ma_table[i].me_value == NULL)
1584 {
1585 /* Not the *smallest* a key; or maybe it is
1586 * but the compare shrunk the dict so we can't
1587 * find its associated value anymore; or
1588 * maybe it is but the compare deleted the
1589 * a[thiskey] entry.
Neal Norwitzd3881b02006-05-30 04:25:05 +00001590 */
Tim Peters95bf9392001-05-10 08:32:44 +00001591 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001592 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001593 }
Tim Peters95bf9392001-05-10 08:32:44 +00001594 }
1595
1596 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1597 thisaval = a->ma_table[i].me_value;
1598 assert(thisaval);
1599 Py_INCREF(thisaval); /* keep alive */
1600 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1601 if (thisbval == NULL)
1602 cmp = 0;
1603 else {
1604 /* both dicts have thiskey: same values? */
1605 cmp = PyObject_RichCompareBool(
1606 thisaval, thisbval, Py_EQ);
1607 if (cmp < 0) {
1608 Py_DECREF(thiskey);
1609 Py_DECREF(thisaval);
1610 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001611 }
1612 }
Tim Peters95bf9392001-05-10 08:32:44 +00001613 if (cmp == 0) {
1614 /* New winner. */
1615 Py_XDECREF(akey);
1616 Py_XDECREF(aval);
1617 akey = thiskey;
1618 aval = thisaval;
1619 }
1620 else {
1621 Py_DECREF(thiskey);
1622 Py_DECREF(thisaval);
1623 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001624 }
Tim Peters95bf9392001-05-10 08:32:44 +00001625 *pval = aval;
1626 return akey;
1627
1628Fail:
1629 Py_XDECREF(akey);
1630 Py_XDECREF(aval);
1631 *pval = NULL;
1632 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001633}
1634
1635static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001636dict_compare(PyDictObject *a, PyDictObject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001637{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001638 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001639 int res;
1640
1641 /* Compare lengths first */
1642 if (a->ma_used < b->ma_used)
1643 return -1; /* a is shorter */
1644 else if (a->ma_used > b->ma_used)
1645 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001646
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001647 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001648 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001649 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001650 if (adiff == NULL) {
1651 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001652 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001653 * must be equal.
1654 */
1655 res = PyErr_Occurred() ? -1 : 0;
1656 goto Finished;
1657 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001658 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001659 if (bdiff == NULL && PyErr_Occurred()) {
1660 assert(!bval);
1661 res = -1;
1662 goto Finished;
1663 }
1664 res = 0;
1665 if (bdiff) {
1666 /* bdiff == NULL "should be" impossible now, but perhaps
1667 * the last comparison done by the characterize() on a had
1668 * the side effect of making the dicts equal!
1669 */
1670 res = PyObject_Compare(adiff, bdiff);
1671 }
1672 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001673 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001674
1675Finished:
1676 Py_XDECREF(adiff);
1677 Py_XDECREF(bdiff);
1678 Py_XDECREF(aval);
1679 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001680 return res;
1681}
1682
Tim Peterse63415e2001-05-08 04:38:29 +00001683/* Return 1 if dicts equal, 0 if not, -1 if error.
1684 * Gets out as soon as any difference is detected.
1685 * Uses only Py_EQ comparison.
1686 */
1687static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001688dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001689{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001690 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001691
1692 if (a->ma_used != b->ma_used)
1693 /* can't be equal if # of entries differ */
1694 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001695
Tim Peterse63415e2001-05-08 04:38:29 +00001696 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001697 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001698 PyObject *aval = a->ma_table[i].me_value;
1699 if (aval != NULL) {
1700 int cmp;
1701 PyObject *bval;
1702 PyObject *key = a->ma_table[i].me_key;
1703 /* temporarily bump aval's refcount to ensure it stays
1704 alive until we're done with it */
1705 Py_INCREF(aval);
Neal Norwitza22975f2006-09-05 02:24:03 +00001706 /* ditto for key */
1707 Py_INCREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001708 bval = PyDict_GetItem((PyObject *)b, key);
Neal Norwitza22975f2006-09-05 02:24:03 +00001709 Py_DECREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001710 if (bval == NULL) {
1711 Py_DECREF(aval);
1712 return 0;
1713 }
1714 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1715 Py_DECREF(aval);
1716 if (cmp <= 0) /* error or not equal */
1717 return cmp;
1718 }
1719 }
1720 return 1;
1721 }
1722
1723static PyObject *
1724dict_richcompare(PyObject *v, PyObject *w, int op)
1725{
1726 int cmp;
1727 PyObject *res;
1728
1729 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1730 res = Py_NotImplemented;
1731 }
1732 else if (op == Py_EQ || op == Py_NE) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001733 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
Tim Peterse63415e2001-05-08 04:38:29 +00001734 if (cmp < 0)
1735 return NULL;
1736 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1737 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001738 else
1739 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001740 Py_INCREF(res);
1741 return res;
1742 }
1743
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001744static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001745dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001746{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001747 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001748 PyDictEntry *ep;
Tim Petersd770ebd2006-06-01 15:50:44 +00001749
Tim Peters0ab085c2001-09-14 00:25:33 +00001750 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001751 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001752 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001753 if (hash == -1)
1754 return NULL;
1755 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001756 ep = (mp->ma_lookup)(mp, key, hash);
1757 if (ep == NULL)
1758 return NULL;
Tim Petersd770ebd2006-06-01 15:50:44 +00001759 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001760}
1761
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001762static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001763dict_has_key(register PyDictObject *mp, PyObject *key)
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +00001764{
1765 if (Py_Py3kWarningFlag &&
1766 PyErr_Warn(PyExc_DeprecationWarning,
1767 "dict.has_key() not supported in 3.x") < 0)
1768 return NULL;
1769 return dict_contains(mp, key);
1770}
1771
1772static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001773dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001774{
1775 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001776 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001777 PyObject *val = NULL;
1778 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001779 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001780
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001781 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001782 return NULL;
1783
Tim Peters0ab085c2001-09-14 00:25:33 +00001784 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001785 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001786 hash = PyObject_Hash(key);
1787 if (hash == -1)
1788 return NULL;
1789 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001790 ep = (mp->ma_lookup)(mp, key, hash);
1791 if (ep == NULL)
1792 return NULL;
1793 val = ep->me_value;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001794 if (val == NULL)
1795 val = failobj;
1796 Py_INCREF(val);
1797 return val;
1798}
1799
1800
1801static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001802dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001803{
1804 PyObject *key;
1805 PyObject *failobj = Py_None;
1806 PyObject *val = NULL;
1807 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001808 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001809
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001810 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001811 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001812
Tim Peters0ab085c2001-09-14 00:25:33 +00001813 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001814 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001815 hash = PyObject_Hash(key);
1816 if (hash == -1)
1817 return NULL;
1818 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001819 ep = (mp->ma_lookup)(mp, key, hash);
1820 if (ep == NULL)
1821 return NULL;
1822 val = ep->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001823 if (val == NULL) {
1824 val = failobj;
1825 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1826 val = NULL;
1827 }
1828 Py_XINCREF(val);
1829 return val;
1830}
1831
1832
1833static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001834dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001835{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001836 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001837 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001838}
1839
Guido van Rossumba6ab842000-12-12 22:02:18 +00001840static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001841dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001842{
1843 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001844 PyDictEntry *ep;
Guido van Rossume027d982002-04-12 15:11:59 +00001845 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001846 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001847
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001848 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1849 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001850 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001851 if (deflt) {
1852 Py_INCREF(deflt);
1853 return deflt;
1854 }
Guido van Rossume027d982002-04-12 15:11:59 +00001855 PyErr_SetString(PyExc_KeyError,
1856 "pop(): dictionary is empty");
1857 return NULL;
1858 }
1859 if (!PyString_CheckExact(key) ||
1860 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1861 hash = PyObject_Hash(key);
1862 if (hash == -1)
1863 return NULL;
1864 }
1865 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +00001866 if (ep == NULL)
1867 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001868 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001869 if (deflt) {
1870 Py_INCREF(deflt);
1871 return deflt;
1872 }
Georg Brandlb9f4ad32006-10-29 18:31:42 +00001873 set_key_error(key);
Guido van Rossume027d982002-04-12 15:11:59 +00001874 return NULL;
1875 }
1876 old_key = ep->me_key;
1877 Py_INCREF(dummy);
1878 ep->me_key = dummy;
1879 old_value = ep->me_value;
1880 ep->me_value = NULL;
1881 mp->ma_used--;
1882 Py_DECREF(old_key);
1883 return old_value;
1884}
1885
1886static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001887dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001888{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001889 Py_ssize_t i = 0;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001890 PyDictEntry *ep;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001891 PyObject *res;
1892
Tim Petersf4b33f62001-06-02 05:42:29 +00001893 /* Allocate the result tuple before checking the size. Believe it
1894 * or not, this allocation could trigger a garbage collection which
1895 * could empty the dict, so if we checked the size first and that
1896 * happened, the result would be an infinite loop (searching for an
1897 * entry that no longer exists). Note that the usual popitem()
1898 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Tim Peters9b10f7e2006-05-30 04:16:25 +00001899 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00001900 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001901 */
1902 res = PyTuple_New(2);
1903 if (res == NULL)
1904 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001905 if (mp->ma_used == 0) {
1906 Py_DECREF(res);
1907 PyErr_SetString(PyExc_KeyError,
1908 "popitem(): dictionary is empty");
1909 return NULL;
1910 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001911 /* Set ep to "the first" dict entry with a value. We abuse the hash
1912 * field of slot 0 to hold a search finger:
1913 * If slot 0 has a value, use slot 0.
1914 * Else slot 0 is being used to hold a search finger,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001915 * and we use its hash value as the first index to look.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001916 */
1917 ep = &mp->ma_table[0];
1918 if (ep->me_value == NULL) {
Tim Peters9b10f7e2006-05-30 04:16:25 +00001919 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001920 /* The hash field may be a real hash value, or it may be a
1921 * legit search finger, or it may be a once-legit search
1922 * finger that's out of bounds now because it wrapped around
1923 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001924 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001925 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001926 i = 1; /* skip slot 0 */
1927 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1928 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001929 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001930 i = 1;
1931 }
1932 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001933 PyTuple_SET_ITEM(res, 0, ep->me_key);
1934 PyTuple_SET_ITEM(res, 1, ep->me_value);
1935 Py_INCREF(dummy);
1936 ep->me_key = dummy;
1937 ep->me_value = NULL;
1938 mp->ma_used--;
1939 assert(mp->ma_table[0].me_value == NULL);
1940 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001941 return res;
1942}
1943
Jeremy Hylton8caad492000-06-23 14:18:11 +00001944static int
1945dict_traverse(PyObject *op, visitproc visit, void *arg)
1946{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001947 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001948 PyObject *pk;
1949 PyObject *pv;
1950
1951 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Woutersc6e55062006-04-15 21:47:09 +00001952 Py_VISIT(pk);
1953 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00001954 }
1955 return 0;
1956}
1957
1958static int
1959dict_tp_clear(PyObject *op)
1960{
1961 PyDict_Clear(op);
1962 return 0;
1963}
1964
Tim Petersf7f88b12000-12-13 23:18:45 +00001965
Raymond Hettinger019a1482004-03-18 02:41:19 +00001966extern PyTypeObject PyDictIterKey_Type; /* Forward */
1967extern PyTypeObject PyDictIterValue_Type; /* Forward */
1968extern PyTypeObject PyDictIterItem_Type; /* Forward */
Brett Cannon77ae87c2007-10-10 00:07:50 +00001969static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001970
1971static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001972dict_iterkeys(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001973{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001974 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001975}
1976
1977static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001978dict_itervalues(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001979{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001980 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001981}
1982
1983static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001984dict_iteritems(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001985{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001986 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001987}
1988
1989
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001990PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00001991"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00001992
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001993PyDoc_STRVAR(contains__doc__,
1994"D.__contains__(k) -> True if D has a key k, else False");
1995
1996PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1997
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001998PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001999"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002000
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002001PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002002"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 +00002003
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002004PyDoc_STRVAR(pop__doc__,
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002005"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
2006If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002008PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002009"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000020102-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00002011
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002012PyDoc_STRVAR(keys__doc__,
2013"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00002014
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002015PyDoc_STRVAR(items__doc__,
2016"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00002017
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002018PyDoc_STRVAR(values__doc__,
2019"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00002020
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002021PyDoc_STRVAR(update__doc__,
Walter Dörwaldd70ad8a2004-05-28 20:59:21 +00002022"D.update(E, **F) -> None. Update D from E and F: for k in E: D[k] = E[k]\n\
2023(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 +00002024
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002025PyDoc_STRVAR(fromkeys__doc__,
2026"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
2027v defaults to None.");
2028
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002029PyDoc_STRVAR(clear__doc__,
2030"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002031
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002032PyDoc_STRVAR(copy__doc__,
2033"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002034
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002035PyDoc_STRVAR(iterkeys__doc__,
2036"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002037
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002038PyDoc_STRVAR(itervalues__doc__,
2039"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002040
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002041PyDoc_STRVAR(iteritems__doc__,
2042"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002043
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002044static PyMethodDef mapp_methods[] = {
Neal Norwitzc7926292007-05-23 06:57:35 +00002045 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002046 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00002047 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002048 getitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002049 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00002050 has_key__doc__},
2051 {"get", (PyCFunction)dict_get, METH_VARARGS,
2052 get__doc__},
2053 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2054 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002055 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00002056 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002057 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002058 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002059 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002060 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002061 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002062 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002063 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002064 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002065 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002066 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002067 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2068 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002069 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002070 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002071 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002072 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002073 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002074 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002075 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002076 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002077 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002078 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00002079 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002080};
2081
Tim Petersd770ebd2006-06-01 15:50:44 +00002082/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002083int
2084PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002085{
2086 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002087 PyDictObject *mp = (PyDictObject *)op;
2088 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002089
Tim Peters0ab085c2001-09-14 00:25:33 +00002090 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00002091 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002092 hash = PyObject_Hash(key);
2093 if (hash == -1)
2094 return -1;
2095 }
Armin Rigo35f6d362006-06-01 13:19:12 +00002096 ep = (mp->ma_lookup)(mp, key, hash);
Tim Petersd770ebd2006-06-01 15:50:44 +00002097 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002098}
2099
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00002100/* Internal version of PyDict_Contains used when the hash value is already known */
2101int
2102_PyDict_Contains(PyObject *op, PyObject *key, long hash)
2103{
Brett Cannon77ae87c2007-10-10 00:07:50 +00002104 PyDictObject *mp = (PyDictObject *)op;
2105 PyDictEntry *ep;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00002106
2107 ep = (mp->ma_lookup)(mp, key, hash);
2108 return ep == NULL ? -1 : (ep->me_value != NULL);
2109}
2110
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002111/* Hack to implement "key in dict" */
2112static PySequenceMethods dict_as_sequence = {
Georg Brandl347b3002006-03-30 11:57:00 +00002113 0, /* sq_length */
2114 0, /* sq_concat */
2115 0, /* sq_repeat */
2116 0, /* sq_item */
2117 0, /* sq_slice */
2118 0, /* sq_ass_item */
2119 0, /* sq_ass_slice */
2120 PyDict_Contains, /* sq_contains */
2121 0, /* sq_inplace_concat */
2122 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002123};
2124
Guido van Rossum09e563a2001-05-01 12:10:21 +00002125static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002126dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2127{
2128 PyObject *self;
2129
2130 assert(type != NULL && type->tp_alloc != NULL);
2131 self = type->tp_alloc(type, 0);
2132 if (self != NULL) {
2133 PyDictObject *d = (PyDictObject *)self;
2134 /* It's guaranteed that tp->alloc zeroed out the struct. */
2135 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2136 INIT_NONZERO_DICT_SLOTS(d);
2137 d->ma_lookup = lookdict_string;
2138#ifdef SHOW_CONVERSION_COUNTS
2139 ++created;
2140#endif
2141 }
2142 return self;
2143}
2144
Tim Peters25786c02001-09-02 08:22:48 +00002145static int
2146dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2147{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002148 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002149}
2150
Tim Peters6d6c1a32001-08-02 04:15:00 +00002151static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002152dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002153{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002154 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002155}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002156
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002157PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00002158"dict() -> new empty dictionary.\n"
2159"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00002160" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002161"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002162" d = {}\n"
2163" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002164" d[k] = v\n"
2165"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2166" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002167
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002168PyTypeObject PyDict_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002169 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Petersa427a2b2001-10-29 22:25:45 +00002170 "dict",
Brett Cannon77ae87c2007-10-10 00:07:50 +00002171 sizeof(PyDictObject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002172 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00002173 (destructor)dict_dealloc, /* tp_dealloc */
2174 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002175 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00002176 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00002177 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00002178 (reprfunc)dict_repr, /* tp_repr */
2179 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002180 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00002181 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossum64c06e32007-11-22 00:55:51 +00002182 0, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00002183 0, /* tp_call */
2184 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002185 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00002186 0, /* tp_setattro */
2187 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002188 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00002189 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00002190 dictionary_doc, /* tp_doc */
Georg Brandl347b3002006-03-30 11:57:00 +00002191 dict_traverse, /* tp_traverse */
2192 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00002193 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002194 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00002195 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002196 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002197 mapp_methods, /* tp_methods */
2198 0, /* tp_members */
2199 0, /* tp_getset */
2200 0, /* tp_base */
2201 0, /* tp_dict */
2202 0, /* tp_descr_get */
2203 0, /* tp_descr_set */
2204 0, /* tp_dictoffset */
Georg Brandl347b3002006-03-30 11:57:00 +00002205 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002206 PyType_GenericAlloc, /* tp_alloc */
2207 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002208 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002209};
2210
Guido van Rossum3cca2451997-05-16 14:23:33 +00002211/* For backward compatibility with old dictionary interface */
2212
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002213PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002214PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002215{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002216 PyObject *kv, *rv;
2217 kv = PyString_FromString(key);
2218 if (kv == NULL)
2219 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002220 rv = PyDict_GetItem(v, kv);
2221 Py_DECREF(kv);
2222 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002223}
2224
2225int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002226PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002227{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002228 PyObject *kv;
2229 int err;
2230 kv = PyString_FromString(key);
2231 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002232 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00002233 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002234 err = PyDict_SetItem(v, kv, item);
2235 Py_DECREF(kv);
2236 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002237}
2238
2239int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002240PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002241{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002242 PyObject *kv;
2243 int err;
2244 kv = PyString_FromString(key);
2245 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002246 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002247 err = PyDict_DelItem(v, kv);
2248 Py_DECREF(kv);
2249 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002250}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002251
Raymond Hettinger019a1482004-03-18 02:41:19 +00002252/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002253
2254typedef struct {
2255 PyObject_HEAD
Brett Cannon77ae87c2007-10-10 00:07:50 +00002256 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002257 Py_ssize_t di_used;
2258 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002259 PyObject* di_result; /* reusable result tuple for iteritems */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002260 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002261} dictiterobject;
2262
2263static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002264dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002265{
2266 dictiterobject *di;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002267 di = PyObject_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002268 if (di == NULL)
2269 return NULL;
2270 Py_INCREF(dict);
2271 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002272 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002273 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002274 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002275 if (itertype == &PyDictIterItem_Type) {
2276 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2277 if (di->di_result == NULL) {
2278 Py_DECREF(di);
2279 return NULL;
2280 }
2281 }
2282 else
2283 di->di_result = NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002284 return (PyObject *)di;
2285}
2286
2287static void
2288dictiter_dealloc(dictiterobject *di)
2289{
Guido van Rossum2147df72002-07-16 20:30:22 +00002290 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002291 Py_XDECREF(di->di_result);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002292 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002293}
2294
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002295static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002296dictiter_len(dictiterobject *di)
2297{
Tim Peters9b10f7e2006-05-30 04:16:25 +00002298 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002299 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002300 len = di->len;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002301 return PyInt_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002302}
2303
Armin Rigof5b3e362006-02-11 21:32:43 +00002304PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002305
2306static PyMethodDef dictiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002307 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002308 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002309};
2310
Raymond Hettinger019a1482004-03-18 02:41:19 +00002311static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002312{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002313 PyObject *key;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002314 register Py_ssize_t i, mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002315 register PyDictEntry *ep;
2316 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002317
Raymond Hettinger019a1482004-03-18 02:41:19 +00002318 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002319 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002320 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002321
Raymond Hettinger019a1482004-03-18 02:41:19 +00002322 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002323 PyErr_SetString(PyExc_RuntimeError,
2324 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002325 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002326 return NULL;
2327 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002328
Raymond Hettinger019a1482004-03-18 02:41:19 +00002329 i = di->di_pos;
2330 if (i < 0)
2331 goto fail;
2332 ep = d->ma_table;
2333 mask = d->ma_mask;
2334 while (i <= mask && ep[i].me_value == NULL)
2335 i++;
2336 di->di_pos = i+1;
2337 if (i > mask)
2338 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002339 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002340 key = ep[i].me_key;
2341 Py_INCREF(key);
2342 return key;
2343
2344fail:
2345 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002346 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002347 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002348}
2349
Raymond Hettinger019a1482004-03-18 02:41:19 +00002350PyTypeObject PyDictIterKey_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002351 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002352 "dictionary-keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002353 sizeof(dictiterobject), /* tp_basicsize */
2354 0, /* tp_itemsize */
2355 /* methods */
2356 (destructor)dictiter_dealloc, /* tp_dealloc */
2357 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002358 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002359 0, /* tp_setattr */
2360 0, /* tp_compare */
2361 0, /* tp_repr */
2362 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002363 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002364 0, /* tp_as_mapping */
2365 0, /* tp_hash */
2366 0, /* tp_call */
2367 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002368 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002369 0, /* tp_setattro */
2370 0, /* tp_as_buffer */
2371 Py_TPFLAGS_DEFAULT, /* tp_flags */
2372 0, /* tp_doc */
2373 0, /* tp_traverse */
2374 0, /* tp_clear */
2375 0, /* tp_richcompare */
2376 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002377 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002378 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002379 dictiter_methods, /* tp_methods */
2380 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002381};
2382
2383static PyObject *dictiter_iternextvalue(dictiterobject *di)
2384{
2385 PyObject *value;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002386 register Py_ssize_t i, mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002387 register PyDictEntry *ep;
2388 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002389
2390 if (d == NULL)
2391 return NULL;
2392 assert (PyDict_Check(d));
2393
2394 if (di->di_used != d->ma_used) {
2395 PyErr_SetString(PyExc_RuntimeError,
2396 "dictionary changed size during iteration");
2397 di->di_used = -1; /* Make this state sticky */
2398 return NULL;
2399 }
2400
2401 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002402 mask = d->ma_mask;
2403 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002404 goto fail;
2405 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002406 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002407 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002408 if (i > mask)
2409 goto fail;
2410 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002411 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002412 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002413 Py_INCREF(value);
2414 return value;
2415
2416fail:
2417 Py_DECREF(d);
2418 di->di_dict = NULL;
2419 return NULL;
2420}
2421
2422PyTypeObject PyDictIterValue_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002423 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002424 "dictionary-valueiterator", /* tp_name */
2425 sizeof(dictiterobject), /* tp_basicsize */
2426 0, /* tp_itemsize */
2427 /* methods */
2428 (destructor)dictiter_dealloc, /* tp_dealloc */
2429 0, /* tp_print */
2430 0, /* tp_getattr */
2431 0, /* tp_setattr */
2432 0, /* tp_compare */
2433 0, /* tp_repr */
2434 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002435 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002436 0, /* tp_as_mapping */
2437 0, /* tp_hash */
2438 0, /* tp_call */
2439 0, /* tp_str */
2440 PyObject_GenericGetAttr, /* tp_getattro */
2441 0, /* tp_setattro */
2442 0, /* tp_as_buffer */
2443 Py_TPFLAGS_DEFAULT, /* tp_flags */
2444 0, /* tp_doc */
2445 0, /* tp_traverse */
2446 0, /* tp_clear */
2447 0, /* tp_richcompare */
2448 0, /* tp_weaklistoffset */
2449 PyObject_SelfIter, /* tp_iter */
2450 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002451 dictiter_methods, /* tp_methods */
2452 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002453};
2454
2455static PyObject *dictiter_iternextitem(dictiterobject *di)
2456{
2457 PyObject *key, *value, *result = di->di_result;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002458 register Py_ssize_t i, mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002459 register PyDictEntry *ep;
2460 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002461
2462 if (d == NULL)
2463 return NULL;
2464 assert (PyDict_Check(d));
2465
2466 if (di->di_used != d->ma_used) {
2467 PyErr_SetString(PyExc_RuntimeError,
2468 "dictionary changed size during iteration");
2469 di->di_used = -1; /* Make this state sticky */
2470 return NULL;
2471 }
2472
2473 i = di->di_pos;
2474 if (i < 0)
2475 goto fail;
2476 ep = d->ma_table;
2477 mask = d->ma_mask;
2478 while (i <= mask && ep[i].me_value == NULL)
2479 i++;
2480 di->di_pos = i+1;
2481 if (i > mask)
2482 goto fail;
2483
2484 if (result->ob_refcnt == 1) {
2485 Py_INCREF(result);
2486 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2487 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2488 } else {
2489 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002490 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002491 return NULL;
2492 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002493 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002494 key = ep[i].me_key;
2495 value = ep[i].me_value;
2496 Py_INCREF(key);
2497 Py_INCREF(value);
2498 PyTuple_SET_ITEM(result, 0, key);
2499 PyTuple_SET_ITEM(result, 1, value);
2500 return result;
2501
2502fail:
2503 Py_DECREF(d);
2504 di->di_dict = NULL;
2505 return NULL;
2506}
2507
2508PyTypeObject PyDictIterItem_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002509 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002510 "dictionary-itemiterator", /* tp_name */
2511 sizeof(dictiterobject), /* tp_basicsize */
2512 0, /* tp_itemsize */
2513 /* methods */
2514 (destructor)dictiter_dealloc, /* tp_dealloc */
2515 0, /* tp_print */
2516 0, /* tp_getattr */
2517 0, /* tp_setattr */
2518 0, /* tp_compare */
2519 0, /* tp_repr */
2520 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002521 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002522 0, /* tp_as_mapping */
2523 0, /* tp_hash */
2524 0, /* tp_call */
2525 0, /* tp_str */
2526 PyObject_GenericGetAttr, /* tp_getattro */
2527 0, /* tp_setattro */
2528 0, /* tp_as_buffer */
2529 Py_TPFLAGS_DEFAULT, /* tp_flags */
2530 0, /* tp_doc */
2531 0, /* tp_traverse */
2532 0, /* tp_clear */
2533 0, /* tp_richcompare */
2534 0, /* tp_weaklistoffset */
2535 PyObject_SelfIter, /* tp_iter */
2536 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002537 dictiter_methods, /* tp_methods */
2538 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002539};