blob: 79894e56049781dc239149d4ac251d51a6679bb4 [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"
Christian Heimes0ded5b52007-12-10 15:50:56 +000011#include "stringlib/eq.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000012
Guido van Rossum16e93a81997-01-28 00:00:11 +000013
Thomas Wouters89f507f2006-12-13 04:49:30 +000014/* Set a key error with the specified argument, wrapping it in a
15 * tuple automatically so that tuple keys are not unpacked as the
16 * exception arguments. */
17static void
18set_key_error(PyObject *arg)
19{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 PyObject *tup;
21 tup = PyTuple_Pack(1, arg);
22 if (!tup)
23 return; /* caller will expect error to be set anyway */
24 PyErr_SetObject(PyExc_KeyError, tup);
25 Py_DECREF(tup);
Thomas Wouters89f507f2006-12-13 04:49:30 +000026}
27
Tim Peterseb28ef22001-06-02 05:27:19 +000028/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000029#undef SHOW_CONVERSION_COUNTS
30
Tim Peterseb28ef22001-06-02 05:27:19 +000031/* See large comment block below. This must be >= 1. */
32#define PERTURB_SHIFT 5
33
Guido van Rossum16e93a81997-01-28 00:00:11 +000034/*
Tim Peterseb28ef22001-06-02 05:27:19 +000035Major subtleties ahead: Most hash schemes depend on having a "good" hash
36function, in the sense of simulating randomness. Python doesn't: its most
37important hash functions (for strings and ints) are very regular in common
38cases:
Tim Peters15d49292001-05-27 07:39:22 +000039
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000040 >>> map(hash, (0, 1, 2, 3))
41 [0, 1, 2, 3]
42 >>> map(hash, ("namea", "nameb", "namec", "named"))
43 [-1658398457, -1658398460, -1658398459, -1658398462]
44 >>>
Tim Peters15d49292001-05-27 07:39:22 +000045
Tim Peterseb28ef22001-06-02 05:27:19 +000046This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
47the low-order i bits as the initial table index is extremely fast, and there
48are no collisions at all for dicts indexed by a contiguous range of ints.
49The same is approximately true when keys are "consecutive" strings. So this
50gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000051
Tim Peterseb28ef22001-06-02 05:27:19 +000052OTOH, when collisions occur, the tendency to fill contiguous slices of the
53hash table makes a good collision resolution strategy crucial. Taking only
54the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000056their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
57 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000058
Tim Peterseb28ef22001-06-02 05:27:19 +000059But catering to unusual cases should not slow the usual ones, so we just take
60the last i bits anyway. It's up to collision resolution to do the rest. If
61we *usually* find the key we're looking for on the first try (and, it turns
62out, we usually do -- the table load factor is kept under 2/3, so the odds
63are solidly in our favor), then it makes best sense to keep the initial index
64computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000065
Tim Peterseb28ef22001-06-02 05:27:19 +000066The first half of collision resolution is to visit table indices via this
67recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000068
Tim Peterseb28ef22001-06-02 05:27:19 +000069 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000070
Tim Peterseb28ef22001-06-02 05:27:19 +000071For any initial j in range(2**i), repeating that 2**i times generates each
72int in range(2**i) exactly once (see any text on random-number generation for
73proof). By itself, this doesn't help much: like linear probing (setting
74j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
75order. This would be bad, except that's not the only thing we do, and it's
76actually *good* in the common cases where hash keys are consecutive. In an
77example that's really too small to make this entirely clear, for a table of
78size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000079
Tim Peterseb28ef22001-06-02 05:27:19 +000080 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
81
82If two things come in at index 5, the first place we look after is index 2,
83not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
84Linear probing is deadly in this case because there the fixed probe order
85is the *same* as the order consecutive keys are likely to arrive. But it's
86extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
87and certain that consecutive hash codes do not.
88
89The other half of the strategy is to get the other bits of the hash code
90into play. This is done by initializing a (unsigned) vrbl "perturb" to the
91full hash code, and changing the recurrence to:
92
93 j = (5*j) + 1 + perturb;
94 perturb >>= PERTURB_SHIFT;
95 use j % 2**i as the next table index;
96
97Now the probe sequence depends (eventually) on every bit in the hash code,
98and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
99because it quickly magnifies small differences in the bits that didn't affect
100the initial index. Note that because perturb is unsigned, if the recurrence
101is executed often enough perturb eventually becomes and remains 0. At that
102point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
103that's certain to find an empty slot eventually (since it generates every int
104in range(2**i), and we make sure there's always at least one empty slot).
105
106Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
107small so that the high bits of the hash code continue to affect the probe
108sequence across iterations; but you want it large so that in really bad cases
109the high-order hash bits have an effect on early iterations. 5 was "the
110best" in minimizing total collisions across experiments Tim Peters ran (on
111both normal and pathological cases), but 4 and 6 weren't significantly worse.
112
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000113Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000114approach, using repeated multiplication by x in GF(2**n) where an irreducible
115polynomial for each table size was chosen such that x was a primitive root.
116Christian Tismer later extended that to use division by x instead, as an
117efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000118also gave excellent collision statistics, but was more expensive: two
119if-tests were required inside the loop; computing "the next" index took about
120the same number of operations but without as much potential parallelism
121(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
122above, and then shifting perturb can be done while the table index is being
123masked); and the PyDictObject struct required a member to hold the table's
124polynomial. In Tim's experiments the current scheme ran faster, produced
125equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000126
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000127*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000128
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000129/* Object used as dummy key to fill deleted entries */
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000130static PyObject *dummy = NULL; /* Initialized by first call to newPyDictObject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000131
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000132#ifdef Py_REF_DEBUG
133PyObject *
134_PyDict_Dummy(void)
135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 return dummy;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000137}
138#endif
139
Fred Drake1bff34a2000-08-31 19:31:38 +0000140/* forward declarations */
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000141static PyDictEntry *
Benjamin Petersone6baa462010-10-17 21:20:58 +0000142lookdict_unicode(PyDictObject *mp, PyObject *key, Py_hash_t hash);
Fred Drake1bff34a2000-08-31 19:31:38 +0000143
144#ifdef SHOW_CONVERSION_COUNTS
145static long created = 0L;
146static long converted = 0L;
147
148static void
149show_counts(void)
150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 fprintf(stderr, "created %ld string dicts\n", created);
152 fprintf(stderr, "converted %ld to normal dicts\n", converted);
153 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
Fred Drake1bff34a2000-08-31 19:31:38 +0000154}
155#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000156
Christian Heimes77c02eb2008-02-09 02:18:51 +0000157/* Debug statistic to compare allocations with reuse through the free list */
158#undef SHOW_ALLOC_COUNT
159#ifdef SHOW_ALLOC_COUNT
160static size_t count_alloc = 0;
161static size_t count_reuse = 0;
162
163static void
164show_alloc(void)
165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 fprintf(stderr, "Dict allocations: %" PY_FORMAT_SIZE_T "d\n",
167 count_alloc);
168 fprintf(stderr, "Dict reuse through freelist: %" PY_FORMAT_SIZE_T
169 "d\n", count_reuse);
170 fprintf(stderr, "%.2f%% reuse rate\n\n",
171 (100.0*count_reuse/(count_alloc+count_reuse)));
Christian Heimes77c02eb2008-02-09 02:18:51 +0000172}
173#endif
174
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000175/* Debug statistic to count GC tracking of dicts */
176#ifdef SHOW_TRACK_COUNT
177static Py_ssize_t count_untracked = 0;
178static Py_ssize_t count_tracked = 0;
179
180static void
181show_track(void)
182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 fprintf(stderr, "Dicts created: %" PY_FORMAT_SIZE_T "d\n",
184 count_tracked + count_untracked);
185 fprintf(stderr, "Dicts tracked by the GC: %" PY_FORMAT_SIZE_T
186 "d\n", count_tracked);
187 fprintf(stderr, "%.2f%% dict tracking rate\n\n",
188 (100.0*count_tracked/(count_untracked+count_tracked)));
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000189}
190#endif
191
192
Tim Peters6d6c1a32001-08-02 04:15:00 +0000193/* Initialization macros.
194 There are two ways to create a dict: PyDict_New() is the main C API
195 function, and the tp_new slot maps to dict_new(). In the latter case we
196 can save a little time over what PyDict_New does because it's guaranteed
197 that the PyDictObject struct is already zeroed out.
198 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
199 an excellent reason not to).
200*/
201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202#define INIT_NONZERO_DICT_SLOTS(mp) do { \
203 (mp)->ma_table = (mp)->ma_smalltable; \
204 (mp)->ma_mask = PyDict_MINSIZE - 1; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000205 } while(0)
206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207#define EMPTY_TO_MINSIZE(mp) do { \
208 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
209 (mp)->ma_used = (mp)->ma_fill = 0; \
210 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000211 } while(0)
212
Raymond Hettinger43442782004-03-17 21:55:03 +0000213/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes2202f872008-02-06 14:31:34 +0000214#ifndef PyDict_MAXFREELIST
215#define PyDict_MAXFREELIST 80
216#endif
217static PyDictObject *free_list[PyDict_MAXFREELIST];
218static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000219
Christian Heimes77c02eb2008-02-09 02:18:51 +0000220void
221PyDict_Fini(void)
222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 PyDictObject *op;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000225 while (numfree) {
226 op = free_list[--numfree];
227 assert(PyDict_CheckExact(op));
228 PyObject_GC_Del(op);
229 }
Christian Heimes77c02eb2008-02-09 02:18:51 +0000230}
231
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000233PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 register PyDictObject *mp;
236 if (dummy == NULL) { /* Auto-initialize dummy */
237 dummy = PyUnicode_FromString("<dummy key>");
238 if (dummy == NULL)
239 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000240#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 Py_AtExit(show_counts);
Fred Drake1bff34a2000-08-31 19:31:38 +0000242#endif
Christian Heimes77c02eb2008-02-09 02:18:51 +0000243#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 Py_AtExit(show_alloc);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000245#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000246#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 Py_AtExit(show_track);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 }
250 if (numfree) {
251 mp = free_list[--numfree];
252 assert (mp != NULL);
253 assert (Py_TYPE(mp) == &PyDict_Type);
254 _Py_NewReference((PyObject *)mp);
255 if (mp->ma_fill) {
256 EMPTY_TO_MINSIZE(mp);
257 } else {
258 /* At least set ma_table and ma_mask; these are wrong
259 if an empty but presized dict is added to freelist */
260 INIT_NONZERO_DICT_SLOTS(mp);
261 }
262 assert (mp->ma_used == 0);
263 assert (mp->ma_table == mp->ma_smalltable);
264 assert (mp->ma_mask == PyDict_MINSIZE - 1);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000265#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 count_reuse++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000267#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 } else {
269 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
270 if (mp == NULL)
271 return NULL;
272 EMPTY_TO_MINSIZE(mp);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000273#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 count_alloc++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 }
277 mp->ma_lookup = lookdict_unicode;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000278#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 count_untracked++;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000280#endif
Fred Drake1bff34a2000-08-31 19:31:38 +0000281#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 ++created;
Fred Drake1bff34a2000-08-31 19:31:38 +0000283#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000285}
286
287/*
288The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000289This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000290Open addressing is preferred over chaining since the link overhead for
291chaining would be substantial (100% with typical malloc overhead).
292
Tim Peterseb28ef22001-06-02 05:27:19 +0000293The initial probe index is computed as hash mod the table size. Subsequent
294probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000295
296All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000297
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000298The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000299contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000300Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000301
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000302lookdict() is general-purpose, and may return NULL if (and only if) a
303comparison raises an exception (this was new in Python 2.5).
Guido van Rossum89d8c602007-09-18 17:26:56 +0000304lookdict_unicode() below is specialized to string keys, comparison of which can
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000305never raise an exception; that function can never return NULL. For both, when
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000306the key isn't found a PyDictEntry* is returned for which the me_value field is
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000307NULL; this is the slot in the dict at which the key would have been found, and
308the caller can (if it wishes) add the <key, value> pair to the returned
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000309PyDictEntry*.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000310*/
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000311static PyDictEntry *
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000312lookdict(PyDictObject *mp, PyObject *key, register Py_hash_t hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 register size_t i;
315 register size_t perturb;
316 register PyDictEntry *freeslot;
317 register size_t mask = (size_t)mp->ma_mask;
318 PyDictEntry *ep0 = mp->ma_table;
319 register PyDictEntry *ep;
320 register int cmp;
321 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 i = (size_t)hash & mask;
324 ep = &ep0[i];
325 if (ep->me_key == NULL || ep->me_key == key)
326 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 if (ep->me_key == dummy)
329 freeslot = ep;
330 else {
331 if (ep->me_hash == hash) {
332 startkey = ep->me_key;
333 Py_INCREF(startkey);
334 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
335 Py_DECREF(startkey);
336 if (cmp < 0)
337 return NULL;
338 if (ep0 == mp->ma_table && ep->me_key == startkey) {
339 if (cmp > 0)
340 return ep;
341 }
342 else {
343 /* The compare did major nasty stuff to the
344 * dict: start over.
345 * XXX A clever adversary could prevent this
346 * XXX from terminating.
347 */
348 return lookdict(mp, key, hash);
349 }
350 }
351 freeslot = NULL;
352 }
Tim Peters15d49292001-05-27 07:39:22 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 /* In the loop, me_key == dummy is by far (factor of 100s) the
355 least likely outcome, so test for that last. */
356 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
357 i = (i << 2) + i + perturb + 1;
358 ep = &ep0[i & mask];
359 if (ep->me_key == NULL)
360 return freeslot == NULL ? ep : freeslot;
361 if (ep->me_key == key)
362 return ep;
363 if (ep->me_hash == hash && ep->me_key != dummy) {
364 startkey = ep->me_key;
365 Py_INCREF(startkey);
366 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
367 Py_DECREF(startkey);
368 if (cmp < 0)
369 return NULL;
370 if (ep0 == mp->ma_table && ep->me_key == startkey) {
371 if (cmp > 0)
372 return ep;
373 }
374 else {
375 /* The compare did major nasty stuff to the
376 * dict: start over.
377 * XXX A clever adversary could prevent this
378 * XXX from terminating.
379 */
380 return lookdict(mp, key, hash);
381 }
382 }
383 else if (ep->me_key == dummy && freeslot == NULL)
384 freeslot = ep;
385 }
386 assert(0); /* NOT REACHED */
387 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000388}
389
390/*
Guido van Rossum89d8c602007-09-18 17:26:56 +0000391 * Hacked up version of lookdict which can assume keys are always
392 * unicodes; this assumption allows testing for errors during
393 * PyObject_RichCompareBool() to be dropped; unicode-unicode
394 * comparisons never raise exceptions. This also means we don't need
395 * to go through PyObject_RichCompareBool(); we can always use
396 * unicode_eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000397 *
Guido van Rossum89d8c602007-09-18 17:26:56 +0000398 * This is valuable because dicts with only unicode keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000399 */
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000400static PyDictEntry *
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000401lookdict_unicode(PyDictObject *mp, PyObject *key, register Py_hash_t hash)
Fred Drake1bff34a2000-08-31 19:31:38 +0000402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 register size_t i;
404 register size_t perturb;
405 register PyDictEntry *freeslot;
406 register size_t mask = (size_t)mp->ma_mask;
407 PyDictEntry *ep0 = mp->ma_table;
408 register PyDictEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 /* Make sure this function doesn't have to handle non-unicode keys,
411 including subclasses of str; e.g., one reason to subclass
412 unicodes is to override __eq__, and for speed we don't cater to
413 that here. */
414 if (!PyUnicode_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000415#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 ++converted;
Fred Drake1bff34a2000-08-31 19:31:38 +0000417#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 mp->ma_lookup = lookdict;
419 return lookdict(mp, key, hash);
420 }
421 i = hash & mask;
422 ep = &ep0[i];
423 if (ep->me_key == NULL || ep->me_key == key)
424 return ep;
425 if (ep->me_key == dummy)
426 freeslot = ep;
427 else {
428 if (ep->me_hash == hash && unicode_eq(ep->me_key, key))
429 return ep;
430 freeslot = NULL;
431 }
Tim Peters15d49292001-05-27 07:39:22 +0000432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 /* In the loop, me_key == dummy is by far (factor of 100s) the
434 least likely outcome, so test for that last. */
435 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
436 i = (i << 2) + i + perturb + 1;
437 ep = &ep0[i & mask];
438 if (ep->me_key == NULL)
439 return freeslot == NULL ? ep : freeslot;
440 if (ep->me_key == key
441 || (ep->me_hash == hash
442 && ep->me_key != dummy
443 && unicode_eq(ep->me_key, key)))
444 return ep;
445 if (ep->me_key == dummy && freeslot == NULL)
446 freeslot = ep;
447 }
448 assert(0); /* NOT REACHED */
449 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000450}
451
Benjamin Petersonfb886362010-04-24 18:21:17 +0000452int
453_PyDict_HasOnlyStringKeys(PyObject *dict)
454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 Py_ssize_t pos = 0;
456 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +0000457 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 /* Shortcut */
459 if (((PyDictObject *)dict)->ma_lookup == lookdict_unicode)
460 return 1;
461 while (PyDict_Next(dict, &pos, &key, &value))
462 if (!PyUnicode_Check(key))
463 return 0;
464 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +0000465}
466
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000467#ifdef SHOW_TRACK_COUNT
468#define INCREASE_TRACK_COUNT \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 (count_tracked++, count_untracked--);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000470#define DECREASE_TRACK_COUNT \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 (count_tracked--, count_untracked++);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000472#else
473#define INCREASE_TRACK_COUNT
474#define DECREASE_TRACK_COUNT
475#endif
476
477#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 do { \
479 if (!_PyObject_GC_IS_TRACKED(mp)) { \
480 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
481 _PyObject_GC_MAY_BE_TRACKED(value)) { \
482 _PyObject_GC_TRACK(mp); \
483 INCREASE_TRACK_COUNT \
484 } \
485 } \
486 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000487
488void
489_PyDict_MaybeUntrack(PyObject *op)
490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 PyDictObject *mp;
492 PyObject *value;
493 Py_ssize_t mask, i;
494 PyDictEntry *ep;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
497 return;
498
499 mp = (PyDictObject *) op;
500 ep = mp->ma_table;
501 mask = mp->ma_mask;
502 for (i = 0; i <= mask; i++) {
503 if ((value = ep[i].me_value) == NULL)
504 continue;
505 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
506 _PyObject_GC_MAY_BE_TRACKED(ep[i].me_key))
507 return;
508 }
509 DECREASE_TRACK_COUNT
510 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000511}
512
513
Fred Drake1bff34a2000-08-31 19:31:38 +0000514/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000515Internal routine to insert a new item into the table.
516Used both by the internal resize routine and by the public insert routine.
517Eats a reference to key and one to value.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000518Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000519*/
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000520static int
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000521insertdict(register PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000522{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 PyObject *old_value;
524 register PyDictEntry *ep;
Antoine Pitroufbb1c612010-10-23 17:37:54 +0000525 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, Py_hash_t);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 assert(mp->ma_lookup != NULL);
528 ep = mp->ma_lookup(mp, key, hash);
529 if (ep == NULL) {
530 Py_DECREF(key);
531 Py_DECREF(value);
532 return -1;
533 }
534 MAINTAIN_TRACKING(mp, key, value);
535 if (ep->me_value != NULL) {
536 old_value = ep->me_value;
537 ep->me_value = value;
538 Py_DECREF(old_value); /* which **CAN** re-enter */
539 Py_DECREF(key);
540 }
541 else {
542 if (ep->me_key == NULL)
543 mp->ma_fill++;
544 else {
545 assert(ep->me_key == dummy);
546 Py_DECREF(dummy);
547 }
548 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000549 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 ep->me_value = value;
551 mp->ma_used++;
552 }
553 return 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000554}
555
556/*
557Internal routine used by dictresize() to insert an item which is
558known to be absent from the dict. This routine also assumes that
559the dict contains no deleted entries. Besides the performance benefit,
560using insertdict() in dictresize() is dangerous (SF bug #1456209).
561Note that no refcounts are changed by this routine; if needed, the caller
562is responsible for incref'ing `key` and `value`.
563*/
564static void
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000565insertdict_clean(register PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 register size_t i;
569 register size_t perturb;
570 register size_t mask = (size_t)mp->ma_mask;
571 PyDictEntry *ep0 = mp->ma_table;
572 register PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 MAINTAIN_TRACKING(mp, key, value);
575 i = hash & mask;
576 ep = &ep0[i];
577 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
578 i = (i << 2) + i + perturb + 1;
579 ep = &ep0[i & mask];
580 }
581 assert(ep->me_value == NULL);
582 mp->ma_fill++;
583 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000584 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 ep->me_value = value;
586 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000587}
588
589/*
590Restructure the table by allocating a new table and reinserting all
591items again. When entries have been deleted, the new table may
592actually be smaller than the old one.
593*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000594static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000595dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 Py_ssize_t newsize;
598 PyDictEntry *oldtable, *newtable, *ep;
599 Py_ssize_t i;
600 int is_oldtable_malloced;
601 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 /* Find the smallest table size > minused. */
606 for (newsize = PyDict_MINSIZE;
607 newsize <= minused && newsize > 0;
608 newsize <<= 1)
609 ;
610 if (newsize <= 0) {
611 PyErr_NoMemory();
612 return -1;
613 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 /* Get space for a new table. */
616 oldtable = mp->ma_table;
617 assert(oldtable != NULL);
618 is_oldtable_malloced = oldtable != mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 if (newsize == PyDict_MINSIZE) {
621 /* A large table is shrinking, or we can't get any smaller. */
622 newtable = mp->ma_smalltable;
623 if (newtable == oldtable) {
624 if (mp->ma_fill == mp->ma_used) {
625 /* No dummies, so no point doing anything. */
626 return 0;
627 }
628 /* We're not going to resize it, but rebuild the
629 table anyway to purge old dummy entries.
630 Subtle: This is *necessary* if fill==size,
631 as lookdict needs at least one virgin slot to
632 terminate failing searches. If fill < size, it's
633 merely desirable, as dummies slow searches. */
634 assert(mp->ma_fill > mp->ma_used);
635 memcpy(small_copy, oldtable, sizeof(small_copy));
636 oldtable = small_copy;
637 }
638 }
639 else {
640 newtable = PyMem_NEW(PyDictEntry, newsize);
641 if (newtable == NULL) {
642 PyErr_NoMemory();
643 return -1;
644 }
645 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 /* Make the dict empty, using the new table. */
648 assert(newtable != oldtable);
649 mp->ma_table = newtable;
650 mp->ma_mask = newsize - 1;
651 memset(newtable, 0, sizeof(PyDictEntry) * newsize);
652 mp->ma_used = 0;
653 i = mp->ma_fill;
654 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 /* Copy the data over; this is refcount-neutral for active entries;
657 dummy entries aren't copied over, of course */
658 for (ep = oldtable; i > 0; ep++) {
659 if (ep->me_value != NULL) { /* active entry */
660 --i;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000661 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 }
663 else if (ep->me_key != NULL) { /* dummy entry */
664 --i;
665 assert(ep->me_key == dummy);
666 Py_DECREF(ep->me_key);
667 }
668 /* else key == value == NULL: nothing to do */
669 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 if (is_oldtable_malloced)
672 PyMem_DEL(oldtable);
673 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000674}
675
Christian Heimes99170a52007-12-19 02:07:34 +0000676/* Create a new dictionary pre-sized to hold an estimated number of elements.
677 Underestimates are okay because the dictionary will resize as necessary.
678 Overestimates just mean the dictionary will be more sparse than usual.
679*/
680
681PyObject *
682_PyDict_NewPresized(Py_ssize_t minused)
683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 PyObject *op = PyDict_New();
Christian Heimes99170a52007-12-19 02:07:34 +0000685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
687 Py_DECREF(op);
688 return NULL;
689 }
690 return op;
Christian Heimes99170a52007-12-19 02:07:34 +0000691}
692
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000693/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
694 * that may occur (originally dicts supported only string keys, and exceptions
695 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000696 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000697 * (suppressed) occurred while computing the key's hash, or that some error
698 * (suppressed) occurred when comparing keys in the dict's internal probe
699 * sequence. A nasty example of the latter is when a Python-coded comparison
700 * function hits a stack-depth error, which can cause this to return NULL
701 * even if the key is present.
702 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000704PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000705{
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000706 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 PyDictObject *mp = (PyDictObject *)op;
708 PyDictEntry *ep;
709 PyThreadState *tstate;
710 if (!PyDict_Check(op))
711 return NULL;
712 if (!PyUnicode_CheckExact(key) ||
713 (hash = ((PyUnicodeObject *) key)->hash) == -1)
714 {
715 hash = PyObject_Hash(key);
716 if (hash == -1) {
717 PyErr_Clear();
718 return NULL;
719 }
720 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 /* We can arrive here with a NULL tstate during initialization: try
723 running "python -Wi" for an example related to string interning.
724 Let's just hope that no exception occurs then... This must be
725 _PyThreadState_Current and not PyThreadState_GET() because in debug
726 mode, the latter complains if tstate is NULL. */
727 tstate = (PyThreadState*)_Py_atomic_load_relaxed(
728 &_PyThreadState_Current);
729 if (tstate != NULL && tstate->curexc_type != NULL) {
730 /* preserve the existing exception */
731 PyObject *err_type, *err_value, *err_tb;
732 PyErr_Fetch(&err_type, &err_value, &err_tb);
733 ep = (mp->ma_lookup)(mp, key, hash);
734 /* ignore errors */
735 PyErr_Restore(err_type, err_value, err_tb);
736 if (ep == NULL)
737 return NULL;
738 }
739 else {
740 ep = (mp->ma_lookup)(mp, key, hash);
741 if (ep == NULL) {
742 PyErr_Clear();
743 return NULL;
744 }
745 }
746 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000747}
748
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000749/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
750 This returns NULL *with* an exception set if an exception occurred.
751 It returns NULL *without* an exception set if the key wasn't present.
752*/
753PyObject *
754PyDict_GetItemWithError(PyObject *op, PyObject *key)
755{
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000756 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 PyDictObject*mp = (PyDictObject *)op;
758 PyDictEntry *ep;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 if (!PyDict_Check(op)) {
761 PyErr_BadInternalCall();
762 return NULL;
763 }
764 if (!PyUnicode_CheckExact(key) ||
765 (hash = ((PyUnicodeObject *) key)->hash) == -1)
766 {
767 hash = PyObject_Hash(key);
768 if (hash == -1) {
769 return NULL;
770 }
771 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 ep = (mp->ma_lookup)(mp, key, hash);
774 if (ep == NULL)
775 return NULL;
776 return ep->me_value;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000777}
778
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000779/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000780 * dictionary if it's merely replacing the value for an existing key.
781 * This means that it's safe to loop over a dictionary with PyDict_Next()
782 * and occasionally replace a value -- but you can't insert new keys or
783 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000784 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000785int
Tim Peters1f5871e2000-07-04 17:44:48 +0000786PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 register PyDictObject *mp;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000789 register Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 if (!PyDict_Check(op)) {
793 PyErr_BadInternalCall();
794 return -1;
795 }
796 assert(key);
797 assert(value);
798 mp = (PyDictObject *)op;
799 if (!PyUnicode_CheckExact(key) ||
800 (hash = ((PyUnicodeObject *) key)->hash) == -1)
801 {
802 hash = PyObject_Hash(key);
803 if (hash == -1)
804 return -1;
805 }
806 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
807 n_used = mp->ma_used;
808 Py_INCREF(value);
809 Py_INCREF(key);
810 if (insertdict(mp, key, hash, value) != 0)
811 return -1;
812 /* If we added a key, we can safely resize. Otherwise just return!
813 * If fill >= 2/3 size, adjust size. Normally, this doubles or
814 * quaduples the size, but it's also possible for the dict to shrink
815 * (if ma_fill is much larger than ma_used, meaning a lot of dict
816 * keys have been * deleted).
817 *
818 * Quadrupling the size improves average dictionary sparseness
819 * (reducing collisions) at the cost of some memory and iteration
820 * speed (which loops over every possible entry). It also halves
821 * the number of expensive resize operations in a growing dictionary.
822 *
823 * Very large dictionaries (over 50K items) use doubling instead.
824 * This may help applications with severe memory constraints.
825 */
826 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
827 return 0;
828 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000829}
830
831int
Tim Peters1f5871e2000-07-04 17:44:48 +0000832PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000833{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 register PyDictObject *mp;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000835 register Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 register PyDictEntry *ep;
837 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 if (!PyDict_Check(op)) {
840 PyErr_BadInternalCall();
841 return -1;
842 }
843 assert(key);
844 if (!PyUnicode_CheckExact(key) ||
845 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
846 hash = PyObject_Hash(key);
847 if (hash == -1)
848 return -1;
849 }
850 mp = (PyDictObject *)op;
851 ep = (mp->ma_lookup)(mp, key, hash);
852 if (ep == NULL)
853 return -1;
854 if (ep->me_value == NULL) {
855 set_key_error(key);
856 return -1;
857 }
858 old_key = ep->me_key;
859 Py_INCREF(dummy);
860 ep->me_key = dummy;
861 old_value = ep->me_value;
862 ep->me_value = NULL;
863 mp->ma_used--;
864 Py_DECREF(old_value);
865 Py_DECREF(old_key);
866 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000867}
868
Guido van Rossum25831651993-05-19 14:50:45 +0000869void
Tim Peters1f5871e2000-07-04 17:44:48 +0000870PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 PyDictObject *mp;
873 PyDictEntry *ep, *table;
874 int table_is_malloced;
875 Py_ssize_t fill;
876 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000877#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000879#endif
880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 if (!PyDict_Check(op))
882 return;
883 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000884#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 n = mp->ma_mask + 1;
886 i = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000887#endif
888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 table = mp->ma_table;
890 assert(table != NULL);
891 table_is_malloced = table != mp->ma_smalltable;
Tim Petersdea48ec2001-05-22 20:40:22 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 /* This is delicate. During the process of clearing the dict,
894 * decrefs can cause the dict to mutate. To avoid fatal confusion
895 * (voice of experience), we have to make the dict empty before
896 * clearing the slots, and never refer to anything via mp->xxx while
897 * clearing.
898 */
899 fill = mp->ma_fill;
900 if (table_is_malloced)
901 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 else if (fill > 0) {
904 /* It's a small table with something that needs to be cleared.
905 * Afraid the only safe way is to copy the dict entries into
906 * another small table first.
907 */
908 memcpy(small_copy, table, sizeof(small_copy));
909 table = small_copy;
910 EMPTY_TO_MINSIZE(mp);
911 }
912 /* else it's a small table that's already empty */
Tim Petersdea48ec2001-05-22 20:40:22 +0000913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 /* Now we can finally clear things. If C had refcounts, we could
915 * assert that the refcount on table is 1 now, i.e. that this function
916 * has unique access to it, so decref side-effects can't alter it.
917 */
918 for (ep = table; fill > 0; ++ep) {
Tim Petersdea48ec2001-05-22 20:40:22 +0000919#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 assert(i < n);
921 ++i;
Tim Petersdea48ec2001-05-22 20:40:22 +0000922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 if (ep->me_key) {
924 --fill;
925 Py_DECREF(ep->me_key);
926 Py_XDECREF(ep->me_value);
927 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000928#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 else
930 assert(ep->me_value == NULL);
Tim Petersdea48ec2001-05-22 20:40:22 +0000931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 if (table_is_malloced)
935 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000936}
937
Tim Peters080c88b2003-02-15 03:01:11 +0000938/*
939 * Iterate over a dict. Use like so:
940 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000941 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000942 * PyObject *key, *value;
943 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000944 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000945 * Refer to borrowed references in key and value.
946 * }
947 *
948 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000949 * mutates the dict. One exception: it is safe if the loop merely changes
950 * the values associated with the keys (but doesn't insert new keys or
951 * delete keys), via PyDict_SetItem().
952 */
Guido van Rossum25831651993-05-19 14:50:45 +0000953int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000954PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 register Py_ssize_t i;
957 register Py_ssize_t mask;
958 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 if (!PyDict_Check(op))
961 return 0;
962 i = *ppos;
963 if (i < 0)
964 return 0;
965 ep = ((PyDictObject *)op)->ma_table;
966 mask = ((PyDictObject *)op)->ma_mask;
967 while (i <= mask && ep[i].me_value == NULL)
968 i++;
969 *ppos = i+1;
970 if (i > mask)
971 return 0;
972 if (pkey)
973 *pkey = ep[i].me_key;
974 if (pvalue)
975 *pvalue = ep[i].me_value;
976 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000977}
978
Thomas Wouterscf297e42007-02-23 15:07:44 +0000979/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
980int
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000981_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 register Py_ssize_t i;
984 register Py_ssize_t mask;
985 register PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +0000986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 if (!PyDict_Check(op))
988 return 0;
989 i = *ppos;
990 if (i < 0)
991 return 0;
992 ep = ((PyDictObject *)op)->ma_table;
993 mask = ((PyDictObject *)op)->ma_mask;
994 while (i <= mask && ep[i].me_value == NULL)
995 i++;
996 *ppos = i+1;
997 if (i > mask)
998 return 0;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000999 *phash = ep[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 if (pkey)
1001 *pkey = ep[i].me_key;
1002 if (pvalue)
1003 *pvalue = ep[i].me_value;
1004 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001005}
1006
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001007/* Methods */
1008
1009static void
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001010dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 register PyDictEntry *ep;
1013 Py_ssize_t fill = mp->ma_fill;
1014 PyObject_GC_UnTrack(mp);
1015 Py_TRASHCAN_SAFE_BEGIN(mp)
1016 for (ep = mp->ma_table; fill > 0; ep++) {
1017 if (ep->me_key) {
1018 --fill;
1019 Py_DECREF(ep->me_key);
1020 Py_XDECREF(ep->me_value);
1021 }
1022 }
1023 if (mp->ma_table != mp->ma_smalltable)
1024 PyMem_DEL(mp->ma_table);
1025 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1026 free_list[numfree++] = mp;
1027 else
1028 Py_TYPE(mp)->tp_free((PyObject *)mp);
1029 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001030}
1031
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001033dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 Py_ssize_t i;
1036 PyObject *s, *temp, *colon = NULL;
1037 PyObject *pieces = NULL, *result = NULL;
1038 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 i = Py_ReprEnter((PyObject *)mp);
1041 if (i != 0) {
1042 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1043 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 if (mp->ma_used == 0) {
1046 result = PyUnicode_FromString("{}");
1047 goto Done;
1048 }
Tim Petersa7259592001-06-16 05:11:17 +00001049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 pieces = PyList_New(0);
1051 if (pieces == NULL)
1052 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 colon = PyUnicode_FromString(": ");
1055 if (colon == NULL)
1056 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 /* Do repr() on each key+value pair, and insert ": " between them.
1059 Note that repr may mutate the dict. */
1060 i = 0;
1061 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
1062 int status;
1063 /* Prevent repr from deleting value during key format. */
1064 Py_INCREF(value);
1065 s = PyObject_Repr(key);
1066 PyUnicode_Append(&s, colon);
1067 PyUnicode_AppendAndDel(&s, PyObject_Repr(value));
1068 Py_DECREF(value);
1069 if (s == NULL)
1070 goto Done;
1071 status = PyList_Append(pieces, s);
1072 Py_DECREF(s); /* append created a new ref */
1073 if (status < 0)
1074 goto Done;
1075 }
Tim Petersa7259592001-06-16 05:11:17 +00001076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 /* Add "{}" decorations to the first and last items. */
1078 assert(PyList_GET_SIZE(pieces) > 0);
1079 s = PyUnicode_FromString("{");
1080 if (s == NULL)
1081 goto Done;
1082 temp = PyList_GET_ITEM(pieces, 0);
1083 PyUnicode_AppendAndDel(&s, temp);
1084 PyList_SET_ITEM(pieces, 0, s);
1085 if (s == NULL)
1086 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 s = PyUnicode_FromString("}");
1089 if (s == NULL)
1090 goto Done;
1091 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
1092 PyUnicode_AppendAndDel(&temp, s);
1093 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1094 if (temp == NULL)
1095 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 /* Paste them all together with ", " between. */
1098 s = PyUnicode_FromString(", ");
1099 if (s == NULL)
1100 goto Done;
1101 result = PyUnicode_Join(s, pieces);
1102 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001103
1104Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 Py_XDECREF(pieces);
1106 Py_XDECREF(colon);
1107 Py_ReprLeave((PyObject *)mp);
1108 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001109}
1110
Martin v. Löwis18e16552006-02-15 17:27:45 +00001111static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001112dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001115}
1116
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001118dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 PyObject *v;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001121 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 PyDictEntry *ep;
1123 assert(mp->ma_table != NULL);
1124 if (!PyUnicode_CheckExact(key) ||
1125 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1126 hash = PyObject_Hash(key);
1127 if (hash == -1)
1128 return NULL;
1129 }
1130 ep = (mp->ma_lookup)(mp, key, hash);
1131 if (ep == NULL)
1132 return NULL;
1133 v = ep->me_value;
1134 if (v == NULL) {
1135 if (!PyDict_CheckExact(mp)) {
1136 /* Look up __missing__ method if we're a subclass. */
1137 PyObject *missing, *res;
1138 static PyObject *missing_str = NULL;
1139 missing = _PyObject_LookupSpecial((PyObject *)mp,
1140 "__missing__",
1141 &missing_str);
1142 if (missing != NULL) {
1143 res = PyObject_CallFunctionObjArgs(missing,
1144 key, NULL);
1145 Py_DECREF(missing);
1146 return res;
1147 }
1148 else if (PyErr_Occurred())
1149 return NULL;
1150 }
1151 set_key_error(key);
1152 return NULL;
1153 }
1154 else
1155 Py_INCREF(v);
1156 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001157}
1158
1159static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001160dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 if (w == NULL)
1163 return PyDict_DelItem((PyObject *)mp, v);
1164 else
1165 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001166}
1167
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001168static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 (lenfunc)dict_length, /*mp_length*/
1170 (binaryfunc)dict_subscript, /*mp_subscript*/
1171 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001172};
1173
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001175dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 register PyObject *v;
1178 register Py_ssize_t i, j;
1179 PyDictEntry *ep;
1180 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001181
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001182 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 n = mp->ma_used;
1184 v = PyList_New(n);
1185 if (v == NULL)
1186 return NULL;
1187 if (n != mp->ma_used) {
1188 /* Durnit. The allocations caused the dict to resize.
1189 * Just start over, this shouldn't normally happen.
1190 */
1191 Py_DECREF(v);
1192 goto again;
1193 }
1194 ep = mp->ma_table;
1195 mask = mp->ma_mask;
1196 for (i = 0, j = 0; i <= mask; i++) {
1197 if (ep[i].me_value != NULL) {
1198 PyObject *key = ep[i].me_key;
1199 Py_INCREF(key);
1200 PyList_SET_ITEM(v, j, key);
1201 j++;
1202 }
1203 }
1204 assert(j == n);
1205 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001206}
1207
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001209dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 register PyObject *v;
1212 register Py_ssize_t i, j;
1213 PyDictEntry *ep;
1214 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001215
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001216 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 n = mp->ma_used;
1218 v = PyList_New(n);
1219 if (v == NULL)
1220 return NULL;
1221 if (n != mp->ma_used) {
1222 /* Durnit. The allocations caused the dict to resize.
1223 * Just start over, this shouldn't normally happen.
1224 */
1225 Py_DECREF(v);
1226 goto again;
1227 }
1228 ep = mp->ma_table;
1229 mask = mp->ma_mask;
1230 for (i = 0, j = 0; i <= mask; i++) {
1231 if (ep[i].me_value != NULL) {
1232 PyObject *value = ep[i].me_value;
1233 Py_INCREF(value);
1234 PyList_SET_ITEM(v, j, value);
1235 j++;
1236 }
1237 }
1238 assert(j == n);
1239 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001240}
1241
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001243dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 register PyObject *v;
1246 register Py_ssize_t i, j, n;
1247 Py_ssize_t mask;
1248 PyObject *item, *key, *value;
1249 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 /* Preallocate the list of tuples, to avoid allocations during
1252 * the loop over the items, which could trigger GC, which
1253 * could resize the dict. :-(
1254 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001255 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 n = mp->ma_used;
1257 v = PyList_New(n);
1258 if (v == NULL)
1259 return NULL;
1260 for (i = 0; i < n; i++) {
1261 item = PyTuple_New(2);
1262 if (item == NULL) {
1263 Py_DECREF(v);
1264 return NULL;
1265 }
1266 PyList_SET_ITEM(v, i, item);
1267 }
1268 if (n != mp->ma_used) {
1269 /* Durnit. The allocations caused the dict to resize.
1270 * Just start over, this shouldn't normally happen.
1271 */
1272 Py_DECREF(v);
1273 goto again;
1274 }
1275 /* Nothing we do below makes any function calls. */
1276 ep = mp->ma_table;
1277 mask = mp->ma_mask;
1278 for (i = 0, j = 0; i <= mask; i++) {
1279 if ((value=ep[i].me_value) != NULL) {
1280 key = ep[i].me_key;
1281 item = PyList_GET_ITEM(v, j);
1282 Py_INCREF(key);
1283 PyTuple_SET_ITEM(item, 0, key);
1284 Py_INCREF(value);
1285 PyTuple_SET_ITEM(item, 1, value);
1286 j++;
1287 }
1288 }
1289 assert(j == n);
1290 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001291}
1292
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001293static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001294dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 PyObject *seq;
1297 PyObject *value = Py_None;
1298 PyObject *it; /* iter(seq) */
1299 PyObject *key;
1300 PyObject *d;
1301 int status;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
1304 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 d = PyObject_CallObject(cls, NULL);
1307 if (d == NULL)
1308 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1311 PyDictObject *mp = (PyDictObject *)d;
1312 PyObject *oldvalue;
1313 Py_ssize_t pos = 0;
1314 PyObject *key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001315 Py_hash_t hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001316
Petri Lehtinena94200e2011-10-24 21:12:58 +03001317 if (dictresize(mp, Py_SIZE(seq))) {
1318 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001320 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1323 Py_INCREF(key);
1324 Py_INCREF(value);
Petri Lehtinena94200e2011-10-24 21:12:58 +03001325 if (insertdict(mp, key, hash, value)) {
1326 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001328 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 }
1330 return d;
1331 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
1334 PyDictObject *mp = (PyDictObject *)d;
1335 Py_ssize_t pos = 0;
1336 PyObject *key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001337 Py_hash_t hash;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001338
Petri Lehtinena94200e2011-10-24 21:12:58 +03001339 if (dictresize(mp, PySet_GET_SIZE(seq))) {
1340 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001342 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1345 Py_INCREF(key);
1346 Py_INCREF(value);
Petri Lehtinena94200e2011-10-24 21:12:58 +03001347 if (insertdict(mp, key, hash, value)) {
1348 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001350 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 }
1352 return d;
1353 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 it = PyObject_GetIter(seq);
1356 if (it == NULL){
1357 Py_DECREF(d);
1358 return NULL;
1359 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 if (PyDict_CheckExact(d)) {
1362 while ((key = PyIter_Next(it)) != NULL) {
1363 status = PyDict_SetItem(d, key, value);
1364 Py_DECREF(key);
1365 if (status < 0)
1366 goto Fail;
1367 }
1368 } else {
1369 while ((key = PyIter_Next(it)) != NULL) {
1370 status = PyObject_SetItem(d, key, value);
1371 Py_DECREF(key);
1372 if (status < 0)
1373 goto Fail;
1374 }
1375 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 if (PyErr_Occurred())
1378 goto Fail;
1379 Py_DECREF(it);
1380 return d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001381
1382Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 Py_DECREF(it);
1384 Py_DECREF(d);
1385 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001386}
1387
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001388static int
1389dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 PyObject *arg = NULL;
1392 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1395 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 else if (arg != NULL) {
1398 if (PyObject_HasAttrString(arg, "keys"))
1399 result = PyDict_Merge(self, arg, 1);
1400 else
1401 result = PyDict_MergeFromSeq2(self, arg, 1);
1402 }
1403 if (result == 0 && kwds != NULL) {
1404 if (PyArg_ValidateKeywordArguments(kwds))
1405 result = PyDict_Merge(self, kwds, 1);
1406 else
1407 result = -1;
1408 }
1409 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001410}
1411
1412static PyObject *
1413dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 if (dict_update_common(self, args, kwds, "update") != -1)
1416 Py_RETURN_NONE;
1417 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001418}
1419
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001420/* Update unconditionally replaces existing items.
1421 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001422 otherwise it leaves existing items unchanged.
1423
1424 PyDict_{Update,Merge} update/merge from a mapping object.
1425
Tim Petersf582b822001-12-11 18:51:08 +00001426 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001427 producing iterable objects of length 2.
1428*/
1429
Tim Petersf582b822001-12-11 18:51:08 +00001430int
Tim Peters1fc240e2001-10-26 05:06:50 +00001431PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 PyObject *it; /* iter(seq2) */
1434 Py_ssize_t i; /* index into seq2 of current element */
1435 PyObject *item; /* seq2[i] */
1436 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 assert(d != NULL);
1439 assert(PyDict_Check(d));
1440 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 it = PyObject_GetIter(seq2);
1443 if (it == NULL)
1444 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 for (i = 0; ; ++i) {
1447 PyObject *key, *value;
1448 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 fast = NULL;
1451 item = PyIter_Next(it);
1452 if (item == NULL) {
1453 if (PyErr_Occurred())
1454 goto Fail;
1455 break;
1456 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 /* Convert item to sequence, and verify length 2. */
1459 fast = PySequence_Fast(item, "");
1460 if (fast == NULL) {
1461 if (PyErr_ExceptionMatches(PyExc_TypeError))
1462 PyErr_Format(PyExc_TypeError,
1463 "cannot convert dictionary update "
1464 "sequence element #%zd to a sequence",
1465 i);
1466 goto Fail;
1467 }
1468 n = PySequence_Fast_GET_SIZE(fast);
1469 if (n != 2) {
1470 PyErr_Format(PyExc_ValueError,
1471 "dictionary update sequence element #%zd "
1472 "has length %zd; 2 is required",
1473 i, n);
1474 goto Fail;
1475 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 /* Update/merge with this (key, value) pair. */
1478 key = PySequence_Fast_GET_ITEM(fast, 0);
1479 value = PySequence_Fast_GET_ITEM(fast, 1);
1480 if (override || PyDict_GetItem(d, key) == NULL) {
1481 int status = PyDict_SetItem(d, key, value);
1482 if (status < 0)
1483 goto Fail;
1484 }
1485 Py_DECREF(fast);
1486 Py_DECREF(item);
1487 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 i = 0;
1490 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00001491Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 Py_XDECREF(item);
1493 Py_XDECREF(fast);
1494 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001495Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 Py_DECREF(it);
1497 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001498}
1499
Tim Peters6d6c1a32001-08-02 04:15:00 +00001500int
1501PyDict_Update(PyObject *a, PyObject *b)
1502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001504}
1505
1506int
1507PyDict_Merge(PyObject *a, PyObject *b, int override)
1508{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 register PyDictObject *mp, *other;
1510 register Py_ssize_t i;
1511 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 /* We accept for the argument either a concrete dictionary object,
1514 * or an abstract "mapping" object. For the former, we can do
1515 * things quite efficiently. For the latter, we only require that
1516 * PyMapping_Keys() and PyObject_GetItem() be supported.
1517 */
1518 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1519 PyErr_BadInternalCall();
1520 return -1;
1521 }
1522 mp = (PyDictObject*)a;
1523 if (PyDict_Check(b)) {
1524 other = (PyDictObject*)b;
1525 if (other == mp || other->ma_used == 0)
1526 /* a.update(a) or a.update({}); nothing to do */
1527 return 0;
1528 if (mp->ma_used == 0)
1529 /* Since the target dict is empty, PyDict_GetItem()
1530 * always returns NULL. Setting override to 1
1531 * skips the unnecessary test.
1532 */
1533 override = 1;
1534 /* Do one big resize at the start, rather than
1535 * incrementally resizing as we insert new items. Expect
1536 * that there will be no (or few) overlapping keys.
1537 */
1538 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
1539 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
1540 return -1;
1541 }
1542 for (i = 0; i <= other->ma_mask; i++) {
1543 entry = &other->ma_table[i];
1544 if (entry->me_value != NULL &&
1545 (override ||
1546 PyDict_GetItem(a, entry->me_key) == NULL)) {
1547 Py_INCREF(entry->me_key);
1548 Py_INCREF(entry->me_value);
1549 if (insertdict(mp, entry->me_key,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001550 entry->me_hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 entry->me_value) != 0)
1552 return -1;
1553 }
1554 }
1555 }
1556 else {
1557 /* Do it the generic, slower way */
1558 PyObject *keys = PyMapping_Keys(b);
1559 PyObject *iter;
1560 PyObject *key, *value;
1561 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 if (keys == NULL)
1564 /* Docstring says this is equivalent to E.keys() so
1565 * if E doesn't have a .keys() method we want
1566 * AttributeError to percolate up. Might as well
1567 * do the same for any other error.
1568 */
1569 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 iter = PyObject_GetIter(keys);
1572 Py_DECREF(keys);
1573 if (iter == NULL)
1574 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
1577 if (!override && PyDict_GetItem(a, key) != NULL) {
1578 Py_DECREF(key);
1579 continue;
1580 }
1581 value = PyObject_GetItem(b, key);
1582 if (value == NULL) {
1583 Py_DECREF(iter);
1584 Py_DECREF(key);
1585 return -1;
1586 }
1587 status = PyDict_SetItem(a, key, value);
1588 Py_DECREF(key);
1589 Py_DECREF(value);
1590 if (status < 0) {
1591 Py_DECREF(iter);
1592 return -1;
1593 }
1594 }
1595 Py_DECREF(iter);
1596 if (PyErr_Occurred())
1597 /* Iterator completed, via error */
1598 return -1;
1599 }
1600 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001601}
1602
1603static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001604dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001607}
1608
1609PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001610PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001611{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 if (o == NULL || !PyDict_Check(o)) {
1615 PyErr_BadInternalCall();
1616 return NULL;
1617 }
1618 copy = PyDict_New();
1619 if (copy == NULL)
1620 return NULL;
1621 if (PyDict_Merge(copy, o, 1) == 0)
1622 return copy;
1623 Py_DECREF(copy);
1624 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001625}
1626
Martin v. Löwis18e16552006-02-15 17:27:45 +00001627Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001628PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 if (mp == NULL || !PyDict_Check(mp)) {
1631 PyErr_BadInternalCall();
1632 return -1;
1633 }
1634 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001635}
1636
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001637PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001638PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001639{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 if (mp == NULL || !PyDict_Check(mp)) {
1641 PyErr_BadInternalCall();
1642 return NULL;
1643 }
1644 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001645}
1646
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001647PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001648PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 if (mp == NULL || !PyDict_Check(mp)) {
1651 PyErr_BadInternalCall();
1652 return NULL;
1653 }
1654 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001655}
1656
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001657PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001658PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001659{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 if (mp == NULL || !PyDict_Check(mp)) {
1661 PyErr_BadInternalCall();
1662 return NULL;
1663 }
1664 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001665}
1666
Tim Peterse63415e2001-05-08 04:38:29 +00001667/* Return 1 if dicts equal, 0 if not, -1 if error.
1668 * Gets out as soon as any difference is detected.
1669 * Uses only Py_EQ comparison.
1670 */
1671static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001672dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 if (a->ma_used != b->ma_used)
1677 /* can't be equal if # of entries differ */
1678 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 /* Same # of entries -- check all of 'em. Exit early on any diff. */
1681 for (i = 0; i <= a->ma_mask; i++) {
1682 PyObject *aval = a->ma_table[i].me_value;
1683 if (aval != NULL) {
1684 int cmp;
1685 PyObject *bval;
1686 PyObject *key = a->ma_table[i].me_key;
1687 /* temporarily bump aval's refcount to ensure it stays
1688 alive until we're done with it */
1689 Py_INCREF(aval);
1690 /* ditto for key */
1691 Py_INCREF(key);
1692 bval = PyDict_GetItemWithError((PyObject *)b, key);
1693 Py_DECREF(key);
1694 if (bval == NULL) {
1695 Py_DECREF(aval);
1696 if (PyErr_Occurred())
1697 return -1;
1698 return 0;
1699 }
1700 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1701 Py_DECREF(aval);
1702 if (cmp <= 0) /* error or not equal */
1703 return cmp;
1704 }
1705 }
1706 return 1;
Tim Peterse63415e2001-05-08 04:38:29 +00001707 }
1708
1709static PyObject *
1710dict_richcompare(PyObject *v, PyObject *w, int op)
1711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 int cmp;
1713 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00001714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1716 res = Py_NotImplemented;
1717 }
1718 else if (op == Py_EQ || op == Py_NE) {
1719 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
1720 if (cmp < 0)
1721 return NULL;
1722 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1723 }
1724 else
1725 res = Py_NotImplemented;
1726 Py_INCREF(res);
1727 return res;
Tim Peterse63415e2001-05-08 04:38:29 +00001728 }
1729
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001730static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001731dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001732{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001733 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 if (!PyUnicode_CheckExact(key) ||
1737 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1738 hash = PyObject_Hash(key);
1739 if (hash == -1)
1740 return NULL;
1741 }
1742 ep = (mp->ma_lookup)(mp, key, hash);
1743 if (ep == NULL)
1744 return NULL;
1745 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001746}
1747
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001748static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001749dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 PyObject *key;
1752 PyObject *failobj = Py_None;
1753 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001754 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
1758 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 if (!PyUnicode_CheckExact(key) ||
1761 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1762 hash = PyObject_Hash(key);
1763 if (hash == -1)
1764 return NULL;
1765 }
1766 ep = (mp->ma_lookup)(mp, key, hash);
1767 if (ep == NULL)
1768 return NULL;
1769 val = ep->me_value;
1770 if (val == NULL)
1771 val = failobj;
1772 Py_INCREF(val);
1773 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001774}
1775
1776
1777static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001778dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001779{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 PyObject *key;
1781 PyObject *failobj = Py_None;
1782 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001783 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
1787 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 if (!PyUnicode_CheckExact(key) ||
1790 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1791 hash = PyObject_Hash(key);
1792 if (hash == -1)
1793 return NULL;
1794 }
1795 ep = (mp->ma_lookup)(mp, key, hash);
1796 if (ep == NULL)
1797 return NULL;
1798 val = ep->me_value;
1799 if (val == NULL) {
1800 val = failobj;
1801 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1802 val = NULL;
1803 }
1804 Py_XINCREF(val);
1805 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00001806}
1807
1808
1809static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001810dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001811{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 PyDict_Clear((PyObject *)mp);
1813 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001814}
1815
Guido van Rossumba6ab842000-12-12 22:02:18 +00001816static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001817dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001818{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001819 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 PyDictEntry *ep;
1821 PyObject *old_value, *old_key;
1822 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1825 return NULL;
1826 if (mp->ma_used == 0) {
1827 if (deflt) {
1828 Py_INCREF(deflt);
1829 return deflt;
1830 }
Raymond Hettingerdd421542010-10-30 08:10:29 +00001831 set_key_error(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 return NULL;
1833 }
1834 if (!PyUnicode_CheckExact(key) ||
1835 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1836 hash = PyObject_Hash(key);
1837 if (hash == -1)
1838 return NULL;
1839 }
1840 ep = (mp->ma_lookup)(mp, key, hash);
1841 if (ep == NULL)
1842 return NULL;
1843 if (ep->me_value == NULL) {
1844 if (deflt) {
1845 Py_INCREF(deflt);
1846 return deflt;
1847 }
1848 set_key_error(key);
1849 return NULL;
1850 }
1851 old_key = ep->me_key;
1852 Py_INCREF(dummy);
1853 ep->me_key = dummy;
1854 old_value = ep->me_value;
1855 ep->me_value = NULL;
1856 mp->ma_used--;
1857 Py_DECREF(old_key);
1858 return old_value;
Guido van Rossume027d982002-04-12 15:11:59 +00001859}
1860
1861static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001862dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001863{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001864 Py_hash_t i = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 PyDictEntry *ep;
1866 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 /* Allocate the result tuple before checking the size. Believe it
1869 * or not, this allocation could trigger a garbage collection which
1870 * could empty the dict, so if we checked the size first and that
1871 * happened, the result would be an infinite loop (searching for an
1872 * entry that no longer exists). Note that the usual popitem()
1873 * idiom is "while d: k, v = d.popitem()". so needing to throw the
1874 * tuple away if the dict *is* empty isn't a significant
1875 * inefficiency -- possible, but unlikely in practice.
1876 */
1877 res = PyTuple_New(2);
1878 if (res == NULL)
1879 return NULL;
1880 if (mp->ma_used == 0) {
1881 Py_DECREF(res);
1882 PyErr_SetString(PyExc_KeyError,
1883 "popitem(): dictionary is empty");
1884 return NULL;
1885 }
1886 /* Set ep to "the first" dict entry with a value. We abuse the hash
1887 * field of slot 0 to hold a search finger:
1888 * If slot 0 has a value, use slot 0.
1889 * Else slot 0 is being used to hold a search finger,
1890 * and we use its hash value as the first index to look.
1891 */
1892 ep = &mp->ma_table[0];
1893 if (ep->me_value == NULL) {
1894 i = ep->me_hash;
1895 /* The hash field may be a real hash value, or it may be a
1896 * legit search finger, or it may be a once-legit search
1897 * finger that's out of bounds now because it wrapped around
1898 * or the table shrunk -- simply make sure it's in bounds now.
1899 */
1900 if (i > mp->ma_mask || i < 1)
1901 i = 1; /* skip slot 0 */
1902 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1903 i++;
1904 if (i > mp->ma_mask)
1905 i = 1;
1906 }
1907 }
1908 PyTuple_SET_ITEM(res, 0, ep->me_key);
1909 PyTuple_SET_ITEM(res, 1, ep->me_value);
1910 Py_INCREF(dummy);
1911 ep->me_key = dummy;
1912 ep->me_value = NULL;
1913 mp->ma_used--;
1914 assert(mp->ma_table[0].me_value == NULL);
1915 mp->ma_table[0].me_hash = i + 1; /* next place to start */
1916 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001917}
1918
Jeremy Hylton8caad492000-06-23 14:18:11 +00001919static int
1920dict_traverse(PyObject *op, visitproc visit, void *arg)
1921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 Py_ssize_t i = 0;
1923 PyObject *pk;
1924 PyObject *pv;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 while (PyDict_Next(op, &i, &pk, &pv)) {
1927 Py_VISIT(pk);
1928 Py_VISIT(pv);
1929 }
1930 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001931}
1932
1933static int
1934dict_tp_clear(PyObject *op)
1935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 PyDict_Clear(op);
1937 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001938}
1939
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001940static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001941
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001942static PyObject *
1943dict_sizeof(PyDictObject *mp)
1944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 res = sizeof(PyDictObject);
1948 if (mp->ma_table != mp->ma_smalltable)
1949 res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry);
1950 return PyLong_FromSsize_t(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001951}
1952
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001953PyDoc_STRVAR(contains__doc__,
1954"D.__contains__(k) -> True if D has a key k, else False");
1955
1956PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1957
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001958PyDoc_STRVAR(sizeof__doc__,
1959"D.__sizeof__() -> size of D in memory, in bytes");
1960
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001961PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001962"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001964PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001965"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 +00001966
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001967PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001968"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001969If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001971PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001972"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000019732-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001974
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001975PyDoc_STRVAR(update__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001976"D.update(E, **F) -> None. Update D from dict/iterable E and F.\n"
1977"If E has a .keys() method, does: for k in E: D[k] = E[k]\n\
1978If E lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
1979In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00001980
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001981PyDoc_STRVAR(fromkeys__doc__,
1982"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1983v defaults to None.");
1984
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001985PyDoc_STRVAR(clear__doc__,
1986"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001987
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001988PyDoc_STRVAR(copy__doc__,
1989"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001990
Guido van Rossumb90c8482007-02-10 01:11:45 +00001991/* Forward */
1992static PyObject *dictkeys_new(PyObject *);
1993static PyObject *dictitems_new(PyObject *);
1994static PyObject *dictvalues_new(PyObject *);
1995
Guido van Rossum45c85d12007-07-27 16:31:40 +00001996PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00001998PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002000PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002002
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002003static PyMethodDef mapp_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
2005 contains__doc__},
2006 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2007 getitem__doc__},
2008 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2009 sizeof__doc__},
2010 {"get", (PyCFunction)dict_get, METH_VARARGS,
2011 get__doc__},
2012 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2013 setdefault_doc__},
2014 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2015 pop__doc__},
2016 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2017 popitem__doc__},
2018 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2019 keys__doc__},
2020 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2021 items__doc__},
2022 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2023 values__doc__},
2024 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2025 update__doc__},
2026 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2027 fromkeys__doc__},
2028 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2029 clear__doc__},
2030 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2031 copy__doc__},
2032 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002033};
2034
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002035/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002036int
2037PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002038{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002039 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 PyDictObject *mp = (PyDictObject *)op;
2041 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 if (!PyUnicode_CheckExact(key) ||
2044 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
2045 hash = PyObject_Hash(key);
2046 if (hash == -1)
2047 return -1;
2048 }
2049 ep = (mp->ma_lookup)(mp, key, hash);
2050 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002051}
2052
Thomas Wouterscf297e42007-02-23 15:07:44 +00002053/* Internal version of PyDict_Contains used when the hash value is already known */
2054int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002055_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002056{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 PyDictObject *mp = (PyDictObject *)op;
2058 PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 ep = (mp->ma_lookup)(mp, key, hash);
2061 return ep == NULL ? -1 : (ep->me_value != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002062}
2063
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002064/* Hack to implement "key in dict" */
2065static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 0, /* sq_length */
2067 0, /* sq_concat */
2068 0, /* sq_repeat */
2069 0, /* sq_item */
2070 0, /* sq_slice */
2071 0, /* sq_ass_item */
2072 0, /* sq_ass_slice */
2073 PyDict_Contains, /* sq_contains */
2074 0, /* sq_inplace_concat */
2075 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002076};
2077
Guido van Rossum09e563a2001-05-01 12:10:21 +00002078static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002079dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 PyObject *self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 assert(type != NULL && type->tp_alloc != NULL);
2084 self = type->tp_alloc(type, 0);
2085 if (self != NULL) {
2086 PyDictObject *d = (PyDictObject *)self;
2087 /* It's guaranteed that tp->alloc zeroed out the struct. */
2088 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2089 INIT_NONZERO_DICT_SLOTS(d);
2090 d->ma_lookup = lookdict_unicode;
Ezio Melotti13925002011-03-16 11:05:33 +02002091 /* The object has been implicitly tracked by tp_alloc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 if (type == &PyDict_Type)
2093 _PyObject_GC_UNTRACK(d);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002094#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 ++created;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002096#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002097#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 if (_PyObject_GC_IS_TRACKED(d))
2099 count_tracked++;
2100 else
2101 count_untracked++;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002102#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 }
2104 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002105}
2106
Tim Peters25786c02001-09-02 08:22:48 +00002107static int
2108dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002111}
2112
Tim Peters6d6c1a32001-08-02 04:15:00 +00002113static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002114dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002117}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002118
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002119PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002120"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002121"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002122" (key, value) pairs\n"
2123"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002124" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002125" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002126" d[k] = v\n"
2127"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2128" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002129
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002130PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2132 "dict",
2133 sizeof(PyDictObject),
2134 0,
2135 (destructor)dict_dealloc, /* tp_dealloc */
2136 0, /* tp_print */
2137 0, /* tp_getattr */
2138 0, /* tp_setattr */
2139 0, /* tp_reserved */
2140 (reprfunc)dict_repr, /* tp_repr */
2141 0, /* tp_as_number */
2142 &dict_as_sequence, /* tp_as_sequence */
2143 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002144 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 0, /* tp_call */
2146 0, /* tp_str */
2147 PyObject_GenericGetAttr, /* tp_getattro */
2148 0, /* tp_setattro */
2149 0, /* tp_as_buffer */
2150 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2151 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2152 dictionary_doc, /* tp_doc */
2153 dict_traverse, /* tp_traverse */
2154 dict_tp_clear, /* tp_clear */
2155 dict_richcompare, /* tp_richcompare */
2156 0, /* tp_weaklistoffset */
2157 (getiterfunc)dict_iter, /* tp_iter */
2158 0, /* tp_iternext */
2159 mapp_methods, /* tp_methods */
2160 0, /* tp_members */
2161 0, /* tp_getset */
2162 0, /* tp_base */
2163 0, /* tp_dict */
2164 0, /* tp_descr_get */
2165 0, /* tp_descr_set */
2166 0, /* tp_dictoffset */
2167 dict_init, /* tp_init */
2168 PyType_GenericAlloc, /* tp_alloc */
2169 dict_new, /* tp_new */
2170 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002171};
2172
Guido van Rossum3cca2451997-05-16 14:23:33 +00002173/* For backward compatibility with old dictionary interface */
2174
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002175PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002176PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 PyObject *kv, *rv;
2179 kv = PyUnicode_FromString(key);
2180 if (kv == NULL)
2181 return NULL;
2182 rv = PyDict_GetItem(v, kv);
2183 Py_DECREF(kv);
2184 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002185}
2186
2187int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002188PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002189{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 PyObject *kv;
2191 int err;
2192 kv = PyUnicode_FromString(key);
2193 if (kv == NULL)
2194 return -1;
2195 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2196 err = PyDict_SetItem(v, kv, item);
2197 Py_DECREF(kv);
2198 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002199}
2200
2201int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002202PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 PyObject *kv;
2205 int err;
2206 kv = PyUnicode_FromString(key);
2207 if (kv == NULL)
2208 return -1;
2209 err = PyDict_DelItem(v, kv);
2210 Py_DECREF(kv);
2211 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002212}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002213
Raymond Hettinger019a1482004-03-18 02:41:19 +00002214/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002215
2216typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 PyObject_HEAD
2218 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2219 Py_ssize_t di_used;
2220 Py_ssize_t di_pos;
2221 PyObject* di_result; /* reusable result tuple for iteritems */
2222 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002223} dictiterobject;
2224
2225static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002226dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 dictiterobject *di;
2229 di = PyObject_GC_New(dictiterobject, itertype);
2230 if (di == NULL)
2231 return NULL;
2232 Py_INCREF(dict);
2233 di->di_dict = dict;
2234 di->di_used = dict->ma_used;
2235 di->di_pos = 0;
2236 di->len = dict->ma_used;
2237 if (itertype == &PyDictIterItem_Type) {
2238 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2239 if (di->di_result == NULL) {
2240 Py_DECREF(di);
2241 return NULL;
2242 }
2243 }
2244 else
2245 di->di_result = NULL;
2246 _PyObject_GC_TRACK(di);
2247 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002248}
2249
2250static void
2251dictiter_dealloc(dictiterobject *di)
2252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 Py_XDECREF(di->di_dict);
2254 Py_XDECREF(di->di_result);
2255 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002256}
2257
2258static int
2259dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2260{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 Py_VISIT(di->di_dict);
2262 Py_VISIT(di->di_result);
2263 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002264}
2265
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002266static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002267dictiter_len(dictiterobject *di)
2268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 Py_ssize_t len = 0;
2270 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2271 len = di->len;
2272 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002273}
2274
Guido van Rossumb90c8482007-02-10 01:11:45 +00002275PyDoc_STRVAR(length_hint_doc,
2276 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002277
2278static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2280 length_hint_doc},
2281 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002282};
2283
Raymond Hettinger019a1482004-03-18 02:41:19 +00002284static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 PyObject *key;
2287 register Py_ssize_t i, mask;
2288 register PyDictEntry *ep;
2289 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 if (d == NULL)
2292 return NULL;
2293 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 if (di->di_used != d->ma_used) {
2296 PyErr_SetString(PyExc_RuntimeError,
2297 "dictionary changed size during iteration");
2298 di->di_used = -1; /* Make this state sticky */
2299 return NULL;
2300 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 i = di->di_pos;
2303 if (i < 0)
2304 goto fail;
2305 ep = d->ma_table;
2306 mask = d->ma_mask;
2307 while (i <= mask && ep[i].me_value == NULL)
2308 i++;
2309 di->di_pos = i+1;
2310 if (i > mask)
2311 goto fail;
2312 di->len--;
2313 key = ep[i].me_key;
2314 Py_INCREF(key);
2315 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002316
2317fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 Py_DECREF(d);
2319 di->di_dict = NULL;
2320 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002321}
2322
Raymond Hettinger019a1482004-03-18 02:41:19 +00002323PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2325 "dict_keyiterator", /* tp_name */
2326 sizeof(dictiterobject), /* tp_basicsize */
2327 0, /* tp_itemsize */
2328 /* methods */
2329 (destructor)dictiter_dealloc, /* tp_dealloc */
2330 0, /* tp_print */
2331 0, /* tp_getattr */
2332 0, /* tp_setattr */
2333 0, /* tp_reserved */
2334 0, /* tp_repr */
2335 0, /* tp_as_number */
2336 0, /* tp_as_sequence */
2337 0, /* tp_as_mapping */
2338 0, /* tp_hash */
2339 0, /* tp_call */
2340 0, /* tp_str */
2341 PyObject_GenericGetAttr, /* tp_getattro */
2342 0, /* tp_setattro */
2343 0, /* tp_as_buffer */
2344 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2345 0, /* tp_doc */
2346 (traverseproc)dictiter_traverse, /* tp_traverse */
2347 0, /* tp_clear */
2348 0, /* tp_richcompare */
2349 0, /* tp_weaklistoffset */
2350 PyObject_SelfIter, /* tp_iter */
2351 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2352 dictiter_methods, /* tp_methods */
2353 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002354};
2355
2356static PyObject *dictiter_iternextvalue(dictiterobject *di)
2357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 PyObject *value;
2359 register Py_ssize_t i, mask;
2360 register PyDictEntry *ep;
2361 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 if (d == NULL)
2364 return NULL;
2365 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 if (di->di_used != d->ma_used) {
2368 PyErr_SetString(PyExc_RuntimeError,
2369 "dictionary changed size during iteration");
2370 di->di_used = -1; /* Make this state sticky */
2371 return NULL;
2372 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 i = di->di_pos;
2375 mask = d->ma_mask;
2376 if (i < 0 || i > mask)
2377 goto fail;
2378 ep = d->ma_table;
2379 while ((value=ep[i].me_value) == NULL) {
2380 i++;
2381 if (i > mask)
2382 goto fail;
2383 }
2384 di->di_pos = i+1;
2385 di->len--;
2386 Py_INCREF(value);
2387 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002388
2389fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 Py_DECREF(d);
2391 di->di_dict = NULL;
2392 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002393}
2394
2395PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2397 "dict_valueiterator", /* tp_name */
2398 sizeof(dictiterobject), /* tp_basicsize */
2399 0, /* tp_itemsize */
2400 /* methods */
2401 (destructor)dictiter_dealloc, /* tp_dealloc */
2402 0, /* tp_print */
2403 0, /* tp_getattr */
2404 0, /* tp_setattr */
2405 0, /* tp_reserved */
2406 0, /* tp_repr */
2407 0, /* tp_as_number */
2408 0, /* tp_as_sequence */
2409 0, /* tp_as_mapping */
2410 0, /* tp_hash */
2411 0, /* tp_call */
2412 0, /* tp_str */
2413 PyObject_GenericGetAttr, /* tp_getattro */
2414 0, /* tp_setattro */
2415 0, /* tp_as_buffer */
2416 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2417 0, /* tp_doc */
2418 (traverseproc)dictiter_traverse, /* tp_traverse */
2419 0, /* tp_clear */
2420 0, /* tp_richcompare */
2421 0, /* tp_weaklistoffset */
2422 PyObject_SelfIter, /* tp_iter */
2423 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2424 dictiter_methods, /* tp_methods */
2425 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002426};
2427
2428static PyObject *dictiter_iternextitem(dictiterobject *di)
2429{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 PyObject *key, *value, *result = di->di_result;
2431 register Py_ssize_t i, mask;
2432 register PyDictEntry *ep;
2433 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 if (d == NULL)
2436 return NULL;
2437 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 if (di->di_used != d->ma_used) {
2440 PyErr_SetString(PyExc_RuntimeError,
2441 "dictionary changed size during iteration");
2442 di->di_used = -1; /* Make this state sticky */
2443 return NULL;
2444 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 i = di->di_pos;
2447 if (i < 0)
2448 goto fail;
2449 ep = d->ma_table;
2450 mask = d->ma_mask;
2451 while (i <= mask && ep[i].me_value == NULL)
2452 i++;
2453 di->di_pos = i+1;
2454 if (i > mask)
2455 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 if (result->ob_refcnt == 1) {
2458 Py_INCREF(result);
2459 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2460 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2461 } else {
2462 result = PyTuple_New(2);
2463 if (result == NULL)
2464 return NULL;
2465 }
2466 di->len--;
2467 key = ep[i].me_key;
2468 value = ep[i].me_value;
2469 Py_INCREF(key);
2470 Py_INCREF(value);
2471 PyTuple_SET_ITEM(result, 0, key);
2472 PyTuple_SET_ITEM(result, 1, value);
2473 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002474
2475fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 Py_DECREF(d);
2477 di->di_dict = NULL;
2478 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002479}
2480
2481PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2483 "dict_itemiterator", /* tp_name */
2484 sizeof(dictiterobject), /* tp_basicsize */
2485 0, /* tp_itemsize */
2486 /* methods */
2487 (destructor)dictiter_dealloc, /* tp_dealloc */
2488 0, /* tp_print */
2489 0, /* tp_getattr */
2490 0, /* tp_setattr */
2491 0, /* tp_reserved */
2492 0, /* tp_repr */
2493 0, /* tp_as_number */
2494 0, /* tp_as_sequence */
2495 0, /* tp_as_mapping */
2496 0, /* tp_hash */
2497 0, /* tp_call */
2498 0, /* tp_str */
2499 PyObject_GenericGetAttr, /* tp_getattro */
2500 0, /* tp_setattro */
2501 0, /* tp_as_buffer */
2502 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2503 0, /* tp_doc */
2504 (traverseproc)dictiter_traverse, /* tp_traverse */
2505 0, /* tp_clear */
2506 0, /* tp_richcompare */
2507 0, /* tp_weaklistoffset */
2508 PyObject_SelfIter, /* tp_iter */
2509 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
2510 dictiter_methods, /* tp_methods */
2511 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002512};
Guido van Rossumb90c8482007-02-10 01:11:45 +00002513
2514
Guido van Rossum3ac67412007-02-10 18:55:06 +00002515/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002516/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002517/***********************************************/
2518
Guido van Rossumb90c8482007-02-10 01:11:45 +00002519/* The instance lay-out is the same for all three; but the type differs. */
2520
2521typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 PyObject_HEAD
2523 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002524} dictviewobject;
2525
2526
2527static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00002528dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 Py_XDECREF(dv->dv_dict);
2531 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002532}
2533
2534static int
2535dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
2536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 Py_VISIT(dv->dv_dict);
2538 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002539}
2540
Guido van Rossum83825ac2007-02-10 04:54:19 +00002541static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00002542dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 Py_ssize_t len = 0;
2545 if (dv->dv_dict != NULL)
2546 len = dv->dv_dict->ma_used;
2547 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002548}
2549
2550static PyObject *
2551dictview_new(PyObject *dict, PyTypeObject *type)
2552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 dictviewobject *dv;
2554 if (dict == NULL) {
2555 PyErr_BadInternalCall();
2556 return NULL;
2557 }
2558 if (!PyDict_Check(dict)) {
2559 /* XXX Get rid of this restriction later */
2560 PyErr_Format(PyExc_TypeError,
2561 "%s() requires a dict argument, not '%s'",
2562 type->tp_name, dict->ob_type->tp_name);
2563 return NULL;
2564 }
2565 dv = PyObject_GC_New(dictviewobject, type);
2566 if (dv == NULL)
2567 return NULL;
2568 Py_INCREF(dict);
2569 dv->dv_dict = (PyDictObject *)dict;
2570 _PyObject_GC_TRACK(dv);
2571 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002572}
2573
Neal Norwitze36f2ba2007-02-26 23:12:28 +00002574/* TODO(guido): The views objects are not complete:
2575
2576 * support more set operations
2577 * support arbitrary mappings?
2578 - either these should be static or exported in dictobject.h
2579 - if public then they should probably be in builtins
2580*/
2581
Guido van Rossumaac530c2007-08-24 22:33:45 +00002582/* Return 1 if self is a subset of other, iterating over self;
2583 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002584static int
2585all_contained_in(PyObject *self, PyObject *other)
2586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 PyObject *iter = PyObject_GetIter(self);
2588 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 if (iter == NULL)
2591 return -1;
2592 for (;;) {
2593 PyObject *next = PyIter_Next(iter);
2594 if (next == NULL) {
2595 if (PyErr_Occurred())
2596 ok = -1;
2597 break;
2598 }
2599 ok = PySequence_Contains(other, next);
2600 Py_DECREF(next);
2601 if (ok <= 0)
2602 break;
2603 }
2604 Py_DECREF(iter);
2605 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002606}
2607
2608static PyObject *
2609dictview_richcompare(PyObject *self, PyObject *other, int op)
2610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 Py_ssize_t len_self, len_other;
2612 int ok;
2613 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 assert(self != NULL);
2616 assert(PyDictViewSet_Check(self));
2617 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00002618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other)) {
2620 Py_INCREF(Py_NotImplemented);
2621 return Py_NotImplemented;
2622 }
Guido van Rossumaac530c2007-08-24 22:33:45 +00002623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002624 len_self = PyObject_Size(self);
2625 if (len_self < 0)
2626 return NULL;
2627 len_other = PyObject_Size(other);
2628 if (len_other < 0)
2629 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 ok = 0;
2632 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00002633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 case Py_NE:
2635 case Py_EQ:
2636 if (len_self == len_other)
2637 ok = all_contained_in(self, other);
2638 if (op == Py_NE && ok >= 0)
2639 ok = !ok;
2640 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 case Py_LT:
2643 if (len_self < len_other)
2644 ok = all_contained_in(self, other);
2645 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 case Py_LE:
2648 if (len_self <= len_other)
2649 ok = all_contained_in(self, other);
2650 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 case Py_GT:
2653 if (len_self > len_other)
2654 ok = all_contained_in(other, self);
2655 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 case Py_GE:
2658 if (len_self >= len_other)
2659 ok = all_contained_in(other, self);
2660 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 }
2663 if (ok < 0)
2664 return NULL;
2665 result = ok ? Py_True : Py_False;
2666 Py_INCREF(result);
2667 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002668}
2669
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002670static PyObject *
2671dictview_repr(dictviewobject *dv)
2672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 PyObject *seq;
2674 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676 seq = PySequence_List((PyObject *)dv);
2677 if (seq == NULL)
2678 return NULL;
2679
2680 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
2681 Py_DECREF(seq);
2682 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002683}
2684
Guido van Rossum3ac67412007-02-10 18:55:06 +00002685/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002686
2687static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002688dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 if (dv->dv_dict == NULL) {
2691 Py_RETURN_NONE;
2692 }
2693 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002694}
2695
2696static int
2697dictkeys_contains(dictviewobject *dv, PyObject *obj)
2698{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 if (dv->dv_dict == NULL)
2700 return 0;
2701 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002702}
2703
Guido van Rossum83825ac2007-02-10 04:54:19 +00002704static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 (lenfunc)dictview_len, /* sq_length */
2706 0, /* sq_concat */
2707 0, /* sq_repeat */
2708 0, /* sq_item */
2709 0, /* sq_slice */
2710 0, /* sq_ass_item */
2711 0, /* sq_ass_slice */
2712 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002713};
2714
Guido van Rossum523259b2007-08-24 23:41:22 +00002715static PyObject*
2716dictviews_sub(PyObject* self, PyObject *other)
2717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 PyObject *result = PySet_New(self);
2719 PyObject *tmp;
2720 if (result == NULL)
2721 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 tmp = PyObject_CallMethod(result, "difference_update", "O", other);
2724 if (tmp == NULL) {
2725 Py_DECREF(result);
2726 return NULL;
2727 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 Py_DECREF(tmp);
2730 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002731}
2732
2733static PyObject*
2734dictviews_and(PyObject* self, PyObject *other)
2735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 PyObject *result = PySet_New(self);
2737 PyObject *tmp;
2738 if (result == NULL)
2739 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 tmp = PyObject_CallMethod(result, "intersection_update", "O", other);
2742 if (tmp == NULL) {
2743 Py_DECREF(result);
2744 return NULL;
2745 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 Py_DECREF(tmp);
2748 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002749}
2750
2751static PyObject*
2752dictviews_or(PyObject* self, PyObject *other)
2753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 PyObject *result = PySet_New(self);
2755 PyObject *tmp;
2756 if (result == NULL)
2757 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 tmp = PyObject_CallMethod(result, "update", "O", other);
2760 if (tmp == NULL) {
2761 Py_DECREF(result);
2762 return NULL;
2763 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 Py_DECREF(tmp);
2766 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002767}
2768
2769static PyObject*
2770dictviews_xor(PyObject* self, PyObject *other)
2771{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002772 PyObject *result = PySet_New(self);
2773 PyObject *tmp;
2774 if (result == NULL)
2775 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 tmp = PyObject_CallMethod(result, "symmetric_difference_update", "O",
2778 other);
2779 if (tmp == NULL) {
2780 Py_DECREF(result);
2781 return NULL;
2782 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 Py_DECREF(tmp);
2785 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002786}
2787
2788static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 0, /*nb_add*/
2790 (binaryfunc)dictviews_sub, /*nb_subtract*/
2791 0, /*nb_multiply*/
2792 0, /*nb_remainder*/
2793 0, /*nb_divmod*/
2794 0, /*nb_power*/
2795 0, /*nb_negative*/
2796 0, /*nb_positive*/
2797 0, /*nb_absolute*/
2798 0, /*nb_bool*/
2799 0, /*nb_invert*/
2800 0, /*nb_lshift*/
2801 0, /*nb_rshift*/
2802 (binaryfunc)dictviews_and, /*nb_and*/
2803 (binaryfunc)dictviews_xor, /*nb_xor*/
2804 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00002805};
2806
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00002807static PyObject*
2808dictviews_isdisjoint(PyObject *self, PyObject *other)
2809{
2810 PyObject *it;
2811 PyObject *item = NULL;
2812
2813 if (self == other) {
2814 if (dictview_len((dictviewobject *)self) == 0)
2815 Py_RETURN_TRUE;
2816 else
2817 Py_RETURN_FALSE;
2818 }
2819
2820 /* Iterate over the shorter object (only if other is a set,
2821 * because PySequence_Contains may be expensive otherwise): */
2822 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
2823 Py_ssize_t len_self = dictview_len((dictviewobject *)self);
2824 Py_ssize_t len_other = PyObject_Size(other);
2825 if (len_other == -1)
2826 return NULL;
2827
2828 if ((len_other > len_self)) {
2829 PyObject *tmp = other;
2830 other = self;
2831 self = tmp;
2832 }
2833 }
2834
2835 it = PyObject_GetIter(other);
2836 if (it == NULL)
2837 return NULL;
2838
2839 while ((item = PyIter_Next(it)) != NULL) {
2840 int contains = PySequence_Contains(self, item);
2841 Py_DECREF(item);
2842 if (contains == -1) {
2843 Py_DECREF(it);
2844 return NULL;
2845 }
2846
2847 if (contains) {
2848 Py_DECREF(it);
2849 Py_RETURN_FALSE;
2850 }
2851 }
2852 Py_DECREF(it);
2853 if (PyErr_Occurred())
2854 return NULL; /* PyIter_Next raised an exception. */
2855 Py_RETURN_TRUE;
2856}
2857
2858PyDoc_STRVAR(isdisjoint_doc,
2859"Return True if the view and the given iterable have a null intersection.");
2860
Guido van Rossumb90c8482007-02-10 01:11:45 +00002861static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00002862 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
2863 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002865};
2866
2867PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2869 "dict_keys", /* tp_name */
2870 sizeof(dictviewobject), /* tp_basicsize */
2871 0, /* tp_itemsize */
2872 /* methods */
2873 (destructor)dictview_dealloc, /* tp_dealloc */
2874 0, /* tp_print */
2875 0, /* tp_getattr */
2876 0, /* tp_setattr */
2877 0, /* tp_reserved */
2878 (reprfunc)dictview_repr, /* tp_repr */
2879 &dictviews_as_number, /* tp_as_number */
2880 &dictkeys_as_sequence, /* tp_as_sequence */
2881 0, /* tp_as_mapping */
2882 0, /* tp_hash */
2883 0, /* tp_call */
2884 0, /* tp_str */
2885 PyObject_GenericGetAttr, /* tp_getattro */
2886 0, /* tp_setattro */
2887 0, /* tp_as_buffer */
2888 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2889 0, /* tp_doc */
2890 (traverseproc)dictview_traverse, /* tp_traverse */
2891 0, /* tp_clear */
2892 dictview_richcompare, /* tp_richcompare */
2893 0, /* tp_weaklistoffset */
2894 (getiterfunc)dictkeys_iter, /* tp_iter */
2895 0, /* tp_iternext */
2896 dictkeys_methods, /* tp_methods */
2897 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00002898};
2899
2900static PyObject *
2901dictkeys_new(PyObject *dict)
2902{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002903 return dictview_new(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002904}
2905
Guido van Rossum3ac67412007-02-10 18:55:06 +00002906/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002907
2908static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002909dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002910{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002911 if (dv->dv_dict == NULL) {
2912 Py_RETURN_NONE;
2913 }
2914 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002915}
2916
2917static int
2918dictitems_contains(dictviewobject *dv, PyObject *obj)
2919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920 PyObject *key, *value, *found;
2921 if (dv->dv_dict == NULL)
2922 return 0;
2923 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
2924 return 0;
2925 key = PyTuple_GET_ITEM(obj, 0);
2926 value = PyTuple_GET_ITEM(obj, 1);
2927 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
2928 if (found == NULL) {
2929 if (PyErr_Occurred())
2930 return -1;
2931 return 0;
2932 }
2933 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002934}
2935
Guido van Rossum83825ac2007-02-10 04:54:19 +00002936static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937 (lenfunc)dictview_len, /* sq_length */
2938 0, /* sq_concat */
2939 0, /* sq_repeat */
2940 0, /* sq_item */
2941 0, /* sq_slice */
2942 0, /* sq_ass_item */
2943 0, /* sq_ass_slice */
2944 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002945};
2946
Guido van Rossumb90c8482007-02-10 01:11:45 +00002947static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00002948 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
2949 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002951};
2952
2953PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2955 "dict_items", /* tp_name */
2956 sizeof(dictviewobject), /* tp_basicsize */
2957 0, /* tp_itemsize */
2958 /* methods */
2959 (destructor)dictview_dealloc, /* tp_dealloc */
2960 0, /* tp_print */
2961 0, /* tp_getattr */
2962 0, /* tp_setattr */
2963 0, /* tp_reserved */
2964 (reprfunc)dictview_repr, /* tp_repr */
2965 &dictviews_as_number, /* tp_as_number */
2966 &dictitems_as_sequence, /* tp_as_sequence */
2967 0, /* tp_as_mapping */
2968 0, /* tp_hash */
2969 0, /* tp_call */
2970 0, /* tp_str */
2971 PyObject_GenericGetAttr, /* tp_getattro */
2972 0, /* tp_setattro */
2973 0, /* tp_as_buffer */
2974 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2975 0, /* tp_doc */
2976 (traverseproc)dictview_traverse, /* tp_traverse */
2977 0, /* tp_clear */
2978 dictview_richcompare, /* tp_richcompare */
2979 0, /* tp_weaklistoffset */
2980 (getiterfunc)dictitems_iter, /* tp_iter */
2981 0, /* tp_iternext */
2982 dictitems_methods, /* tp_methods */
2983 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00002984};
2985
2986static PyObject *
2987dictitems_new(PyObject *dict)
2988{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002989 return dictview_new(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002990}
2991
Guido van Rossum3ac67412007-02-10 18:55:06 +00002992/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002993
2994static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002995dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 if (dv->dv_dict == NULL) {
2998 Py_RETURN_NONE;
2999 }
3000 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003001}
3002
Guido van Rossum83825ac2007-02-10 04:54:19 +00003003static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003004 (lenfunc)dictview_len, /* sq_length */
3005 0, /* sq_concat */
3006 0, /* sq_repeat */
3007 0, /* sq_item */
3008 0, /* sq_slice */
3009 0, /* sq_ass_item */
3010 0, /* sq_ass_slice */
3011 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003012};
3013
Guido van Rossumb90c8482007-02-10 01:11:45 +00003014static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003016};
3017
3018PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3020 "dict_values", /* tp_name */
3021 sizeof(dictviewobject), /* tp_basicsize */
3022 0, /* tp_itemsize */
3023 /* methods */
3024 (destructor)dictview_dealloc, /* tp_dealloc */
3025 0, /* tp_print */
3026 0, /* tp_getattr */
3027 0, /* tp_setattr */
3028 0, /* tp_reserved */
3029 (reprfunc)dictview_repr, /* tp_repr */
3030 0, /* tp_as_number */
3031 &dictvalues_as_sequence, /* tp_as_sequence */
3032 0, /* tp_as_mapping */
3033 0, /* tp_hash */
3034 0, /* tp_call */
3035 0, /* tp_str */
3036 PyObject_GenericGetAttr, /* tp_getattro */
3037 0, /* tp_setattro */
3038 0, /* tp_as_buffer */
3039 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3040 0, /* tp_doc */
3041 (traverseproc)dictview_traverse, /* tp_traverse */
3042 0, /* tp_clear */
3043 0, /* tp_richcompare */
3044 0, /* tp_weaklistoffset */
3045 (getiterfunc)dictvalues_iter, /* tp_iter */
3046 0, /* tp_iternext */
3047 dictvalues_methods, /* tp_methods */
3048 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003049};
3050
3051static PyObject *
3052dictvalues_new(PyObject *dict)
3053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054 return dictview_new(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003055}