blob: 865feffb1c2527668d21960f616ebbe399285ebb [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 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100421 i = (size_t)hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 ep = &ep0[i];
423 if (ep->me_key == NULL || ep->me_key == key)
424 return ep;
425 if (ep->me_key == dummy)
426 freeslot = ep;
427 else {
428 if (ep->me_hash == hash && unicode_eq(ep->me_key, key))
429 return ep;
430 freeslot = NULL;
431 }
Tim Peters15d49292001-05-27 07:39:22 +0000432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 /* In the loop, me_key == dummy is by far (factor of 100s) the
434 least likely outcome, so test for that last. */
435 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
436 i = (i << 2) + i + perturb + 1;
437 ep = &ep0[i & mask];
438 if (ep->me_key == NULL)
439 return freeslot == NULL ? ep : freeslot;
440 if (ep->me_key == key
441 || (ep->me_hash == hash
442 && ep->me_key != dummy
443 && unicode_eq(ep->me_key, key)))
444 return ep;
445 if (ep->me_key == dummy && freeslot == NULL)
446 freeslot = ep;
447 }
448 assert(0); /* NOT REACHED */
449 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000450}
451
Benjamin Petersonfb886362010-04-24 18:21:17 +0000452int
453_PyDict_HasOnlyStringKeys(PyObject *dict)
454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 Py_ssize_t pos = 0;
456 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +0000457 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 /* Shortcut */
459 if (((PyDictObject *)dict)->ma_lookup == lookdict_unicode)
460 return 1;
461 while (PyDict_Next(dict, &pos, &key, &value))
462 if (!PyUnicode_Check(key))
463 return 0;
464 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +0000465}
466
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000467#ifdef SHOW_TRACK_COUNT
468#define INCREASE_TRACK_COUNT \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 (count_tracked++, count_untracked--);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000470#define DECREASE_TRACK_COUNT \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 (count_tracked--, count_untracked++);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000472#else
473#define INCREASE_TRACK_COUNT
474#define DECREASE_TRACK_COUNT
475#endif
476
477#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 do { \
479 if (!_PyObject_GC_IS_TRACKED(mp)) { \
480 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
481 _PyObject_GC_MAY_BE_TRACKED(value)) { \
482 _PyObject_GC_TRACK(mp); \
483 INCREASE_TRACK_COUNT \
484 } \
485 } \
486 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000487
488void
489_PyDict_MaybeUntrack(PyObject *op)
490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 PyDictObject *mp;
492 PyObject *value;
493 Py_ssize_t mask, i;
494 PyDictEntry *ep;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
497 return;
498
499 mp = (PyDictObject *) op;
500 ep = mp->ma_table;
501 mask = mp->ma_mask;
502 for (i = 0; i <= mask; i++) {
503 if ((value = ep[i].me_value) == NULL)
504 continue;
505 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
506 _PyObject_GC_MAY_BE_TRACKED(ep[i].me_key))
507 return;
508 }
509 DECREASE_TRACK_COUNT
510 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000511}
512
513
Fred Drake1bff34a2000-08-31 19:31:38 +0000514/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000515Internal routine to insert a new item into the table.
516Used both by the internal resize routine and by the public insert routine.
517Eats a reference to key and one to value.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000518Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000519*/
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000520static int
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000521insertdict(register PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000522{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 PyObject *old_value;
524 register PyDictEntry *ep;
Antoine Pitroufbb1c612010-10-23 17:37:54 +0000525 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, Py_hash_t);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 assert(mp->ma_lookup != NULL);
528 ep = mp->ma_lookup(mp, key, hash);
529 if (ep == NULL) {
530 Py_DECREF(key);
531 Py_DECREF(value);
532 return -1;
533 }
534 MAINTAIN_TRACKING(mp, key, value);
535 if (ep->me_value != NULL) {
536 old_value = ep->me_value;
537 ep->me_value = value;
538 Py_DECREF(old_value); /* which **CAN** re-enter */
539 Py_DECREF(key);
540 }
541 else {
542 if (ep->me_key == NULL)
543 mp->ma_fill++;
544 else {
545 assert(ep->me_key == dummy);
546 Py_DECREF(dummy);
547 }
548 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000549 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 ep->me_value = value;
551 mp->ma_used++;
552 }
553 return 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000554}
555
556/*
557Internal routine used by dictresize() to insert an item which is
558known to be absent from the dict. This routine also assumes that
559the dict contains no deleted entries. Besides the performance benefit,
560using insertdict() in dictresize() is dangerous (SF bug #1456209).
561Note that no refcounts are changed by this routine; if needed, the caller
562is responsible for incref'ing `key` and `value`.
563*/
564static void
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000565insertdict_clean(register PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 register size_t i;
569 register size_t perturb;
570 register size_t mask = (size_t)mp->ma_mask;
571 PyDictEntry *ep0 = mp->ma_table;
572 register PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 MAINTAIN_TRACKING(mp, key, value);
Mark Dickinson57e683e2011-09-24 18:18:40 +0100575 i = (size_t)hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 ep = &ep0[i];
577 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
578 i = (i << 2) + i + perturb + 1;
579 ep = &ep0[i & mask];
580 }
581 assert(ep->me_value == NULL);
582 mp->ma_fill++;
583 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000584 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 ep->me_value = value;
586 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000587}
588
589/*
590Restructure the table by allocating a new table and reinserting all
591items again. When entries have been deleted, the new table may
592actually be smaller than the old one.
593*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000594static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000595dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 Py_ssize_t newsize;
598 PyDictEntry *oldtable, *newtable, *ep;
599 Py_ssize_t i;
600 int is_oldtable_malloced;
601 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 /* Find the smallest table size > minused. */
606 for (newsize = PyDict_MINSIZE;
607 newsize <= minused && newsize > 0;
608 newsize <<= 1)
609 ;
610 if (newsize <= 0) {
611 PyErr_NoMemory();
612 return -1;
613 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 /* Get space for a new table. */
616 oldtable = mp->ma_table;
617 assert(oldtable != NULL);
618 is_oldtable_malloced = oldtable != mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 if (newsize == PyDict_MINSIZE) {
621 /* A large table is shrinking, or we can't get any smaller. */
622 newtable = mp->ma_smalltable;
623 if (newtable == oldtable) {
624 if (mp->ma_fill == mp->ma_used) {
625 /* No dummies, so no point doing anything. */
626 return 0;
627 }
628 /* We're not going to resize it, but rebuild the
629 table anyway to purge old dummy entries.
630 Subtle: This is *necessary* if fill==size,
631 as lookdict needs at least one virgin slot to
632 terminate failing searches. If fill < size, it's
633 merely desirable, as dummies slow searches. */
634 assert(mp->ma_fill > mp->ma_used);
635 memcpy(small_copy, oldtable, sizeof(small_copy));
636 oldtable = small_copy;
637 }
638 }
639 else {
640 newtable = PyMem_NEW(PyDictEntry, newsize);
641 if (newtable == NULL) {
642 PyErr_NoMemory();
643 return -1;
644 }
645 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 /* Make the dict empty, using the new table. */
648 assert(newtable != oldtable);
649 mp->ma_table = newtable;
650 mp->ma_mask = newsize - 1;
651 memset(newtable, 0, sizeof(PyDictEntry) * newsize);
652 mp->ma_used = 0;
653 i = mp->ma_fill;
654 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 /* Copy the data over; this is refcount-neutral for active entries;
657 dummy entries aren't copied over, of course */
658 for (ep = oldtable; i > 0; ep++) {
659 if (ep->me_value != NULL) { /* active entry */
660 --i;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000661 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 }
663 else if (ep->me_key != NULL) { /* dummy entry */
664 --i;
665 assert(ep->me_key == dummy);
666 Py_DECREF(ep->me_key);
667 }
668 /* else key == value == NULL: nothing to do */
669 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 if (is_oldtable_malloced)
672 PyMem_DEL(oldtable);
673 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000674}
675
Christian Heimes99170a52007-12-19 02:07:34 +0000676/* Create a new dictionary pre-sized to hold an estimated number of elements.
677 Underestimates are okay because the dictionary will resize as necessary.
678 Overestimates just mean the dictionary will be more sparse than usual.
679*/
680
681PyObject *
682_PyDict_NewPresized(Py_ssize_t minused)
683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 PyObject *op = PyDict_New();
Christian Heimes99170a52007-12-19 02:07:34 +0000685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
687 Py_DECREF(op);
688 return NULL;
689 }
690 return op;
Christian Heimes99170a52007-12-19 02:07:34 +0000691}
692
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000693/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
694 * that may occur (originally dicts supported only string keys, and exceptions
695 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000696 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000697 * (suppressed) occurred while computing the key's hash, or that some error
698 * (suppressed) occurred when comparing keys in the dict's internal probe
699 * sequence. A nasty example of the latter is when a Python-coded comparison
700 * function hits a stack-depth error, which can cause this to return NULL
701 * even if the key is present.
702 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000704PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000705{
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000706 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 PyDictObject *mp = (PyDictObject *)op;
708 PyDictEntry *ep;
709 PyThreadState *tstate;
710 if (!PyDict_Check(op))
711 return NULL;
712 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200713 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 {
715 hash = PyObject_Hash(key);
716 if (hash == -1) {
717 PyErr_Clear();
718 return NULL;
719 }
720 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 /* We can arrive here with a NULL tstate during initialization: try
723 running "python -Wi" for an example related to string interning.
724 Let's just hope that no exception occurs then... This must be
725 _PyThreadState_Current and not PyThreadState_GET() because in debug
726 mode, the latter complains if tstate is NULL. */
727 tstate = (PyThreadState*)_Py_atomic_load_relaxed(
728 &_PyThreadState_Current);
729 if (tstate != NULL && tstate->curexc_type != NULL) {
730 /* preserve the existing exception */
731 PyObject *err_type, *err_value, *err_tb;
732 PyErr_Fetch(&err_type, &err_value, &err_tb);
733 ep = (mp->ma_lookup)(mp, key, hash);
734 /* ignore errors */
735 PyErr_Restore(err_type, err_value, err_tb);
736 if (ep == NULL)
737 return NULL;
738 }
739 else {
740 ep = (mp->ma_lookup)(mp, key, hash);
741 if (ep == NULL) {
742 PyErr_Clear();
743 return NULL;
744 }
745 }
746 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000747}
748
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000749/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
750 This returns NULL *with* an exception set if an exception occurred.
751 It returns NULL *without* an exception set if the key wasn't present.
752*/
753PyObject *
754PyDict_GetItemWithError(PyObject *op, PyObject *key)
755{
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000756 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 PyDictObject*mp = (PyDictObject *)op;
758 PyDictEntry *ep;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 if (!PyDict_Check(op)) {
761 PyErr_BadInternalCall();
762 return NULL;
763 }
764 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200765 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 {
767 hash = PyObject_Hash(key);
768 if (hash == -1) {
769 return NULL;
770 }
771 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 ep = (mp->ma_lookup)(mp, key, hash);
774 if (ep == NULL)
775 return NULL;
776 return ep->me_value;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000777}
778
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000779/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000780 * dictionary if it's merely replacing the value for an existing key.
781 * This means that it's safe to loop over a dictionary with PyDict_Next()
782 * and occasionally replace a value -- but you can't insert new keys or
783 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000784 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000785int
Tim Peters1f5871e2000-07-04 17:44:48 +0000786PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 register PyDictObject *mp;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000789 register Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 if (!PyDict_Check(op)) {
793 PyErr_BadInternalCall();
794 return -1;
795 }
796 assert(key);
797 assert(value);
798 mp = (PyDictObject *)op;
799 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200800 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 {
802 hash = PyObject_Hash(key);
803 if (hash == -1)
804 return -1;
805 }
806 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
807 n_used = mp->ma_used;
808 Py_INCREF(value);
809 Py_INCREF(key);
810 if (insertdict(mp, key, hash, value) != 0)
811 return -1;
812 /* If we added a key, we can safely resize. Otherwise just return!
813 * If fill >= 2/3 size, adjust size. Normally, this doubles or
814 * quaduples the size, but it's also possible for the dict to shrink
815 * (if ma_fill is much larger than ma_used, meaning a lot of dict
816 * keys have been * deleted).
817 *
818 * Quadrupling the size improves average dictionary sparseness
819 * (reducing collisions) at the cost of some memory and iteration
820 * speed (which loops over every possible entry). It also halves
821 * the number of expensive resize operations in a growing dictionary.
822 *
823 * Very large dictionaries (over 50K items) use doubling instead.
824 * This may help applications with severe memory constraints.
825 */
826 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
827 return 0;
828 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000829}
830
831int
Tim Peters1f5871e2000-07-04 17:44:48 +0000832PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000833{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 register PyDictObject *mp;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000835 register Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 register PyDictEntry *ep;
837 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 if (!PyDict_Check(op)) {
840 PyErr_BadInternalCall();
841 return -1;
842 }
843 assert(key);
844 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200845 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 hash = PyObject_Hash(key);
847 if (hash == -1)
848 return -1;
849 }
850 mp = (PyDictObject *)op;
851 ep = (mp->ma_lookup)(mp, key, hash);
852 if (ep == NULL)
853 return -1;
854 if (ep->me_value == NULL) {
855 set_key_error(key);
856 return -1;
857 }
858 old_key = ep->me_key;
859 Py_INCREF(dummy);
860 ep->me_key = dummy;
861 old_value = ep->me_value;
862 ep->me_value = NULL;
863 mp->ma_used--;
864 Py_DECREF(old_value);
865 Py_DECREF(old_key);
866 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000867}
868
Guido van Rossum25831651993-05-19 14:50:45 +0000869void
Tim Peters1f5871e2000-07-04 17:44:48 +0000870PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 PyDictObject *mp;
873 PyDictEntry *ep, *table;
874 int table_is_malloced;
875 Py_ssize_t fill;
876 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000877#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000879#endif
880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 if (!PyDict_Check(op))
882 return;
883 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000884#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 n = mp->ma_mask + 1;
886 i = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000887#endif
888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 table = mp->ma_table;
890 assert(table != NULL);
891 table_is_malloced = table != mp->ma_smalltable;
Tim Petersdea48ec2001-05-22 20:40:22 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 /* This is delicate. During the process of clearing the dict,
894 * decrefs can cause the dict to mutate. To avoid fatal confusion
895 * (voice of experience), we have to make the dict empty before
896 * clearing the slots, and never refer to anything via mp->xxx while
897 * clearing.
898 */
899 fill = mp->ma_fill;
900 if (table_is_malloced)
901 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 else if (fill > 0) {
904 /* It's a small table with something that needs to be cleared.
905 * Afraid the only safe way is to copy the dict entries into
906 * another small table first.
907 */
908 memcpy(small_copy, table, sizeof(small_copy));
909 table = small_copy;
910 EMPTY_TO_MINSIZE(mp);
911 }
912 /* else it's a small table that's already empty */
Tim Petersdea48ec2001-05-22 20:40:22 +0000913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 /* Now we can finally clear things. If C had refcounts, we could
915 * assert that the refcount on table is 1 now, i.e. that this function
916 * has unique access to it, so decref side-effects can't alter it.
917 */
918 for (ep = table; fill > 0; ++ep) {
Tim Petersdea48ec2001-05-22 20:40:22 +0000919#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 assert(i < n);
921 ++i;
Tim Petersdea48ec2001-05-22 20:40:22 +0000922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 if (ep->me_key) {
924 --fill;
925 Py_DECREF(ep->me_key);
926 Py_XDECREF(ep->me_value);
927 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000928#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 else
930 assert(ep->me_value == NULL);
Tim Petersdea48ec2001-05-22 20:40:22 +0000931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 if (table_is_malloced)
935 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000936}
937
Tim Peters080c88b2003-02-15 03:01:11 +0000938/*
939 * Iterate over a dict. Use like so:
940 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000941 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000942 * PyObject *key, *value;
943 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000944 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000945 * Refer to borrowed references in key and value.
946 * }
947 *
948 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000949 * mutates the dict. One exception: it is safe if the loop merely changes
950 * the values associated with the keys (but doesn't insert new keys or
951 * delete keys), via PyDict_SetItem().
952 */
Guido van Rossum25831651993-05-19 14:50:45 +0000953int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000954PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 register Py_ssize_t i;
957 register Py_ssize_t mask;
958 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 if (!PyDict_Check(op))
961 return 0;
962 i = *ppos;
963 if (i < 0)
964 return 0;
965 ep = ((PyDictObject *)op)->ma_table;
966 mask = ((PyDictObject *)op)->ma_mask;
967 while (i <= mask && ep[i].me_value == NULL)
968 i++;
969 *ppos = i+1;
970 if (i > mask)
971 return 0;
972 if (pkey)
973 *pkey = ep[i].me_key;
974 if (pvalue)
975 *pvalue = ep[i].me_value;
976 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000977}
978
Thomas Wouterscf297e42007-02-23 15:07:44 +0000979/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
980int
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000981_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 register Py_ssize_t i;
984 register Py_ssize_t mask;
985 register PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +0000986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 if (!PyDict_Check(op))
988 return 0;
989 i = *ppos;
990 if (i < 0)
991 return 0;
992 ep = ((PyDictObject *)op)->ma_table;
993 mask = ((PyDictObject *)op)->ma_mask;
994 while (i <= mask && ep[i].me_value == NULL)
995 i++;
996 *ppos = i+1;
997 if (i > mask)
998 return 0;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000999 *phash = ep[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 if (pkey)
1001 *pkey = ep[i].me_key;
1002 if (pvalue)
1003 *pvalue = ep[i].me_value;
1004 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001005}
1006
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001007/* Methods */
1008
1009static void
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001010dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 register PyDictEntry *ep;
1013 Py_ssize_t fill = mp->ma_fill;
1014 PyObject_GC_UnTrack(mp);
1015 Py_TRASHCAN_SAFE_BEGIN(mp)
1016 for (ep = mp->ma_table; fill > 0; ep++) {
1017 if (ep->me_key) {
1018 --fill;
1019 Py_DECREF(ep->me_key);
1020 Py_XDECREF(ep->me_value);
1021 }
1022 }
1023 if (mp->ma_table != mp->ma_smalltable)
1024 PyMem_DEL(mp->ma_table);
1025 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1026 free_list[numfree++] = mp;
1027 else
1028 Py_TYPE(mp)->tp_free((PyObject *)mp);
1029 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001030}
1031
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001033dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 Py_ssize_t i;
1036 PyObject *s, *temp, *colon = NULL;
1037 PyObject *pieces = NULL, *result = NULL;
1038 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 i = Py_ReprEnter((PyObject *)mp);
1041 if (i != 0) {
1042 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1043 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 if (mp->ma_used == 0) {
1046 result = PyUnicode_FromString("{}");
1047 goto Done;
1048 }
Tim Petersa7259592001-06-16 05:11:17 +00001049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 pieces = PyList_New(0);
1051 if (pieces == NULL)
1052 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 colon = PyUnicode_FromString(": ");
1055 if (colon == NULL)
1056 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 /* Do repr() on each key+value pair, and insert ": " between them.
1059 Note that repr may mutate the dict. */
1060 i = 0;
1061 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
1062 int status;
1063 /* Prevent repr from deleting value during key format. */
1064 Py_INCREF(value);
1065 s = PyObject_Repr(key);
1066 PyUnicode_Append(&s, colon);
1067 PyUnicode_AppendAndDel(&s, PyObject_Repr(value));
1068 Py_DECREF(value);
1069 if (s == NULL)
1070 goto Done;
1071 status = PyList_Append(pieces, s);
1072 Py_DECREF(s); /* append created a new ref */
1073 if (status < 0)
1074 goto Done;
1075 }
Tim Petersa7259592001-06-16 05:11:17 +00001076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 /* Add "{}" decorations to the first and last items. */
1078 assert(PyList_GET_SIZE(pieces) > 0);
1079 s = PyUnicode_FromString("{");
1080 if (s == NULL)
1081 goto Done;
1082 temp = PyList_GET_ITEM(pieces, 0);
1083 PyUnicode_AppendAndDel(&s, temp);
1084 PyList_SET_ITEM(pieces, 0, s);
1085 if (s == NULL)
1086 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 s = PyUnicode_FromString("}");
1089 if (s == NULL)
1090 goto Done;
1091 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
1092 PyUnicode_AppendAndDel(&temp, s);
1093 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1094 if (temp == NULL)
1095 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 /* Paste them all together with ", " between. */
1098 s = PyUnicode_FromString(", ");
1099 if (s == NULL)
1100 goto Done;
1101 result = PyUnicode_Join(s, pieces);
1102 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001103
1104Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 Py_XDECREF(pieces);
1106 Py_XDECREF(colon);
1107 Py_ReprLeave((PyObject *)mp);
1108 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001109}
1110
Martin v. Löwis18e16552006-02-15 17:27:45 +00001111static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001112dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001115}
1116
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001118dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 PyObject *v;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001121 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 PyDictEntry *ep;
1123 assert(mp->ma_table != NULL);
1124 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001125 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 hash = PyObject_Hash(key);
1127 if (hash == -1)
1128 return NULL;
1129 }
1130 ep = (mp->ma_lookup)(mp, key, hash);
1131 if (ep == NULL)
1132 return NULL;
1133 v = ep->me_value;
1134 if (v == NULL) {
1135 if (!PyDict_CheckExact(mp)) {
1136 /* Look up __missing__ method if we're a subclass. */
1137 PyObject *missing, *res;
1138 static PyObject *missing_str = NULL;
1139 missing = _PyObject_LookupSpecial((PyObject *)mp,
1140 "__missing__",
1141 &missing_str);
1142 if (missing != NULL) {
1143 res = PyObject_CallFunctionObjArgs(missing,
1144 key, NULL);
1145 Py_DECREF(missing);
1146 return res;
1147 }
1148 else if (PyErr_Occurred())
1149 return NULL;
1150 }
1151 set_key_error(key);
1152 return NULL;
1153 }
1154 else
1155 Py_INCREF(v);
1156 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001157}
1158
1159static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001160dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 if (w == NULL)
1163 return PyDict_DelItem((PyObject *)mp, v);
1164 else
1165 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001166}
1167
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001168static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 (lenfunc)dict_length, /*mp_length*/
1170 (binaryfunc)dict_subscript, /*mp_subscript*/
1171 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001172};
1173
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001175dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 register PyObject *v;
1178 register Py_ssize_t i, j;
1179 PyDictEntry *ep;
1180 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001181
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001182 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 n = mp->ma_used;
1184 v = PyList_New(n);
1185 if (v == NULL)
1186 return NULL;
1187 if (n != mp->ma_used) {
1188 /* Durnit. The allocations caused the dict to resize.
1189 * Just start over, this shouldn't normally happen.
1190 */
1191 Py_DECREF(v);
1192 goto again;
1193 }
1194 ep = mp->ma_table;
1195 mask = mp->ma_mask;
1196 for (i = 0, j = 0; i <= mask; i++) {
1197 if (ep[i].me_value != NULL) {
1198 PyObject *key = ep[i].me_key;
1199 Py_INCREF(key);
1200 PyList_SET_ITEM(v, j, key);
1201 j++;
1202 }
1203 }
1204 assert(j == n);
1205 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001206}
1207
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001209dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 register PyObject *v;
1212 register Py_ssize_t i, j;
1213 PyDictEntry *ep;
1214 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001215
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001216 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 n = mp->ma_used;
1218 v = PyList_New(n);
1219 if (v == NULL)
1220 return NULL;
1221 if (n != mp->ma_used) {
1222 /* Durnit. The allocations caused the dict to resize.
1223 * Just start over, this shouldn't normally happen.
1224 */
1225 Py_DECREF(v);
1226 goto again;
1227 }
1228 ep = mp->ma_table;
1229 mask = mp->ma_mask;
1230 for (i = 0, j = 0; i <= mask; i++) {
1231 if (ep[i].me_value != NULL) {
1232 PyObject *value = ep[i].me_value;
1233 Py_INCREF(value);
1234 PyList_SET_ITEM(v, j, value);
1235 j++;
1236 }
1237 }
1238 assert(j == n);
1239 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001240}
1241
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001243dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 register PyObject *v;
1246 register Py_ssize_t i, j, n;
1247 Py_ssize_t mask;
1248 PyObject *item, *key, *value;
1249 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 /* Preallocate the list of tuples, to avoid allocations during
1252 * the loop over the items, which could trigger GC, which
1253 * could resize the dict. :-(
1254 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001255 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 n = mp->ma_used;
1257 v = PyList_New(n);
1258 if (v == NULL)
1259 return NULL;
1260 for (i = 0; i < n; i++) {
1261 item = PyTuple_New(2);
1262 if (item == NULL) {
1263 Py_DECREF(v);
1264 return NULL;
1265 }
1266 PyList_SET_ITEM(v, i, item);
1267 }
1268 if (n != mp->ma_used) {
1269 /* Durnit. The allocations caused the dict to resize.
1270 * Just start over, this shouldn't normally happen.
1271 */
1272 Py_DECREF(v);
1273 goto again;
1274 }
1275 /* Nothing we do below makes any function calls. */
1276 ep = mp->ma_table;
1277 mask = mp->ma_mask;
1278 for (i = 0, j = 0; i <= mask; i++) {
1279 if ((value=ep[i].me_value) != NULL) {
1280 key = ep[i].me_key;
1281 item = PyList_GET_ITEM(v, j);
1282 Py_INCREF(key);
1283 PyTuple_SET_ITEM(item, 0, key);
1284 Py_INCREF(value);
1285 PyTuple_SET_ITEM(item, 1, value);
1286 j++;
1287 }
1288 }
1289 assert(j == n);
1290 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001291}
1292
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001293static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001294dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 PyObject *seq;
1297 PyObject *value = Py_None;
1298 PyObject *it; /* iter(seq) */
1299 PyObject *key;
1300 PyObject *d;
1301 int status;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
1304 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 d = PyObject_CallObject(cls, NULL);
1307 if (d == NULL)
1308 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1311 PyDictObject *mp = (PyDictObject *)d;
1312 PyObject *oldvalue;
1313 Py_ssize_t pos = 0;
1314 PyObject *key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001315 Py_hash_t hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 if (dictresize(mp, Py_SIZE(seq)))
1318 return NULL;
Guido van Rossum58da9312007-11-10 23:39:45 +00001319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1321 Py_INCREF(key);
1322 Py_INCREF(value);
1323 if (insertdict(mp, key, hash, value))
1324 return NULL;
1325 }
1326 return d;
1327 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
1330 PyDictObject *mp = (PyDictObject *)d;
1331 Py_ssize_t pos = 0;
1332 PyObject *key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001333 Py_hash_t hash;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 if (dictresize(mp, PySet_GET_SIZE(seq)))
1336 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1339 Py_INCREF(key);
1340 Py_INCREF(value);
1341 if (insertdict(mp, key, hash, value))
1342 return NULL;
1343 }
1344 return d;
1345 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 it = PyObject_GetIter(seq);
1348 if (it == NULL){
1349 Py_DECREF(d);
1350 return NULL;
1351 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 if (PyDict_CheckExact(d)) {
1354 while ((key = PyIter_Next(it)) != NULL) {
1355 status = PyDict_SetItem(d, key, value);
1356 Py_DECREF(key);
1357 if (status < 0)
1358 goto Fail;
1359 }
1360 } else {
1361 while ((key = PyIter_Next(it)) != NULL) {
1362 status = PyObject_SetItem(d, key, value);
1363 Py_DECREF(key);
1364 if (status < 0)
1365 goto Fail;
1366 }
1367 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 if (PyErr_Occurred())
1370 goto Fail;
1371 Py_DECREF(it);
1372 return d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001373
1374Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 Py_DECREF(it);
1376 Py_DECREF(d);
1377 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001378}
1379
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001380static int
1381dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 PyObject *arg = NULL;
1384 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1387 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001390 _Py_IDENTIFIER(keys);
1391 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 result = PyDict_Merge(self, arg, 1);
1393 else
1394 result = PyDict_MergeFromSeq2(self, arg, 1);
1395 }
1396 if (result == 0 && kwds != NULL) {
1397 if (PyArg_ValidateKeywordArguments(kwds))
1398 result = PyDict_Merge(self, kwds, 1);
1399 else
1400 result = -1;
1401 }
1402 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001403}
1404
1405static PyObject *
1406dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1407{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 if (dict_update_common(self, args, kwds, "update") != -1)
1409 Py_RETURN_NONE;
1410 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001411}
1412
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001413/* Update unconditionally replaces existing items.
1414 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001415 otherwise it leaves existing items unchanged.
1416
1417 PyDict_{Update,Merge} update/merge from a mapping object.
1418
Tim Petersf582b822001-12-11 18:51:08 +00001419 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001420 producing iterable objects of length 2.
1421*/
1422
Tim Petersf582b822001-12-11 18:51:08 +00001423int
Tim Peters1fc240e2001-10-26 05:06:50 +00001424PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1425{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 PyObject *it; /* iter(seq2) */
1427 Py_ssize_t i; /* index into seq2 of current element */
1428 PyObject *item; /* seq2[i] */
1429 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 assert(d != NULL);
1432 assert(PyDict_Check(d));
1433 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 it = PyObject_GetIter(seq2);
1436 if (it == NULL)
1437 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 for (i = 0; ; ++i) {
1440 PyObject *key, *value;
1441 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 fast = NULL;
1444 item = PyIter_Next(it);
1445 if (item == NULL) {
1446 if (PyErr_Occurred())
1447 goto Fail;
1448 break;
1449 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 /* Convert item to sequence, and verify length 2. */
1452 fast = PySequence_Fast(item, "");
1453 if (fast == NULL) {
1454 if (PyErr_ExceptionMatches(PyExc_TypeError))
1455 PyErr_Format(PyExc_TypeError,
1456 "cannot convert dictionary update "
1457 "sequence element #%zd to a sequence",
1458 i);
1459 goto Fail;
1460 }
1461 n = PySequence_Fast_GET_SIZE(fast);
1462 if (n != 2) {
1463 PyErr_Format(PyExc_ValueError,
1464 "dictionary update sequence element #%zd "
1465 "has length %zd; 2 is required",
1466 i, n);
1467 goto Fail;
1468 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 /* Update/merge with this (key, value) pair. */
1471 key = PySequence_Fast_GET_ITEM(fast, 0);
1472 value = PySequence_Fast_GET_ITEM(fast, 1);
1473 if (override || PyDict_GetItem(d, key) == NULL) {
1474 int status = PyDict_SetItem(d, key, value);
1475 if (status < 0)
1476 goto Fail;
1477 }
1478 Py_DECREF(fast);
1479 Py_DECREF(item);
1480 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 i = 0;
1483 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00001484Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 Py_XDECREF(item);
1486 Py_XDECREF(fast);
1487 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001488Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 Py_DECREF(it);
1490 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001491}
1492
Tim Peters6d6c1a32001-08-02 04:15:00 +00001493int
1494PyDict_Update(PyObject *a, PyObject *b)
1495{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001497}
1498
1499int
1500PyDict_Merge(PyObject *a, PyObject *b, int override)
1501{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 register PyDictObject *mp, *other;
1503 register Py_ssize_t i;
1504 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 /* We accept for the argument either a concrete dictionary object,
1507 * or an abstract "mapping" object. For the former, we can do
1508 * things quite efficiently. For the latter, we only require that
1509 * PyMapping_Keys() and PyObject_GetItem() be supported.
1510 */
1511 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1512 PyErr_BadInternalCall();
1513 return -1;
1514 }
1515 mp = (PyDictObject*)a;
1516 if (PyDict_Check(b)) {
1517 other = (PyDictObject*)b;
1518 if (other == mp || other->ma_used == 0)
1519 /* a.update(a) or a.update({}); nothing to do */
1520 return 0;
1521 if (mp->ma_used == 0)
1522 /* Since the target dict is empty, PyDict_GetItem()
1523 * always returns NULL. Setting override to 1
1524 * skips the unnecessary test.
1525 */
1526 override = 1;
1527 /* Do one big resize at the start, rather than
1528 * incrementally resizing as we insert new items. Expect
1529 * that there will be no (or few) overlapping keys.
1530 */
1531 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
1532 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
1533 return -1;
1534 }
1535 for (i = 0; i <= other->ma_mask; i++) {
1536 entry = &other->ma_table[i];
1537 if (entry->me_value != NULL &&
1538 (override ||
1539 PyDict_GetItem(a, entry->me_key) == NULL)) {
1540 Py_INCREF(entry->me_key);
1541 Py_INCREF(entry->me_value);
1542 if (insertdict(mp, entry->me_key,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001543 entry->me_hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 entry->me_value) != 0)
1545 return -1;
1546 }
1547 }
1548 }
1549 else {
1550 /* Do it the generic, slower way */
1551 PyObject *keys = PyMapping_Keys(b);
1552 PyObject *iter;
1553 PyObject *key, *value;
1554 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 if (keys == NULL)
1557 /* Docstring says this is equivalent to E.keys() so
1558 * if E doesn't have a .keys() method we want
1559 * AttributeError to percolate up. Might as well
1560 * do the same for any other error.
1561 */
1562 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 iter = PyObject_GetIter(keys);
1565 Py_DECREF(keys);
1566 if (iter == NULL)
1567 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
1570 if (!override && PyDict_GetItem(a, key) != NULL) {
1571 Py_DECREF(key);
1572 continue;
1573 }
1574 value = PyObject_GetItem(b, key);
1575 if (value == NULL) {
1576 Py_DECREF(iter);
1577 Py_DECREF(key);
1578 return -1;
1579 }
1580 status = PyDict_SetItem(a, key, value);
1581 Py_DECREF(key);
1582 Py_DECREF(value);
1583 if (status < 0) {
1584 Py_DECREF(iter);
1585 return -1;
1586 }
1587 }
1588 Py_DECREF(iter);
1589 if (PyErr_Occurred())
1590 /* Iterator completed, via error */
1591 return -1;
1592 }
1593 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001594}
1595
1596static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001597dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001600}
1601
1602PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001603PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001604{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 if (o == NULL || !PyDict_Check(o)) {
1608 PyErr_BadInternalCall();
1609 return NULL;
1610 }
1611 copy = PyDict_New();
1612 if (copy == NULL)
1613 return NULL;
1614 if (PyDict_Merge(copy, o, 1) == 0)
1615 return copy;
1616 Py_DECREF(copy);
1617 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001618}
1619
Martin v. Löwis18e16552006-02-15 17:27:45 +00001620Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001621PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001622{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 if (mp == NULL || !PyDict_Check(mp)) {
1624 PyErr_BadInternalCall();
1625 return -1;
1626 }
1627 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001628}
1629
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001630PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001631PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 if (mp == NULL || !PyDict_Check(mp)) {
1634 PyErr_BadInternalCall();
1635 return NULL;
1636 }
1637 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001638}
1639
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001640PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001641PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 if (mp == NULL || !PyDict_Check(mp)) {
1644 PyErr_BadInternalCall();
1645 return NULL;
1646 }
1647 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001648}
1649
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001650PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001651PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 if (mp == NULL || !PyDict_Check(mp)) {
1654 PyErr_BadInternalCall();
1655 return NULL;
1656 }
1657 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001658}
1659
Tim Peterse63415e2001-05-08 04:38:29 +00001660/* Return 1 if dicts equal, 0 if not, -1 if error.
1661 * Gets out as soon as any difference is detected.
1662 * Uses only Py_EQ comparison.
1663 */
1664static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001665dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 if (a->ma_used != b->ma_used)
1670 /* can't be equal if # of entries differ */
1671 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 /* Same # of entries -- check all of 'em. Exit early on any diff. */
1674 for (i = 0; i <= a->ma_mask; i++) {
1675 PyObject *aval = a->ma_table[i].me_value;
1676 if (aval != NULL) {
1677 int cmp;
1678 PyObject *bval;
1679 PyObject *key = a->ma_table[i].me_key;
1680 /* temporarily bump aval's refcount to ensure it stays
1681 alive until we're done with it */
1682 Py_INCREF(aval);
1683 /* ditto for key */
1684 Py_INCREF(key);
1685 bval = PyDict_GetItemWithError((PyObject *)b, key);
1686 Py_DECREF(key);
1687 if (bval == NULL) {
1688 Py_DECREF(aval);
1689 if (PyErr_Occurred())
1690 return -1;
1691 return 0;
1692 }
1693 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1694 Py_DECREF(aval);
1695 if (cmp <= 0) /* error or not equal */
1696 return cmp;
1697 }
1698 }
1699 return 1;
Tim Peterse63415e2001-05-08 04:38:29 +00001700 }
1701
1702static PyObject *
1703dict_richcompare(PyObject *v, PyObject *w, int op)
1704{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 int cmp;
1706 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00001707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1709 res = Py_NotImplemented;
1710 }
1711 else if (op == Py_EQ || op == Py_NE) {
1712 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
1713 if (cmp < 0)
1714 return NULL;
1715 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1716 }
1717 else
1718 res = Py_NotImplemented;
1719 Py_INCREF(res);
1720 return res;
Tim Peterse63415e2001-05-08 04:38:29 +00001721 }
1722
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001723static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001724dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001725{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001726 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001730 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 hash = PyObject_Hash(key);
1732 if (hash == -1)
1733 return NULL;
1734 }
1735 ep = (mp->ma_lookup)(mp, key, hash);
1736 if (ep == NULL)
1737 return NULL;
1738 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001739}
1740
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001741static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001742dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 PyObject *key;
1745 PyObject *failobj = Py_None;
1746 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001747 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
1751 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001754 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 hash = PyObject_Hash(key);
1756 if (hash == -1)
1757 return NULL;
1758 }
1759 ep = (mp->ma_lookup)(mp, key, hash);
1760 if (ep == NULL)
1761 return NULL;
1762 val = ep->me_value;
1763 if (val == NULL)
1764 val = failobj;
1765 Py_INCREF(val);
1766 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001767}
1768
1769
1770static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001771dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001772{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 PyObject *key;
1774 PyObject *failobj = Py_None;
1775 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001776 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
1780 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001783 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 hash = PyObject_Hash(key);
1785 if (hash == -1)
1786 return NULL;
1787 }
1788 ep = (mp->ma_lookup)(mp, key, hash);
1789 if (ep == NULL)
1790 return NULL;
1791 val = ep->me_value;
1792 if (val == NULL) {
1793 val = failobj;
1794 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1795 val = NULL;
1796 }
1797 Py_XINCREF(val);
1798 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00001799}
1800
1801
1802static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001803dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001804{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 PyDict_Clear((PyObject *)mp);
1806 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001807}
1808
Guido van Rossumba6ab842000-12-12 22:02:18 +00001809static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001810dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001811{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001812 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 PyDictEntry *ep;
1814 PyObject *old_value, *old_key;
1815 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1818 return NULL;
1819 if (mp->ma_used == 0) {
1820 if (deflt) {
1821 Py_INCREF(deflt);
1822 return deflt;
1823 }
Raymond Hettingerdd421542010-10-30 08:10:29 +00001824 set_key_error(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 return NULL;
1826 }
1827 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001828 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 hash = PyObject_Hash(key);
1830 if (hash == -1)
1831 return NULL;
1832 }
1833 ep = (mp->ma_lookup)(mp, key, hash);
1834 if (ep == NULL)
1835 return NULL;
1836 if (ep->me_value == NULL) {
1837 if (deflt) {
1838 Py_INCREF(deflt);
1839 return deflt;
1840 }
1841 set_key_error(key);
1842 return NULL;
1843 }
1844 old_key = ep->me_key;
1845 Py_INCREF(dummy);
1846 ep->me_key = dummy;
1847 old_value = ep->me_value;
1848 ep->me_value = NULL;
1849 mp->ma_used--;
1850 Py_DECREF(old_key);
1851 return old_value;
Guido van Rossume027d982002-04-12 15:11:59 +00001852}
1853
1854static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001855dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001856{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001857 Py_hash_t i = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 PyDictEntry *ep;
1859 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 /* Allocate the result tuple before checking the size. Believe it
1862 * or not, this allocation could trigger a garbage collection which
1863 * could empty the dict, so if we checked the size first and that
1864 * happened, the result would be an infinite loop (searching for an
1865 * entry that no longer exists). Note that the usual popitem()
1866 * idiom is "while d: k, v = d.popitem()". so needing to throw the
1867 * tuple away if the dict *is* empty isn't a significant
1868 * inefficiency -- possible, but unlikely in practice.
1869 */
1870 res = PyTuple_New(2);
1871 if (res == NULL)
1872 return NULL;
1873 if (mp->ma_used == 0) {
1874 Py_DECREF(res);
1875 PyErr_SetString(PyExc_KeyError,
1876 "popitem(): dictionary is empty");
1877 return NULL;
1878 }
1879 /* Set ep to "the first" dict entry with a value. We abuse the hash
1880 * field of slot 0 to hold a search finger:
1881 * If slot 0 has a value, use slot 0.
1882 * Else slot 0 is being used to hold a search finger,
1883 * and we use its hash value as the first index to look.
1884 */
1885 ep = &mp->ma_table[0];
1886 if (ep->me_value == NULL) {
1887 i = ep->me_hash;
1888 /* The hash field may be a real hash value, or it may be a
1889 * legit search finger, or it may be a once-legit search
1890 * finger that's out of bounds now because it wrapped around
1891 * or the table shrunk -- simply make sure it's in bounds now.
1892 */
1893 if (i > mp->ma_mask || i < 1)
1894 i = 1; /* skip slot 0 */
1895 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1896 i++;
1897 if (i > mp->ma_mask)
1898 i = 1;
1899 }
1900 }
1901 PyTuple_SET_ITEM(res, 0, ep->me_key);
1902 PyTuple_SET_ITEM(res, 1, ep->me_value);
1903 Py_INCREF(dummy);
1904 ep->me_key = dummy;
1905 ep->me_value = NULL;
1906 mp->ma_used--;
1907 assert(mp->ma_table[0].me_value == NULL);
1908 mp->ma_table[0].me_hash = i + 1; /* next place to start */
1909 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001910}
1911
Jeremy Hylton8caad492000-06-23 14:18:11 +00001912static int
1913dict_traverse(PyObject *op, visitproc visit, void *arg)
1914{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 Py_ssize_t i = 0;
1916 PyObject *pk;
1917 PyObject *pv;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 while (PyDict_Next(op, &i, &pk, &pv)) {
1920 Py_VISIT(pk);
1921 Py_VISIT(pv);
1922 }
1923 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001924}
1925
1926static int
1927dict_tp_clear(PyObject *op)
1928{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 PyDict_Clear(op);
1930 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001931}
1932
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001933static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001934
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001935static PyObject *
1936dict_sizeof(PyDictObject *mp)
1937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 res = sizeof(PyDictObject);
1941 if (mp->ma_table != mp->ma_smalltable)
1942 res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry);
1943 return PyLong_FromSsize_t(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001944}
1945
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001946PyDoc_STRVAR(contains__doc__,
1947"D.__contains__(k) -> True if D has a key k, else False");
1948
1949PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1950
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001951PyDoc_STRVAR(sizeof__doc__,
1952"D.__sizeof__() -> size of D in memory, in bytes");
1953
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001954PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001955"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001956
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001957PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001958"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 +00001959
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001960PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001961"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001962If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001964PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001965"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000019662-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001967
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001968PyDoc_STRVAR(update__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001969"D.update(E, **F) -> None. Update D from dict/iterable E and F.\n"
1970"If E has a .keys() method, does: for k in E: D[k] = E[k]\n\
1971If E lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
1972In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00001973
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001974PyDoc_STRVAR(fromkeys__doc__,
1975"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1976v defaults to None.");
1977
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001978PyDoc_STRVAR(clear__doc__,
1979"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001980
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001981PyDoc_STRVAR(copy__doc__,
1982"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001983
Guido van Rossumb90c8482007-02-10 01:11:45 +00001984/* Forward */
1985static PyObject *dictkeys_new(PyObject *);
1986static PyObject *dictitems_new(PyObject *);
1987static PyObject *dictvalues_new(PyObject *);
1988
Guido van Rossum45c85d12007-07-27 16:31:40 +00001989PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00001991PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00001993PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00001995
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001996static PyMethodDef mapp_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
1998 contains__doc__},
1999 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2000 getitem__doc__},
2001 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2002 sizeof__doc__},
2003 {"get", (PyCFunction)dict_get, METH_VARARGS,
2004 get__doc__},
2005 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2006 setdefault_doc__},
2007 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2008 pop__doc__},
2009 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2010 popitem__doc__},
2011 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2012 keys__doc__},
2013 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2014 items__doc__},
2015 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2016 values__doc__},
2017 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2018 update__doc__},
2019 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2020 fromkeys__doc__},
2021 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2022 clear__doc__},
2023 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2024 copy__doc__},
2025 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002026};
2027
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002028/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002029int
2030PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002031{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002032 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 PyDictObject *mp = (PyDictObject *)op;
2034 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002037 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 hash = PyObject_Hash(key);
2039 if (hash == -1)
2040 return -1;
2041 }
2042 ep = (mp->ma_lookup)(mp, key, hash);
2043 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002044}
2045
Thomas Wouterscf297e42007-02-23 15:07:44 +00002046/* Internal version of PyDict_Contains used when the hash value is already known */
2047int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002048_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002049{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 PyDictObject *mp = (PyDictObject *)op;
2051 PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 ep = (mp->ma_lookup)(mp, key, hash);
2054 return ep == NULL ? -1 : (ep->me_value != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002055}
2056
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002057/* Hack to implement "key in dict" */
2058static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 0, /* sq_length */
2060 0, /* sq_concat */
2061 0, /* sq_repeat */
2062 0, /* sq_item */
2063 0, /* sq_slice */
2064 0, /* sq_ass_item */
2065 0, /* sq_ass_slice */
2066 PyDict_Contains, /* sq_contains */
2067 0, /* sq_inplace_concat */
2068 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002069};
2070
Guido van Rossum09e563a2001-05-01 12:10:21 +00002071static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002072dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 PyObject *self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 assert(type != NULL && type->tp_alloc != NULL);
2077 self = type->tp_alloc(type, 0);
2078 if (self != NULL) {
2079 PyDictObject *d = (PyDictObject *)self;
2080 /* It's guaranteed that tp->alloc zeroed out the struct. */
2081 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2082 INIT_NONZERO_DICT_SLOTS(d);
2083 d->ma_lookup = lookdict_unicode;
Ezio Melotti13925002011-03-16 11:05:33 +02002084 /* The object has been implicitly tracked by tp_alloc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 if (type == &PyDict_Type)
2086 _PyObject_GC_UNTRACK(d);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002087#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 ++created;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002089#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002090#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 if (_PyObject_GC_IS_TRACKED(d))
2092 count_tracked++;
2093 else
2094 count_untracked++;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002095#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 }
2097 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002098}
2099
Tim Peters25786c02001-09-02 08:22:48 +00002100static int
2101dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002104}
2105
Tim Peters6d6c1a32001-08-02 04:15:00 +00002106static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002107dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002110}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002111
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002112PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002113"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002114"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002115" (key, value) pairs\n"
2116"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002117" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002118" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002119" d[k] = v\n"
2120"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2121" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002122
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002123PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2125 "dict",
2126 sizeof(PyDictObject),
2127 0,
2128 (destructor)dict_dealloc, /* tp_dealloc */
2129 0, /* tp_print */
2130 0, /* tp_getattr */
2131 0, /* tp_setattr */
2132 0, /* tp_reserved */
2133 (reprfunc)dict_repr, /* tp_repr */
2134 0, /* tp_as_number */
2135 &dict_as_sequence, /* tp_as_sequence */
2136 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002137 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 0, /* tp_call */
2139 0, /* tp_str */
2140 PyObject_GenericGetAttr, /* tp_getattro */
2141 0, /* tp_setattro */
2142 0, /* tp_as_buffer */
2143 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2144 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2145 dictionary_doc, /* tp_doc */
2146 dict_traverse, /* tp_traverse */
2147 dict_tp_clear, /* tp_clear */
2148 dict_richcompare, /* tp_richcompare */
2149 0, /* tp_weaklistoffset */
2150 (getiterfunc)dict_iter, /* tp_iter */
2151 0, /* tp_iternext */
2152 mapp_methods, /* tp_methods */
2153 0, /* tp_members */
2154 0, /* tp_getset */
2155 0, /* tp_base */
2156 0, /* tp_dict */
2157 0, /* tp_descr_get */
2158 0, /* tp_descr_set */
2159 0, /* tp_dictoffset */
2160 dict_init, /* tp_init */
2161 PyType_GenericAlloc, /* tp_alloc */
2162 dict_new, /* tp_new */
2163 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002164};
2165
Guido van Rossum3cca2451997-05-16 14:23:33 +00002166/* For backward compatibility with old dictionary interface */
2167
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002168PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002169PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 PyObject *kv, *rv;
2172 kv = PyUnicode_FromString(key);
2173 if (kv == NULL)
2174 return NULL;
2175 rv = PyDict_GetItem(v, kv);
2176 Py_DECREF(kv);
2177 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002178}
2179
2180int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002181PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 PyObject *kv;
2184 int err;
2185 kv = PyUnicode_FromString(key);
2186 if (kv == NULL)
2187 return -1;
2188 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2189 err = PyDict_SetItem(v, kv, item);
2190 Py_DECREF(kv);
2191 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002192}
2193
2194int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002195PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002196{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 PyObject *kv;
2198 int err;
2199 kv = PyUnicode_FromString(key);
2200 if (kv == NULL)
2201 return -1;
2202 err = PyDict_DelItem(v, kv);
2203 Py_DECREF(kv);
2204 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002205}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002206
Raymond Hettinger019a1482004-03-18 02:41:19 +00002207/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002208
2209typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 PyObject_HEAD
2211 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2212 Py_ssize_t di_used;
2213 Py_ssize_t di_pos;
2214 PyObject* di_result; /* reusable result tuple for iteritems */
2215 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002216} dictiterobject;
2217
2218static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002219dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 dictiterobject *di;
2222 di = PyObject_GC_New(dictiterobject, itertype);
2223 if (di == NULL)
2224 return NULL;
2225 Py_INCREF(dict);
2226 di->di_dict = dict;
2227 di->di_used = dict->ma_used;
2228 di->di_pos = 0;
2229 di->len = dict->ma_used;
2230 if (itertype == &PyDictIterItem_Type) {
2231 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2232 if (di->di_result == NULL) {
2233 Py_DECREF(di);
2234 return NULL;
2235 }
2236 }
2237 else
2238 di->di_result = NULL;
2239 _PyObject_GC_TRACK(di);
2240 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002241}
2242
2243static void
2244dictiter_dealloc(dictiterobject *di)
2245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 Py_XDECREF(di->di_dict);
2247 Py_XDECREF(di->di_result);
2248 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002249}
2250
2251static int
2252dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 Py_VISIT(di->di_dict);
2255 Py_VISIT(di->di_result);
2256 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002257}
2258
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002259static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002260dictiter_len(dictiterobject *di)
2261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 Py_ssize_t len = 0;
2263 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2264 len = di->len;
2265 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002266}
2267
Guido van Rossumb90c8482007-02-10 01:11:45 +00002268PyDoc_STRVAR(length_hint_doc,
2269 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002270
2271static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2273 length_hint_doc},
2274 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002275};
2276
Raymond Hettinger019a1482004-03-18 02:41:19 +00002277static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 PyObject *key;
2280 register Py_ssize_t i, mask;
2281 register PyDictEntry *ep;
2282 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002284 if (d == NULL)
2285 return NULL;
2286 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 if (di->di_used != d->ma_used) {
2289 PyErr_SetString(PyExc_RuntimeError,
2290 "dictionary changed size during iteration");
2291 di->di_used = -1; /* Make this state sticky */
2292 return NULL;
2293 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 i = di->di_pos;
2296 if (i < 0)
2297 goto fail;
2298 ep = d->ma_table;
2299 mask = d->ma_mask;
2300 while (i <= mask && ep[i].me_value == NULL)
2301 i++;
2302 di->di_pos = i+1;
2303 if (i > mask)
2304 goto fail;
2305 di->len--;
2306 key = ep[i].me_key;
2307 Py_INCREF(key);
2308 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002309
2310fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002311 Py_DECREF(d);
2312 di->di_dict = NULL;
2313 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002314}
2315
Raymond Hettinger019a1482004-03-18 02:41:19 +00002316PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2318 "dict_keyiterator", /* tp_name */
2319 sizeof(dictiterobject), /* tp_basicsize */
2320 0, /* tp_itemsize */
2321 /* methods */
2322 (destructor)dictiter_dealloc, /* tp_dealloc */
2323 0, /* tp_print */
2324 0, /* tp_getattr */
2325 0, /* tp_setattr */
2326 0, /* tp_reserved */
2327 0, /* tp_repr */
2328 0, /* tp_as_number */
2329 0, /* tp_as_sequence */
2330 0, /* tp_as_mapping */
2331 0, /* tp_hash */
2332 0, /* tp_call */
2333 0, /* tp_str */
2334 PyObject_GenericGetAttr, /* tp_getattro */
2335 0, /* tp_setattro */
2336 0, /* tp_as_buffer */
2337 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2338 0, /* tp_doc */
2339 (traverseproc)dictiter_traverse, /* tp_traverse */
2340 0, /* tp_clear */
2341 0, /* tp_richcompare */
2342 0, /* tp_weaklistoffset */
2343 PyObject_SelfIter, /* tp_iter */
2344 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2345 dictiter_methods, /* tp_methods */
2346 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002347};
2348
2349static PyObject *dictiter_iternextvalue(dictiterobject *di)
2350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 PyObject *value;
2352 register Py_ssize_t i, mask;
2353 register PyDictEntry *ep;
2354 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 if (d == NULL)
2357 return NULL;
2358 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 if (di->di_used != d->ma_used) {
2361 PyErr_SetString(PyExc_RuntimeError,
2362 "dictionary changed size during iteration");
2363 di->di_used = -1; /* Make this state sticky */
2364 return NULL;
2365 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 i = di->di_pos;
2368 mask = d->ma_mask;
2369 if (i < 0 || i > mask)
2370 goto fail;
2371 ep = d->ma_table;
2372 while ((value=ep[i].me_value) == NULL) {
2373 i++;
2374 if (i > mask)
2375 goto fail;
2376 }
2377 di->di_pos = i+1;
2378 di->len--;
2379 Py_INCREF(value);
2380 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002381
2382fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 Py_DECREF(d);
2384 di->di_dict = NULL;
2385 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002386}
2387
2388PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2390 "dict_valueiterator", /* tp_name */
2391 sizeof(dictiterobject), /* tp_basicsize */
2392 0, /* tp_itemsize */
2393 /* methods */
2394 (destructor)dictiter_dealloc, /* tp_dealloc */
2395 0, /* tp_print */
2396 0, /* tp_getattr */
2397 0, /* tp_setattr */
2398 0, /* tp_reserved */
2399 0, /* tp_repr */
2400 0, /* tp_as_number */
2401 0, /* tp_as_sequence */
2402 0, /* tp_as_mapping */
2403 0, /* tp_hash */
2404 0, /* tp_call */
2405 0, /* tp_str */
2406 PyObject_GenericGetAttr, /* tp_getattro */
2407 0, /* tp_setattro */
2408 0, /* tp_as_buffer */
2409 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2410 0, /* tp_doc */
2411 (traverseproc)dictiter_traverse, /* tp_traverse */
2412 0, /* tp_clear */
2413 0, /* tp_richcompare */
2414 0, /* tp_weaklistoffset */
2415 PyObject_SelfIter, /* tp_iter */
2416 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2417 dictiter_methods, /* tp_methods */
2418 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002419};
2420
2421static PyObject *dictiter_iternextitem(dictiterobject *di)
2422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 PyObject *key, *value, *result = di->di_result;
2424 register Py_ssize_t i, mask;
2425 register PyDictEntry *ep;
2426 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 if (d == NULL)
2429 return NULL;
2430 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 if (di->di_used != d->ma_used) {
2433 PyErr_SetString(PyExc_RuntimeError,
2434 "dictionary changed size during iteration");
2435 di->di_used = -1; /* Make this state sticky */
2436 return NULL;
2437 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 i = di->di_pos;
2440 if (i < 0)
2441 goto fail;
2442 ep = d->ma_table;
2443 mask = d->ma_mask;
2444 while (i <= mask && ep[i].me_value == NULL)
2445 i++;
2446 di->di_pos = i+1;
2447 if (i > mask)
2448 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 if (result->ob_refcnt == 1) {
2451 Py_INCREF(result);
2452 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2453 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2454 } else {
2455 result = PyTuple_New(2);
2456 if (result == NULL)
2457 return NULL;
2458 }
2459 di->len--;
2460 key = ep[i].me_key;
2461 value = ep[i].me_value;
2462 Py_INCREF(key);
2463 Py_INCREF(value);
2464 PyTuple_SET_ITEM(result, 0, key);
2465 PyTuple_SET_ITEM(result, 1, value);
2466 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002467
2468fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 Py_DECREF(d);
2470 di->di_dict = NULL;
2471 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002472}
2473
2474PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2476 "dict_itemiterator", /* tp_name */
2477 sizeof(dictiterobject), /* tp_basicsize */
2478 0, /* tp_itemsize */
2479 /* methods */
2480 (destructor)dictiter_dealloc, /* tp_dealloc */
2481 0, /* tp_print */
2482 0, /* tp_getattr */
2483 0, /* tp_setattr */
2484 0, /* tp_reserved */
2485 0, /* tp_repr */
2486 0, /* tp_as_number */
2487 0, /* tp_as_sequence */
2488 0, /* tp_as_mapping */
2489 0, /* tp_hash */
2490 0, /* tp_call */
2491 0, /* tp_str */
2492 PyObject_GenericGetAttr, /* tp_getattro */
2493 0, /* tp_setattro */
2494 0, /* tp_as_buffer */
2495 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2496 0, /* tp_doc */
2497 (traverseproc)dictiter_traverse, /* tp_traverse */
2498 0, /* tp_clear */
2499 0, /* tp_richcompare */
2500 0, /* tp_weaklistoffset */
2501 PyObject_SelfIter, /* tp_iter */
2502 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
2503 dictiter_methods, /* tp_methods */
2504 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002505};
Guido van Rossumb90c8482007-02-10 01:11:45 +00002506
2507
Guido van Rossum3ac67412007-02-10 18:55:06 +00002508/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002509/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002510/***********************************************/
2511
Guido van Rossumb90c8482007-02-10 01:11:45 +00002512/* The instance lay-out is the same for all three; but the type differs. */
2513
2514typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 PyObject_HEAD
2516 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002517} dictviewobject;
2518
2519
2520static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00002521dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002522{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 Py_XDECREF(dv->dv_dict);
2524 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002525}
2526
2527static int
2528dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
2529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 Py_VISIT(dv->dv_dict);
2531 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002532}
2533
Guido van Rossum83825ac2007-02-10 04:54:19 +00002534static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00002535dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 Py_ssize_t len = 0;
2538 if (dv->dv_dict != NULL)
2539 len = dv->dv_dict->ma_used;
2540 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002541}
2542
2543static PyObject *
2544dictview_new(PyObject *dict, PyTypeObject *type)
2545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 dictviewobject *dv;
2547 if (dict == NULL) {
2548 PyErr_BadInternalCall();
2549 return NULL;
2550 }
2551 if (!PyDict_Check(dict)) {
2552 /* XXX Get rid of this restriction later */
2553 PyErr_Format(PyExc_TypeError,
2554 "%s() requires a dict argument, not '%s'",
2555 type->tp_name, dict->ob_type->tp_name);
2556 return NULL;
2557 }
2558 dv = PyObject_GC_New(dictviewobject, type);
2559 if (dv == NULL)
2560 return NULL;
2561 Py_INCREF(dict);
2562 dv->dv_dict = (PyDictObject *)dict;
2563 _PyObject_GC_TRACK(dv);
2564 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002565}
2566
Neal Norwitze36f2ba2007-02-26 23:12:28 +00002567/* TODO(guido): The views objects are not complete:
2568
2569 * support more set operations
2570 * support arbitrary mappings?
2571 - either these should be static or exported in dictobject.h
2572 - if public then they should probably be in builtins
2573*/
2574
Guido van Rossumaac530c2007-08-24 22:33:45 +00002575/* Return 1 if self is a subset of other, iterating over self;
2576 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002577static int
2578all_contained_in(PyObject *self, PyObject *other)
2579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002580 PyObject *iter = PyObject_GetIter(self);
2581 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 if (iter == NULL)
2584 return -1;
2585 for (;;) {
2586 PyObject *next = PyIter_Next(iter);
2587 if (next == NULL) {
2588 if (PyErr_Occurred())
2589 ok = -1;
2590 break;
2591 }
2592 ok = PySequence_Contains(other, next);
2593 Py_DECREF(next);
2594 if (ok <= 0)
2595 break;
2596 }
2597 Py_DECREF(iter);
2598 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002599}
2600
2601static PyObject *
2602dictview_richcompare(PyObject *self, PyObject *other, int op)
2603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 Py_ssize_t len_self, len_other;
2605 int ok;
2606 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002608 assert(self != NULL);
2609 assert(PyDictViewSet_Check(self));
2610 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00002611
Brian Curtindfc80e32011-08-10 20:28:54 -05002612 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
2613 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 len_self = PyObject_Size(self);
2616 if (len_self < 0)
2617 return NULL;
2618 len_other = PyObject_Size(other);
2619 if (len_other < 0)
2620 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 ok = 0;
2623 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00002624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 case Py_NE:
2626 case Py_EQ:
2627 if (len_self == len_other)
2628 ok = all_contained_in(self, other);
2629 if (op == Py_NE && ok >= 0)
2630 ok = !ok;
2631 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 case Py_LT:
2634 if (len_self < len_other)
2635 ok = all_contained_in(self, other);
2636 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 case Py_LE:
2639 if (len_self <= len_other)
2640 ok = all_contained_in(self, other);
2641 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 case Py_GT:
2644 if (len_self > len_other)
2645 ok = all_contained_in(other, self);
2646 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 case Py_GE:
2649 if (len_self >= len_other)
2650 ok = all_contained_in(other, self);
2651 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 }
2654 if (ok < 0)
2655 return NULL;
2656 result = ok ? Py_True : Py_False;
2657 Py_INCREF(result);
2658 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002659}
2660
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002661static PyObject *
2662dictview_repr(dictviewobject *dv)
2663{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 PyObject *seq;
2665 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 seq = PySequence_List((PyObject *)dv);
2668 if (seq == NULL)
2669 return NULL;
2670
2671 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
2672 Py_DECREF(seq);
2673 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002674}
2675
Guido van Rossum3ac67412007-02-10 18:55:06 +00002676/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002677
2678static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002679dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 if (dv->dv_dict == NULL) {
2682 Py_RETURN_NONE;
2683 }
2684 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002685}
2686
2687static int
2688dictkeys_contains(dictviewobject *dv, PyObject *obj)
2689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 if (dv->dv_dict == NULL)
2691 return 0;
2692 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002693}
2694
Guido van Rossum83825ac2007-02-10 04:54:19 +00002695static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 (lenfunc)dictview_len, /* sq_length */
2697 0, /* sq_concat */
2698 0, /* sq_repeat */
2699 0, /* sq_item */
2700 0, /* sq_slice */
2701 0, /* sq_ass_item */
2702 0, /* sq_ass_slice */
2703 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002704};
2705
Guido van Rossum523259b2007-08-24 23:41:22 +00002706static PyObject*
2707dictviews_sub(PyObject* self, PyObject *other)
2708{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 PyObject *result = PySet_New(self);
2710 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002711 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 if (result == NULL)
2714 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002715
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002716 tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717 if (tmp == NULL) {
2718 Py_DECREF(result);
2719 return NULL;
2720 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 Py_DECREF(tmp);
2723 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002724}
2725
2726static PyObject*
2727dictviews_and(PyObject* self, PyObject *other)
2728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 PyObject *result = PySet_New(self);
2730 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002731 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 if (result == NULL)
2734 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002735
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002736 tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 if (tmp == NULL) {
2738 Py_DECREF(result);
2739 return NULL;
2740 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 Py_DECREF(tmp);
2743 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002744}
2745
2746static PyObject*
2747dictviews_or(PyObject* self, PyObject *other)
2748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 PyObject *result = PySet_New(self);
2750 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002751 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02002752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 if (result == NULL)
2754 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002755
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02002756 tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 if (tmp == NULL) {
2758 Py_DECREF(result);
2759 return NULL;
2760 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 Py_DECREF(tmp);
2763 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002764}
2765
2766static PyObject*
2767dictviews_xor(PyObject* self, PyObject *other)
2768{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 PyObject *result = PySet_New(self);
2770 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002771 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 if (result == NULL)
2774 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002775
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002776 tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 other);
2778 if (tmp == NULL) {
2779 Py_DECREF(result);
2780 return NULL;
2781 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 Py_DECREF(tmp);
2784 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002785}
2786
2787static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 0, /*nb_add*/
2789 (binaryfunc)dictviews_sub, /*nb_subtract*/
2790 0, /*nb_multiply*/
2791 0, /*nb_remainder*/
2792 0, /*nb_divmod*/
2793 0, /*nb_power*/
2794 0, /*nb_negative*/
2795 0, /*nb_positive*/
2796 0, /*nb_absolute*/
2797 0, /*nb_bool*/
2798 0, /*nb_invert*/
2799 0, /*nb_lshift*/
2800 0, /*nb_rshift*/
2801 (binaryfunc)dictviews_and, /*nb_and*/
2802 (binaryfunc)dictviews_xor, /*nb_xor*/
2803 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00002804};
2805
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00002806static PyObject*
2807dictviews_isdisjoint(PyObject *self, PyObject *other)
2808{
2809 PyObject *it;
2810 PyObject *item = NULL;
2811
2812 if (self == other) {
2813 if (dictview_len((dictviewobject *)self) == 0)
2814 Py_RETURN_TRUE;
2815 else
2816 Py_RETURN_FALSE;
2817 }
2818
2819 /* Iterate over the shorter object (only if other is a set,
2820 * because PySequence_Contains may be expensive otherwise): */
2821 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
2822 Py_ssize_t len_self = dictview_len((dictviewobject *)self);
2823 Py_ssize_t len_other = PyObject_Size(other);
2824 if (len_other == -1)
2825 return NULL;
2826
2827 if ((len_other > len_self)) {
2828 PyObject *tmp = other;
2829 other = self;
2830 self = tmp;
2831 }
2832 }
2833
2834 it = PyObject_GetIter(other);
2835 if (it == NULL)
2836 return NULL;
2837
2838 while ((item = PyIter_Next(it)) != NULL) {
2839 int contains = PySequence_Contains(self, item);
2840 Py_DECREF(item);
2841 if (contains == -1) {
2842 Py_DECREF(it);
2843 return NULL;
2844 }
2845
2846 if (contains) {
2847 Py_DECREF(it);
2848 Py_RETURN_FALSE;
2849 }
2850 }
2851 Py_DECREF(it);
2852 if (PyErr_Occurred())
2853 return NULL; /* PyIter_Next raised an exception. */
2854 Py_RETURN_TRUE;
2855}
2856
2857PyDoc_STRVAR(isdisjoint_doc,
2858"Return True if the view and the given iterable have a null intersection.");
2859
Guido van Rossumb90c8482007-02-10 01:11:45 +00002860static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00002861 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
2862 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002863 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002864};
2865
2866PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2868 "dict_keys", /* tp_name */
2869 sizeof(dictviewobject), /* tp_basicsize */
2870 0, /* tp_itemsize */
2871 /* methods */
2872 (destructor)dictview_dealloc, /* tp_dealloc */
2873 0, /* tp_print */
2874 0, /* tp_getattr */
2875 0, /* tp_setattr */
2876 0, /* tp_reserved */
2877 (reprfunc)dictview_repr, /* tp_repr */
2878 &dictviews_as_number, /* tp_as_number */
2879 &dictkeys_as_sequence, /* tp_as_sequence */
2880 0, /* tp_as_mapping */
2881 0, /* tp_hash */
2882 0, /* tp_call */
2883 0, /* tp_str */
2884 PyObject_GenericGetAttr, /* tp_getattro */
2885 0, /* tp_setattro */
2886 0, /* tp_as_buffer */
2887 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2888 0, /* tp_doc */
2889 (traverseproc)dictview_traverse, /* tp_traverse */
2890 0, /* tp_clear */
2891 dictview_richcompare, /* tp_richcompare */
2892 0, /* tp_weaklistoffset */
2893 (getiterfunc)dictkeys_iter, /* tp_iter */
2894 0, /* tp_iternext */
2895 dictkeys_methods, /* tp_methods */
2896 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00002897};
2898
2899static PyObject *
2900dictkeys_new(PyObject *dict)
2901{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 return dictview_new(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002903}
2904
Guido van Rossum3ac67412007-02-10 18:55:06 +00002905/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002906
2907static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002908dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 if (dv->dv_dict == NULL) {
2911 Py_RETURN_NONE;
2912 }
2913 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002914}
2915
2916static int
2917dictitems_contains(dictviewobject *dv, PyObject *obj)
2918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 PyObject *key, *value, *found;
2920 if (dv->dv_dict == NULL)
2921 return 0;
2922 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
2923 return 0;
2924 key = PyTuple_GET_ITEM(obj, 0);
2925 value = PyTuple_GET_ITEM(obj, 1);
2926 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
2927 if (found == NULL) {
2928 if (PyErr_Occurred())
2929 return -1;
2930 return 0;
2931 }
2932 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002933}
2934
Guido van Rossum83825ac2007-02-10 04:54:19 +00002935static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002936 (lenfunc)dictview_len, /* sq_length */
2937 0, /* sq_concat */
2938 0, /* sq_repeat */
2939 0, /* sq_item */
2940 0, /* sq_slice */
2941 0, /* sq_ass_item */
2942 0, /* sq_ass_slice */
2943 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002944};
2945
Guido van Rossumb90c8482007-02-10 01:11:45 +00002946static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00002947 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
2948 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002950};
2951
2952PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2954 "dict_items", /* tp_name */
2955 sizeof(dictviewobject), /* tp_basicsize */
2956 0, /* tp_itemsize */
2957 /* methods */
2958 (destructor)dictview_dealloc, /* tp_dealloc */
2959 0, /* tp_print */
2960 0, /* tp_getattr */
2961 0, /* tp_setattr */
2962 0, /* tp_reserved */
2963 (reprfunc)dictview_repr, /* tp_repr */
2964 &dictviews_as_number, /* tp_as_number */
2965 &dictitems_as_sequence, /* tp_as_sequence */
2966 0, /* tp_as_mapping */
2967 0, /* tp_hash */
2968 0, /* tp_call */
2969 0, /* tp_str */
2970 PyObject_GenericGetAttr, /* tp_getattro */
2971 0, /* tp_setattro */
2972 0, /* tp_as_buffer */
2973 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2974 0, /* tp_doc */
2975 (traverseproc)dictview_traverse, /* tp_traverse */
2976 0, /* tp_clear */
2977 dictview_richcompare, /* tp_richcompare */
2978 0, /* tp_weaklistoffset */
2979 (getiterfunc)dictitems_iter, /* tp_iter */
2980 0, /* tp_iternext */
2981 dictitems_methods, /* tp_methods */
2982 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00002983};
2984
2985static PyObject *
2986dictitems_new(PyObject *dict)
2987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 return dictview_new(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002989}
2990
Guido van Rossum3ac67412007-02-10 18:55:06 +00002991/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002992
2993static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002994dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 if (dv->dv_dict == NULL) {
2997 Py_RETURN_NONE;
2998 }
2999 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003000}
3001
Guido van Rossum83825ac2007-02-10 04:54:19 +00003002static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003003 (lenfunc)dictview_len, /* sq_length */
3004 0, /* sq_concat */
3005 0, /* sq_repeat */
3006 0, /* sq_item */
3007 0, /* sq_slice */
3008 0, /* sq_ass_item */
3009 0, /* sq_ass_slice */
3010 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003011};
3012
Guido van Rossumb90c8482007-02-10 01:11:45 +00003013static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003015};
3016
3017PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3019 "dict_values", /* tp_name */
3020 sizeof(dictviewobject), /* tp_basicsize */
3021 0, /* tp_itemsize */
3022 /* methods */
3023 (destructor)dictview_dealloc, /* tp_dealloc */
3024 0, /* tp_print */
3025 0, /* tp_getattr */
3026 0, /* tp_setattr */
3027 0, /* tp_reserved */
3028 (reprfunc)dictview_repr, /* tp_repr */
3029 0, /* tp_as_number */
3030 &dictvalues_as_sequence, /* tp_as_sequence */
3031 0, /* tp_as_mapping */
3032 0, /* tp_hash */
3033 0, /* tp_call */
3034 0, /* tp_str */
3035 PyObject_GenericGetAttr, /* tp_getattro */
3036 0, /* tp_setattro */
3037 0, /* tp_as_buffer */
3038 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3039 0, /* tp_doc */
3040 (traverseproc)dictview_traverse, /* tp_traverse */
3041 0, /* tp_clear */
3042 0, /* tp_richcompare */
3043 0, /* tp_weaklistoffset */
3044 (getiterfunc)dictvalues_iter, /* tp_iter */
3045 0, /* tp_iternext */
3046 dictvalues_methods, /* tp_methods */
3047 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003048};
3049
3050static PyObject *
3051dictvalues_new(PyObject *dict)
3052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003053 return dictview_new(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003054}