blob: 1da24f409ec08b3e705c2971691cb3eedea7e075 [file] [log] [blame]
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001
Guido van Rossum2bc13791999-03-24 19:06:42 +00002/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003
Raymond Hettinger930427b2003-05-03 06:51:59 +00004/* The distribution includes a separate file, Objects/dictnotes.txt,
Tim Peters60b29962006-01-01 01:19:23 +00005 describing explorations into dictionary design and optimization.
Raymond Hettinger930427b2003-05-03 06:51:59 +00006 It covers typical dictionary use patterns, the parameters for
7 tuning dictionaries, and several ideas for possible optimizations.
8*/
9
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010#include "Python.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000011
Tim Peters6d6c1a32001-08-02 04:15:00 +000012typedef PyDictEntry dictentry;
13typedef PyDictObject dictobject;
Guido van Rossum16e93a81997-01-28 00:00:11 +000014
Thomas Wouters89f507f2006-12-13 04:49:30 +000015/* Set a key error with the specified argument, wrapping it in a
16 * tuple automatically so that tuple keys are not unpacked as the
17 * exception arguments. */
18static void
19set_key_error(PyObject *arg)
20{
21 PyObject *tup;
22 tup = PyTuple_Pack(1, arg);
23 if (!tup)
24 return; /* caller will expect error to be set anyway */
25 PyErr_SetObject(PyExc_KeyError, tup);
26 Py_DECREF(tup);
27}
28
Tim Peterseb28ef22001-06-02 05:27:19 +000029/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000030#undef SHOW_CONVERSION_COUNTS
31
Tim Peterseb28ef22001-06-02 05:27:19 +000032/* See large comment block below. This must be >= 1. */
33#define PERTURB_SHIFT 5
34
Guido van Rossum16e93a81997-01-28 00:00:11 +000035/*
Tim Peterseb28ef22001-06-02 05:27:19 +000036Major subtleties ahead: Most hash schemes depend on having a "good" hash
37function, in the sense of simulating randomness. Python doesn't: its most
38important hash functions (for strings and ints) are very regular in common
39cases:
Tim Peters15d49292001-05-27 07:39:22 +000040
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000041 >>> map(hash, (0, 1, 2, 3))
42 [0, 1, 2, 3]
43 >>> map(hash, ("namea", "nameb", "namec", "named"))
44 [-1658398457, -1658398460, -1658398459, -1658398462]
45 >>>
Tim Peters15d49292001-05-27 07:39:22 +000046
Tim Peterseb28ef22001-06-02 05:27:19 +000047This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
48the low-order i bits as the initial table index is extremely fast, and there
49are no collisions at all for dicts indexed by a contiguous range of ints.
50The same is approximately true when keys are "consecutive" strings. So this
51gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000052
Tim Peterseb28ef22001-06-02 05:27:19 +000053OTOH, when collisions occur, the tendency to fill contiguous slices of the
54hash table makes a good collision resolution strategy crucial. Taking only
55the last i bits of the hash code is also vulnerable: for example, consider
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000056the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
57their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
58 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000059
Tim Peterseb28ef22001-06-02 05:27:19 +000060But catering to unusual cases should not slow the usual ones, so we just take
61the last i bits anyway. It's up to collision resolution to do the rest. If
62we *usually* find the key we're looking for on the first try (and, it turns
63out, we usually do -- the table load factor is kept under 2/3, so the odds
64are solidly in our favor), then it makes best sense to keep the initial index
65computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000066
Tim Peterseb28ef22001-06-02 05:27:19 +000067The first half of collision resolution is to visit table indices via this
68recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000069
Tim Peterseb28ef22001-06-02 05:27:19 +000070 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000071
Tim Peterseb28ef22001-06-02 05:27:19 +000072For any initial j in range(2**i), repeating that 2**i times generates each
73int in range(2**i) exactly once (see any text on random-number generation for
74proof). By itself, this doesn't help much: like linear probing (setting
75j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
76order. This would be bad, except that's not the only thing we do, and it's
77actually *good* in the common cases where hash keys are consecutive. In an
78example that's really too small to make this entirely clear, for a table of
79size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000080
Tim Peterseb28ef22001-06-02 05:27:19 +000081 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
82
83If two things come in at index 5, the first place we look after is index 2,
84not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
85Linear probing is deadly in this case because there the fixed probe order
86is the *same* as the order consecutive keys are likely to arrive. But it's
87extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
88and certain that consecutive hash codes do not.
89
90The other half of the strategy is to get the other bits of the hash code
91into play. This is done by initializing a (unsigned) vrbl "perturb" to the
92full hash code, and changing the recurrence to:
93
94 j = (5*j) + 1 + perturb;
95 perturb >>= PERTURB_SHIFT;
96 use j % 2**i as the next table index;
97
98Now the probe sequence depends (eventually) on every bit in the hash code,
99and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
100because it quickly magnifies small differences in the bits that didn't affect
101the initial index. Note that because perturb is unsigned, if the recurrence
102is executed often enough perturb eventually becomes and remains 0. At that
103point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
104that's certain to find an empty slot eventually (since it generates every int
105in range(2**i), and we make sure there's always at least one empty slot).
106
107Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
108small so that the high bits of the hash code continue to affect the probe
109sequence across iterations; but you want it large so that in really bad cases
110the high-order hash bits have an effect on early iterations. 5 was "the
111best" in minimizing total collisions across experiments Tim Peters ran (on
112both normal and pathological cases), but 4 and 6 weren't significantly worse.
113
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000114Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000115approach, using repeated multiplication by x in GF(2**n) where an irreducible
116polynomial for each table size was chosen such that x was a primitive root.
117Christian Tismer later extended that to use division by x instead, as an
118efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000119also gave excellent collision statistics, but was more expensive: two if-tests
120were required inside the loop; computing "the next" index took about the same
121number of operations but without as much potential parallelism (e.g.,
122computing 5*j can go on at the same time as computing 1+perturb in the above,
123and then shifting perturb can be done while the table index is being masked);
124and the dictobject struct required a member to hold the table's polynomial.
125In Tim's experiments the current scheme ran faster, produced equally good
126collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000127
128Theoretical Python 2.5 headache: hash codes are only C "long", but
129sizeof(Py_ssize_t) > sizeof(long) may be possible. In that case, and if a
130dict is genuinely huge, then only the slots directly reachable via indexing
131by a C long can be the first slot in a probe sequence. The probe sequence
132will still eventually reach every slot in the table, but the collision rate
133on initial probes may be much higher than this scheme was designed for.
134Getting a hash code as fat as Py_ssize_t is the only real cure. But in
135practice, this probably won't make a lick of difference for many years (at
136which point everyone will have terabytes of RAM on 64-bit boxes).
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000137*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000138
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000139/* Object used as dummy key to fill deleted entries */
Raymond Hettingerf81e4502005-08-17 02:19:36 +0000140static PyObject *dummy = NULL; /* Initialized by first call to newdictobject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000141
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000142#ifdef Py_REF_DEBUG
143PyObject *
144_PyDict_Dummy(void)
145{
146 return dummy;
147}
148#endif
149
Fred Drake1bff34a2000-08-31 19:31:38 +0000150/* forward declarations */
151static dictentry *
152lookdict_string(dictobject *mp, PyObject *key, long hash);
153
154#ifdef SHOW_CONVERSION_COUNTS
155static long created = 0L;
156static long converted = 0L;
157
158static void
159show_counts(void)
160{
161 fprintf(stderr, "created %ld string dicts\n", created);
162 fprintf(stderr, "converted %ld to normal dicts\n", converted);
163 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
164}
165#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000166
Tim Peters6d6c1a32001-08-02 04:15:00 +0000167/* Initialization macros.
168 There are two ways to create a dict: PyDict_New() is the main C API
169 function, and the tp_new slot maps to dict_new(). In the latter case we
170 can save a little time over what PyDict_New does because it's guaranteed
171 that the PyDictObject struct is already zeroed out.
172 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
173 an excellent reason not to).
174*/
175
176#define INIT_NONZERO_DICT_SLOTS(mp) do { \
Tim Petersdea48ec2001-05-22 20:40:22 +0000177 (mp)->ma_table = (mp)->ma_smalltable; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000178 (mp)->ma_mask = PyDict_MINSIZE - 1; \
179 } while(0)
180
181#define EMPTY_TO_MINSIZE(mp) do { \
182 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000183 (mp)->ma_used = (mp)->ma_fill = 0; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000184 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000185 } while(0)
186
Raymond Hettinger43442782004-03-17 21:55:03 +0000187/* Dictionary reuse scheme to save calls to malloc, free, and memset */
188#define MAXFREEDICTS 80
189static PyDictObject *free_dicts[MAXFREEDICTS];
190static int num_free_dicts = 0;
191
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000193PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000194{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000195 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000196 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000198 if (dummy == NULL)
199 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000200#ifdef SHOW_CONVERSION_COUNTS
201 Py_AtExit(show_counts);
202#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000203 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000204 if (num_free_dicts) {
205 mp = free_dicts[--num_free_dicts];
206 assert (mp != NULL);
207 assert (mp->ob_type == &PyDict_Type);
208 _Py_NewReference((PyObject *)mp);
209 if (mp->ma_fill) {
210 EMPTY_TO_MINSIZE(mp);
211 }
212 assert (mp->ma_used == 0);
213 assert (mp->ma_table == mp->ma_smalltable);
214 assert (mp->ma_mask == PyDict_MINSIZE - 1);
215 } else {
216 mp = PyObject_GC_New(dictobject, &PyDict_Type);
217 if (mp == NULL)
218 return NULL;
219 EMPTY_TO_MINSIZE(mp);
220 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000221 mp->ma_lookup = lookdict_string;
222#ifdef SHOW_CONVERSION_COUNTS
223 ++created;
224#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000225 _PyObject_GC_TRACK(mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000227}
228
229/*
230The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000231This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000232Open addressing is preferred over chaining since the link overhead for
233chaining would be substantial (100% with typical malloc overhead).
234
Tim Peterseb28ef22001-06-02 05:27:19 +0000235The initial probe index is computed as hash mod the table size. Subsequent
236probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000237
238All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000239
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000240The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000241contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000242Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000243
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000244lookdict() is general-purpose, and may return NULL if (and only if) a
245comparison raises an exception (this was new in Python 2.5).
246lookdict_string() below is specialized to string keys, comparison of which can
247never raise an exception; that function can never return NULL. For both, when
248the key isn't found a dictentry* is returned for which the me_value field is
249NULL; this is the slot in the dict at which the key would have been found, and
250the caller can (if it wishes) add the <key, value> pair to the returned
251dictentry*.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000252*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000253static dictentry *
Tim Peters1f5871e2000-07-04 17:44:48 +0000254lookdict(dictobject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000255{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000256 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000257 register size_t perturb;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000258 register dictentry *freeslot;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000259 register size_t mask = (size_t)mp->ma_mask;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000260 dictentry *ep0 = mp->ma_table;
261 register dictentry *ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000262 register int cmp;
Tim Peters453163d2001-06-03 04:54:32 +0000263 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000264
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000265 i = (size_t)hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000266 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000267 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000268 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000269
Guido van Rossum16e93a81997-01-28 00:00:11 +0000270 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000271 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000272 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000273 if (ep->me_hash == hash) {
Tim Peters453163d2001-06-03 04:54:32 +0000274 startkey = ep->me_key;
275 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000276 if (cmp < 0)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000277 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000278 if (ep0 == mp->ma_table && ep->me_key == startkey) {
279 if (cmp > 0)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +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 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +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];
Thomas Wouters4d70c3d2006-06-08 14:42:34 +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)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000302 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000303 if (ep->me_hash == hash && ep->me_key != dummy) {
Tim Peters453163d2001-06-03 04:54:32 +0000304 startkey = ep->me_key;
305 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000306 if (cmp < 0)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000307 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000308 if (ep0 == mp->ma_table && ep->me_key == startkey) {
309 if (cmp > 0)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000310 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000311 }
312 else {
313 /* The compare did major nasty stuff to the
314 * dict: start over.
315 * XXX A clever adversary could prevent this
316 * XXX from terminating.
317 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000318 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000319 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000320 }
Tim Peters342c65e2001-05-13 06:43:53 +0000321 else if (ep->me_key == dummy && freeslot == NULL)
322 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000323 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000324 assert(0); /* NOT REACHED */
325 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000326}
327
328/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000329 * Hacked up version of lookdict which can assume keys are always strings;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000330 * this assumption allows testing for errors during PyObject_RichCompareBool()
331 * to be dropped; string-string comparisons never raise exceptions. This also
332 * means we don't need to go through PyObject_RichCompareBool(); we can always
333 * use _PyString_Eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000334 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000335 * This is valuable because dicts with only string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000336 */
337static dictentry *
338lookdict_string(dictobject *mp, PyObject *key, register long hash)
339{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000340 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000341 register size_t perturb;
Fred Drake1bff34a2000-08-31 19:31:38 +0000342 register dictentry *freeslot;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000343 register size_t mask = (size_t)mp->ma_mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000344 dictentry *ep0 = mp->ma_table;
345 register dictentry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000346
Tim Peters0ab085c2001-09-14 00:25:33 +0000347 /* Make sure this function doesn't have to handle non-string keys,
348 including subclasses of str; e.g., one reason to subclass
349 strings is to override __eq__, and for speed we don't cater to
350 that here. */
351 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000352#ifdef SHOW_CONVERSION_COUNTS
353 ++converted;
354#endif
355 mp->ma_lookup = lookdict;
356 return lookdict(mp, key, hash);
357 }
Tim Peters2f228e72001-05-13 00:19:31 +0000358 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000359 ep = &ep0[i];
360 if (ep->me_key == NULL || ep->me_key == key)
361 return ep;
362 if (ep->me_key == dummy)
363 freeslot = ep;
364 else {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000365 if (ep->me_hash == hash && _PyString_Eq(ep->me_key, key))
Fred Drake1bff34a2000-08-31 19:31:38 +0000366 return ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000367 freeslot = NULL;
368 }
Tim Peters15d49292001-05-27 07:39:22 +0000369
Tim Peters342c65e2001-05-13 06:43:53 +0000370 /* In the loop, me_key == dummy is by far (factor of 100s) the
371 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000372 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
373 i = (i << 2) + i + perturb + 1;
374 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000375 if (ep->me_key == NULL)
376 return freeslot == NULL ? ep : freeslot;
377 if (ep->me_key == key
378 || (ep->me_hash == hash
379 && ep->me_key != dummy
Martin v. Löwiscd353062001-05-24 16:56:35 +0000380 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000381 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000382 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000383 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000384 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000385 assert(0); /* NOT REACHED */
386 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000387}
388
389/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000390Internal routine to insert a new item into the table.
391Used both by the internal resize routine and by the public insert routine.
392Eats a reference to key and one to value.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000393Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000394*/
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000395static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000396insertdict(register dictobject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000397{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000399 register dictentry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000400 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
401
402 assert(mp->ma_lookup != NULL);
403 ep = mp->ma_lookup(mp, key, hash);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000404 if (ep == NULL) {
405 Py_DECREF(key);
406 Py_DECREF(value);
407 return -1;
408 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000409 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000410 old_value = ep->me_value;
411 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412 Py_DECREF(old_value); /* which **CAN** re-enter */
413 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000414 }
415 else {
416 if (ep->me_key == NULL)
417 mp->ma_fill++;
Raymond Hettinger07ead172005-02-05 23:42:57 +0000418 else {
419 assert(ep->me_key == dummy);
420 Py_DECREF(dummy);
421 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000422 ep->me_key = key;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000423 ep->me_hash = (Py_ssize_t)hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000424 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000425 mp->ma_used++;
426 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000427 return 0;
428}
429
430/*
431Internal routine used by dictresize() to insert an item which is
432known to be absent from the dict. This routine also assumes that
433the dict contains no deleted entries. Besides the performance benefit,
434using insertdict() in dictresize() is dangerous (SF bug #1456209).
435Note that no refcounts are changed by this routine; if needed, the caller
436is responsible for incref'ing `key` and `value`.
437*/
438static void
439insertdict_clean(register dictobject *mp, PyObject *key, long hash,
440 PyObject *value)
441{
442 register size_t i;
443 register size_t perturb;
444 register size_t mask = (size_t)mp->ma_mask;
445 dictentry *ep0 = mp->ma_table;
446 register dictentry *ep;
447
448 i = hash & mask;
449 ep = &ep0[i];
450 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
451 i = (i << 2) + i + perturb + 1;
452 ep = &ep0[i & mask];
453 }
454 assert(ep->me_value == NULL);
455 mp->ma_fill++;
456 ep->me_key = key;
457 ep->me_hash = (Py_ssize_t)hash;
458 ep->me_value = value;
459 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000460}
461
462/*
463Restructure the table by allocating a new table and reinserting all
464items again. When entries have been deleted, the new table may
465actually be smaller than the old one.
466*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000467static int
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000468dictresize(dictobject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000469{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000470 Py_ssize_t newsize;
Tim Peters0c6010b2001-05-23 23:33:57 +0000471 dictentry *oldtable, *newtable, *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000472 Py_ssize_t i;
Tim Peters0c6010b2001-05-23 23:33:57 +0000473 int is_oldtable_malloced;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000474 dictentry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000475
476 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000477
Tim Peterseb28ef22001-06-02 05:27:19 +0000478 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000479 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000480 newsize <= minused && newsize > 0;
481 newsize <<= 1)
482 ;
483 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000485 return -1;
486 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000487
488 /* Get space for a new table. */
489 oldtable = mp->ma_table;
490 assert(oldtable != NULL);
491 is_oldtable_malloced = oldtable != mp->ma_smalltable;
492
Tim Peters6d6c1a32001-08-02 04:15:00 +0000493 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000494 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000495 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000496 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000497 if (mp->ma_fill == mp->ma_used) {
498 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000499 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000500 }
501 /* We're not going to resize it, but rebuild the
502 table anyway to purge old dummy entries.
503 Subtle: This is *necessary* if fill==size,
504 as lookdict needs at least one virgin slot to
505 terminate failing searches. If fill < size, it's
506 merely desirable, as dummies slow searches. */
507 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000508 memcpy(small_copy, oldtable, sizeof(small_copy));
509 oldtable = small_copy;
510 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000511 }
512 else {
513 newtable = PyMem_NEW(dictentry, newsize);
514 if (newtable == NULL) {
515 PyErr_NoMemory();
516 return -1;
517 }
518 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000519
520 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000521 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000522 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000523 mp->ma_mask = newsize - 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000524 memset(newtable, 0, sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000525 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000526 i = mp->ma_fill;
527 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000528
Tim Peters19283142001-05-17 22:25:34 +0000529 /* Copy the data over; this is refcount-neutral for active entries;
530 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000531 for (ep = oldtable; i > 0; ep++) {
532 if (ep->me_value != NULL) { /* active entry */
533 --i;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000534 insertdict_clean(mp, ep->me_key, (long)ep->me_hash,
535 ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000536 }
Tim Peters19283142001-05-17 22:25:34 +0000537 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000538 --i;
Tim Peters19283142001-05-17 22:25:34 +0000539 assert(ep->me_key == dummy);
540 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000541 }
Tim Peters19283142001-05-17 22:25:34 +0000542 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000543 }
544
Tim Peters0c6010b2001-05-23 23:33:57 +0000545 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000546 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000547 return 0;
548}
549
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000550/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
551 * that may occur (originally dicts supported only string keys, and exceptions
552 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000553 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000554 * (suppressed) occurred while computing the key's hash, or that some error
555 * (suppressed) occurred when comparing keys in the dict's internal probe
556 * sequence. A nasty example of the latter is when a Python-coded comparison
557 * function hits a stack-depth error, which can cause this to return NULL
558 * even if the key is present.
559 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000561PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000562{
563 long hash;
Fred Drake1bff34a2000-08-31 19:31:38 +0000564 dictobject *mp = (dictobject *)op;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000565 dictentry *ep;
566 PyThreadState *tstate;
567 if (!PyDict_Check(op))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000568 return NULL;
Tim Peters0ab085c2001-09-14 00:25:33 +0000569 if (!PyString_CheckExact(key) ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000571 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000573 if (hash == -1) {
574 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000575 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000576 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000577 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000578
579 /* We can arrive here with a NULL tstate during initialization:
580 try running "python -Wi" for an example related to string
581 interning. Let's just hope that no exception occurs then... */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000582 tstate = _PyThreadState_Current;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000583 if (tstate != NULL && tstate->curexc_type != NULL) {
584 /* preserve the existing exception */
585 PyObject *err_type, *err_value, *err_tb;
586 PyErr_Fetch(&err_type, &err_value, &err_tb);
587 ep = (mp->ma_lookup)(mp, key, hash);
588 /* ignore errors */
589 PyErr_Restore(err_type, err_value, err_tb);
590 if (ep == NULL)
591 return NULL;
592 }
593 else {
594 ep = (mp->ma_lookup)(mp, key, hash);
595 if (ep == NULL) {
596 PyErr_Clear();
597 return NULL;
598 }
599 }
600 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000601}
602
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000603/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
604 This returns NULL *with* an exception set if an exception occurred.
605 It returns NULL *without* an exception set if the key wasn't present.
606*/
607PyObject *
608PyDict_GetItemWithError(PyObject *op, PyObject *key)
609{
610 long hash;
611 dictobject *mp = (dictobject *)op;
612 dictentry *ep;
613
614 if (!PyDict_Check(op)) {
615 PyErr_BadInternalCall();
616 return NULL;
617 }
618 if (!PyString_CheckExact(key) ||
619 (hash = ((PyStringObject *) key)->ob_shash) == -1)
620 {
621 hash = PyObject_Hash(key);
622 if (hash == -1) {
623 return NULL;
624 }
625 }
626
627 ep = (mp->ma_lookup)(mp, key, hash);
628 if (ep == NULL)
629 return NULL;
630 return ep->me_value;
631}
632
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000633/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000634 * dictionary if it's merely replacing the value for an existing key.
635 * This means that it's safe to loop over a dictionary with PyDict_Next()
636 * and occasionally replace a value -- but you can't insert new keys or
637 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000638 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000639int
Tim Peters1f5871e2000-07-04 17:44:48 +0000640PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000641{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000642 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000643 register long hash;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000644 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000645
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 if (!PyDict_Check(op)) {
647 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000648 return -1;
649 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000650 assert(key);
651 assert(value);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000652 mp = (dictobject *)op;
Tim Peters0ab085c2001-09-14 00:25:33 +0000653 if (PyString_CheckExact(key)) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000654 hash = ((PyStringObject *)key)->ob_shash;
655 if (hash == -1)
656 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000657 }
Tim Peters1f7df352002-03-29 03:29:08 +0000658 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000660 if (hash == -1)
661 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000662 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000663 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000664 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 Py_INCREF(value);
666 Py_INCREF(key);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000667 if (insertdict(mp, key, hash, value) != 0)
668 return -1;
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000669 /* If we added a key, we can safely resize. Otherwise just return!
670 * If fill >= 2/3 size, adjust size. Normally, this doubles or
671 * quaduples the size, but it's also possible for the dict to shrink
Tim Peters60b29962006-01-01 01:19:23 +0000672 * (if ma_fill is much larger than ma_used, meaning a lot of dict
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000673 * keys have been * deleted).
Tim Peters60b29962006-01-01 01:19:23 +0000674 *
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000675 * Quadrupling the size improves average dictionary sparseness
676 * (reducing collisions) at the cost of some memory and iteration
677 * speed (which loops over every possible entry). It also halves
678 * the number of expensive resize operations in a growing dictionary.
Tim Peters60b29962006-01-01 01:19:23 +0000679 *
680 * Very large dictionaries (over 50K items) use doubling instead.
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000681 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000682 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000683 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
684 return 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000685 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000686}
687
688int
Tim Peters1f5871e2000-07-04 17:44:48 +0000689PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000690{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000691 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000692 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000693 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000695
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 if (!PyDict_Check(op)) {
697 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000698 return -1;
699 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000700 assert(key);
Tim Peters0ab085c2001-09-14 00:25:33 +0000701 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000702 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000704 if (hash == -1)
705 return -1;
706 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000707 mp = (dictobject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000708 ep = (mp->ma_lookup)(mp, key, hash);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000709 if (ep == NULL)
710 return -1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000711 if (ep->me_value == NULL) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000712 set_key_error(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000713 return -1;
714 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000715 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000717 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000718 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000719 ep->me_value = NULL;
720 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000721 Py_DECREF(old_value);
722 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000723 return 0;
724}
725
Guido van Rossum25831651993-05-19 14:50:45 +0000726void
Tim Peters1f5871e2000-07-04 17:44:48 +0000727PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000728{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000729 dictobject *mp;
Tim Petersdea48ec2001-05-22 20:40:22 +0000730 dictentry *ep, *table;
731 int table_is_malloced;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000732 Py_ssize_t fill;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000733 dictentry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000734#ifdef Py_DEBUG
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000735 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000736#endif
737
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000738 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000739 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000740 mp = (dictobject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000741#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000742 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000743 i = 0;
744#endif
745
746 table = mp->ma_table;
747 assert(table != NULL);
748 table_is_malloced = table != mp->ma_smalltable;
749
750 /* This is delicate. During the process of clearing the dict,
751 * decrefs can cause the dict to mutate. To avoid fatal confusion
752 * (voice of experience), we have to make the dict empty before
753 * clearing the slots, and never refer to anything via mp->xxx while
754 * clearing.
755 */
756 fill = mp->ma_fill;
757 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000758 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000759
760 else if (fill > 0) {
761 /* It's a small table with something that needs to be cleared.
762 * Afraid the only safe way is to copy the dict entries into
763 * another small table first.
764 */
765 memcpy(small_copy, table, sizeof(small_copy));
766 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000767 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000768 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000769 /* else it's a small table that's already empty */
770
771 /* Now we can finally clear things. If C had refcounts, we could
772 * assert that the refcount on table is 1 now, i.e. that this function
773 * has unique access to it, so decref side-effects can't alter it.
774 */
775 for (ep = table; fill > 0; ++ep) {
776#ifdef Py_DEBUG
777 assert(i < n);
778 ++i;
779#endif
780 if (ep->me_key) {
781 --fill;
782 Py_DECREF(ep->me_key);
783 Py_XDECREF(ep->me_value);
784 }
785#ifdef Py_DEBUG
786 else
787 assert(ep->me_value == NULL);
788#endif
789 }
790
791 if (table_is_malloced)
792 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000793}
794
Tim Peters080c88b2003-02-15 03:01:11 +0000795/*
796 * Iterate over a dict. Use like so:
797 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000798 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000799 * PyObject *key, *value;
800 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000801 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000802 * Refer to borrowed references in key and value.
803 * }
804 *
805 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000806 * mutates the dict. One exception: it is safe if the loop merely changes
807 * the values associated with the keys (but doesn't insert new keys or
808 * delete keys), via PyDict_SetItem().
809 */
Guido van Rossum25831651993-05-19 14:50:45 +0000810int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000811PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000812{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000813 register Py_ssize_t i;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000814 register Py_ssize_t mask;
Raymond Hettinger43442782004-03-17 21:55:03 +0000815 register dictentry *ep;
816
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000818 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000819 i = *ppos;
820 if (i < 0)
821 return 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000822 ep = ((dictobject *)op)->ma_table;
823 mask = ((dictobject *)op)->ma_mask;
824 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000825 i++;
826 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000827 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000828 return 0;
829 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000830 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000831 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000832 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000833 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000834}
835
Thomas Wouterscf297e42007-02-23 15:07:44 +0000836/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
837int
838_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, long *phash)
839{
840 register Py_ssize_t i;
841 register Py_ssize_t mask;
842 register dictentry *ep;
843
844 if (!PyDict_Check(op))
845 return 0;
846 i = *ppos;
847 if (i < 0)
848 return 0;
849 ep = ((dictobject *)op)->ma_table;
850 mask = ((dictobject *)op)->ma_mask;
851 while (i <= mask && ep[i].me_value == NULL)
852 i++;
853 *ppos = i+1;
854 if (i > mask)
855 return 0;
856 *phash = (long)(ep[i].me_hash);
857 if (pkey)
858 *pkey = ep[i].me_key;
859 if (pvalue)
860 *pvalue = ep[i].me_value;
861 return 1;
862}
863
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000864/* Methods */
865
866static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000867dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000868{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000869 register dictentry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000870 Py_ssize_t fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000871 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000872 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000873 for (ep = mp->ma_table; fill > 0; ep++) {
874 if (ep->me_key) {
875 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000877 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000878 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000879 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000880 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000881 PyMem_DEL(mp->ma_table);
Raymond Hettinger43442782004-03-17 21:55:03 +0000882 if (num_free_dicts < MAXFREEDICTS && mp->ob_type == &PyDict_Type)
883 free_dicts[num_free_dicts++] = mp;
Tim Peters60b29962006-01-01 01:19:23 +0000884 else
Raymond Hettinger43442782004-03-17 21:55:03 +0000885 mp->ob_type->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000886 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000887}
888
889static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000890dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000891{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000892 register Py_ssize_t i;
893 register Py_ssize_t any;
894 int status;
Guido van Rossum255443b1998-04-10 22:47:14 +0000895
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000896 status = Py_ReprEnter((PyObject*)mp);
897 if (status != 0) {
898 if (status < 0)
899 return status;
Guido van Rossum255443b1998-04-10 22:47:14 +0000900 fprintf(fp, "{...}");
901 return 0;
902 }
903
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000904 fprintf(fp, "{");
905 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000906 for (i = 0; i <= mp->ma_mask; i++) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000907 dictentry *ep = mp->ma_table + i;
908 PyObject *pvalue = ep->me_value;
909 if (pvalue != NULL) {
910 /* Prevent PyObject_Repr from deleting value during
911 key format */
912 Py_INCREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000913 if (any++ > 0)
914 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000915 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000916 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000917 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000918 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000919 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000920 fprintf(fp, ": ");
Tim Peters19b77cf2001-06-02 08:27:39 +0000921 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000922 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000923 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000924 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000925 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000926 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000927 }
928 }
929 fprintf(fp, "}");
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 *
Tim Peters1f5871e2000-07-04 17:44:48 +0000935dict_repr(dictobject *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
Tim Peters1f5871e2000-07-04 17:44:48 +00001014dict_length(dictobject *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 *
Tim Peters1f5871e2000-07-04 17:44:48 +00001020dict_subscript(dictobject *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;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001024 dictentry *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 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +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)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001042 missing_str =
Guido van Rossum1968ad32006-02-25 22:38:04 +00001043 PyString_InternFromString("__missing__");
Guido van Rossum4b92a822006-02-25 23:32:30 +00001044 missing = _PyType_Lookup(mp->ob_type, 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 }
Thomas Wouters89f507f2006-12-13 04:49:30 +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
Tim Peters1f5871e2000-07-04 17:44:48 +00001058dict_ass_sub(dictobject *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 *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001073dict_keys(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001074{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075 register PyObject *v;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001076 register Py_ssize_t i, j;
Raymond Hettinger43442782004-03-17 21:55:03 +00001077 dictentry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +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 *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001107dict_values(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001108{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109 register PyObject *v;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001110 register Py_ssize_t i, j;
Raymond Hettinger43442782004-03-17 21:55:03 +00001111 dictentry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +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 *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001141dict_items(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001142{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143 register PyObject *v;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +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;
Raymond Hettinger43442782004-03-17 21:55:03 +00001147 dictentry *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
Guido van Rossumd8faa362007-04-27 19:54:29 +00001208 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
1209 dictobject *mp = (dictobject *)d;
1210 Py_ssize_t pos = 0;
1211 PyObject *key;
1212 long hash;
1213
1214 if (dictresize(mp, PySet_GET_SIZE(seq)))
1215 return NULL;
1216
1217 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1218 Py_INCREF(key);
1219 Py_INCREF(value);
1220 if (insertdict(mp, key, hash, value))
1221 return NULL;
1222 }
1223 return d;
1224 }
1225
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001226 it = PyObject_GetIter(seq);
1227 if (it == NULL){
1228 Py_DECREF(d);
1229 return NULL;
1230 }
1231
1232 for (;;) {
1233 key = PyIter_Next(it);
1234 if (key == NULL) {
1235 if (PyErr_Occurred())
1236 goto Fail;
1237 break;
1238 }
Raymond Hettingere03e5b12002-12-07 08:10:51 +00001239 status = PyObject_SetItem(d, key, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001240 Py_DECREF(key);
1241 if (status < 0)
1242 goto Fail;
1243 }
1244
1245 Py_DECREF(it);
1246 return d;
1247
1248Fail:
1249 Py_DECREF(it);
1250 Py_DECREF(d);
1251 return NULL;
1252}
1253
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001254static int
1255dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001256{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001257 PyObject *arg = NULL;
1258 int result = 0;
1259
1260 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1261 result = -1;
1262
1263 else if (arg != NULL) {
1264 if (PyObject_HasAttrString(arg, "keys"))
1265 result = PyDict_Merge(self, arg, 1);
1266 else
1267 result = PyDict_MergeFromSeq2(self, arg, 1);
1268 }
1269 if (result == 0 && kwds != NULL)
1270 result = PyDict_Merge(self, kwds, 1);
1271 return result;
1272}
1273
1274static PyObject *
1275dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1276{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001277 if (dict_update_common(self, args, kwds, "update") != -1)
1278 Py_RETURN_NONE;
1279 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001280}
1281
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001282/* Update unconditionally replaces existing items.
1283 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001284 otherwise it leaves existing items unchanged.
1285
1286 PyDict_{Update,Merge} update/merge from a mapping object.
1287
Tim Petersf582b822001-12-11 18:51:08 +00001288 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001289 producing iterable objects of length 2.
1290*/
1291
Tim Petersf582b822001-12-11 18:51:08 +00001292int
Tim Peters1fc240e2001-10-26 05:06:50 +00001293PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1294{
1295 PyObject *it; /* iter(seq2) */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001296 Py_ssize_t i; /* index into seq2 of current element */
Tim Peters1fc240e2001-10-26 05:06:50 +00001297 PyObject *item; /* seq2[i] */
1298 PyObject *fast; /* item as a 2-tuple or 2-list */
1299
1300 assert(d != NULL);
1301 assert(PyDict_Check(d));
1302 assert(seq2 != NULL);
1303
1304 it = PyObject_GetIter(seq2);
1305 if (it == NULL)
1306 return -1;
1307
1308 for (i = 0; ; ++i) {
1309 PyObject *key, *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001310 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001311
1312 fast = NULL;
1313 item = PyIter_Next(it);
1314 if (item == NULL) {
1315 if (PyErr_Occurred())
1316 goto Fail;
1317 break;
1318 }
1319
1320 /* Convert item to sequence, and verify length 2. */
1321 fast = PySequence_Fast(item, "");
1322 if (fast == NULL) {
1323 if (PyErr_ExceptionMatches(PyExc_TypeError))
1324 PyErr_Format(PyExc_TypeError,
1325 "cannot convert dictionary update "
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001326 "sequence element #%zd to a sequence",
Tim Peters1fc240e2001-10-26 05:06:50 +00001327 i);
1328 goto Fail;
1329 }
1330 n = PySequence_Fast_GET_SIZE(fast);
1331 if (n != 2) {
1332 PyErr_Format(PyExc_ValueError,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001333 "dictionary update sequence element #%zd "
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00001334 "has length %zd; 2 is required",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00001335 i, n);
Tim Peters1fc240e2001-10-26 05:06:50 +00001336 goto Fail;
1337 }
1338
1339 /* Update/merge with this (key, value) pair. */
1340 key = PySequence_Fast_GET_ITEM(fast, 0);
1341 value = PySequence_Fast_GET_ITEM(fast, 1);
1342 if (override || PyDict_GetItem(d, key) == NULL) {
1343 int status = PyDict_SetItem(d, key, value);
1344 if (status < 0)
1345 goto Fail;
1346 }
1347 Py_DECREF(fast);
1348 Py_DECREF(item);
1349 }
1350
1351 i = 0;
1352 goto Return;
1353Fail:
1354 Py_XDECREF(item);
1355 Py_XDECREF(fast);
1356 i = -1;
1357Return:
1358 Py_DECREF(it);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001359 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001360}
1361
Tim Peters6d6c1a32001-08-02 04:15:00 +00001362int
1363PyDict_Update(PyObject *a, PyObject *b)
1364{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001365 return PyDict_Merge(a, b, 1);
1366}
1367
1368int
1369PyDict_Merge(PyObject *a, PyObject *b, int override)
1370{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001371 register PyDictObject *mp, *other;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001372 register Py_ssize_t i;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001373 dictentry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001374
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001375 /* We accept for the argument either a concrete dictionary object,
1376 * or an abstract "mapping" object. For the former, we can do
1377 * things quite efficiently. For the latter, we only require that
1378 * PyMapping_Keys() and PyObject_GetItem() be supported.
1379 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001380 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1381 PyErr_BadInternalCall();
1382 return -1;
1383 }
1384 mp = (dictobject*)a;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001385 if (PyDict_CheckExact(b)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001386 other = (dictobject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001387 if (other == mp || other->ma_used == 0)
1388 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001389 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001390 if (mp->ma_used == 0)
1391 /* Since the target dict is empty, PyDict_GetItem()
1392 * always returns NULL. Setting override to 1
1393 * skips the unnecessary test.
1394 */
1395 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001396 /* Do one big resize at the start, rather than
1397 * incrementally resizing as we insert new items. Expect
1398 * that there will be no (or few) overlapping keys.
1399 */
1400 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001401 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001402 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001403 }
1404 for (i = 0; i <= other->ma_mask; i++) {
1405 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001406 if (entry->me_value != NULL &&
1407 (override ||
1408 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001409 Py_INCREF(entry->me_key);
1410 Py_INCREF(entry->me_value);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001411 if (insertdict(mp, entry->me_key,
1412 (long)entry->me_hash,
1413 entry->me_value) != 0)
1414 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001415 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001416 }
1417 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001418 else {
1419 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001420 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001421 PyObject *iter;
1422 PyObject *key, *value;
1423 int status;
1424
1425 if (keys == NULL)
1426 /* Docstring says this is equivalent to E.keys() so
1427 * if E doesn't have a .keys() method we want
1428 * AttributeError to percolate up. Might as well
1429 * do the same for any other error.
1430 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001431 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001432
1433 iter = PyObject_GetIter(keys);
1434 Py_DECREF(keys);
1435 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001436 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001437
1438 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001439 if (!override && PyDict_GetItem(a, key) != NULL) {
1440 Py_DECREF(key);
1441 continue;
1442 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001443 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001444 if (value == NULL) {
1445 Py_DECREF(iter);
1446 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001447 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001448 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001449 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001450 Py_DECREF(key);
1451 Py_DECREF(value);
1452 if (status < 0) {
1453 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001454 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001455 }
1456 }
1457 Py_DECREF(iter);
1458 if (PyErr_Occurred())
1459 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001460 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001461 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001462 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001463}
1464
1465static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001466dict_copy(register dictobject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001467{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001468 return PyDict_Copy((PyObject*)mp);
1469}
1470
1471PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001472PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001473{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001474 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001475
1476 if (o == NULL || !PyDict_Check(o)) {
1477 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001478 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001479 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001480 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001481 if (copy == NULL)
1482 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001483 if (PyDict_Merge(copy, o, 1) == 0)
1484 return copy;
1485 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001486 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001487}
1488
Martin v. Löwis18e16552006-02-15 17:27:45 +00001489Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001490PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001491{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492 if (mp == NULL || !PyDict_Check(mp)) {
1493 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001494 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001495 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001496 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001497}
1498
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001499PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001500PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001501{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502 if (mp == NULL || !PyDict_Check(mp)) {
1503 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001504 return NULL;
1505 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001506 return dict_keys((dictobject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001507}
1508
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001510PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001511{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001512 if (mp == NULL || !PyDict_Check(mp)) {
1513 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001514 return NULL;
1515 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001516 return dict_values((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001517}
1518
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001519PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001520PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001521{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001522 if (mp == NULL || !PyDict_Check(mp)) {
1523 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001524 return NULL;
1525 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001526 return dict_items((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001527}
1528
Tim Peterse63415e2001-05-08 04:38:29 +00001529/* Return 1 if dicts equal, 0 if not, -1 if error.
1530 * Gets out as soon as any difference is detected.
1531 * Uses only Py_EQ comparison.
1532 */
1533static int
1534dict_equal(dictobject *a, dictobject *b)
1535{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001536 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001537
1538 if (a->ma_used != b->ma_used)
1539 /* can't be equal if # of entries differ */
1540 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001541
Tim Peterse63415e2001-05-08 04:38:29 +00001542 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001543 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001544 PyObject *aval = a->ma_table[i].me_value;
1545 if (aval != NULL) {
1546 int cmp;
1547 PyObject *bval;
1548 PyObject *key = a->ma_table[i].me_key;
1549 /* temporarily bump aval's refcount to ensure it stays
1550 alive until we're done with it */
1551 Py_INCREF(aval);
Guido van Rossumdc5f6b22006-08-24 21:29:26 +00001552 /* ditto for key */
1553 Py_INCREF(key);
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001554 bval = PyDict_GetItemWithError((PyObject *)b, key);
Guido van Rossumdc5f6b22006-08-24 21:29:26 +00001555 Py_DECREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001556 if (bval == NULL) {
1557 Py_DECREF(aval);
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001558 if (PyErr_Occurred())
1559 return -1;
Tim Peterse63415e2001-05-08 04:38:29 +00001560 return 0;
1561 }
1562 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1563 Py_DECREF(aval);
1564 if (cmp <= 0) /* error or not equal */
1565 return cmp;
1566 }
1567 }
1568 return 1;
1569 }
1570
1571static PyObject *
1572dict_richcompare(PyObject *v, PyObject *w, int op)
1573{
1574 int cmp;
1575 PyObject *res;
1576
1577 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1578 res = Py_NotImplemented;
1579 }
1580 else if (op == Py_EQ || op == Py_NE) {
1581 cmp = dict_equal((dictobject *)v, (dictobject *)w);
1582 if (cmp < 0)
1583 return NULL;
1584 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1585 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001586 else
1587 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001588 Py_INCREF(res);
1589 return res;
1590 }
1591
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001592static PyObject *
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001593dict_contains(register dictobject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001594{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001595 long hash;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001596 dictentry *ep;
1597
Tim Peters0ab085c2001-09-14 00:25:33 +00001598 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001599 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001600 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001601 if (hash == -1)
1602 return NULL;
1603 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001604 ep = (mp->ma_lookup)(mp, key, hash);
1605 if (ep == NULL)
1606 return NULL;
1607 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001608}
1609
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001610static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001611dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001612{
1613 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001614 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001615 PyObject *val = NULL;
1616 long hash;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001617 dictentry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001618
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001619 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001620 return NULL;
1621
Tim Peters0ab085c2001-09-14 00:25:33 +00001622 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001623 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001624 hash = PyObject_Hash(key);
1625 if (hash == -1)
1626 return NULL;
1627 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001628 ep = (mp->ma_lookup)(mp, key, hash);
1629 if (ep == NULL)
1630 return NULL;
1631 val = ep->me_value;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001632 if (val == NULL)
1633 val = failobj;
1634 Py_INCREF(val);
1635 return val;
1636}
1637
1638
1639static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001640dict_setdefault(register dictobject *mp, PyObject *args)
1641{
1642 PyObject *key;
1643 PyObject *failobj = Py_None;
1644 PyObject *val = NULL;
1645 long hash;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001646 dictentry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001647
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001648 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001649 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001650
Tim Peters0ab085c2001-09-14 00:25:33 +00001651 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001652 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001653 hash = PyObject_Hash(key);
1654 if (hash == -1)
1655 return NULL;
1656 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001657 ep = (mp->ma_lookup)(mp, key, hash);
1658 if (ep == NULL)
1659 return NULL;
1660 val = ep->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001661 if (val == NULL) {
1662 val = failobj;
1663 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1664 val = NULL;
1665 }
1666 Py_XINCREF(val);
1667 return val;
1668}
1669
1670
1671static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001672dict_clear(register dictobject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001673{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001674 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001675 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001676}
1677
Guido van Rossumba6ab842000-12-12 22:02:18 +00001678static PyObject *
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001679dict_pop(dictobject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001680{
1681 long hash;
1682 dictentry *ep;
1683 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001684 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001685
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001686 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1687 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001688 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001689 if (deflt) {
1690 Py_INCREF(deflt);
1691 return deflt;
1692 }
Guido van Rossume027d982002-04-12 15:11:59 +00001693 PyErr_SetString(PyExc_KeyError,
1694 "pop(): dictionary is empty");
1695 return NULL;
1696 }
1697 if (!PyString_CheckExact(key) ||
1698 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1699 hash = PyObject_Hash(key);
1700 if (hash == -1)
1701 return NULL;
1702 }
1703 ep = (mp->ma_lookup)(mp, key, hash);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001704 if (ep == NULL)
1705 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001706 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001707 if (deflt) {
1708 Py_INCREF(deflt);
1709 return deflt;
1710 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001711 set_key_error(key);
Guido van Rossume027d982002-04-12 15:11:59 +00001712 return NULL;
1713 }
1714 old_key = ep->me_key;
1715 Py_INCREF(dummy);
1716 ep->me_key = dummy;
1717 old_value = ep->me_value;
1718 ep->me_value = NULL;
1719 mp->ma_used--;
1720 Py_DECREF(old_key);
1721 return old_value;
1722}
1723
1724static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001725dict_popitem(dictobject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001726{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001727 Py_ssize_t i = 0;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001728 dictentry *ep;
1729 PyObject *res;
1730
Tim Petersf4b33f62001-06-02 05:42:29 +00001731 /* Allocate the result tuple before checking the size. Believe it
1732 * or not, this allocation could trigger a garbage collection which
1733 * could empty the dict, so if we checked the size first and that
1734 * happened, the result would be an infinite loop (searching for an
1735 * entry that no longer exists). Note that the usual popitem()
1736 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001737 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00001738 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001739 */
1740 res = PyTuple_New(2);
1741 if (res == NULL)
1742 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001743 if (mp->ma_used == 0) {
1744 Py_DECREF(res);
1745 PyErr_SetString(PyExc_KeyError,
1746 "popitem(): dictionary is empty");
1747 return NULL;
1748 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001749 /* Set ep to "the first" dict entry with a value. We abuse the hash
1750 * field of slot 0 to hold a search finger:
1751 * If slot 0 has a value, use slot 0.
1752 * Else slot 0 is being used to hold a search finger,
1753 * and we use its hash value as the first index to look.
1754 */
1755 ep = &mp->ma_table[0];
1756 if (ep->me_value == NULL) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001757 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001758 /* The hash field may be a real hash value, or it may be a
1759 * legit search finger, or it may be a once-legit search
1760 * finger that's out of bounds now because it wrapped around
1761 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001762 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001763 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001764 i = 1; /* skip slot 0 */
1765 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1766 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001767 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001768 i = 1;
1769 }
1770 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001771 PyTuple_SET_ITEM(res, 0, ep->me_key);
1772 PyTuple_SET_ITEM(res, 1, ep->me_value);
1773 Py_INCREF(dummy);
1774 ep->me_key = dummy;
1775 ep->me_value = NULL;
1776 mp->ma_used--;
1777 assert(mp->ma_table[0].me_value == NULL);
1778 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001779 return res;
1780}
1781
Jeremy Hylton8caad492000-06-23 14:18:11 +00001782static int
1783dict_traverse(PyObject *op, visitproc visit, void *arg)
1784{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001785 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001786 PyObject *pk;
1787 PyObject *pv;
1788
1789 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001790 Py_VISIT(pk);
1791 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00001792 }
1793 return 0;
1794}
1795
1796static int
1797dict_tp_clear(PyObject *op)
1798{
1799 PyDict_Clear(op);
1800 return 0;
1801}
1802
Tim Petersf7f88b12000-12-13 23:18:45 +00001803
Raymond Hettinger019a1482004-03-18 02:41:19 +00001804extern PyTypeObject PyDictIterKey_Type; /* Forward */
1805extern PyTypeObject PyDictIterValue_Type; /* Forward */
1806extern PyTypeObject PyDictIterItem_Type; /* Forward */
1807static PyObject *dictiter_new(dictobject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001808
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001809#if 0
Guido van Rossum09e563a2001-05-01 12:10:21 +00001810static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001811dict_iterkeys(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001812{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001813 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001814}
1815
1816static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001817dict_itervalues(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001818{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001819 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001820}
1821
1822static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001823dict_iteritems(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001824{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001825 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001826}
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001827#endif
Guido van Rossum09e563a2001-05-01 12:10:21 +00001828
1829
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001830PyDoc_STRVAR(contains__doc__,
1831"D.__contains__(k) -> True if D has a key k, else False");
1832
1833PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1834
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001835PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001836"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001837
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001838PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001839"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 +00001840
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001841PyDoc_STRVAR(pop__doc__,
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001842"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
1843If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001844
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001845PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001846"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000018472-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00001848
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001849#if 0
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001850PyDoc_STRVAR(keys__doc__,
1851"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00001852
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001853PyDoc_STRVAR(items__doc__,
1854"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00001855
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001856PyDoc_STRVAR(values__doc__,
1857"D.values() -> list of D's values");
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001858#endif
Tim Petersf7f88b12000-12-13 23:18:45 +00001859
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001860PyDoc_STRVAR(update__doc__,
Guido van Rossumb90c8482007-02-10 01:11:45 +00001861"D.update(E, **F) -> None. Update D from E and F: for k in E: D[k] = E[k]\
1862\n(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 +00001863
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001864PyDoc_STRVAR(fromkeys__doc__,
1865"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1866v defaults to None.");
1867
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001868PyDoc_STRVAR(clear__doc__,
1869"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001870
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001871PyDoc_STRVAR(copy__doc__,
1872"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001873
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001874#if 0
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001875PyDoc_STRVAR(iterkeys__doc__,
1876"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001877
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001878PyDoc_STRVAR(itervalues__doc__,
1879"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001880
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001881PyDoc_STRVAR(iteritems__doc__,
1882"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001883#endif
Guido van Rossum09e563a2001-05-01 12:10:21 +00001884
Guido van Rossumb90c8482007-02-10 01:11:45 +00001885/* Forward */
1886static PyObject *dictkeys_new(PyObject *);
1887static PyObject *dictitems_new(PyObject *);
1888static PyObject *dictvalues_new(PyObject *);
1889
Guido van Rossumeff072c2007-02-27 05:47:18 +00001890PyDoc_STRVAR(keys__doc__, "D.keys() -> a set-like object for D's keys");
1891PyDoc_STRVAR(items__doc__, "D.items() -> a set-like object for D's items");
1892PyDoc_STRVAR(values__doc__, "D.values() -> a set-like object for D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00001893
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001894static PyMethodDef mapp_methods[] = {
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001895 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001896 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00001897 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001898 getitem__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00001899 {"get", (PyCFunction)dict_get, METH_VARARGS,
1900 get__doc__},
1901 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1902 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001903 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00001904 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001905 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001906 popitem__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001907#if 0
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001908 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001909 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001910 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001911 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001912 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001913 values__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001914#endif
1915 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
Guido van Rossumeff072c2007-02-27 05:47:18 +00001916 keys__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001917 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
Guido van Rossumeff072c2007-02-27 05:47:18 +00001918 items__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001919 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
Guido van Rossumeff072c2007-02-27 05:47:18 +00001920 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001921 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001922 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001923 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
1924 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001925 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001926 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001927 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001928 copy__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001929#if 0
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001930 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001931 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001932 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001933 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001934 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001935 iteritems__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001936#endif
Tim Petersf7f88b12000-12-13 23:18:45 +00001937 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001938};
1939
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001940/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001941int
1942PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001943{
1944 long hash;
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00001945 dictobject *mp = (dictobject *)op;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001946 dictentry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001947
Tim Peters0ab085c2001-09-14 00:25:33 +00001948 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001949 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001950 hash = PyObject_Hash(key);
1951 if (hash == -1)
1952 return -1;
1953 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001954 ep = (mp->ma_lookup)(mp, key, hash);
1955 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001956}
1957
Thomas Wouterscf297e42007-02-23 15:07:44 +00001958/* Internal version of PyDict_Contains used when the hash value is already known */
1959int
1960_PyDict_Contains(PyObject *op, PyObject *key, long hash)
1961{
1962 dictobject *mp = (dictobject *)op;
1963 dictentry *ep;
1964
1965 ep = (mp->ma_lookup)(mp, key, hash);
1966 return ep == NULL ? -1 : (ep->me_value != NULL);
1967}
1968
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001969/* Hack to implement "key in dict" */
1970static PySequenceMethods dict_as_sequence = {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001971 0, /* sq_length */
1972 0, /* sq_concat */
1973 0, /* sq_repeat */
1974 0, /* sq_item */
1975 0, /* sq_slice */
1976 0, /* sq_ass_item */
1977 0, /* sq_ass_slice */
1978 PyDict_Contains, /* sq_contains */
1979 0, /* sq_inplace_concat */
1980 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001981};
1982
Guido van Rossum09e563a2001-05-01 12:10:21 +00001983static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001984dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1985{
1986 PyObject *self;
1987
1988 assert(type != NULL && type->tp_alloc != NULL);
1989 self = type->tp_alloc(type, 0);
1990 if (self != NULL) {
1991 PyDictObject *d = (PyDictObject *)self;
1992 /* It's guaranteed that tp->alloc zeroed out the struct. */
1993 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
1994 INIT_NONZERO_DICT_SLOTS(d);
1995 d->ma_lookup = lookdict_string;
1996#ifdef SHOW_CONVERSION_COUNTS
1997 ++created;
1998#endif
1999 }
2000 return self;
2001}
2002
Tim Peters25786c02001-09-02 08:22:48 +00002003static int
2004dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2005{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002006 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002007}
2008
Tim Peters6d6c1a32001-08-02 04:15:00 +00002009static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00002010dict_iter(dictobject *dict)
2011{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002012 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002013}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002014
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002015PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00002016"dict() -> new empty dictionary.\n"
2017"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00002018" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002019"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002020" d = {}\n"
2021" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002022" d[k] = v\n"
2023"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2024" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002025
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002026PyTypeObject PyDict_Type = {
2027 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002028 0,
Tim Petersa427a2b2001-10-29 22:25:45 +00002029 "dict",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002030 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002031 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00002032 (destructor)dict_dealloc, /* tp_dealloc */
2033 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002034 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00002035 0, /* tp_setattr */
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002036 0, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00002037 (reprfunc)dict_repr, /* tp_repr */
2038 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002039 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00002040 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002041 0, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00002042 0, /* tp_call */
2043 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002044 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00002045 0, /* tp_setattro */
2046 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002047 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +00002048 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00002049 dictionary_doc, /* tp_doc */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002050 dict_traverse, /* tp_traverse */
2051 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00002052 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002053 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00002054 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002055 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002056 mapp_methods, /* tp_methods */
2057 0, /* tp_members */
2058 0, /* tp_getset */
2059 0, /* tp_base */
2060 0, /* tp_dict */
2061 0, /* tp_descr_get */
2062 0, /* tp_descr_set */
2063 0, /* tp_dictoffset */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002064 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002065 PyType_GenericAlloc, /* tp_alloc */
2066 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002067 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002068};
2069
Guido van Rossum3cca2451997-05-16 14:23:33 +00002070/* For backward compatibility with old dictionary interface */
2071
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002072PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002073PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002074{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002075 PyObject *kv, *rv;
2076 kv = PyString_FromString(key);
2077 if (kv == NULL)
2078 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002079 rv = PyDict_GetItem(v, kv);
2080 Py_DECREF(kv);
2081 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002082}
2083
2084int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002085PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002086{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002087 PyObject *kv;
2088 int err;
2089 kv = PyString_FromString(key);
2090 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002091 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00002092 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002093 err = PyDict_SetItem(v, kv, item);
2094 Py_DECREF(kv);
2095 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002096}
2097
2098int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002099PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002100{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002101 PyObject *kv;
2102 int err;
2103 kv = PyString_FromString(key);
2104 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002105 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002106 err = PyDict_DelItem(v, kv);
2107 Py_DECREF(kv);
2108 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002109}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002110
Raymond Hettinger019a1482004-03-18 02:41:19 +00002111/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002112
2113typedef struct {
2114 PyObject_HEAD
Guido van Rossum2147df72002-07-16 20:30:22 +00002115 dictobject *di_dict; /* Set to NULL when iterator is exhausted */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002116 Py_ssize_t di_used;
2117 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002118 PyObject* di_result; /* reusable result tuple for iteritems */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002119 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002120} dictiterobject;
2121
2122static PyObject *
Raymond Hettinger019a1482004-03-18 02:41:19 +00002123dictiter_new(dictobject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002124{
2125 dictiterobject *di;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002126 di = PyObject_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002127 if (di == NULL)
2128 return NULL;
2129 Py_INCREF(dict);
2130 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002131 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002132 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002133 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002134 if (itertype == &PyDictIterItem_Type) {
2135 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2136 if (di->di_result == NULL) {
2137 Py_DECREF(di);
2138 return NULL;
2139 }
2140 }
2141 else
2142 di->di_result = NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002143 return (PyObject *)di;
2144}
2145
2146static void
2147dictiter_dealloc(dictiterobject *di)
2148{
Guido van Rossum2147df72002-07-16 20:30:22 +00002149 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002150 Py_XDECREF(di->di_result);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002151 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002152}
2153
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002154static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002155dictiter_len(dictiterobject *di)
2156{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002157 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002158 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002159 len = di->len;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002160 return PyInt_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002161}
2162
Guido van Rossumb90c8482007-02-10 01:11:45 +00002163PyDoc_STRVAR(length_hint_doc,
2164 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002165
2166static PyMethodDef dictiter_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002167 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2168 length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002169 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002170};
2171
Raymond Hettinger019a1482004-03-18 02:41:19 +00002172static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002173{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002174 PyObject *key;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002175 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002176 register dictentry *ep;
2177 dictobject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002178
Raymond Hettinger019a1482004-03-18 02:41:19 +00002179 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002180 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002181 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002182
Raymond Hettinger019a1482004-03-18 02:41:19 +00002183 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002184 PyErr_SetString(PyExc_RuntimeError,
2185 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002186 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002187 return NULL;
2188 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002189
Raymond Hettinger019a1482004-03-18 02:41:19 +00002190 i = di->di_pos;
2191 if (i < 0)
2192 goto fail;
2193 ep = d->ma_table;
2194 mask = d->ma_mask;
2195 while (i <= mask && ep[i].me_value == NULL)
2196 i++;
2197 di->di_pos = i+1;
2198 if (i > mask)
2199 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002200 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002201 key = ep[i].me_key;
2202 Py_INCREF(key);
2203 return key;
2204
2205fail:
2206 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002207 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002208 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002209}
2210
Raymond Hettinger019a1482004-03-18 02:41:19 +00002211PyTypeObject PyDictIterKey_Type = {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002212 PyObject_HEAD_INIT(&PyType_Type)
2213 0, /* ob_size */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002214 "dictionary-keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002215 sizeof(dictiterobject), /* tp_basicsize */
2216 0, /* tp_itemsize */
2217 /* methods */
2218 (destructor)dictiter_dealloc, /* tp_dealloc */
2219 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002220 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002221 0, /* tp_setattr */
2222 0, /* tp_compare */
2223 0, /* tp_repr */
2224 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002225 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002226 0, /* tp_as_mapping */
2227 0, /* tp_hash */
2228 0, /* tp_call */
2229 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002230 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002231 0, /* tp_setattro */
2232 0, /* tp_as_buffer */
2233 Py_TPFLAGS_DEFAULT, /* tp_flags */
2234 0, /* tp_doc */
2235 0, /* tp_traverse */
2236 0, /* tp_clear */
2237 0, /* tp_richcompare */
2238 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002239 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002240 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002241 dictiter_methods, /* tp_methods */
2242 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002243};
2244
2245static PyObject *dictiter_iternextvalue(dictiterobject *di)
2246{
2247 PyObject *value;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002248 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002249 register dictentry *ep;
2250 dictobject *d = di->di_dict;
2251
2252 if (d == NULL)
2253 return NULL;
2254 assert (PyDict_Check(d));
2255
2256 if (di->di_used != d->ma_used) {
2257 PyErr_SetString(PyExc_RuntimeError,
2258 "dictionary changed size during iteration");
2259 di->di_used = -1; /* Make this state sticky */
2260 return NULL;
2261 }
2262
2263 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002264 mask = d->ma_mask;
2265 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002266 goto fail;
2267 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002268 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002269 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002270 if (i > mask)
2271 goto fail;
2272 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002273 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002274 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002275 Py_INCREF(value);
2276 return value;
2277
2278fail:
2279 Py_DECREF(d);
2280 di->di_dict = NULL;
2281 return NULL;
2282}
2283
2284PyTypeObject PyDictIterValue_Type = {
2285 PyObject_HEAD_INIT(&PyType_Type)
2286 0, /* ob_size */
2287 "dictionary-valueiterator", /* tp_name */
2288 sizeof(dictiterobject), /* tp_basicsize */
2289 0, /* tp_itemsize */
2290 /* methods */
2291 (destructor)dictiter_dealloc, /* tp_dealloc */
2292 0, /* tp_print */
2293 0, /* tp_getattr */
2294 0, /* tp_setattr */
2295 0, /* tp_compare */
2296 0, /* tp_repr */
2297 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002298 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002299 0, /* tp_as_mapping */
2300 0, /* tp_hash */
2301 0, /* tp_call */
2302 0, /* tp_str */
2303 PyObject_GenericGetAttr, /* tp_getattro */
2304 0, /* tp_setattro */
2305 0, /* tp_as_buffer */
2306 Py_TPFLAGS_DEFAULT, /* tp_flags */
2307 0, /* tp_doc */
2308 0, /* tp_traverse */
2309 0, /* tp_clear */
2310 0, /* tp_richcompare */
2311 0, /* tp_weaklistoffset */
2312 PyObject_SelfIter, /* tp_iter */
2313 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002314 dictiter_methods, /* tp_methods */
2315 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002316};
2317
2318static PyObject *dictiter_iternextitem(dictiterobject *di)
2319{
2320 PyObject *key, *value, *result = di->di_result;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002321 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002322 register dictentry *ep;
2323 dictobject *d = di->di_dict;
2324
2325 if (d == NULL)
2326 return NULL;
2327 assert (PyDict_Check(d));
2328
2329 if (di->di_used != d->ma_used) {
2330 PyErr_SetString(PyExc_RuntimeError,
2331 "dictionary changed size during iteration");
2332 di->di_used = -1; /* Make this state sticky */
2333 return NULL;
2334 }
2335
2336 i = di->di_pos;
2337 if (i < 0)
2338 goto fail;
2339 ep = d->ma_table;
2340 mask = d->ma_mask;
2341 while (i <= mask && ep[i].me_value == NULL)
2342 i++;
2343 di->di_pos = i+1;
2344 if (i > mask)
2345 goto fail;
2346
2347 if (result->ob_refcnt == 1) {
2348 Py_INCREF(result);
2349 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2350 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2351 } else {
2352 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002353 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002354 return NULL;
2355 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002356 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002357 key = ep[i].me_key;
2358 value = ep[i].me_value;
2359 Py_INCREF(key);
2360 Py_INCREF(value);
2361 PyTuple_SET_ITEM(result, 0, key);
2362 PyTuple_SET_ITEM(result, 1, value);
2363 return result;
2364
2365fail:
2366 Py_DECREF(d);
2367 di->di_dict = NULL;
2368 return NULL;
2369}
2370
2371PyTypeObject PyDictIterItem_Type = {
2372 PyObject_HEAD_INIT(&PyType_Type)
2373 0, /* ob_size */
2374 "dictionary-itemiterator", /* tp_name */
2375 sizeof(dictiterobject), /* tp_basicsize */
2376 0, /* tp_itemsize */
2377 /* methods */
2378 (destructor)dictiter_dealloc, /* tp_dealloc */
2379 0, /* tp_print */
2380 0, /* tp_getattr */
2381 0, /* tp_setattr */
2382 0, /* tp_compare */
2383 0, /* tp_repr */
2384 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002385 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002386 0, /* tp_as_mapping */
2387 0, /* tp_hash */
2388 0, /* tp_call */
2389 0, /* tp_str */
2390 PyObject_GenericGetAttr, /* tp_getattro */
2391 0, /* tp_setattro */
2392 0, /* tp_as_buffer */
2393 Py_TPFLAGS_DEFAULT, /* tp_flags */
2394 0, /* tp_doc */
2395 0, /* tp_traverse */
2396 0, /* tp_clear */
2397 0, /* tp_richcompare */
2398 0, /* tp_weaklistoffset */
2399 PyObject_SelfIter, /* tp_iter */
2400 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002401 dictiter_methods, /* tp_methods */
2402 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002403};
Guido van Rossumb90c8482007-02-10 01:11:45 +00002404
2405
Guido van Rossum3ac67412007-02-10 18:55:06 +00002406/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002407/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002408/***********************************************/
2409
Guido van Rossumb90c8482007-02-10 01:11:45 +00002410/* The instance lay-out is the same for all three; but the type differs. */
2411
2412typedef struct {
2413 PyObject_HEAD
Guido van Rossum3ac67412007-02-10 18:55:06 +00002414 dictobject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002415} dictviewobject;
2416
2417
2418static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00002419dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002420{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002421 Py_XDECREF(dv->dv_dict);
2422 PyObject_Del(dv);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002423}
2424
Guido van Rossum83825ac2007-02-10 04:54:19 +00002425static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00002426dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002427{
2428 Py_ssize_t len = 0;
Guido van Rossum3ac67412007-02-10 18:55:06 +00002429 if (dv->dv_dict != NULL)
2430 len = dv->dv_dict->ma_used;
Guido van Rossum83825ac2007-02-10 04:54:19 +00002431 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002432}
2433
2434static PyObject *
2435dictview_new(PyObject *dict, PyTypeObject *type)
2436{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002437 dictviewobject *dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002438 if (dict == NULL) {
2439 PyErr_BadInternalCall();
2440 return NULL;
2441 }
2442 if (!PyDict_Check(dict)) {
2443 /* XXX Get rid of this restriction later */
2444 PyErr_Format(PyExc_TypeError,
2445 "%s() requires a dict argument, not '%s'",
2446 type->tp_name, dict->ob_type->tp_name);
2447 return NULL;
2448 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002449 dv = PyObject_New(dictviewobject, type);
2450 if (dv == NULL)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002451 return NULL;
2452 Py_INCREF(dict);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002453 dv->dv_dict = (dictobject *)dict;
2454 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002455}
2456
Neal Norwitze36f2ba2007-02-26 23:12:28 +00002457/* TODO(guido): The views objects are not complete:
2458
2459 * support more set operations
2460 * support arbitrary mappings?
2461 - either these should be static or exported in dictobject.h
2462 - if public then they should probably be in builtins
2463*/
2464
Guido van Rossumd9214d12007-02-12 02:23:40 +00002465/* Forward */
2466PyTypeObject PyDictKeys_Type;
2467PyTypeObject PyDictItems_Type;
2468PyTypeObject PyDictValues_Type;
2469
2470#define PyDictKeys_Check(obj) ((obj)->ob_type == &PyDictKeys_Type)
2471#define PyDictItems_Check(obj) ((obj)->ob_type == &PyDictItems_Type)
2472#define PyDictValues_Check(obj) ((obj)->ob_type == &PyDictValues_Type)
2473
2474/* This excludes Values, since they are not sets. */
2475# define PyDictViewSet_Check(obj) \
2476 (PyDictKeys_Check(obj) || PyDictItems_Check(obj))
2477
2478static int
2479all_contained_in(PyObject *self, PyObject *other)
2480{
2481 PyObject *iter = PyObject_GetIter(self);
2482 int ok = 1;
2483
2484 if (iter == NULL)
2485 return -1;
2486 for (;;) {
2487 PyObject *next = PyIter_Next(iter);
2488 if (next == NULL) {
2489 if (PyErr_Occurred())
2490 ok = -1;
2491 break;
2492 }
2493 ok = PySequence_Contains(other, next);
2494 Py_DECREF(next);
2495 if (ok <= 0)
2496 break;
2497 }
2498 Py_DECREF(iter);
2499 return ok;
2500}
2501
2502static PyObject *
2503dictview_richcompare(PyObject *self, PyObject *other, int op)
2504{
2505 assert(self != NULL);
2506 assert(PyDictViewSet_Check(self));
2507 assert(other != NULL);
2508 if ((op == Py_EQ || op == Py_NE) &&
2509 (PyAnySet_Check(other) || PyDictViewSet_Check(other)))
2510 {
2511 Py_ssize_t len_self, len_other;
2512 int ok;
2513 PyObject *result;
2514
2515 len_self = PyObject_Size(self);
2516 if (len_self < 0)
2517 return NULL;
2518 len_other = PyObject_Size(other);
2519 if (len_other < 0)
2520 return NULL;
2521 if (len_self != len_other)
2522 ok = 0;
2523 else if (len_self == 0)
2524 ok = 1;
2525 else
2526 ok = all_contained_in(self, other);
2527 if (ok < 0)
2528 return NULL;
2529 if (ok == (op == Py_EQ))
2530 result = Py_True;
2531 else
2532 result = Py_False;
2533 Py_INCREF(result);
2534 return result;
2535 }
2536 else {
2537 Py_INCREF(Py_NotImplemented);
2538 return Py_NotImplemented;
2539 }
2540}
2541
Guido van Rossum3ac67412007-02-10 18:55:06 +00002542/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002543
2544static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002545dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002546{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002547 if (dv->dv_dict == NULL) {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002548 Py_RETURN_NONE;
2549 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002550 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
2551}
2552
2553static int
2554dictkeys_contains(dictviewobject *dv, PyObject *obj)
2555{
2556 if (dv->dv_dict == NULL)
2557 return 0;
2558 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002559}
2560
Guido van Rossum83825ac2007-02-10 04:54:19 +00002561static PySequenceMethods dictkeys_as_sequence = {
2562 (lenfunc)dictview_len, /* sq_length */
2563 0, /* sq_concat */
2564 0, /* sq_repeat */
2565 0, /* sq_item */
2566 0, /* sq_slice */
2567 0, /* sq_ass_item */
2568 0, /* sq_ass_slice */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002569 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002570};
2571
Guido van Rossumb90c8482007-02-10 01:11:45 +00002572static PyMethodDef dictkeys_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002573 {NULL, NULL} /* sentinel */
2574};
2575
2576PyTypeObject PyDictKeys_Type = {
2577 PyObject_HEAD_INIT(&PyType_Type)
2578 0, /* ob_size */
2579 "dict_keys", /* tp_name */
2580 sizeof(dictviewobject), /* tp_basicsize */
2581 0, /* tp_itemsize */
2582 /* methods */
2583 (destructor)dictview_dealloc, /* tp_dealloc */
2584 0, /* tp_print */
2585 0, /* tp_getattr */
2586 0, /* tp_setattr */
2587 0, /* tp_compare */
2588 0, /* tp_repr */
2589 0, /* tp_as_number */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002590 &dictkeys_as_sequence, /* tp_as_sequence */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002591 0, /* tp_as_mapping */
2592 0, /* tp_hash */
2593 0, /* tp_call */
2594 0, /* tp_str */
2595 PyObject_GenericGetAttr, /* tp_getattro */
2596 0, /* tp_setattro */
2597 0, /* tp_as_buffer */
2598 Py_TPFLAGS_DEFAULT, /* tp_flags */
2599 0, /* tp_doc */
2600 0, /* tp_traverse */
2601 0, /* tp_clear */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002602 dictview_richcompare, /* tp_richcompare */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002603 0, /* tp_weaklistoffset */
2604 (getiterfunc)dictkeys_iter, /* tp_iter */
2605 0, /* tp_iternext */
2606 dictkeys_methods, /* tp_methods */
2607 0,
2608};
2609
2610static PyObject *
2611dictkeys_new(PyObject *dict)
2612{
2613 return dictview_new(dict, &PyDictKeys_Type);
2614}
2615
Guido van Rossum3ac67412007-02-10 18:55:06 +00002616/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002617
2618static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002619dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002620{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002621 if (dv->dv_dict == NULL) {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002622 Py_RETURN_NONE;
2623 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002624 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
2625}
2626
2627static int
2628dictitems_contains(dictviewobject *dv, PyObject *obj)
2629{
2630 PyObject *key, *value, *found;
2631 if (dv->dv_dict == NULL)
2632 return 0;
2633 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
2634 return 0;
2635 key = PyTuple_GET_ITEM(obj, 0);
2636 value = PyTuple_GET_ITEM(obj, 1);
2637 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
2638 if (found == NULL) {
2639 if (PyErr_Occurred())
2640 return -1;
2641 return 0;
2642 }
2643 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002644}
2645
Guido van Rossum83825ac2007-02-10 04:54:19 +00002646static PySequenceMethods dictitems_as_sequence = {
2647 (lenfunc)dictview_len, /* sq_length */
2648 0, /* sq_concat */
2649 0, /* sq_repeat */
2650 0, /* sq_item */
2651 0, /* sq_slice */
2652 0, /* sq_ass_item */
2653 0, /* sq_ass_slice */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002654 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002655};
2656
Guido van Rossumb90c8482007-02-10 01:11:45 +00002657static PyMethodDef dictitems_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002658 {NULL, NULL} /* sentinel */
2659};
2660
2661PyTypeObject PyDictItems_Type = {
2662 PyObject_HEAD_INIT(&PyType_Type)
2663 0, /* ob_size */
2664 "dict_items", /* tp_name */
2665 sizeof(dictviewobject), /* tp_basicsize */
2666 0, /* tp_itemsize */
2667 /* methods */
2668 (destructor)dictview_dealloc, /* tp_dealloc */
2669 0, /* tp_print */
2670 0, /* tp_getattr */
2671 0, /* tp_setattr */
2672 0, /* tp_compare */
2673 0, /* tp_repr */
2674 0, /* tp_as_number */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002675 &dictitems_as_sequence, /* tp_as_sequence */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002676 0, /* tp_as_mapping */
2677 0, /* tp_hash */
2678 0, /* tp_call */
2679 0, /* tp_str */
2680 PyObject_GenericGetAttr, /* tp_getattro */
2681 0, /* tp_setattro */
2682 0, /* tp_as_buffer */
2683 Py_TPFLAGS_DEFAULT, /* tp_flags */
2684 0, /* tp_doc */
2685 0, /* tp_traverse */
2686 0, /* tp_clear */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002687 dictview_richcompare, /* tp_richcompare */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002688 0, /* tp_weaklistoffset */
2689 (getiterfunc)dictitems_iter, /* tp_iter */
2690 0, /* tp_iternext */
2691 dictitems_methods, /* tp_methods */
2692 0,
2693};
2694
2695static PyObject *
2696dictitems_new(PyObject *dict)
2697{
2698 return dictview_new(dict, &PyDictItems_Type);
2699}
2700
Guido van Rossum3ac67412007-02-10 18:55:06 +00002701/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002702
2703static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002704dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002705{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002706 if (dv->dv_dict == NULL) {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002707 Py_RETURN_NONE;
2708 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002709 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002710}
2711
Guido van Rossum83825ac2007-02-10 04:54:19 +00002712static PySequenceMethods dictvalues_as_sequence = {
2713 (lenfunc)dictview_len, /* sq_length */
2714 0, /* sq_concat */
2715 0, /* sq_repeat */
2716 0, /* sq_item */
2717 0, /* sq_slice */
2718 0, /* sq_ass_item */
2719 0, /* sq_ass_slice */
2720 (objobjproc)0, /* sq_contains */
2721};
2722
Guido van Rossumb90c8482007-02-10 01:11:45 +00002723static PyMethodDef dictvalues_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002724 {NULL, NULL} /* sentinel */
2725};
2726
2727PyTypeObject PyDictValues_Type = {
2728 PyObject_HEAD_INIT(&PyType_Type)
2729 0, /* ob_size */
2730 "dict_values", /* tp_name */
2731 sizeof(dictviewobject), /* tp_basicsize */
2732 0, /* tp_itemsize */
2733 /* methods */
2734 (destructor)dictview_dealloc, /* tp_dealloc */
2735 0, /* tp_print */
2736 0, /* tp_getattr */
2737 0, /* tp_setattr */
2738 0, /* tp_compare */
2739 0, /* tp_repr */
2740 0, /* tp_as_number */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002741 &dictvalues_as_sequence, /* tp_as_sequence */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002742 0, /* tp_as_mapping */
2743 0, /* tp_hash */
2744 0, /* tp_call */
2745 0, /* tp_str */
2746 PyObject_GenericGetAttr, /* tp_getattro */
2747 0, /* tp_setattro */
2748 0, /* tp_as_buffer */
2749 Py_TPFLAGS_DEFAULT, /* tp_flags */
2750 0, /* tp_doc */
2751 0, /* tp_traverse */
2752 0, /* tp_clear */
2753 0, /* tp_richcompare */
2754 0, /* tp_weaklistoffset */
2755 (getiterfunc)dictvalues_iter, /* tp_iter */
2756 0, /* tp_iternext */
2757 dictvalues_methods, /* tp_methods */
2758 0,
2759};
2760
2761static PyObject *
2762dictvalues_new(PyObject *dict)
2763{
2764 return dictview_new(dict, &PyDictValues_Type);
2765}