blob: 27de10dc8dfcac2d9c77ffc5c905fb5a9e2bd0bf [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
Fred Drake1bff34a2000-08-31 19:31:38 +0000513/*
Antoine Pitroue965d972012-02-27 00:45:12 +0100514Internal routine to insert a new item into the table when you have entry object.
515Used by insertdict.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000516*/
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000517static int
Antoine Pitroue965d972012-02-27 00:45:12 +0100518insertdict_by_entry(register PyDictObject *mp, PyObject *key, Py_hash_t hash,
519 PyDictEntry *ep, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000520{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 PyObject *old_value;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 MAINTAIN_TRACKING(mp, key, value);
524 if (ep->me_value != NULL) {
525 old_value = ep->me_value;
526 ep->me_value = value;
527 Py_DECREF(old_value); /* which **CAN** re-enter */
528 Py_DECREF(key);
529 }
530 else {
531 if (ep->me_key == NULL)
532 mp->ma_fill++;
533 else {
534 assert(ep->me_key == dummy);
535 Py_DECREF(dummy);
536 }
537 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000538 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 ep->me_value = value;
540 mp->ma_used++;
541 }
542 return 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000543}
544
Antoine Pitroue965d972012-02-27 00:45:12 +0100545
546/*
547Internal routine to insert a new item into the table.
548Used both by the internal resize routine and by the public insert routine.
549Eats a reference to key and one to value.
550Returns -1 if an error occurred, or 0 on success.
551*/
552static int
553insertdict(register PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
554{
555 register PyDictEntry *ep;
556
557 assert(mp->ma_lookup != NULL);
558 ep = mp->ma_lookup(mp, key, hash);
559 if (ep == NULL) {
560 Py_DECREF(key);
561 Py_DECREF(value);
562 return -1;
563 }
564 return insertdict_by_entry(mp, key, hash, ep, value);
565}
566
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000567/*
568Internal routine used by dictresize() to insert an item which is
569known to be absent from the dict. This routine also assumes that
570the dict contains no deleted entries. Besides the performance benefit,
571using insertdict() in dictresize() is dangerous (SF bug #1456209).
572Note that no refcounts are changed by this routine; if needed, the caller
573is responsible for incref'ing `key` and `value`.
574*/
575static void
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000576insertdict_clean(register PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 register size_t i;
580 register size_t perturb;
581 register size_t mask = (size_t)mp->ma_mask;
582 PyDictEntry *ep0 = mp->ma_table;
583 register PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 MAINTAIN_TRACKING(mp, key, value);
586 i = hash & mask;
587 ep = &ep0[i];
588 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
589 i = (i << 2) + i + perturb + 1;
590 ep = &ep0[i & mask];
591 }
592 assert(ep->me_value == NULL);
593 mp->ma_fill++;
594 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000595 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 ep->me_value = value;
597 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000598}
599
600/*
601Restructure the table by allocating a new table and reinserting all
602items again. When entries have been deleted, the new table may
603actually be smaller than the old one.
604*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000605static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000606dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 Py_ssize_t newsize;
609 PyDictEntry *oldtable, *newtable, *ep;
610 Py_ssize_t i;
611 int is_oldtable_malloced;
612 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 /* Find the smallest table size > minused. */
617 for (newsize = PyDict_MINSIZE;
618 newsize <= minused && newsize > 0;
619 newsize <<= 1)
620 ;
621 if (newsize <= 0) {
622 PyErr_NoMemory();
623 return -1;
624 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 /* Get space for a new table. */
627 oldtable = mp->ma_table;
628 assert(oldtable != NULL);
629 is_oldtable_malloced = oldtable != mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 if (newsize == PyDict_MINSIZE) {
632 /* A large table is shrinking, or we can't get any smaller. */
633 newtable = mp->ma_smalltable;
634 if (newtable == oldtable) {
635 if (mp->ma_fill == mp->ma_used) {
636 /* No dummies, so no point doing anything. */
637 return 0;
638 }
639 /* We're not going to resize it, but rebuild the
640 table anyway to purge old dummy entries.
641 Subtle: This is *necessary* if fill==size,
642 as lookdict needs at least one virgin slot to
643 terminate failing searches. If fill < size, it's
644 merely desirable, as dummies slow searches. */
645 assert(mp->ma_fill > mp->ma_used);
646 memcpy(small_copy, oldtable, sizeof(small_copy));
647 oldtable = small_copy;
648 }
649 }
650 else {
651 newtable = PyMem_NEW(PyDictEntry, newsize);
652 if (newtable == NULL) {
653 PyErr_NoMemory();
654 return -1;
655 }
656 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 /* Make the dict empty, using the new table. */
659 assert(newtable != oldtable);
660 mp->ma_table = newtable;
661 mp->ma_mask = newsize - 1;
662 memset(newtable, 0, sizeof(PyDictEntry) * newsize);
663 mp->ma_used = 0;
664 i = mp->ma_fill;
665 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 /* Copy the data over; this is refcount-neutral for active entries;
668 dummy entries aren't copied over, of course */
669 for (ep = oldtable; i > 0; ep++) {
670 if (ep->me_value != NULL) { /* active entry */
671 --i;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000672 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 }
674 else if (ep->me_key != NULL) { /* dummy entry */
675 --i;
676 assert(ep->me_key == dummy);
677 Py_DECREF(ep->me_key);
678 }
679 /* else key == value == NULL: nothing to do */
680 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 if (is_oldtable_malloced)
683 PyMem_DEL(oldtable);
684 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000685}
686
Christian Heimes99170a52007-12-19 02:07:34 +0000687/* Create a new dictionary pre-sized to hold an estimated number of elements.
688 Underestimates are okay because the dictionary will resize as necessary.
689 Overestimates just mean the dictionary will be more sparse than usual.
690*/
691
692PyObject *
693_PyDict_NewPresized(Py_ssize_t minused)
694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 PyObject *op = PyDict_New();
Christian Heimes99170a52007-12-19 02:07:34 +0000696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
698 Py_DECREF(op);
699 return NULL;
700 }
701 return op;
Christian Heimes99170a52007-12-19 02:07:34 +0000702}
703
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000704/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
705 * that may occur (originally dicts supported only string keys, and exceptions
706 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000707 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000708 * (suppressed) occurred while computing the key's hash, or that some error
709 * (suppressed) occurred when comparing keys in the dict's internal probe
710 * sequence. A nasty example of the latter is when a Python-coded comparison
711 * function hits a stack-depth error, which can cause this to return NULL
712 * even if the key is present.
713 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000715PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000716{
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000717 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 PyDictObject *mp = (PyDictObject *)op;
719 PyDictEntry *ep;
720 PyThreadState *tstate;
721 if (!PyDict_Check(op))
722 return NULL;
723 if (!PyUnicode_CheckExact(key) ||
724 (hash = ((PyUnicodeObject *) key)->hash) == -1)
725 {
726 hash = PyObject_Hash(key);
727 if (hash == -1) {
728 PyErr_Clear();
729 return NULL;
730 }
731 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 /* We can arrive here with a NULL tstate during initialization: try
734 running "python -Wi" for an example related to string interning.
735 Let's just hope that no exception occurs then... This must be
736 _PyThreadState_Current and not PyThreadState_GET() because in debug
737 mode, the latter complains if tstate is NULL. */
738 tstate = (PyThreadState*)_Py_atomic_load_relaxed(
739 &_PyThreadState_Current);
740 if (tstate != NULL && tstate->curexc_type != NULL) {
741 /* preserve the existing exception */
742 PyObject *err_type, *err_value, *err_tb;
743 PyErr_Fetch(&err_type, &err_value, &err_tb);
744 ep = (mp->ma_lookup)(mp, key, hash);
745 /* ignore errors */
746 PyErr_Restore(err_type, err_value, err_tb);
747 if (ep == NULL)
748 return NULL;
749 }
750 else {
751 ep = (mp->ma_lookup)(mp, key, hash);
752 if (ep == NULL) {
753 PyErr_Clear();
754 return NULL;
755 }
756 }
757 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000758}
759
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000760/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
761 This returns NULL *with* an exception set if an exception occurred.
762 It returns NULL *without* an exception set if the key wasn't present.
763*/
764PyObject *
765PyDict_GetItemWithError(PyObject *op, PyObject *key)
766{
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000767 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 PyDictObject*mp = (PyDictObject *)op;
769 PyDictEntry *ep;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 if (!PyDict_Check(op)) {
772 PyErr_BadInternalCall();
773 return NULL;
774 }
775 if (!PyUnicode_CheckExact(key) ||
776 (hash = ((PyUnicodeObject *) key)->hash) == -1)
777 {
778 hash = PyObject_Hash(key);
779 if (hash == -1) {
780 return NULL;
781 }
782 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 ep = (mp->ma_lookup)(mp, key, hash);
785 if (ep == NULL)
786 return NULL;
787 return ep->me_value;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000788}
789
Antoine Pitroue965d972012-02-27 00:45:12 +0100790static int
791dict_set_item_by_hash_or_entry(register PyObject *op, PyObject *key,
792 Py_hash_t hash, PyDictEntry *ep, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 register PyDictObject *mp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
799 n_used = mp->ma_used;
800 Py_INCREF(value);
801 Py_INCREF(key);
Antoine Pitroue965d972012-02-27 00:45:12 +0100802 if (ep == NULL) {
803 if (insertdict(mp, key, hash, value) != 0)
804 return -1;
805 }
806 else {
807 if (insertdict_by_entry(mp, key, hash, ep, value) != 0)
808 return -1;
809 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 /* If we added a key, we can safely resize. Otherwise just return!
811 * If fill >= 2/3 size, adjust size. Normally, this doubles or
812 * quaduples the size, but it's also possible for the dict to shrink
813 * (if ma_fill is much larger than ma_used, meaning a lot of dict
814 * keys have been * deleted).
815 *
816 * Quadrupling the size improves average dictionary sparseness
817 * (reducing collisions) at the cost of some memory and iteration
818 * speed (which loops over every possible entry). It also halves
819 * the number of expensive resize operations in a growing dictionary.
820 *
821 * Very large dictionaries (over 50K items) use doubling instead.
822 * This may help applications with severe memory constraints.
823 */
824 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
825 return 0;
826 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000827}
828
Antoine Pitroue965d972012-02-27 00:45:12 +0100829/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
830 * dictionary if it's merely replacing the value for an existing key.
831 * This means that it's safe to loop over a dictionary with PyDict_Next()
832 * and occasionally replace a value -- but you can't insert new keys or
833 * remove them.
834 */
835int
836PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
837{
838 register Py_hash_t hash;
839
840 if (!PyDict_Check(op)) {
841 PyErr_BadInternalCall();
842 return -1;
843 }
844 assert(key);
845 assert(value);
846 if (PyUnicode_CheckExact(key)) {
847 hash = ((PyUnicodeObject *) key)->hash;
848 if (hash == -1)
849 hash = PyObject_Hash(key);
850 }
851 else {
852 hash = PyObject_Hash(key);
853 if (hash == -1)
854 return -1;
855 }
856 return dict_set_item_by_hash_or_entry(op, key, hash, NULL, value);
857}
858
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000859int
Tim Peters1f5871e2000-07-04 17:44:48 +0000860PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 register PyDictObject *mp;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000863 register Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 register PyDictEntry *ep;
865 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 if (!PyDict_Check(op)) {
868 PyErr_BadInternalCall();
869 return -1;
870 }
871 assert(key);
872 if (!PyUnicode_CheckExact(key) ||
873 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
874 hash = PyObject_Hash(key);
875 if (hash == -1)
876 return -1;
877 }
878 mp = (PyDictObject *)op;
879 ep = (mp->ma_lookup)(mp, key, hash);
880 if (ep == NULL)
881 return -1;
882 if (ep->me_value == NULL) {
883 set_key_error(key);
884 return -1;
885 }
886 old_key = ep->me_key;
887 Py_INCREF(dummy);
888 ep->me_key = dummy;
889 old_value = ep->me_value;
890 ep->me_value = NULL;
891 mp->ma_used--;
892 Py_DECREF(old_value);
893 Py_DECREF(old_key);
894 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000895}
896
Guido van Rossum25831651993-05-19 14:50:45 +0000897void
Tim Peters1f5871e2000-07-04 17:44:48 +0000898PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 PyDictObject *mp;
901 PyDictEntry *ep, *table;
902 int table_is_malloced;
903 Py_ssize_t fill;
904 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000905#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000907#endif
908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 if (!PyDict_Check(op))
910 return;
911 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000912#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 n = mp->ma_mask + 1;
914 i = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000915#endif
916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 table = mp->ma_table;
918 assert(table != NULL);
919 table_is_malloced = table != mp->ma_smalltable;
Tim Petersdea48ec2001-05-22 20:40:22 +0000920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 /* This is delicate. During the process of clearing the dict,
922 * decrefs can cause the dict to mutate. To avoid fatal confusion
923 * (voice of experience), we have to make the dict empty before
924 * clearing the slots, and never refer to anything via mp->xxx while
925 * clearing.
926 */
927 fill = mp->ma_fill;
928 if (table_is_malloced)
929 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 else if (fill > 0) {
932 /* It's a small table with something that needs to be cleared.
933 * Afraid the only safe way is to copy the dict entries into
934 * another small table first.
935 */
936 memcpy(small_copy, table, sizeof(small_copy));
937 table = small_copy;
938 EMPTY_TO_MINSIZE(mp);
939 }
940 /* else it's a small table that's already empty */
Tim Petersdea48ec2001-05-22 20:40:22 +0000941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 /* Now we can finally clear things. If C had refcounts, we could
943 * assert that the refcount on table is 1 now, i.e. that this function
944 * has unique access to it, so decref side-effects can't alter it.
945 */
946 for (ep = table; fill > 0; ++ep) {
Tim Petersdea48ec2001-05-22 20:40:22 +0000947#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 assert(i < n);
949 ++i;
Tim Petersdea48ec2001-05-22 20:40:22 +0000950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 if (ep->me_key) {
952 --fill;
953 Py_DECREF(ep->me_key);
954 Py_XDECREF(ep->me_value);
955 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000956#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 else
958 assert(ep->me_value == NULL);
Tim Petersdea48ec2001-05-22 20:40:22 +0000959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 if (table_is_malloced)
963 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000964}
965
Tim Peters080c88b2003-02-15 03:01:11 +0000966/*
967 * Iterate over a dict. Use like so:
968 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000969 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000970 * PyObject *key, *value;
971 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000972 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000973 * Refer to borrowed references in key and value.
974 * }
975 *
976 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000977 * mutates the dict. One exception: it is safe if the loop merely changes
978 * the values associated with the keys (but doesn't insert new keys or
979 * delete keys), via PyDict_SetItem().
980 */
Guido van Rossum25831651993-05-19 14:50:45 +0000981int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000982PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000983{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 register Py_ssize_t i;
985 register Py_ssize_t mask;
986 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 if (!PyDict_Check(op))
989 return 0;
990 i = *ppos;
991 if (i < 0)
992 return 0;
993 ep = ((PyDictObject *)op)->ma_table;
994 mask = ((PyDictObject *)op)->ma_mask;
995 while (i <= mask && ep[i].me_value == NULL)
996 i++;
997 *ppos = i+1;
998 if (i > mask)
999 return 0;
1000 if (pkey)
1001 *pkey = ep[i].me_key;
1002 if (pvalue)
1003 *pvalue = ep[i].me_value;
1004 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001005}
1006
Thomas Wouterscf297e42007-02-23 15:07:44 +00001007/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
1008int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001009_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001010{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 register Py_ssize_t i;
1012 register Py_ssize_t mask;
1013 register PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 if (!PyDict_Check(op))
1016 return 0;
1017 i = *ppos;
1018 if (i < 0)
1019 return 0;
1020 ep = ((PyDictObject *)op)->ma_table;
1021 mask = ((PyDictObject *)op)->ma_mask;
1022 while (i <= mask && ep[i].me_value == NULL)
1023 i++;
1024 *ppos = i+1;
1025 if (i > mask)
1026 return 0;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001027 *phash = ep[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 if (pkey)
1029 *pkey = ep[i].me_key;
1030 if (pvalue)
1031 *pvalue = ep[i].me_value;
1032 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001033}
1034
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001035/* Methods */
1036
1037static void
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001038dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 register PyDictEntry *ep;
1041 Py_ssize_t fill = mp->ma_fill;
1042 PyObject_GC_UnTrack(mp);
1043 Py_TRASHCAN_SAFE_BEGIN(mp)
1044 for (ep = mp->ma_table; fill > 0; ep++) {
1045 if (ep->me_key) {
1046 --fill;
1047 Py_DECREF(ep->me_key);
1048 Py_XDECREF(ep->me_value);
1049 }
1050 }
1051 if (mp->ma_table != mp->ma_smalltable)
1052 PyMem_DEL(mp->ma_table);
1053 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1054 free_list[numfree++] = mp;
1055 else
1056 Py_TYPE(mp)->tp_free((PyObject *)mp);
1057 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001058}
1059
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001060static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001061dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 Py_ssize_t i;
1064 PyObject *s, *temp, *colon = NULL;
1065 PyObject *pieces = NULL, *result = NULL;
1066 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 i = Py_ReprEnter((PyObject *)mp);
1069 if (i != 0) {
1070 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1071 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 if (mp->ma_used == 0) {
1074 result = PyUnicode_FromString("{}");
1075 goto Done;
1076 }
Tim Petersa7259592001-06-16 05:11:17 +00001077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 pieces = PyList_New(0);
1079 if (pieces == NULL)
1080 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 colon = PyUnicode_FromString(": ");
1083 if (colon == NULL)
1084 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 /* Do repr() on each key+value pair, and insert ": " between them.
1087 Note that repr may mutate the dict. */
1088 i = 0;
1089 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
1090 int status;
1091 /* Prevent repr from deleting value during key format. */
1092 Py_INCREF(value);
1093 s = PyObject_Repr(key);
1094 PyUnicode_Append(&s, colon);
1095 PyUnicode_AppendAndDel(&s, PyObject_Repr(value));
1096 Py_DECREF(value);
1097 if (s == NULL)
1098 goto Done;
1099 status = PyList_Append(pieces, s);
1100 Py_DECREF(s); /* append created a new ref */
1101 if (status < 0)
1102 goto Done;
1103 }
Tim Petersa7259592001-06-16 05:11:17 +00001104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 /* Add "{}" decorations to the first and last items. */
1106 assert(PyList_GET_SIZE(pieces) > 0);
1107 s = PyUnicode_FromString("{");
1108 if (s == NULL)
1109 goto Done;
1110 temp = PyList_GET_ITEM(pieces, 0);
1111 PyUnicode_AppendAndDel(&s, temp);
1112 PyList_SET_ITEM(pieces, 0, s);
1113 if (s == NULL)
1114 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 s = PyUnicode_FromString("}");
1117 if (s == NULL)
1118 goto Done;
1119 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
1120 PyUnicode_AppendAndDel(&temp, s);
1121 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1122 if (temp == NULL)
1123 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 /* Paste them all together with ", " between. */
1126 s = PyUnicode_FromString(", ");
1127 if (s == NULL)
1128 goto Done;
1129 result = PyUnicode_Join(s, pieces);
1130 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001131
1132Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 Py_XDECREF(pieces);
1134 Py_XDECREF(colon);
1135 Py_ReprLeave((PyObject *)mp);
1136 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001137}
1138
Martin v. Löwis18e16552006-02-15 17:27:45 +00001139static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001140dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001143}
1144
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001145static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001146dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 PyObject *v;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001149 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 PyDictEntry *ep;
1151 assert(mp->ma_table != NULL);
1152 if (!PyUnicode_CheckExact(key) ||
1153 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1154 hash = PyObject_Hash(key);
1155 if (hash == -1)
1156 return NULL;
1157 }
1158 ep = (mp->ma_lookup)(mp, key, hash);
1159 if (ep == NULL)
1160 return NULL;
1161 v = ep->me_value;
1162 if (v == NULL) {
1163 if (!PyDict_CheckExact(mp)) {
1164 /* Look up __missing__ method if we're a subclass. */
1165 PyObject *missing, *res;
1166 static PyObject *missing_str = NULL;
1167 missing = _PyObject_LookupSpecial((PyObject *)mp,
1168 "__missing__",
1169 &missing_str);
1170 if (missing != NULL) {
1171 res = PyObject_CallFunctionObjArgs(missing,
1172 key, NULL);
1173 Py_DECREF(missing);
1174 return res;
1175 }
1176 else if (PyErr_Occurred())
1177 return NULL;
1178 }
1179 set_key_error(key);
1180 return NULL;
1181 }
1182 else
1183 Py_INCREF(v);
1184 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001185}
1186
1187static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001188dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001189{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 if (w == NULL)
1191 return PyDict_DelItem((PyObject *)mp, v);
1192 else
1193 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001194}
1195
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001196static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 (lenfunc)dict_length, /*mp_length*/
1198 (binaryfunc)dict_subscript, /*mp_subscript*/
1199 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001200};
1201
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001203dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 register PyObject *v;
1206 register Py_ssize_t i, j;
1207 PyDictEntry *ep;
1208 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001209
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001210 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 n = mp->ma_used;
1212 v = PyList_New(n);
1213 if (v == NULL)
1214 return NULL;
1215 if (n != mp->ma_used) {
1216 /* Durnit. The allocations caused the dict to resize.
1217 * Just start over, this shouldn't normally happen.
1218 */
1219 Py_DECREF(v);
1220 goto again;
1221 }
1222 ep = mp->ma_table;
1223 mask = mp->ma_mask;
1224 for (i = 0, j = 0; i <= mask; i++) {
1225 if (ep[i].me_value != NULL) {
1226 PyObject *key = ep[i].me_key;
1227 Py_INCREF(key);
1228 PyList_SET_ITEM(v, j, key);
1229 j++;
1230 }
1231 }
1232 assert(j == n);
1233 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001234}
1235
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001237dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 register PyObject *v;
1240 register Py_ssize_t i, j;
1241 PyDictEntry *ep;
1242 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001243
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001244 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 n = mp->ma_used;
1246 v = PyList_New(n);
1247 if (v == NULL)
1248 return NULL;
1249 if (n != mp->ma_used) {
1250 /* Durnit. The allocations caused the dict to resize.
1251 * Just start over, this shouldn't normally happen.
1252 */
1253 Py_DECREF(v);
1254 goto again;
1255 }
1256 ep = mp->ma_table;
1257 mask = mp->ma_mask;
1258 for (i = 0, j = 0; i <= mask; i++) {
1259 if (ep[i].me_value != NULL) {
1260 PyObject *value = ep[i].me_value;
1261 Py_INCREF(value);
1262 PyList_SET_ITEM(v, j, value);
1263 j++;
1264 }
1265 }
1266 assert(j == n);
1267 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001268}
1269
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001270static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001271dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 register PyObject *v;
1274 register Py_ssize_t i, j, n;
1275 Py_ssize_t mask;
1276 PyObject *item, *key, *value;
1277 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 /* Preallocate the list of tuples, to avoid allocations during
1280 * the loop over the items, which could trigger GC, which
1281 * could resize the dict. :-(
1282 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001283 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 n = mp->ma_used;
1285 v = PyList_New(n);
1286 if (v == NULL)
1287 return NULL;
1288 for (i = 0; i < n; i++) {
1289 item = PyTuple_New(2);
1290 if (item == NULL) {
1291 Py_DECREF(v);
1292 return NULL;
1293 }
1294 PyList_SET_ITEM(v, i, item);
1295 }
1296 if (n != mp->ma_used) {
1297 /* Durnit. The allocations caused the dict to resize.
1298 * Just start over, this shouldn't normally happen.
1299 */
1300 Py_DECREF(v);
1301 goto again;
1302 }
1303 /* Nothing we do below makes any function calls. */
1304 ep = mp->ma_table;
1305 mask = mp->ma_mask;
1306 for (i = 0, j = 0; i <= mask; i++) {
1307 if ((value=ep[i].me_value) != NULL) {
1308 key = ep[i].me_key;
1309 item = PyList_GET_ITEM(v, j);
1310 Py_INCREF(key);
1311 PyTuple_SET_ITEM(item, 0, key);
1312 Py_INCREF(value);
1313 PyTuple_SET_ITEM(item, 1, value);
1314 j++;
1315 }
1316 }
1317 assert(j == n);
1318 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001319}
1320
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001321static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001322dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 PyObject *seq;
1325 PyObject *value = Py_None;
1326 PyObject *it; /* iter(seq) */
1327 PyObject *key;
1328 PyObject *d;
1329 int status;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
1332 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 d = PyObject_CallObject(cls, NULL);
1335 if (d == NULL)
1336 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1339 PyDictObject *mp = (PyDictObject *)d;
1340 PyObject *oldvalue;
1341 Py_ssize_t pos = 0;
1342 PyObject *key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001343 Py_hash_t hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001344
Petri Lehtinena94200e2011-10-24 21:12:58 +03001345 if (dictresize(mp, Py_SIZE(seq))) {
1346 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001348 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1351 Py_INCREF(key);
1352 Py_INCREF(value);
Petri Lehtinena94200e2011-10-24 21:12:58 +03001353 if (insertdict(mp, key, hash, value)) {
1354 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001356 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 }
1358 return d;
1359 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
1362 PyDictObject *mp = (PyDictObject *)d;
1363 Py_ssize_t pos = 0;
1364 PyObject *key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001365 Py_hash_t hash;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001366
Petri Lehtinena94200e2011-10-24 21:12:58 +03001367 if (dictresize(mp, PySet_GET_SIZE(seq))) {
1368 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001370 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1373 Py_INCREF(key);
1374 Py_INCREF(value);
Petri Lehtinena94200e2011-10-24 21:12:58 +03001375 if (insertdict(mp, key, hash, value)) {
1376 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001378 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 }
1380 return d;
1381 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 it = PyObject_GetIter(seq);
1384 if (it == NULL){
1385 Py_DECREF(d);
1386 return NULL;
1387 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 if (PyDict_CheckExact(d)) {
1390 while ((key = PyIter_Next(it)) != NULL) {
1391 status = PyDict_SetItem(d, key, value);
1392 Py_DECREF(key);
1393 if (status < 0)
1394 goto Fail;
1395 }
1396 } else {
1397 while ((key = PyIter_Next(it)) != NULL) {
1398 status = PyObject_SetItem(d, key, value);
1399 Py_DECREF(key);
1400 if (status < 0)
1401 goto Fail;
1402 }
1403 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 if (PyErr_Occurred())
1406 goto Fail;
1407 Py_DECREF(it);
1408 return d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001409
1410Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 Py_DECREF(it);
1412 Py_DECREF(d);
1413 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001414}
1415
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001416static int
1417dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001418{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 PyObject *arg = NULL;
1420 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1423 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 else if (arg != NULL) {
1426 if (PyObject_HasAttrString(arg, "keys"))
1427 result = PyDict_Merge(self, arg, 1);
1428 else
1429 result = PyDict_MergeFromSeq2(self, arg, 1);
1430 }
1431 if (result == 0 && kwds != NULL) {
1432 if (PyArg_ValidateKeywordArguments(kwds))
1433 result = PyDict_Merge(self, kwds, 1);
1434 else
1435 result = -1;
1436 }
1437 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001438}
1439
1440static PyObject *
1441dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 if (dict_update_common(self, args, kwds, "update") != -1)
1444 Py_RETURN_NONE;
1445 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001446}
1447
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001448/* Update unconditionally replaces existing items.
1449 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001450 otherwise it leaves existing items unchanged.
1451
1452 PyDict_{Update,Merge} update/merge from a mapping object.
1453
Tim Petersf582b822001-12-11 18:51:08 +00001454 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001455 producing iterable objects of length 2.
1456*/
1457
Tim Petersf582b822001-12-11 18:51:08 +00001458int
Tim Peters1fc240e2001-10-26 05:06:50 +00001459PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1460{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 PyObject *it; /* iter(seq2) */
1462 Py_ssize_t i; /* index into seq2 of current element */
1463 PyObject *item; /* seq2[i] */
1464 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 assert(d != NULL);
1467 assert(PyDict_Check(d));
1468 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 it = PyObject_GetIter(seq2);
1471 if (it == NULL)
1472 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 for (i = 0; ; ++i) {
1475 PyObject *key, *value;
1476 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 fast = NULL;
1479 item = PyIter_Next(it);
1480 if (item == NULL) {
1481 if (PyErr_Occurred())
1482 goto Fail;
1483 break;
1484 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 /* Convert item to sequence, and verify length 2. */
1487 fast = PySequence_Fast(item, "");
1488 if (fast == NULL) {
1489 if (PyErr_ExceptionMatches(PyExc_TypeError))
1490 PyErr_Format(PyExc_TypeError,
1491 "cannot convert dictionary update "
1492 "sequence element #%zd to a sequence",
1493 i);
1494 goto Fail;
1495 }
1496 n = PySequence_Fast_GET_SIZE(fast);
1497 if (n != 2) {
1498 PyErr_Format(PyExc_ValueError,
1499 "dictionary update sequence element #%zd "
1500 "has length %zd; 2 is required",
1501 i, n);
1502 goto Fail;
1503 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 /* Update/merge with this (key, value) pair. */
1506 key = PySequence_Fast_GET_ITEM(fast, 0);
1507 value = PySequence_Fast_GET_ITEM(fast, 1);
1508 if (override || PyDict_GetItem(d, key) == NULL) {
1509 int status = PyDict_SetItem(d, key, value);
1510 if (status < 0)
1511 goto Fail;
1512 }
1513 Py_DECREF(fast);
1514 Py_DECREF(item);
1515 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 i = 0;
1518 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00001519Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 Py_XDECREF(item);
1521 Py_XDECREF(fast);
1522 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001523Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 Py_DECREF(it);
1525 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001526}
1527
Tim Peters6d6c1a32001-08-02 04:15:00 +00001528int
1529PyDict_Update(PyObject *a, PyObject *b)
1530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001532}
1533
1534int
1535PyDict_Merge(PyObject *a, PyObject *b, int override)
1536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 register PyDictObject *mp, *other;
1538 register Py_ssize_t i;
1539 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 /* We accept for the argument either a concrete dictionary object,
1542 * or an abstract "mapping" object. For the former, we can do
1543 * things quite efficiently. For the latter, we only require that
1544 * PyMapping_Keys() and PyObject_GetItem() be supported.
1545 */
1546 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1547 PyErr_BadInternalCall();
1548 return -1;
1549 }
1550 mp = (PyDictObject*)a;
1551 if (PyDict_Check(b)) {
1552 other = (PyDictObject*)b;
1553 if (other == mp || other->ma_used == 0)
1554 /* a.update(a) or a.update({}); nothing to do */
1555 return 0;
1556 if (mp->ma_used == 0)
1557 /* Since the target dict is empty, PyDict_GetItem()
1558 * always returns NULL. Setting override to 1
1559 * skips the unnecessary test.
1560 */
1561 override = 1;
1562 /* Do one big resize at the start, rather than
1563 * incrementally resizing as we insert new items. Expect
1564 * that there will be no (or few) overlapping keys.
1565 */
1566 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
1567 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
1568 return -1;
1569 }
1570 for (i = 0; i <= other->ma_mask; i++) {
1571 entry = &other->ma_table[i];
1572 if (entry->me_value != NULL &&
1573 (override ||
1574 PyDict_GetItem(a, entry->me_key) == NULL)) {
1575 Py_INCREF(entry->me_key);
1576 Py_INCREF(entry->me_value);
1577 if (insertdict(mp, entry->me_key,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001578 entry->me_hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 entry->me_value) != 0)
1580 return -1;
1581 }
1582 }
1583 }
1584 else {
1585 /* Do it the generic, slower way */
1586 PyObject *keys = PyMapping_Keys(b);
1587 PyObject *iter;
1588 PyObject *key, *value;
1589 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 if (keys == NULL)
1592 /* Docstring says this is equivalent to E.keys() so
1593 * if E doesn't have a .keys() method we want
1594 * AttributeError to percolate up. Might as well
1595 * do the same for any other error.
1596 */
1597 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 iter = PyObject_GetIter(keys);
1600 Py_DECREF(keys);
1601 if (iter == NULL)
1602 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
1605 if (!override && PyDict_GetItem(a, key) != NULL) {
1606 Py_DECREF(key);
1607 continue;
1608 }
1609 value = PyObject_GetItem(b, key);
1610 if (value == NULL) {
1611 Py_DECREF(iter);
1612 Py_DECREF(key);
1613 return -1;
1614 }
1615 status = PyDict_SetItem(a, key, value);
1616 Py_DECREF(key);
1617 Py_DECREF(value);
1618 if (status < 0) {
1619 Py_DECREF(iter);
1620 return -1;
1621 }
1622 }
1623 Py_DECREF(iter);
1624 if (PyErr_Occurred())
1625 /* Iterator completed, via error */
1626 return -1;
1627 }
1628 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001629}
1630
1631static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001632dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001635}
1636
1637PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001638PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001639{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 if (o == NULL || !PyDict_Check(o)) {
1643 PyErr_BadInternalCall();
1644 return NULL;
1645 }
1646 copy = PyDict_New();
1647 if (copy == NULL)
1648 return NULL;
1649 if (PyDict_Merge(copy, o, 1) == 0)
1650 return copy;
1651 Py_DECREF(copy);
1652 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001653}
1654
Martin v. Löwis18e16552006-02-15 17:27:45 +00001655Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001656PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 if (mp == NULL || !PyDict_Check(mp)) {
1659 PyErr_BadInternalCall();
1660 return -1;
1661 }
1662 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001663}
1664
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001666PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 if (mp == NULL || !PyDict_Check(mp)) {
1669 PyErr_BadInternalCall();
1670 return NULL;
1671 }
1672 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001673}
1674
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001675PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001676PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001677{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 if (mp == NULL || !PyDict_Check(mp)) {
1679 PyErr_BadInternalCall();
1680 return NULL;
1681 }
1682 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001683}
1684
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001685PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001686PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 if (mp == NULL || !PyDict_Check(mp)) {
1689 PyErr_BadInternalCall();
1690 return NULL;
1691 }
1692 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001693}
1694
Tim Peterse63415e2001-05-08 04:38:29 +00001695/* Return 1 if dicts equal, 0 if not, -1 if error.
1696 * Gets out as soon as any difference is detected.
1697 * Uses only Py_EQ comparison.
1698 */
1699static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001700dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 if (a->ma_used != b->ma_used)
1705 /* can't be equal if # of entries differ */
1706 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 /* Same # of entries -- check all of 'em. Exit early on any diff. */
1709 for (i = 0; i <= a->ma_mask; i++) {
1710 PyObject *aval = a->ma_table[i].me_value;
1711 if (aval != NULL) {
1712 int cmp;
1713 PyObject *bval;
1714 PyObject *key = a->ma_table[i].me_key;
1715 /* temporarily bump aval's refcount to ensure it stays
1716 alive until we're done with it */
1717 Py_INCREF(aval);
1718 /* ditto for key */
1719 Py_INCREF(key);
1720 bval = PyDict_GetItemWithError((PyObject *)b, key);
1721 Py_DECREF(key);
1722 if (bval == NULL) {
1723 Py_DECREF(aval);
1724 if (PyErr_Occurred())
1725 return -1;
1726 return 0;
1727 }
1728 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1729 Py_DECREF(aval);
1730 if (cmp <= 0) /* error or not equal */
1731 return cmp;
1732 }
1733 }
1734 return 1;
Tim Peterse63415e2001-05-08 04:38:29 +00001735 }
1736
1737static PyObject *
1738dict_richcompare(PyObject *v, PyObject *w, int op)
1739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 int cmp;
1741 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00001742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1744 res = Py_NotImplemented;
1745 }
1746 else if (op == Py_EQ || op == Py_NE) {
1747 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
1748 if (cmp < 0)
1749 return NULL;
1750 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1751 }
1752 else
1753 res = Py_NotImplemented;
1754 Py_INCREF(res);
1755 return res;
Tim Peterse63415e2001-05-08 04:38:29 +00001756 }
1757
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001758static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001759dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001760{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001761 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 if (!PyUnicode_CheckExact(key) ||
1765 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1766 hash = PyObject_Hash(key);
1767 if (hash == -1)
1768 return NULL;
1769 }
1770 ep = (mp->ma_lookup)(mp, key, hash);
1771 if (ep == NULL)
1772 return NULL;
1773 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001774}
1775
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001776static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001777dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001778{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 PyObject *key;
1780 PyObject *failobj = Py_None;
1781 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001782 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
1786 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 if (!PyUnicode_CheckExact(key) ||
1789 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1790 hash = PyObject_Hash(key);
1791 if (hash == -1)
1792 return NULL;
1793 }
1794 ep = (mp->ma_lookup)(mp, key, hash);
1795 if (ep == NULL)
1796 return NULL;
1797 val = ep->me_value;
1798 if (val == NULL)
1799 val = failobj;
1800 Py_INCREF(val);
1801 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001802}
1803
1804
1805static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001806dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001807{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 PyObject *key;
1809 PyObject *failobj = Py_None;
1810 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001811 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
1815 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 if (!PyUnicode_CheckExact(key) ||
1818 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1819 hash = PyObject_Hash(key);
1820 if (hash == -1)
1821 return NULL;
1822 }
1823 ep = (mp->ma_lookup)(mp, key, hash);
1824 if (ep == NULL)
1825 return NULL;
1826 val = ep->me_value;
1827 if (val == NULL) {
Antoine Pitroue965d972012-02-27 00:45:12 +01001828 if (dict_set_item_by_hash_or_entry((PyObject*)mp, key, hash, ep,
1829 failobj) == 0)
1830 val = failobj;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 }
1832 Py_XINCREF(val);
1833 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00001834}
1835
1836
1837static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001838dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001839{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 PyDict_Clear((PyObject *)mp);
1841 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001842}
1843
Guido van Rossumba6ab842000-12-12 22:02:18 +00001844static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001845dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001846{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001847 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 PyDictEntry *ep;
1849 PyObject *old_value, *old_key;
1850 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1853 return NULL;
1854 if (mp->ma_used == 0) {
1855 if (deflt) {
1856 Py_INCREF(deflt);
1857 return deflt;
1858 }
Raymond Hettingerdd421542010-10-30 08:10:29 +00001859 set_key_error(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 return NULL;
1861 }
1862 if (!PyUnicode_CheckExact(key) ||
1863 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1864 hash = PyObject_Hash(key);
1865 if (hash == -1)
1866 return NULL;
1867 }
1868 ep = (mp->ma_lookup)(mp, key, hash);
1869 if (ep == NULL)
1870 return NULL;
1871 if (ep->me_value == NULL) {
1872 if (deflt) {
1873 Py_INCREF(deflt);
1874 return deflt;
1875 }
1876 set_key_error(key);
1877 return NULL;
1878 }
1879 old_key = ep->me_key;
1880 Py_INCREF(dummy);
1881 ep->me_key = dummy;
1882 old_value = ep->me_value;
1883 ep->me_value = NULL;
1884 mp->ma_used--;
1885 Py_DECREF(old_key);
1886 return old_value;
Guido van Rossume027d982002-04-12 15:11:59 +00001887}
1888
1889static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001890dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001891{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001892 Py_hash_t i = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 PyDictEntry *ep;
1894 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 /* Allocate the result tuple before checking the size. Believe it
1897 * or not, this allocation could trigger a garbage collection which
1898 * could empty the dict, so if we checked the size first and that
1899 * happened, the result would be an infinite loop (searching for an
1900 * entry that no longer exists). Note that the usual popitem()
1901 * idiom is "while d: k, v = d.popitem()". so needing to throw the
1902 * tuple away if the dict *is* empty isn't a significant
1903 * inefficiency -- possible, but unlikely in practice.
1904 */
1905 res = PyTuple_New(2);
1906 if (res == NULL)
1907 return NULL;
1908 if (mp->ma_used == 0) {
1909 Py_DECREF(res);
1910 PyErr_SetString(PyExc_KeyError,
1911 "popitem(): dictionary is empty");
1912 return NULL;
1913 }
1914 /* Set ep to "the first" dict entry with a value. We abuse the hash
1915 * field of slot 0 to hold a search finger:
1916 * If slot 0 has a value, use slot 0.
1917 * Else slot 0 is being used to hold a search finger,
1918 * and we use its hash value as the first index to look.
1919 */
1920 ep = &mp->ma_table[0];
1921 if (ep->me_value == NULL) {
1922 i = ep->me_hash;
1923 /* The hash field may be a real hash value, or it may be a
1924 * legit search finger, or it may be a once-legit search
1925 * finger that's out of bounds now because it wrapped around
1926 * or the table shrunk -- simply make sure it's in bounds now.
1927 */
1928 if (i > mp->ma_mask || i < 1)
1929 i = 1; /* skip slot 0 */
1930 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1931 i++;
1932 if (i > mp->ma_mask)
1933 i = 1;
1934 }
1935 }
1936 PyTuple_SET_ITEM(res, 0, ep->me_key);
1937 PyTuple_SET_ITEM(res, 1, ep->me_value);
1938 Py_INCREF(dummy);
1939 ep->me_key = dummy;
1940 ep->me_value = NULL;
1941 mp->ma_used--;
1942 assert(mp->ma_table[0].me_value == NULL);
1943 mp->ma_table[0].me_hash = i + 1; /* next place to start */
1944 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001945}
1946
Jeremy Hylton8caad492000-06-23 14:18:11 +00001947static int
1948dict_traverse(PyObject *op, visitproc visit, void *arg)
1949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 Py_ssize_t i = 0;
1951 PyObject *pk;
1952 PyObject *pv;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 while (PyDict_Next(op, &i, &pk, &pv)) {
1955 Py_VISIT(pk);
1956 Py_VISIT(pv);
1957 }
1958 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001959}
1960
1961static int
1962dict_tp_clear(PyObject *op)
1963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 PyDict_Clear(op);
1965 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001966}
1967
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001968static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001969
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001970static PyObject *
1971dict_sizeof(PyDictObject *mp)
1972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 res = sizeof(PyDictObject);
1976 if (mp->ma_table != mp->ma_smalltable)
1977 res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry);
1978 return PyLong_FromSsize_t(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001979}
1980
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001981PyDoc_STRVAR(contains__doc__,
1982"D.__contains__(k) -> True if D has a key k, else False");
1983
1984PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1985
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001986PyDoc_STRVAR(sizeof__doc__,
1987"D.__sizeof__() -> size of D in memory, in bytes");
1988
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001989PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001990"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001991
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001992PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001993"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 +00001994
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001995PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001996"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001997If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001998
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001999PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002000"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000020012-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002002
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002003PyDoc_STRVAR(update__doc__,
Georg Brandlac0675c2011-12-18 19:30:55 +01002004"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n"
2005"If E present and has a .keys() method, does: for k in E: D[k] = E[k]\n\
2006If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002007In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002008
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002009PyDoc_STRVAR(fromkeys__doc__,
2010"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
2011v defaults to None.");
2012
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002013PyDoc_STRVAR(clear__doc__,
2014"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002015
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002016PyDoc_STRVAR(copy__doc__,
2017"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002018
Guido van Rossumb90c8482007-02-10 01:11:45 +00002019/* Forward */
2020static PyObject *dictkeys_new(PyObject *);
2021static PyObject *dictitems_new(PyObject *);
2022static PyObject *dictvalues_new(PyObject *);
2023
Guido van Rossum45c85d12007-07-27 16:31:40 +00002024PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002026PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002028PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002030
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002031static PyMethodDef mapp_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
2033 contains__doc__},
2034 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2035 getitem__doc__},
2036 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2037 sizeof__doc__},
2038 {"get", (PyCFunction)dict_get, METH_VARARGS,
2039 get__doc__},
2040 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2041 setdefault_doc__},
2042 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2043 pop__doc__},
2044 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2045 popitem__doc__},
2046 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2047 keys__doc__},
2048 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2049 items__doc__},
2050 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2051 values__doc__},
2052 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2053 update__doc__},
2054 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2055 fromkeys__doc__},
2056 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2057 clear__doc__},
2058 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2059 copy__doc__},
2060 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002061};
2062
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002063/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002064int
2065PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002066{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002067 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 PyDictObject *mp = (PyDictObject *)op;
2069 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 if (!PyUnicode_CheckExact(key) ||
2072 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
2073 hash = PyObject_Hash(key);
2074 if (hash == -1)
2075 return -1;
2076 }
2077 ep = (mp->ma_lookup)(mp, key, hash);
2078 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002079}
2080
Thomas Wouterscf297e42007-02-23 15:07:44 +00002081/* Internal version of PyDict_Contains used when the hash value is already known */
2082int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002083_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 PyDictObject *mp = (PyDictObject *)op;
2086 PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 ep = (mp->ma_lookup)(mp, key, hash);
2089 return ep == NULL ? -1 : (ep->me_value != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002090}
2091
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002092/* Hack to implement "key in dict" */
2093static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 0, /* sq_length */
2095 0, /* sq_concat */
2096 0, /* sq_repeat */
2097 0, /* sq_item */
2098 0, /* sq_slice */
2099 0, /* sq_ass_item */
2100 0, /* sq_ass_slice */
2101 PyDict_Contains, /* sq_contains */
2102 0, /* sq_inplace_concat */
2103 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002104};
2105
Guido van Rossum09e563a2001-05-01 12:10:21 +00002106static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002107dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 PyObject *self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 assert(type != NULL && type->tp_alloc != NULL);
2112 self = type->tp_alloc(type, 0);
2113 if (self != NULL) {
2114 PyDictObject *d = (PyDictObject *)self;
2115 /* It's guaranteed that tp->alloc zeroed out the struct. */
2116 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2117 INIT_NONZERO_DICT_SLOTS(d);
2118 d->ma_lookup = lookdict_unicode;
Ezio Melotti13925002011-03-16 11:05:33 +02002119 /* The object has been implicitly tracked by tp_alloc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 if (type == &PyDict_Type)
2121 _PyObject_GC_UNTRACK(d);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002122#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 ++created;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002124#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002125#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 if (_PyObject_GC_IS_TRACKED(d))
2127 count_tracked++;
2128 else
2129 count_untracked++;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002130#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 }
2132 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002133}
2134
Tim Peters25786c02001-09-02 08:22:48 +00002135static int
2136dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002139}
2140
Tim Peters6d6c1a32001-08-02 04:15:00 +00002141static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002142dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002145}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002146
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002147PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002148"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002149"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002150" (key, value) pairs\n"
2151"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002152" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002153" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002154" d[k] = v\n"
2155"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2156" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002157
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002158PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2160 "dict",
2161 sizeof(PyDictObject),
2162 0,
2163 (destructor)dict_dealloc, /* tp_dealloc */
2164 0, /* tp_print */
2165 0, /* tp_getattr */
2166 0, /* tp_setattr */
2167 0, /* tp_reserved */
2168 (reprfunc)dict_repr, /* tp_repr */
2169 0, /* tp_as_number */
2170 &dict_as_sequence, /* tp_as_sequence */
2171 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002172 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 0, /* tp_call */
2174 0, /* tp_str */
2175 PyObject_GenericGetAttr, /* tp_getattro */
2176 0, /* tp_setattro */
2177 0, /* tp_as_buffer */
2178 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2179 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2180 dictionary_doc, /* tp_doc */
2181 dict_traverse, /* tp_traverse */
2182 dict_tp_clear, /* tp_clear */
2183 dict_richcompare, /* tp_richcompare */
2184 0, /* tp_weaklistoffset */
2185 (getiterfunc)dict_iter, /* tp_iter */
2186 0, /* tp_iternext */
2187 mapp_methods, /* tp_methods */
2188 0, /* tp_members */
2189 0, /* tp_getset */
2190 0, /* tp_base */
2191 0, /* tp_dict */
2192 0, /* tp_descr_get */
2193 0, /* tp_descr_set */
2194 0, /* tp_dictoffset */
2195 dict_init, /* tp_init */
2196 PyType_GenericAlloc, /* tp_alloc */
2197 dict_new, /* tp_new */
2198 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002199};
2200
Guido van Rossum3cca2451997-05-16 14:23:33 +00002201/* For backward compatibility with old dictionary interface */
2202
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002203PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002204PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 PyObject *kv, *rv;
2207 kv = PyUnicode_FromString(key);
2208 if (kv == NULL)
2209 return NULL;
2210 rv = PyDict_GetItem(v, kv);
2211 Py_DECREF(kv);
2212 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002213}
2214
2215int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002216PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 PyObject *kv;
2219 int err;
2220 kv = PyUnicode_FromString(key);
2221 if (kv == NULL)
2222 return -1;
2223 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2224 err = PyDict_SetItem(v, kv, item);
2225 Py_DECREF(kv);
2226 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002227}
2228
2229int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002230PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 PyObject *kv;
2233 int err;
2234 kv = PyUnicode_FromString(key);
2235 if (kv == NULL)
2236 return -1;
2237 err = PyDict_DelItem(v, kv);
2238 Py_DECREF(kv);
2239 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002240}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002241
Raymond Hettinger019a1482004-03-18 02:41:19 +00002242/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002243
2244typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 PyObject_HEAD
2246 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2247 Py_ssize_t di_used;
2248 Py_ssize_t di_pos;
2249 PyObject* di_result; /* reusable result tuple for iteritems */
2250 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002251} dictiterobject;
2252
2253static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002254dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 dictiterobject *di;
2257 di = PyObject_GC_New(dictiterobject, itertype);
2258 if (di == NULL)
2259 return NULL;
2260 Py_INCREF(dict);
2261 di->di_dict = dict;
2262 di->di_used = dict->ma_used;
2263 di->di_pos = 0;
2264 di->len = dict->ma_used;
2265 if (itertype == &PyDictIterItem_Type) {
2266 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2267 if (di->di_result == NULL) {
2268 Py_DECREF(di);
2269 return NULL;
2270 }
2271 }
2272 else
2273 di->di_result = NULL;
2274 _PyObject_GC_TRACK(di);
2275 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002276}
2277
2278static void
2279dictiter_dealloc(dictiterobject *di)
2280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 Py_XDECREF(di->di_dict);
2282 Py_XDECREF(di->di_result);
2283 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002284}
2285
2286static int
2287dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 Py_VISIT(di->di_dict);
2290 Py_VISIT(di->di_result);
2291 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002292}
2293
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002294static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002295dictiter_len(dictiterobject *di)
2296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 Py_ssize_t len = 0;
2298 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2299 len = di->len;
2300 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002301}
2302
Guido van Rossumb90c8482007-02-10 01:11:45 +00002303PyDoc_STRVAR(length_hint_doc,
2304 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002305
2306static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2308 length_hint_doc},
2309 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002310};
2311
Raymond Hettinger019a1482004-03-18 02:41:19 +00002312static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 PyObject *key;
2315 register Py_ssize_t i, mask;
2316 register PyDictEntry *ep;
2317 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 if (d == NULL)
2320 return NULL;
2321 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 if (di->di_used != d->ma_used) {
2324 PyErr_SetString(PyExc_RuntimeError,
2325 "dictionary changed size during iteration");
2326 di->di_used = -1; /* Make this state sticky */
2327 return NULL;
2328 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 i = di->di_pos;
2331 if (i < 0)
2332 goto fail;
2333 ep = d->ma_table;
2334 mask = d->ma_mask;
2335 while (i <= mask && ep[i].me_value == NULL)
2336 i++;
2337 di->di_pos = i+1;
2338 if (i > mask)
2339 goto fail;
2340 di->len--;
2341 key = ep[i].me_key;
2342 Py_INCREF(key);
2343 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002344
2345fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 Py_DECREF(d);
2347 di->di_dict = NULL;
2348 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002349}
2350
Raymond Hettinger019a1482004-03-18 02:41:19 +00002351PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2353 "dict_keyiterator", /* tp_name */
2354 sizeof(dictiterobject), /* tp_basicsize */
2355 0, /* tp_itemsize */
2356 /* methods */
2357 (destructor)dictiter_dealloc, /* tp_dealloc */
2358 0, /* tp_print */
2359 0, /* tp_getattr */
2360 0, /* tp_setattr */
2361 0, /* tp_reserved */
2362 0, /* tp_repr */
2363 0, /* tp_as_number */
2364 0, /* tp_as_sequence */
2365 0, /* tp_as_mapping */
2366 0, /* tp_hash */
2367 0, /* tp_call */
2368 0, /* tp_str */
2369 PyObject_GenericGetAttr, /* tp_getattro */
2370 0, /* tp_setattro */
2371 0, /* tp_as_buffer */
2372 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2373 0, /* tp_doc */
2374 (traverseproc)dictiter_traverse, /* tp_traverse */
2375 0, /* tp_clear */
2376 0, /* tp_richcompare */
2377 0, /* tp_weaklistoffset */
2378 PyObject_SelfIter, /* tp_iter */
2379 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2380 dictiter_methods, /* tp_methods */
2381 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002382};
2383
2384static PyObject *dictiter_iternextvalue(dictiterobject *di)
2385{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 PyObject *value;
2387 register Py_ssize_t i, mask;
2388 register PyDictEntry *ep;
2389 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 if (d == NULL)
2392 return NULL;
2393 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 if (di->di_used != d->ma_used) {
2396 PyErr_SetString(PyExc_RuntimeError,
2397 "dictionary changed size during iteration");
2398 di->di_used = -1; /* Make this state sticky */
2399 return NULL;
2400 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 i = di->di_pos;
2403 mask = d->ma_mask;
2404 if (i < 0 || i > mask)
2405 goto fail;
2406 ep = d->ma_table;
2407 while ((value=ep[i].me_value) == NULL) {
2408 i++;
2409 if (i > mask)
2410 goto fail;
2411 }
2412 di->di_pos = i+1;
2413 di->len--;
2414 Py_INCREF(value);
2415 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002416
2417fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 Py_DECREF(d);
2419 di->di_dict = NULL;
2420 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002421}
2422
2423PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2425 "dict_valueiterator", /* tp_name */
2426 sizeof(dictiterobject), /* tp_basicsize */
2427 0, /* tp_itemsize */
2428 /* methods */
2429 (destructor)dictiter_dealloc, /* tp_dealloc */
2430 0, /* tp_print */
2431 0, /* tp_getattr */
2432 0, /* tp_setattr */
2433 0, /* tp_reserved */
2434 0, /* tp_repr */
2435 0, /* tp_as_number */
2436 0, /* tp_as_sequence */
2437 0, /* tp_as_mapping */
2438 0, /* tp_hash */
2439 0, /* tp_call */
2440 0, /* tp_str */
2441 PyObject_GenericGetAttr, /* tp_getattro */
2442 0, /* tp_setattro */
2443 0, /* tp_as_buffer */
2444 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2445 0, /* tp_doc */
2446 (traverseproc)dictiter_traverse, /* tp_traverse */
2447 0, /* tp_clear */
2448 0, /* tp_richcompare */
2449 0, /* tp_weaklistoffset */
2450 PyObject_SelfIter, /* tp_iter */
2451 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2452 dictiter_methods, /* tp_methods */
2453 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002454};
2455
2456static PyObject *dictiter_iternextitem(dictiterobject *di)
2457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 PyObject *key, *value, *result = di->di_result;
2459 register Py_ssize_t i, mask;
2460 register PyDictEntry *ep;
2461 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 if (d == NULL)
2464 return NULL;
2465 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 if (di->di_used != d->ma_used) {
2468 PyErr_SetString(PyExc_RuntimeError,
2469 "dictionary changed size during iteration");
2470 di->di_used = -1; /* Make this state sticky */
2471 return NULL;
2472 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 i = di->di_pos;
2475 if (i < 0)
2476 goto fail;
2477 ep = d->ma_table;
2478 mask = d->ma_mask;
2479 while (i <= mask && ep[i].me_value == NULL)
2480 i++;
2481 di->di_pos = i+1;
2482 if (i > mask)
2483 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 if (result->ob_refcnt == 1) {
2486 Py_INCREF(result);
2487 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2488 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2489 } else {
2490 result = PyTuple_New(2);
2491 if (result == NULL)
2492 return NULL;
2493 }
2494 di->len--;
2495 key = ep[i].me_key;
2496 value = ep[i].me_value;
2497 Py_INCREF(key);
2498 Py_INCREF(value);
2499 PyTuple_SET_ITEM(result, 0, key);
2500 PyTuple_SET_ITEM(result, 1, value);
2501 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002502
2503fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 Py_DECREF(d);
2505 di->di_dict = NULL;
2506 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002507}
2508
2509PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2511 "dict_itemiterator", /* tp_name */
2512 sizeof(dictiterobject), /* tp_basicsize */
2513 0, /* tp_itemsize */
2514 /* methods */
2515 (destructor)dictiter_dealloc, /* tp_dealloc */
2516 0, /* tp_print */
2517 0, /* tp_getattr */
2518 0, /* tp_setattr */
2519 0, /* tp_reserved */
2520 0, /* tp_repr */
2521 0, /* tp_as_number */
2522 0, /* tp_as_sequence */
2523 0, /* tp_as_mapping */
2524 0, /* tp_hash */
2525 0, /* tp_call */
2526 0, /* tp_str */
2527 PyObject_GenericGetAttr, /* tp_getattro */
2528 0, /* tp_setattro */
2529 0, /* tp_as_buffer */
2530 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2531 0, /* tp_doc */
2532 (traverseproc)dictiter_traverse, /* tp_traverse */
2533 0, /* tp_clear */
2534 0, /* tp_richcompare */
2535 0, /* tp_weaklistoffset */
2536 PyObject_SelfIter, /* tp_iter */
2537 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
2538 dictiter_methods, /* tp_methods */
2539 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002540};
Guido van Rossumb90c8482007-02-10 01:11:45 +00002541
2542
Guido van Rossum3ac67412007-02-10 18:55:06 +00002543/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002544/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002545/***********************************************/
2546
Guido van Rossumb90c8482007-02-10 01:11:45 +00002547/* The instance lay-out is the same for all three; but the type differs. */
2548
2549typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 PyObject_HEAD
2551 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002552} dictviewobject;
2553
2554
2555static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00002556dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002557{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 Py_XDECREF(dv->dv_dict);
2559 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002560}
2561
2562static int
2563dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
2564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 Py_VISIT(dv->dv_dict);
2566 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002567}
2568
Guido van Rossum83825ac2007-02-10 04:54:19 +00002569static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00002570dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 Py_ssize_t len = 0;
2573 if (dv->dv_dict != NULL)
2574 len = dv->dv_dict->ma_used;
2575 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002576}
2577
2578static PyObject *
2579dictview_new(PyObject *dict, PyTypeObject *type)
2580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 dictviewobject *dv;
2582 if (dict == NULL) {
2583 PyErr_BadInternalCall();
2584 return NULL;
2585 }
2586 if (!PyDict_Check(dict)) {
2587 /* XXX Get rid of this restriction later */
2588 PyErr_Format(PyExc_TypeError,
2589 "%s() requires a dict argument, not '%s'",
2590 type->tp_name, dict->ob_type->tp_name);
2591 return NULL;
2592 }
2593 dv = PyObject_GC_New(dictviewobject, type);
2594 if (dv == NULL)
2595 return NULL;
2596 Py_INCREF(dict);
2597 dv->dv_dict = (PyDictObject *)dict;
2598 _PyObject_GC_TRACK(dv);
2599 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002600}
2601
Neal Norwitze36f2ba2007-02-26 23:12:28 +00002602/* TODO(guido): The views objects are not complete:
2603
2604 * support more set operations
2605 * support arbitrary mappings?
2606 - either these should be static or exported in dictobject.h
2607 - if public then they should probably be in builtins
2608*/
2609
Guido van Rossumaac530c2007-08-24 22:33:45 +00002610/* Return 1 if self is a subset of other, iterating over self;
2611 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002612static int
2613all_contained_in(PyObject *self, PyObject *other)
2614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 PyObject *iter = PyObject_GetIter(self);
2616 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 if (iter == NULL)
2619 return -1;
2620 for (;;) {
2621 PyObject *next = PyIter_Next(iter);
2622 if (next == NULL) {
2623 if (PyErr_Occurred())
2624 ok = -1;
2625 break;
2626 }
2627 ok = PySequence_Contains(other, next);
2628 Py_DECREF(next);
2629 if (ok <= 0)
2630 break;
2631 }
2632 Py_DECREF(iter);
2633 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002634}
2635
2636static PyObject *
2637dictview_richcompare(PyObject *self, PyObject *other, int op)
2638{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 Py_ssize_t len_self, len_other;
2640 int ok;
2641 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 assert(self != NULL);
2644 assert(PyDictViewSet_Check(self));
2645 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00002646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other)) {
2648 Py_INCREF(Py_NotImplemented);
2649 return Py_NotImplemented;
2650 }
Guido van Rossumaac530c2007-08-24 22:33:45 +00002651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 len_self = PyObject_Size(self);
2653 if (len_self < 0)
2654 return NULL;
2655 len_other = PyObject_Size(other);
2656 if (len_other < 0)
2657 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 ok = 0;
2660 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00002661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 case Py_NE:
2663 case Py_EQ:
2664 if (len_self == len_other)
2665 ok = all_contained_in(self, other);
2666 if (op == Py_NE && ok >= 0)
2667 ok = !ok;
2668 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 case Py_LT:
2671 if (len_self < len_other)
2672 ok = all_contained_in(self, other);
2673 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 case Py_LE:
2676 if (len_self <= len_other)
2677 ok = all_contained_in(self, other);
2678 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 case Py_GT:
2681 if (len_self > len_other)
2682 ok = all_contained_in(other, self);
2683 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 case Py_GE:
2686 if (len_self >= len_other)
2687 ok = all_contained_in(other, self);
2688 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 }
2691 if (ok < 0)
2692 return NULL;
2693 result = ok ? Py_True : Py_False;
2694 Py_INCREF(result);
2695 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002696}
2697
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002698static PyObject *
2699dictview_repr(dictviewobject *dv)
2700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 PyObject *seq;
2702 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 seq = PySequence_List((PyObject *)dv);
2705 if (seq == NULL)
2706 return NULL;
2707
2708 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
2709 Py_DECREF(seq);
2710 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002711}
2712
Guido van Rossum3ac67412007-02-10 18:55:06 +00002713/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002714
2715static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002716dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 if (dv->dv_dict == NULL) {
2719 Py_RETURN_NONE;
2720 }
2721 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002722}
2723
2724static int
2725dictkeys_contains(dictviewobject *dv, PyObject *obj)
2726{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 if (dv->dv_dict == NULL)
2728 return 0;
2729 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002730}
2731
Guido van Rossum83825ac2007-02-10 04:54:19 +00002732static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 (lenfunc)dictview_len, /* sq_length */
2734 0, /* sq_concat */
2735 0, /* sq_repeat */
2736 0, /* sq_item */
2737 0, /* sq_slice */
2738 0, /* sq_ass_item */
2739 0, /* sq_ass_slice */
2740 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002741};
2742
Guido van Rossum523259b2007-08-24 23:41:22 +00002743static PyObject*
2744dictviews_sub(PyObject* self, PyObject *other)
2745{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 PyObject *result = PySet_New(self);
2747 PyObject *tmp;
2748 if (result == NULL)
2749 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 tmp = PyObject_CallMethod(result, "difference_update", "O", other);
2752 if (tmp == NULL) {
2753 Py_DECREF(result);
2754 return NULL;
2755 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 Py_DECREF(tmp);
2758 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002759}
2760
2761static PyObject*
2762dictviews_and(PyObject* self, PyObject *other)
2763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 PyObject *result = PySet_New(self);
2765 PyObject *tmp;
2766 if (result == NULL)
2767 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 tmp = PyObject_CallMethod(result, "intersection_update", "O", other);
2770 if (tmp == NULL) {
2771 Py_DECREF(result);
2772 return NULL;
2773 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 Py_DECREF(tmp);
2776 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002777}
2778
2779static PyObject*
2780dictviews_or(PyObject* self, PyObject *other)
2781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 PyObject *result = PySet_New(self);
2783 PyObject *tmp;
2784 if (result == NULL)
2785 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 tmp = PyObject_CallMethod(result, "update", "O", other);
2788 if (tmp == NULL) {
2789 Py_DECREF(result);
2790 return NULL;
2791 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 Py_DECREF(tmp);
2794 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002795}
2796
2797static PyObject*
2798dictviews_xor(PyObject* self, PyObject *other)
2799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 PyObject *result = PySet_New(self);
2801 PyObject *tmp;
2802 if (result == NULL)
2803 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 tmp = PyObject_CallMethod(result, "symmetric_difference_update", "O",
2806 other);
2807 if (tmp == NULL) {
2808 Py_DECREF(result);
2809 return NULL;
2810 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 Py_DECREF(tmp);
2813 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002814}
2815
2816static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 0, /*nb_add*/
2818 (binaryfunc)dictviews_sub, /*nb_subtract*/
2819 0, /*nb_multiply*/
2820 0, /*nb_remainder*/
2821 0, /*nb_divmod*/
2822 0, /*nb_power*/
2823 0, /*nb_negative*/
2824 0, /*nb_positive*/
2825 0, /*nb_absolute*/
2826 0, /*nb_bool*/
2827 0, /*nb_invert*/
2828 0, /*nb_lshift*/
2829 0, /*nb_rshift*/
2830 (binaryfunc)dictviews_and, /*nb_and*/
2831 (binaryfunc)dictviews_xor, /*nb_xor*/
2832 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00002833};
2834
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00002835static PyObject*
2836dictviews_isdisjoint(PyObject *self, PyObject *other)
2837{
2838 PyObject *it;
2839 PyObject *item = NULL;
2840
2841 if (self == other) {
2842 if (dictview_len((dictviewobject *)self) == 0)
2843 Py_RETURN_TRUE;
2844 else
2845 Py_RETURN_FALSE;
2846 }
2847
2848 /* Iterate over the shorter object (only if other is a set,
2849 * because PySequence_Contains may be expensive otherwise): */
2850 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
2851 Py_ssize_t len_self = dictview_len((dictviewobject *)self);
2852 Py_ssize_t len_other = PyObject_Size(other);
2853 if (len_other == -1)
2854 return NULL;
2855
2856 if ((len_other > len_self)) {
2857 PyObject *tmp = other;
2858 other = self;
2859 self = tmp;
2860 }
2861 }
2862
2863 it = PyObject_GetIter(other);
2864 if (it == NULL)
2865 return NULL;
2866
2867 while ((item = PyIter_Next(it)) != NULL) {
2868 int contains = PySequence_Contains(self, item);
2869 Py_DECREF(item);
2870 if (contains == -1) {
2871 Py_DECREF(it);
2872 return NULL;
2873 }
2874
2875 if (contains) {
2876 Py_DECREF(it);
2877 Py_RETURN_FALSE;
2878 }
2879 }
2880 Py_DECREF(it);
2881 if (PyErr_Occurred())
2882 return NULL; /* PyIter_Next raised an exception. */
2883 Py_RETURN_TRUE;
2884}
2885
2886PyDoc_STRVAR(isdisjoint_doc,
2887"Return True if the view and the given iterable have a null intersection.");
2888
Guido van Rossumb90c8482007-02-10 01:11:45 +00002889static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00002890 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
2891 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002893};
2894
2895PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2897 "dict_keys", /* tp_name */
2898 sizeof(dictviewobject), /* tp_basicsize */
2899 0, /* tp_itemsize */
2900 /* methods */
2901 (destructor)dictview_dealloc, /* tp_dealloc */
2902 0, /* tp_print */
2903 0, /* tp_getattr */
2904 0, /* tp_setattr */
2905 0, /* tp_reserved */
2906 (reprfunc)dictview_repr, /* tp_repr */
2907 &dictviews_as_number, /* tp_as_number */
2908 &dictkeys_as_sequence, /* tp_as_sequence */
2909 0, /* tp_as_mapping */
2910 0, /* tp_hash */
2911 0, /* tp_call */
2912 0, /* tp_str */
2913 PyObject_GenericGetAttr, /* tp_getattro */
2914 0, /* tp_setattro */
2915 0, /* tp_as_buffer */
2916 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2917 0, /* tp_doc */
2918 (traverseproc)dictview_traverse, /* tp_traverse */
2919 0, /* tp_clear */
2920 dictview_richcompare, /* tp_richcompare */
2921 0, /* tp_weaklistoffset */
2922 (getiterfunc)dictkeys_iter, /* tp_iter */
2923 0, /* tp_iternext */
2924 dictkeys_methods, /* tp_methods */
2925 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00002926};
2927
2928static PyObject *
2929dictkeys_new(PyObject *dict)
2930{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 return dictview_new(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002932}
2933
Guido van Rossum3ac67412007-02-10 18:55:06 +00002934/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002935
2936static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002937dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002938{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939 if (dv->dv_dict == NULL) {
2940 Py_RETURN_NONE;
2941 }
2942 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002943}
2944
2945static int
2946dictitems_contains(dictviewobject *dv, PyObject *obj)
2947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 PyObject *key, *value, *found;
2949 if (dv->dv_dict == NULL)
2950 return 0;
2951 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
2952 return 0;
2953 key = PyTuple_GET_ITEM(obj, 0);
2954 value = PyTuple_GET_ITEM(obj, 1);
2955 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
2956 if (found == NULL) {
2957 if (PyErr_Occurred())
2958 return -1;
2959 return 0;
2960 }
2961 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002962}
2963
Guido van Rossum83825ac2007-02-10 04:54:19 +00002964static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002965 (lenfunc)dictview_len, /* sq_length */
2966 0, /* sq_concat */
2967 0, /* sq_repeat */
2968 0, /* sq_item */
2969 0, /* sq_slice */
2970 0, /* sq_ass_item */
2971 0, /* sq_ass_slice */
2972 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002973};
2974
Guido van Rossumb90c8482007-02-10 01:11:45 +00002975static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00002976 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
2977 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002979};
2980
2981PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002982 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2983 "dict_items", /* tp_name */
2984 sizeof(dictviewobject), /* tp_basicsize */
2985 0, /* tp_itemsize */
2986 /* methods */
2987 (destructor)dictview_dealloc, /* tp_dealloc */
2988 0, /* tp_print */
2989 0, /* tp_getattr */
2990 0, /* tp_setattr */
2991 0, /* tp_reserved */
2992 (reprfunc)dictview_repr, /* tp_repr */
2993 &dictviews_as_number, /* tp_as_number */
2994 &dictitems_as_sequence, /* tp_as_sequence */
2995 0, /* tp_as_mapping */
2996 0, /* tp_hash */
2997 0, /* tp_call */
2998 0, /* tp_str */
2999 PyObject_GenericGetAttr, /* tp_getattro */
3000 0, /* tp_setattro */
3001 0, /* tp_as_buffer */
3002 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3003 0, /* tp_doc */
3004 (traverseproc)dictview_traverse, /* tp_traverse */
3005 0, /* tp_clear */
3006 dictview_richcompare, /* tp_richcompare */
3007 0, /* tp_weaklistoffset */
3008 (getiterfunc)dictitems_iter, /* tp_iter */
3009 0, /* tp_iternext */
3010 dictitems_methods, /* tp_methods */
3011 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003012};
3013
3014static PyObject *
3015dictitems_new(PyObject *dict)
3016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 return dictview_new(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003018}
3019
Guido van Rossum3ac67412007-02-10 18:55:06 +00003020/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003021
3022static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003023dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003024{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 if (dv->dv_dict == NULL) {
3026 Py_RETURN_NONE;
3027 }
3028 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003029}
3030
Guido van Rossum83825ac2007-02-10 04:54:19 +00003031static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 (lenfunc)dictview_len, /* sq_length */
3033 0, /* sq_concat */
3034 0, /* sq_repeat */
3035 0, /* sq_item */
3036 0, /* sq_slice */
3037 0, /* sq_ass_item */
3038 0, /* sq_ass_slice */
3039 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003040};
3041
Guido van Rossumb90c8482007-02-10 01:11:45 +00003042static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003044};
3045
3046PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3048 "dict_values", /* tp_name */
3049 sizeof(dictviewobject), /* tp_basicsize */
3050 0, /* tp_itemsize */
3051 /* methods */
3052 (destructor)dictview_dealloc, /* tp_dealloc */
3053 0, /* tp_print */
3054 0, /* tp_getattr */
3055 0, /* tp_setattr */
3056 0, /* tp_reserved */
3057 (reprfunc)dictview_repr, /* tp_repr */
3058 0, /* tp_as_number */
3059 &dictvalues_as_sequence, /* tp_as_sequence */
3060 0, /* tp_as_mapping */
3061 0, /* tp_hash */
3062 0, /* tp_call */
3063 0, /* tp_str */
3064 PyObject_GenericGetAttr, /* tp_getattro */
3065 0, /* tp_setattro */
3066 0, /* tp_as_buffer */
3067 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3068 0, /* tp_doc */
3069 (traverseproc)dictview_traverse, /* tp_traverse */
3070 0, /* tp_clear */
3071 0, /* tp_richcompare */
3072 0, /* tp_weaklistoffset */
3073 (getiterfunc)dictvalues_iter, /* tp_iter */
3074 0, /* tp_iternext */
3075 dictvalues_methods, /* tp_methods */
3076 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003077};
3078
3079static PyObject *
3080dictvalues_new(PyObject *dict)
3081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 return dictview_new(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003083}