blob: 910b48fa8e57f8b4daa756a354ec1f300971eb04 [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
Benjamin Peterson7d95e402012-04-23 11:24:50 -040010
11/*
12There are four kinds of slots in the table:
13
141. Unused. me_key == me_value == NULL
15 Does not hold an active (key, value) pair now and never did. Unused can
16 transition to Active upon key insertion. This is the only case in which
17 me_key is NULL, and is each slot's initial state.
18
192. Active. me_key != NULL and me_key != dummy and me_value != NULL
20 Holds an active (key, value) pair. Active can transition to Dummy or
21 Pending upon key deletion (for combined and split tables respectively).
22 This is the only case in which me_value != NULL.
23
243. Dummy. me_key == dummy and me_value == NULL
25 Previously held an active (key, value) pair, but that was deleted and an
26 active pair has not yet overwritten the slot. Dummy can transition to
27 Active upon key insertion. Dummy slots cannot be made Unused again
28 (cannot have me_key set to NULL), else the probe sequence in case of
29 collision would have no way to know they were once active.
30
314. Pending. Not yet inserted or deleted from a split-table.
32 key != NULL, key != dummy and value == NULL
33
34The DictObject can be in one of two forms.
35Either:
36 A combined table:
37 ma_values == NULL, dk_refcnt == 1.
38 Values are stored in the me_value field of the PyDictKeysObject.
39 Slot kind 4 is not allowed i.e.
40 key != NULL, key != dummy and value == NULL is illegal.
41Or:
42 A split table:
43 ma_values != NULL, dk_refcnt >= 1
44 Values are stored in the ma_values array.
45 Only string (unicode) keys are allowed, no <dummy> keys are present.
46
47Note: .popitem() abuses the me_hash field of an Unused or Dummy slot to
48hold a search finger. The me_hash field of Unused or Dummy slots has no
49meaning otherwise. As a consequence of this popitem always converts the dict
50to the combined-table form.
51*/
52
53/* PyDict_MINSIZE_SPLIT is the minimum size of a split dictionary.
54 * It must be a power of 2, and at least 4.
55 * Resizing of split dictionaries is very rare, so the saving memory is more
56 * important than the cost of resizing.
57 */
58#define PyDict_MINSIZE_SPLIT 4
59
60/* PyDict_MINSIZE_COMBINED is the starting size for any new, non-split dict.
61 * 8 allows dicts with no more than 5 active entries; experiments suggested
62 * this suffices for the majority of dicts (consisting mostly of usually-small
63 * dicts created to pass keyword arguments).
64 * Making this 8, rather than 4 reduces the number of resizes for most
65 * dictionaries, without any significant extra memory use.
66 */
67#define PyDict_MINSIZE_COMBINED 8
68
Guido van Rossumc0b618a1997-05-02 03:12:38 +000069#include "Python.h"
Christian Heimes0ded5b52007-12-10 15:50:56 +000070#include "stringlib/eq.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000071
Larry Hastings61272b72014-01-07 12:41:53 -080072/*[clinic input]
Larry Hastings44e2eaa2013-11-23 15:37:55 -080073class dict
Larry Hastings61272b72014-01-07 12:41:53 -080074[clinic start generated code]*/
75/*[clinic end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -080076
Benjamin Peterson7d95e402012-04-23 11:24:50 -040077typedef struct {
78 /* Cached hash code of me_key. */
79 Py_hash_t me_hash;
80 PyObject *me_key;
81 PyObject *me_value; /* This field is only meaningful for combined tables */
82} PyDictKeyEntry;
83
84typedef PyDictKeyEntry *(*dict_lookup_func)
85(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject ***value_addr);
86
87struct _dictkeysobject {
88 Py_ssize_t dk_refcnt;
89 Py_ssize_t dk_size;
90 dict_lookup_func dk_lookup;
91 Py_ssize_t dk_usable;
92 PyDictKeyEntry dk_entries[1];
93};
94
95
96/*
97To ensure the lookup algorithm terminates, there must be at least one Unused
98slot (NULL key) in the table.
99To avoid slowing down lookups on a near-full table, we resize the table when
100it's USABLE_FRACTION (currently two-thirds) full.
101*/
Guido van Rossum16e93a81997-01-28 00:00:11 +0000102
Tim Peterseb28ef22001-06-02 05:27:19 +0000103#define PERTURB_SHIFT 5
104
Guido van Rossum16e93a81997-01-28 00:00:11 +0000105/*
Tim Peterseb28ef22001-06-02 05:27:19 +0000106Major subtleties ahead: Most hash schemes depend on having a "good" hash
107function, in the sense of simulating randomness. Python doesn't: its most
108important hash functions (for strings and ints) are very regular in common
109cases:
Tim Peters15d49292001-05-27 07:39:22 +0000110
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000111 >>> map(hash, (0, 1, 2, 3))
112 [0, 1, 2, 3]
113 >>> map(hash, ("namea", "nameb", "namec", "named"))
114 [-1658398457, -1658398460, -1658398459, -1658398462]
115 >>>
Tim Peters15d49292001-05-27 07:39:22 +0000116
Tim Peterseb28ef22001-06-02 05:27:19 +0000117This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
118the low-order i bits as the initial table index is extremely fast, and there
119are no collisions at all for dicts indexed by a contiguous range of ints.
120The same is approximately true when keys are "consecutive" strings. So this
121gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +0000122
Tim Peterseb28ef22001-06-02 05:27:19 +0000123OTOH, when collisions occur, the tendency to fill contiguous slices of the
124hash table makes a good collision resolution strategy crucial. Taking only
125the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000127their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
128 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +0000129
Tim Peterseb28ef22001-06-02 05:27:19 +0000130But catering to unusual cases should not slow the usual ones, so we just take
131the last i bits anyway. It's up to collision resolution to do the rest. If
132we *usually* find the key we're looking for on the first try (and, it turns
133out, we usually do -- the table load factor is kept under 2/3, so the odds
134are solidly in our favor), then it makes best sense to keep the initial index
135computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +0000136
Tim Peterseb28ef22001-06-02 05:27:19 +0000137The first half of collision resolution is to visit table indices via this
138recurrence:
Tim Peters15d49292001-05-27 07:39:22 +0000139
Tim Peterseb28ef22001-06-02 05:27:19 +0000140 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +0000141
Tim Peterseb28ef22001-06-02 05:27:19 +0000142For any initial j in range(2**i), repeating that 2**i times generates each
143int in range(2**i) exactly once (see any text on random-number generation for
144proof). By itself, this doesn't help much: like linear probing (setting
145j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
146order. This would be bad, except that's not the only thing we do, and it's
147actually *good* in the common cases where hash keys are consecutive. In an
148example that's really too small to make this entirely clear, for a table of
149size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +0000150
Tim Peterseb28ef22001-06-02 05:27:19 +0000151 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
152
153If two things come in at index 5, the first place we look after is index 2,
154not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
155Linear probing is deadly in this case because there the fixed probe order
156is the *same* as the order consecutive keys are likely to arrive. But it's
157extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
158and certain that consecutive hash codes do not.
159
160The other half of the strategy is to get the other bits of the hash code
161into play. This is done by initializing a (unsigned) vrbl "perturb" to the
162full hash code, and changing the recurrence to:
163
164 j = (5*j) + 1 + perturb;
165 perturb >>= PERTURB_SHIFT;
166 use j % 2**i as the next table index;
167
168Now the probe sequence depends (eventually) on every bit in the hash code,
169and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
170because it quickly magnifies small differences in the bits that didn't affect
171the initial index. Note that because perturb is unsigned, if the recurrence
172is executed often enough perturb eventually becomes and remains 0. At that
173point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
174that's certain to find an empty slot eventually (since it generates every int
175in range(2**i), and we make sure there's always at least one empty slot).
176
177Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
178small so that the high bits of the hash code continue to affect the probe
179sequence across iterations; but you want it large so that in really bad cases
180the high-order hash bits have an effect on early iterations. 5 was "the
181best" in minimizing total collisions across experiments Tim Peters ran (on
182both normal and pathological cases), but 4 and 6 weren't significantly worse.
183
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000184Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000185approach, using repeated multiplication by x in GF(2**n) where an irreducible
186polynomial for each table size was chosen such that x was a primitive root.
187Christian Tismer later extended that to use division by x instead, as an
188efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000189also gave excellent collision statistics, but was more expensive: two
190if-tests were required inside the loop; computing "the next" index took about
191the same number of operations but without as much potential parallelism
192(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
193above, and then shifting perturb can be done while the table index is being
194masked); and the PyDictObject struct required a member to hold the table's
195polynomial. In Tim's experiments the current scheme ran faster, produced
196equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000197
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000198*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000199
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400200/* Object used as dummy key to fill deleted entries
201 * This could be any unique object,
202 * use a custom type in order to minimise coupling.
203*/
204static PyObject _dummy_struct;
205
206#define dummy (&_dummy_struct)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000207
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000208#ifdef Py_REF_DEBUG
209PyObject *
210_PyDict_Dummy(void)
211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 return dummy;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000213}
214#endif
215
Fred Drake1bff34a2000-08-31 19:31:38 +0000216/* forward declarations */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400217static PyDictKeyEntry *lookdict(PyDictObject *mp, PyObject *key,
218 Py_hash_t hash, PyObject ***value_addr);
219static PyDictKeyEntry *lookdict_unicode(PyDictObject *mp, PyObject *key,
220 Py_hash_t hash, PyObject ***value_addr);
221static PyDictKeyEntry *
222lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
223 Py_hash_t hash, PyObject ***value_addr);
224static PyDictKeyEntry *lookdict_split(PyDictObject *mp, PyObject *key,
225 Py_hash_t hash, PyObject ***value_addr);
Fred Drake1bff34a2000-08-31 19:31:38 +0000226
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400227static int dictresize(PyDictObject *mp, Py_ssize_t minused);
Tim Petersdea48ec2001-05-22 20:40:22 +0000228
Raymond Hettinger43442782004-03-17 21:55:03 +0000229/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes2202f872008-02-06 14:31:34 +0000230#ifndef PyDict_MAXFREELIST
231#define PyDict_MAXFREELIST 80
232#endif
233static PyDictObject *free_list[PyDict_MAXFREELIST];
234static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000235
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100236int
237PyDict_ClearFreeList(void)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 PyDictObject *op;
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100240 int ret = numfree;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 while (numfree) {
242 op = free_list[--numfree];
243 assert(PyDict_CheckExact(op));
244 PyObject_GC_Del(op);
245 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100246 return ret;
247}
248
David Malcolm49526f42012-06-22 14:55:41 -0400249/* Print summary info about the state of the optimized allocator */
250void
251_PyDict_DebugMallocStats(FILE *out)
252{
253 _PyDebugAllocatorStats(out,
254 "free PyDictObject", numfree, sizeof(PyDictObject));
255}
256
257
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100258void
259PyDict_Fini(void)
260{
261 PyDict_ClearFreeList();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000262}
263
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200264#define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
265#define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
266
267#define DK_INCREF(dk) (DK_DEBUG_INCREF ++(dk)->dk_refcnt)
268#define DK_DECREF(dk) if (DK_DEBUG_DECREF (--(dk)->dk_refcnt) == 0) free_keys_object(dk)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400269#define DK_SIZE(dk) ((dk)->dk_size)
270#define DK_MASK(dk) (((dk)->dk_size)-1)
271#define IS_POWER_OF_2(x) (((x) & (x-1)) == 0)
272
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200273/* USABLE_FRACTION is the maximum dictionary load.
274 * Currently set to (2n+1)/3. Increasing this ratio makes dictionaries more
275 * dense resulting in more collisions. Decreasing it improves sparseness
276 * at the expense of spreading entries over more cache lines and at the
277 * cost of total memory consumed.
278 *
279 * USABLE_FRACTION must obey the following:
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400280 * (0 < USABLE_FRACTION(n) < n) for all n >= 2
281 *
282 * USABLE_FRACTION should be very quick to calculate.
283 * Fractions around 5/8 to 2/3 seem to work well in practice.
284 */
285
286/* Use (2n+1)/3 rather than 2n+3 because: it makes no difference for
287 * combined tables (the two fractions round to the same number n < ),
288 * but 2*4/3 is 2 whereas (2*4+1)/3 is 3 which potentially saves quite
289 * a lot of space for small, split tables */
290#define USABLE_FRACTION(n) ((((n) << 1)+1)/3)
291
292/* Alternative fraction that is otherwise close enough to (2n+1)/3 to make
293 * little difference. 8 * 2/3 == 8 * 5/8 == 5. 16 * 2/3 == 16 * 5/8 == 10.
294 * 32 * 2/3 = 21, 32 * 5/8 = 20.
295 * Its advantage is that it is faster to compute on machines with slow division.
296 * #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
297*/
298
Victor Stinnera9f61a52013-07-16 22:17:26 +0200299/* GROWTH_RATE. Growth rate upon hitting maximum load.
300 * Currently set to used*2 + capacity/2.
301 * This means that dicts double in size when growing without deletions,
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700302 * but have more head room when the number of deletions is on a par with the
303 * number of insertions.
304 * Raising this to used*4 doubles memory consumption depending on the size of
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200305 * the dictionary, but results in half the number of resizes, less effort to
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700306 * resize.
307 * GROWTH_RATE was set to used*4 up to version 3.2.
308 * GROWTH_RATE was set to used*2 in version 3.3.0
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200309 */
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700310#define GROWTH_RATE(d) (((d)->ma_used*2)+((d)->ma_keys->dk_size>>1))
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400311
312#define ENSURE_ALLOWS_DELETIONS(d) \
313 if ((d)->ma_keys->dk_lookup == lookdict_unicode_nodummy) { \
314 (d)->ma_keys->dk_lookup = lookdict_unicode; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400316
317/* This immutable, empty PyDictKeysObject is used for PyDict_Clear()
318 * (which cannot fail and thus can do no allocation).
319 */
320static PyDictKeysObject empty_keys_struct = {
321 2, /* dk_refcnt 1 for this struct, 1 for dummy_struct */
322 1, /* dk_size */
323 lookdict_split, /* dk_lookup */
324 0, /* dk_usable (immutable) */
325 {
326 { 0, 0, 0 } /* dk_entries (empty) */
327 }
328};
329
330static PyObject *empty_values[1] = { NULL };
331
332#define Py_EMPTY_KEYS &empty_keys_struct
333
334static PyDictKeysObject *new_keys_object(Py_ssize_t size)
335{
336 PyDictKeysObject *dk;
337 Py_ssize_t i;
338 PyDictKeyEntry *ep0;
339
340 assert(size >= PyDict_MINSIZE_SPLIT);
341 assert(IS_POWER_OF_2(size));
342 dk = PyMem_MALLOC(sizeof(PyDictKeysObject) +
343 sizeof(PyDictKeyEntry) * (size-1));
344 if (dk == NULL) {
345 PyErr_NoMemory();
346 return NULL;
347 }
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200348 DK_DEBUG_INCREF dk->dk_refcnt = 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400349 dk->dk_size = size;
350 dk->dk_usable = USABLE_FRACTION(size);
351 ep0 = &dk->dk_entries[0];
352 /* Hash value of slot 0 is used by popitem, so it must be initialized */
353 ep0->me_hash = 0;
354 for (i = 0; i < size; i++) {
355 ep0[i].me_key = NULL;
356 ep0[i].me_value = NULL;
357 }
358 dk->dk_lookup = lookdict_unicode_nodummy;
359 return dk;
360}
361
362static void
363free_keys_object(PyDictKeysObject *keys)
364{
365 PyDictKeyEntry *entries = &keys->dk_entries[0];
366 Py_ssize_t i, n;
367 for (i = 0, n = DK_SIZE(keys); i < n; i++) {
368 Py_XDECREF(entries[i].me_key);
369 Py_XDECREF(entries[i].me_value);
370 }
371 PyMem_FREE(keys);
372}
373
374#define new_values(size) PyMem_NEW(PyObject *, size)
375
376#define free_values(values) PyMem_FREE(values)
377
378/* Consumes a reference to the keys object */
379static PyObject *
380new_dict(PyDictKeysObject *keys, PyObject **values)
381{
382 PyDictObject *mp;
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200383 assert(keys != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 if (numfree) {
385 mp = free_list[--numfree];
386 assert (mp != NULL);
387 assert (Py_TYPE(mp) == &PyDict_Type);
388 _Py_NewReference((PyObject *)mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400390 else {
391 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
392 if (mp == NULL) {
393 DK_DECREF(keys);
394 free_values(values);
395 return NULL;
396 }
397 }
398 mp->ma_keys = keys;
399 mp->ma_values = values;
400 mp->ma_used = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000402}
403
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400404/* Consumes a reference to the keys object */
405static PyObject *
406new_dict_with_shared_keys(PyDictKeysObject *keys)
407{
408 PyObject **values;
409 Py_ssize_t i, size;
410
411 size = DK_SIZE(keys);
412 values = new_values(size);
413 if (values == NULL) {
414 DK_DECREF(keys);
415 return PyErr_NoMemory();
416 }
417 for (i = 0; i < size; i++) {
418 values[i] = NULL;
419 }
420 return new_dict(keys, values);
421}
422
423PyObject *
424PyDict_New(void)
425{
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200426 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_COMBINED);
427 if (keys == NULL)
428 return NULL;
429 return new_dict(keys, NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400430}
431
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000432/*
433The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000434This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000435Open addressing is preferred over chaining since the link overhead for
436chaining would be substantial (100% with typical malloc overhead).
437
Tim Peterseb28ef22001-06-02 05:27:19 +0000438The initial probe index is computed as hash mod the table size. Subsequent
439probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000440
441All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000442
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000443The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000444contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000445Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000446
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000447lookdict() is general-purpose, and may return NULL if (and only if) a
448comparison raises an exception (this was new in Python 2.5).
Guido van Rossum89d8c602007-09-18 17:26:56 +0000449lookdict_unicode() below is specialized to string keys, comparison of which can
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400450never raise an exception; that function can never return NULL.
451lookdict_unicode_nodummy is further specialized for string keys that cannot be
452the <dummy> value.
453For both, when the key isn't found a PyDictEntry* is returned
454where the key would have been found, *value_addr points to the matching value
455slot.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000456*/
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400457static PyDictKeyEntry *
458lookdict(PyDictObject *mp, PyObject *key,
459 Py_hash_t hash, PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000460{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200461 size_t i;
462 size_t perturb;
463 PyDictKeyEntry *freeslot;
464 size_t mask;
Antoine Pitrou9a234902012-05-13 20:48:01 +0200465 PyDictKeyEntry *ep0;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200466 PyDictKeyEntry *ep;
467 int cmp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000469
Antoine Pitrou9a234902012-05-13 20:48:01 +0200470top:
471 mask = DK_MASK(mp->ma_keys);
472 ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 i = (size_t)hash & mask;
474 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400475 if (ep->me_key == NULL || ep->me_key == key) {
476 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400478 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 if (ep->me_key == dummy)
480 freeslot = ep;
481 else {
482 if (ep->me_hash == hash) {
483 startkey = ep->me_key;
484 Py_INCREF(startkey);
485 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
486 Py_DECREF(startkey);
487 if (cmp < 0)
488 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400489 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
490 if (cmp > 0) {
491 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400493 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 }
495 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200496 /* The dict was mutated, restart */
497 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 }
499 }
500 freeslot = NULL;
501 }
Tim Peters15d49292001-05-27 07:39:22 +0000502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 /* In the loop, me_key == dummy is by far (factor of 100s) the
504 least likely outcome, so test for that last. */
505 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
506 i = (i << 2) + i + perturb + 1;
507 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400508 if (ep->me_key == NULL) {
509 if (freeslot == NULL) {
510 *value_addr = &ep->me_value;
511 return ep;
512 } else {
513 *value_addr = &freeslot->me_value;
514 return freeslot;
515 }
516 }
517 if (ep->me_key == key) {
518 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400520 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 if (ep->me_hash == hash && ep->me_key != dummy) {
522 startkey = ep->me_key;
523 Py_INCREF(startkey);
524 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
525 Py_DECREF(startkey);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400526 if (cmp < 0) {
527 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400529 }
530 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
531 if (cmp > 0) {
532 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400534 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 }
536 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200537 /* The dict was mutated, restart */
538 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 }
540 }
541 else if (ep->me_key == dummy && freeslot == NULL)
542 freeslot = ep;
543 }
544 assert(0); /* NOT REACHED */
545 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000546}
547
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400548/* Specialized version for string-only keys */
549static PyDictKeyEntry *
550lookdict_unicode(PyDictObject *mp, PyObject *key,
551 Py_hash_t hash, PyObject ***value_addr)
Fred Drake1bff34a2000-08-31 19:31:38 +0000552{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200553 size_t i;
554 size_t perturb;
555 PyDictKeyEntry *freeslot;
556 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400557 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200558 PyDictKeyEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 /* Make sure this function doesn't have to handle non-unicode keys,
561 including subclasses of str; e.g., one reason to subclass
562 unicodes is to override __eq__, and for speed we don't cater to
563 that here. */
564 if (!PyUnicode_CheckExact(key)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400565 mp->ma_keys->dk_lookup = lookdict;
566 return lookdict(mp, key, hash, value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100568 i = (size_t)hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400570 if (ep->me_key == NULL || ep->me_key == key) {
571 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400573 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 if (ep->me_key == dummy)
575 freeslot = ep;
576 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400577 if (ep->me_hash == hash && unicode_eq(ep->me_key, key)) {
578 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400580 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 freeslot = NULL;
582 }
Tim Peters15d49292001-05-27 07:39:22 +0000583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 /* In the loop, me_key == dummy is by far (factor of 100s) the
585 least likely outcome, so test for that last. */
586 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
587 i = (i << 2) + i + perturb + 1;
588 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400589 if (ep->me_key == NULL) {
590 if (freeslot == NULL) {
591 *value_addr = &ep->me_value;
592 return ep;
593 } else {
594 *value_addr = &freeslot->me_value;
595 return freeslot;
596 }
597 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 if (ep->me_key == key
599 || (ep->me_hash == hash
600 && ep->me_key != dummy
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400601 && unicode_eq(ep->me_key, key))) {
602 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400604 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 if (ep->me_key == dummy && freeslot == NULL)
606 freeslot = ep;
607 }
608 assert(0); /* NOT REACHED */
609 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000610}
611
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400612/* Faster version of lookdict_unicode when it is known that no <dummy> keys
613 * will be present. */
614static PyDictKeyEntry *
615lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
616 Py_hash_t hash, PyObject ***value_addr)
617{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200618 size_t i;
619 size_t perturb;
620 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400621 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200622 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400623
624 /* Make sure this function doesn't have to handle non-unicode keys,
625 including subclasses of str; e.g., one reason to subclass
626 unicodes is to override __eq__, and for speed we don't cater to
627 that here. */
628 if (!PyUnicode_CheckExact(key)) {
629 mp->ma_keys->dk_lookup = lookdict;
630 return lookdict(mp, key, hash, value_addr);
631 }
632 i = (size_t)hash & mask;
633 ep = &ep0[i];
634 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
635 if (ep->me_key == NULL || ep->me_key == key ||
636 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
637 *value_addr = &ep->me_value;
638 return ep;
639 }
640 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
641 i = (i << 2) + i + perturb + 1;
642 ep = &ep0[i & mask];
643 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
644 if (ep->me_key == NULL || ep->me_key == key ||
645 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
646 *value_addr = &ep->me_value;
647 return ep;
648 }
649 }
650 assert(0); /* NOT REACHED */
651 return 0;
652}
653
654/* Version of lookdict for split tables.
655 * All split tables and only split tables use this lookup function.
656 * Split tables only contain unicode keys and no dummy keys,
657 * so algorithm is the same as lookdict_unicode_nodummy.
658 */
659static PyDictKeyEntry *
660lookdict_split(PyDictObject *mp, PyObject *key,
661 Py_hash_t hash, PyObject ***value_addr)
662{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200663 size_t i;
664 size_t perturb;
665 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400666 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200667 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400668
669 if (!PyUnicode_CheckExact(key)) {
Benjamin Petersondb780d02012-04-23 13:44:32 -0400670 ep = lookdict(mp, key, hash, value_addr);
671 /* lookdict expects a combined-table, so fix value_addr */
672 i = ep - ep0;
673 *value_addr = &mp->ma_values[i];
674 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400675 }
676 i = (size_t)hash & mask;
677 ep = &ep0[i];
678 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
679 if (ep->me_key == NULL || ep->me_key == key ||
680 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
681 *value_addr = &mp->ma_values[i];
682 return ep;
683 }
684 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
685 i = (i << 2) + i + perturb + 1;
686 ep = &ep0[i & mask];
687 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
688 if (ep->me_key == NULL || ep->me_key == key ||
689 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
690 *value_addr = &mp->ma_values[i & mask];
691 return ep;
692 }
693 }
694 assert(0); /* NOT REACHED */
695 return 0;
696}
697
Benjamin Petersonfb886362010-04-24 18:21:17 +0000698int
699_PyDict_HasOnlyStringKeys(PyObject *dict)
700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 Py_ssize_t pos = 0;
702 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +0000703 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 /* Shortcut */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400705 if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 return 1;
707 while (PyDict_Next(dict, &pos, &key, &value))
708 if (!PyUnicode_Check(key))
709 return 0;
710 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +0000711}
712
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000713#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 do { \
715 if (!_PyObject_GC_IS_TRACKED(mp)) { \
716 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
717 _PyObject_GC_MAY_BE_TRACKED(value)) { \
718 _PyObject_GC_TRACK(mp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 } \
720 } \
721 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000722
723void
724_PyDict_MaybeUntrack(PyObject *op)
725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 PyDictObject *mp;
727 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400728 Py_ssize_t i, size;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
731 return;
732
733 mp = (PyDictObject *) op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400734 size = DK_SIZE(mp->ma_keys);
735 if (_PyDict_HasSplitTable(mp)) {
736 for (i = 0; i < size; i++) {
737 if ((value = mp->ma_values[i]) == NULL)
738 continue;
739 if (_PyObject_GC_MAY_BE_TRACKED(value)) {
740 assert(!_PyObject_GC_MAY_BE_TRACKED(
741 mp->ma_keys->dk_entries[i].me_key));
742 return;
743 }
744 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400746 else {
747 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
748 for (i = 0; i < size; i++) {
749 if ((value = ep0[i].me_value) == NULL)
750 continue;
751 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
752 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
753 return;
754 }
755 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000757}
758
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400759/* Internal function to find slot for an item from its hash
760 * when it is known that the key is not present in the dict.
761 */
762static PyDictKeyEntry *
763find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
764 PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000765{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400766 size_t i;
767 size_t perturb;
768 size_t mask = DK_MASK(mp->ma_keys);
769 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
770 PyDictKeyEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000771
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400772 assert(key != NULL);
773 if (!PyUnicode_CheckExact(key))
774 mp->ma_keys->dk_lookup = lookdict;
775 i = hash & mask;
776 ep = &ep0[i];
777 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
778 i = (i << 2) + i + perturb + 1;
779 ep = &ep0[i & mask];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400781 assert(ep->me_value == NULL);
782 if (mp->ma_values)
783 *value_addr = &mp->ma_values[i & mask];
784 else
785 *value_addr = &ep->me_value;
786 return ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000787}
788
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400789static int
790insertion_resize(PyDictObject *mp)
791{
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700792 return dictresize(mp, GROWTH_RATE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400793}
Antoine Pitroue965d972012-02-27 00:45:12 +0100794
795/*
796Internal routine to insert a new item into the table.
797Used both by the internal resize routine and by the public insert routine.
Antoine Pitroue965d972012-02-27 00:45:12 +0100798Returns -1 if an error occurred, or 0 on success.
799*/
800static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400801insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +0100802{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400803 PyObject *old_value;
804 PyObject **value_addr;
805 PyDictKeyEntry *ep;
806 assert(key != dummy);
Antoine Pitroue965d972012-02-27 00:45:12 +0100807
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400808 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
809 if (insertion_resize(mp) < 0)
810 return -1;
811 }
812
813 ep = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr);
Antoine Pitroue965d972012-02-27 00:45:12 +0100814 if (ep == NULL) {
Antoine Pitroue965d972012-02-27 00:45:12 +0100815 return -1;
816 }
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400817 Py_INCREF(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400818 MAINTAIN_TRACKING(mp, key, value);
819 old_value = *value_addr;
820 if (old_value != NULL) {
821 assert(ep->me_key != NULL && ep->me_key != dummy);
822 *value_addr = value;
823 Py_DECREF(old_value); /* which **CAN** re-enter */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400824 }
825 else {
826 if (ep->me_key == NULL) {
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400827 Py_INCREF(key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400828 if (mp->ma_keys->dk_usable <= 0) {
829 /* Need to resize. */
830 if (insertion_resize(mp) < 0) {
831 Py_DECREF(key);
832 Py_DECREF(value);
833 return -1;
834 }
835 ep = find_empty_slot(mp, key, hash, &value_addr);
836 }
837 mp->ma_keys->dk_usable--;
838 assert(mp->ma_keys->dk_usable >= 0);
839 ep->me_key = key;
840 ep->me_hash = hash;
841 }
842 else {
843 if (ep->me_key == dummy) {
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400844 Py_INCREF(key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400845 ep->me_key = key;
846 ep->me_hash = hash;
847 Py_DECREF(dummy);
848 } else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400849 assert(_PyDict_HasSplitTable(mp));
850 }
851 }
852 mp->ma_used++;
853 *value_addr = value;
854 }
855 assert(ep->me_key != NULL && ep->me_key != dummy);
856 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
857 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +0100858}
859
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000860/*
861Internal routine used by dictresize() to insert an item which is
862known to be absent from the dict. This routine also assumes that
863the dict contains no deleted entries. Besides the performance benefit,
864using insertdict() in dictresize() is dangerous (SF bug #1456209).
865Note that no refcounts are changed by this routine; if needed, the caller
866is responsible for incref'ing `key` and `value`.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400867Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
868must set them correctly
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000869*/
870static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400871insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000873{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400874 size_t i;
875 size_t perturb;
876 PyDictKeysObject *k = mp->ma_keys;
877 size_t mask = (size_t)DK_SIZE(k)-1;
878 PyDictKeyEntry *ep0 = &k->dk_entries[0];
879 PyDictKeyEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000880
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400881 assert(k->dk_lookup != NULL);
882 assert(value != NULL);
883 assert(key != NULL);
884 assert(key != dummy);
885 assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
886 i = hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 ep = &ep0[i];
888 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
889 i = (i << 2) + i + perturb + 1;
890 ep = &ep0[i & mask];
891 }
892 assert(ep->me_value == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000894 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000896}
897
898/*
899Restructure the table by allocating a new table and reinserting all
900items again. When entries have been deleted, the new table may
901actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400902If a table is split (its keys and hashes are shared, its values are not),
903then the values are temporarily copied into the table, it is resized as
904a combined table, then the me_value slots in the old table are NULLed out.
905After resizing a table is always combined,
906but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000907*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000908static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000909dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000910{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 Py_ssize_t newsize;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400912 PyDictKeysObject *oldkeys;
913 PyObject **oldvalues;
914 Py_ssize_t i, oldsize;
Tim Peters91a364d2001-05-19 07:04:38 +0000915
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400916/* Find the smallest table size > minused. */
917 for (newsize = PyDict_MINSIZE_COMBINED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 newsize <= minused && newsize > 0;
919 newsize <<= 1)
920 ;
921 if (newsize <= 0) {
922 PyErr_NoMemory();
923 return -1;
924 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400925 oldkeys = mp->ma_keys;
926 oldvalues = mp->ma_values;
927 /* Allocate a new table. */
928 mp->ma_keys = new_keys_object(newsize);
929 if (mp->ma_keys == NULL) {
930 mp->ma_keys = oldkeys;
931 return -1;
932 }
933 if (oldkeys->dk_lookup == lookdict)
934 mp->ma_keys->dk_lookup = lookdict;
935 oldsize = DK_SIZE(oldkeys);
936 mp->ma_values = NULL;
937 /* If empty then nothing to copy so just return */
938 if (oldsize == 1) {
939 assert(oldkeys == Py_EMPTY_KEYS);
940 DK_DECREF(oldkeys);
941 return 0;
942 }
943 /* Main loop below assumes we can transfer refcount to new keys
944 * and that value is stored in me_value.
945 * Increment ref-counts and copy values here to compensate
946 * This (resizing a split table) should be relatively rare */
947 if (oldvalues != NULL) {
948 for (i = 0; i < oldsize; i++) {
949 if (oldvalues[i] != NULL) {
950 Py_INCREF(oldkeys->dk_entries[i].me_key);
951 oldkeys->dk_entries[i].me_value = oldvalues[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 }
954 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400955 /* Main loop */
956 for (i = 0; i < oldsize; i++) {
957 PyDictKeyEntry *ep = &oldkeys->dk_entries[i];
958 if (ep->me_value != NULL) {
959 assert(ep->me_key != dummy);
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000960 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400963 mp->ma_keys->dk_usable -= mp->ma_used;
964 if (oldvalues != NULL) {
965 /* NULL out me_value slot in oldkeys, in case it was shared */
966 for (i = 0; i < oldsize; i++)
967 oldkeys->dk_entries[i].me_value = NULL;
968 assert(oldvalues != empty_values);
969 free_values(oldvalues);
970 DK_DECREF(oldkeys);
971 }
972 else {
973 assert(oldkeys->dk_lookup != lookdict_split);
974 if (oldkeys->dk_lookup != lookdict_unicode_nodummy) {
975 PyDictKeyEntry *ep0 = &oldkeys->dk_entries[0];
976 for (i = 0; i < oldsize; i++) {
977 if (ep0[i].me_key == dummy)
978 Py_DECREF(dummy);
979 }
980 }
981 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200982 DK_DEBUG_DECREF PyMem_FREE(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400983 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000985}
986
Benjamin Peterson15ee8212012-04-24 14:44:18 -0400987/* Returns NULL if unable to split table.
988 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400989static PyDictKeysObject *
990make_keys_shared(PyObject *op)
991{
992 Py_ssize_t i;
993 Py_ssize_t size;
994 PyDictObject *mp = (PyDictObject *)op;
995
Benjamin Peterson15ee8212012-04-24 14:44:18 -0400996 if (!PyDict_CheckExact(op))
997 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400998 if (!_PyDict_HasSplitTable(mp)) {
999 PyDictKeyEntry *ep0;
1000 PyObject **values;
1001 assert(mp->ma_keys->dk_refcnt == 1);
1002 if (mp->ma_keys->dk_lookup == lookdict) {
1003 return NULL;
1004 }
1005 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
1006 /* Remove dummy keys */
1007 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
1008 return NULL;
1009 }
1010 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
1011 /* Copy values into a new array */
1012 ep0 = &mp->ma_keys->dk_entries[0];
1013 size = DK_SIZE(mp->ma_keys);
1014 values = new_values(size);
1015 if (values == NULL) {
1016 PyErr_SetString(PyExc_MemoryError,
1017 "Not enough memory to allocate new values array");
1018 return NULL;
1019 }
1020 for (i = 0; i < size; i++) {
1021 values[i] = ep0[i].me_value;
1022 ep0[i].me_value = NULL;
1023 }
1024 mp->ma_keys->dk_lookup = lookdict_split;
1025 mp->ma_values = values;
1026 }
1027 DK_INCREF(mp->ma_keys);
1028 return mp->ma_keys;
1029}
Christian Heimes99170a52007-12-19 02:07:34 +00001030
1031PyObject *
1032_PyDict_NewPresized(Py_ssize_t minused)
1033{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001034 Py_ssize_t newsize;
1035 PyDictKeysObject *new_keys;
1036 for (newsize = PyDict_MINSIZE_COMBINED;
1037 newsize <= minused && newsize > 0;
1038 newsize <<= 1)
1039 ;
1040 new_keys = new_keys_object(newsize);
1041 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001043 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001044}
1045
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001046/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1047 * that may occur (originally dicts supported only string keys, and exceptions
1048 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001049 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001050 * (suppressed) occurred while computing the key's hash, or that some error
1051 * (suppressed) occurred when comparing keys in the dict's internal probe
1052 * sequence. A nasty example of the latter is when a Python-coded comparison
1053 * function hits a stack-depth error, which can cause this to return NULL
1054 * even if the key is present.
1055 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001057PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001058{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001059 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001061 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001063 PyObject **value_addr;
1064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 if (!PyDict_Check(op))
1066 return NULL;
1067 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001068 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 {
1070 hash = PyObject_Hash(key);
1071 if (hash == -1) {
1072 PyErr_Clear();
1073 return NULL;
1074 }
1075 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 /* We can arrive here with a NULL tstate during initialization: try
1078 running "python -Wi" for an example related to string interning.
1079 Let's just hope that no exception occurs then... This must be
1080 _PyThreadState_Current and not PyThreadState_GET() because in debug
1081 mode, the latter complains if tstate is NULL. */
1082 tstate = (PyThreadState*)_Py_atomic_load_relaxed(
1083 &_PyThreadState_Current);
1084 if (tstate != NULL && tstate->curexc_type != NULL) {
1085 /* preserve the existing exception */
1086 PyObject *err_type, *err_value, *err_tb;
1087 PyErr_Fetch(&err_type, &err_value, &err_tb);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001088 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 /* ignore errors */
1090 PyErr_Restore(err_type, err_value, err_tb);
1091 if (ep == NULL)
1092 return NULL;
1093 }
1094 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001095 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 if (ep == NULL) {
1097 PyErr_Clear();
1098 return NULL;
1099 }
1100 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001101 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001102}
1103
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001104/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1105 This returns NULL *with* an exception set if an exception occurred.
1106 It returns NULL *without* an exception set if the key wasn't present.
1107*/
1108PyObject *
1109PyDict_GetItemWithError(PyObject *op, PyObject *key)
1110{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001111 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001113 PyDictKeyEntry *ep;
1114 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 if (!PyDict_Check(op)) {
1117 PyErr_BadInternalCall();
1118 return NULL;
1119 }
1120 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001121 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 {
1123 hash = PyObject_Hash(key);
1124 if (hash == -1) {
1125 return NULL;
1126 }
1127 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001128
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001129 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 if (ep == NULL)
1131 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001132 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001133}
1134
Brett Cannonfd074152012-04-14 14:10:13 -04001135PyObject *
1136_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1137{
1138 PyObject *kv;
1139 kv = _PyUnicode_FromId(key); /* borrowed */
1140 if (kv == NULL)
1141 return NULL;
1142 return PyDict_GetItemWithError(dp, kv);
1143}
1144
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001145/* Fast version of global value lookup.
1146 * Lookup in globals, then builtins.
1147 */
1148PyObject *
1149_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001150{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001151 PyObject *x;
1152 if (PyUnicode_CheckExact(key)) {
1153 PyObject **value_addr;
1154 Py_hash_t hash = ((PyASCIIObject *)key)->hash;
1155 if (hash != -1) {
1156 PyDictKeyEntry *e;
1157 e = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr);
1158 if (e == NULL) {
1159 return NULL;
1160 }
1161 x = *value_addr;
1162 if (x != NULL)
1163 return x;
1164 e = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr);
1165 if (e == NULL) {
1166 return NULL;
1167 }
1168 x = *value_addr;
1169 return x;
1170 }
Antoine Pitroue965d972012-02-27 00:45:12 +01001171 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001172 x = PyDict_GetItemWithError((PyObject *)globals, key);
1173 if (x != NULL)
1174 return x;
1175 if (PyErr_Occurred())
1176 return NULL;
1177 return PyDict_GetItemWithError((PyObject *)builtins, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001178}
1179
Antoine Pitroue965d972012-02-27 00:45:12 +01001180/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1181 * dictionary if it's merely replacing the value for an existing key.
1182 * This means that it's safe to loop over a dictionary with PyDict_Next()
1183 * and occasionally replace a value -- but you can't insert new keys or
1184 * remove them.
1185 */
1186int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001187PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001188{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001189 PyDictObject *mp;
1190 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001191 if (!PyDict_Check(op)) {
1192 PyErr_BadInternalCall();
1193 return -1;
1194 }
1195 assert(key);
1196 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001197 mp = (PyDictObject *)op;
1198 if (!PyUnicode_CheckExact(key) ||
1199 (hash = ((PyASCIIObject *) key)->hash) == -1)
1200 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001201 hash = PyObject_Hash(key);
1202 if (hash == -1)
1203 return -1;
1204 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001205
1206 /* insertdict() handles any resizing that might be necessary */
1207 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001208}
1209
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001210int
Tim Peters1f5871e2000-07-04 17:44:48 +00001211PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001212{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001213 PyDictObject *mp;
1214 Py_hash_t hash;
1215 PyDictKeyEntry *ep;
1216 PyObject *old_key, *old_value;
1217 PyObject **value_addr;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 if (!PyDict_Check(op)) {
1220 PyErr_BadInternalCall();
1221 return -1;
1222 }
1223 assert(key);
1224 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001225 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 hash = PyObject_Hash(key);
1227 if (hash == -1)
1228 return -1;
1229 }
1230 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001231 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 if (ep == NULL)
1233 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001234 if (*value_addr == NULL) {
Raymond Hettinger69492da2013-09-02 15:59:26 -07001235 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 return -1;
1237 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001238 old_value = *value_addr;
1239 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001241 if (!_PyDict_HasSplitTable(mp)) {
1242 ENSURE_ALLOWS_DELETIONS(mp);
1243 old_key = ep->me_key;
1244 Py_INCREF(dummy);
1245 ep->me_key = dummy;
1246 Py_DECREF(old_key);
1247 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001250}
1251
Guido van Rossum25831651993-05-19 14:50:45 +00001252void
Tim Peters1f5871e2000-07-04 17:44:48 +00001253PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001254{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001256 PyDictKeysObject *oldkeys;
1257 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 if (!PyDict_Check(op))
1261 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001262 mp = ((PyDictObject *)op);
1263 oldkeys = mp->ma_keys;
1264 oldvalues = mp->ma_values;
1265 if (oldvalues == empty_values)
1266 return;
1267 /* Empty the dict... */
1268 DK_INCREF(Py_EMPTY_KEYS);
1269 mp->ma_keys = Py_EMPTY_KEYS;
1270 mp->ma_values = empty_values;
1271 mp->ma_used = 0;
1272 /* ...then clear the keys and values */
1273 if (oldvalues != NULL) {
1274 n = DK_SIZE(oldkeys);
1275 for (i = 0; i < n; i++)
1276 Py_CLEAR(oldvalues[i]);
1277 free_values(oldvalues);
1278 DK_DECREF(oldkeys);
1279 }
1280 else {
1281 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001282 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001283 }
1284}
1285
1286/* Returns -1 if no more items (or op is not a dict),
1287 * index of item otherwise. Stores value in pvalue
1288 */
1289Py_LOCAL_INLINE(Py_ssize_t)
1290dict_next(PyObject *op, Py_ssize_t i, PyObject **pvalue)
1291{
1292 Py_ssize_t mask, offset;
1293 PyDictObject *mp;
1294 PyObject **value_ptr;
1295
1296
1297 if (!PyDict_Check(op))
1298 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001300 if (i < 0)
1301 return -1;
1302 if (mp->ma_values) {
1303 value_ptr = &mp->ma_values[i];
1304 offset = sizeof(PyObject *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001306 else {
1307 value_ptr = &mp->ma_keys->dk_entries[i].me_value;
1308 offset = sizeof(PyDictKeyEntry);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001310 mask = DK_MASK(mp->ma_keys);
1311 while (i <= mask && *value_ptr == NULL) {
1312 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1313 i++;
1314 }
1315 if (i > mask)
1316 return -1;
1317 if (pvalue)
1318 *pvalue = *value_ptr;
1319 return i;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001320}
1321
Tim Peters080c88b2003-02-15 03:01:11 +00001322/*
1323 * Iterate over a dict. Use like so:
1324 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001325 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001326 * PyObject *key, *value;
1327 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001328 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +00001329 * Refer to borrowed references in key and value.
1330 * }
1331 *
1332 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001333 * mutates the dict. One exception: it is safe if the loop merely changes
1334 * the values associated with the keys (but doesn't insert new keys or
1335 * delete keys), via PyDict_SetItem().
1336 */
Guido van Rossum25831651993-05-19 14:50:45 +00001337int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001338PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001339{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001340 PyDictObject *mp;
1341 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 if (i < 0)
1343 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001344 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 *ppos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001347 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001349}
1350
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001351/* Internal version of PyDict_Next that returns a hash value in addition
1352 * to the key and value.
1353 */
Thomas Wouterscf297e42007-02-23 15:07:44 +00001354int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001355_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1356 PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001357{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001358 PyDictObject *mp;
1359 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 if (i < 0)
1361 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001362 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 *ppos = i+1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001364 *phash = mp->ma_keys->dk_entries[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001366 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001368}
1369
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001370/* Methods */
1371
1372static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001373dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001374{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001375 PyObject **values = mp->ma_values;
1376 PyDictKeysObject *keys = mp->ma_keys;
1377 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 PyObject_GC_UnTrack(mp);
1379 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001380 if (values != NULL) {
1381 if (values != empty_values) {
1382 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
1383 Py_XDECREF(values[i]);
1384 }
1385 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001387 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02001389 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001390 assert(keys->dk_refcnt == 1);
1391 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001392 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1394 free_list[numfree++] = mp;
1395 else
1396 Py_TYPE(mp)->tp_free((PyObject *)mp);
1397 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001398}
1399
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001400
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001401static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001402dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001405 PyObject *key = NULL, *value = NULL;
1406 _PyUnicodeWriter writer;
1407 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 i = Py_ReprEnter((PyObject *)mp);
1410 if (i != 0) {
1411 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1412 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001415 Py_ReprLeave((PyObject *)mp);
1416 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 }
Tim Petersa7259592001-06-16 05:11:17 +00001418
Victor Stinnerf91929b2013-11-19 13:07:38 +01001419 _PyUnicodeWriter_Init(&writer);
1420 writer.overallocate = 1;
1421 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
1422 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00001423
Victor Stinnerf91929b2013-11-19 13:07:38 +01001424 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
1425 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 /* Do repr() on each key+value pair, and insert ": " between them.
1428 Note that repr may mutate the dict. */
1429 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001430 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001432 PyObject *s;
1433 int res;
1434
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001435 /* Prevent repr from deleting key or value during key format. */
1436 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02001438
Victor Stinnerf91929b2013-11-19 13:07:38 +01001439 if (!first) {
1440 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
1441 goto error;
1442 }
1443 first = 0;
1444
1445 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01001447 goto error;
1448 res = _PyUnicodeWriter_WriteStr(&writer, s);
1449 Py_DECREF(s);
1450 if (res < 0)
1451 goto error;
1452
1453 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
1454 goto error;
1455
1456 s = PyObject_Repr(value);
1457 if (s == NULL)
1458 goto error;
1459 res = _PyUnicodeWriter_WriteStr(&writer, s);
1460 Py_DECREF(s);
1461 if (res < 0)
1462 goto error;
1463
1464 Py_CLEAR(key);
1465 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 }
Tim Petersa7259592001-06-16 05:11:17 +00001467
Victor Stinnerf91929b2013-11-19 13:07:38 +01001468 writer.overallocate = 0;
1469 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
1470 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01001473
1474 return _PyUnicodeWriter_Finish(&writer);
1475
1476error:
1477 Py_ReprLeave((PyObject *)mp);
1478 _PyUnicodeWriter_Dealloc(&writer);
1479 Py_XDECREF(key);
1480 Py_XDECREF(value);
1481 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001482}
1483
Martin v. Löwis18e16552006-02-15 17:27:45 +00001484static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001485dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001488}
1489
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001490static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001491dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001492{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 PyObject *v;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001494 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001495 PyDictKeyEntry *ep;
1496 PyObject **value_addr;
1497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001499 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 hash = PyObject_Hash(key);
1501 if (hash == -1)
1502 return NULL;
1503 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001504 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 if (ep == NULL)
1506 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001507 v = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 if (v == NULL) {
1509 if (!PyDict_CheckExact(mp)) {
1510 /* Look up __missing__ method if we're a subclass. */
1511 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05001512 _Py_IDENTIFIER(__missing__);
1513 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 if (missing != NULL) {
1515 res = PyObject_CallFunctionObjArgs(missing,
1516 key, NULL);
1517 Py_DECREF(missing);
1518 return res;
1519 }
1520 else if (PyErr_Occurred())
1521 return NULL;
1522 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07001523 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 return NULL;
1525 }
1526 else
1527 Py_INCREF(v);
1528 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001529}
1530
1531static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001532dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 if (w == NULL)
1535 return PyDict_DelItem((PyObject *)mp, v);
1536 else
1537 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001538}
1539
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001540static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 (lenfunc)dict_length, /*mp_length*/
1542 (binaryfunc)dict_subscript, /*mp_subscript*/
1543 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001544};
1545
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001547dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001548{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001549 PyObject *v;
1550 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001551 PyDictKeyEntry *ep;
1552 Py_ssize_t size, n, offset;
1553 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001554
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001555 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 n = mp->ma_used;
1557 v = PyList_New(n);
1558 if (v == NULL)
1559 return NULL;
1560 if (n != mp->ma_used) {
1561 /* Durnit. The allocations caused the dict to resize.
1562 * Just start over, this shouldn't normally happen.
1563 */
1564 Py_DECREF(v);
1565 goto again;
1566 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001567 ep = &mp->ma_keys->dk_entries[0];
1568 size = DK_SIZE(mp->ma_keys);
1569 if (mp->ma_values) {
1570 value_ptr = mp->ma_values;
1571 offset = sizeof(PyObject *);
1572 }
1573 else {
1574 value_ptr = &ep[0].me_value;
1575 offset = sizeof(PyDictKeyEntry);
1576 }
1577 for (i = 0, j = 0; i < size; i++) {
1578 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 PyObject *key = ep[i].me_key;
1580 Py_INCREF(key);
1581 PyList_SET_ITEM(v, j, key);
1582 j++;
1583 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001584 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 }
1586 assert(j == n);
1587 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001588}
1589
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001590static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001591dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001592{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001593 PyObject *v;
1594 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001595 Py_ssize_t size, n, offset;
1596 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001597
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001598 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 n = mp->ma_used;
1600 v = PyList_New(n);
1601 if (v == NULL)
1602 return NULL;
1603 if (n != mp->ma_used) {
1604 /* Durnit. The allocations caused the dict to resize.
1605 * Just start over, this shouldn't normally happen.
1606 */
1607 Py_DECREF(v);
1608 goto again;
1609 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001610 size = DK_SIZE(mp->ma_keys);
1611 if (mp->ma_values) {
1612 value_ptr = mp->ma_values;
1613 offset = sizeof(PyObject *);
1614 }
1615 else {
1616 value_ptr = &mp->ma_keys->dk_entries[0].me_value;
1617 offset = sizeof(PyDictKeyEntry);
1618 }
1619 for (i = 0, j = 0; i < size; i++) {
1620 PyObject *value = *value_ptr;
1621 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1622 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 Py_INCREF(value);
1624 PyList_SET_ITEM(v, j, value);
1625 j++;
1626 }
1627 }
1628 assert(j == n);
1629 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001630}
1631
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001633dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001634{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001635 PyObject *v;
1636 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001637 Py_ssize_t size, offset;
1638 PyObject *item, *key;
1639 PyDictKeyEntry *ep;
1640 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 /* Preallocate the list of tuples, to avoid allocations during
1643 * the loop over the items, which could trigger GC, which
1644 * could resize the dict. :-(
1645 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001646 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 n = mp->ma_used;
1648 v = PyList_New(n);
1649 if (v == NULL)
1650 return NULL;
1651 for (i = 0; i < n; i++) {
1652 item = PyTuple_New(2);
1653 if (item == NULL) {
1654 Py_DECREF(v);
1655 return NULL;
1656 }
1657 PyList_SET_ITEM(v, i, item);
1658 }
1659 if (n != mp->ma_used) {
1660 /* Durnit. The allocations caused the dict to resize.
1661 * Just start over, this shouldn't normally happen.
1662 */
1663 Py_DECREF(v);
1664 goto again;
1665 }
1666 /* Nothing we do below makes any function calls. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001667 ep = mp->ma_keys->dk_entries;
1668 size = DK_SIZE(mp->ma_keys);
1669 if (mp->ma_values) {
1670 value_ptr = mp->ma_values;
1671 offset = sizeof(PyObject *);
1672 }
1673 else {
1674 value_ptr = &ep[0].me_value;
1675 offset = sizeof(PyDictKeyEntry);
1676 }
1677 for (i = 0, j = 0; i < size; i++) {
1678 PyObject *value = *value_ptr;
1679 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1680 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 key = ep[i].me_key;
1682 item = PyList_GET_ITEM(v, j);
1683 Py_INCREF(key);
1684 PyTuple_SET_ITEM(item, 0, key);
1685 Py_INCREF(value);
1686 PyTuple_SET_ITEM(item, 1, value);
1687 j++;
1688 }
1689 }
1690 assert(j == n);
1691 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001692}
1693
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001694static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001695dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 PyObject *seq;
1698 PyObject *value = Py_None;
1699 PyObject *it; /* iter(seq) */
1700 PyObject *key;
1701 PyObject *d;
1702 int status;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
1705 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 d = PyObject_CallObject(cls, NULL);
1708 if (d == NULL)
1709 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001710
Benjamin Peterson9892f522012-10-31 14:22:12 -04001711 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001712 if (PyDict_CheckExact(seq)) {
1713 PyDictObject *mp = (PyDictObject *)d;
1714 PyObject *oldvalue;
1715 Py_ssize_t pos = 0;
1716 PyObject *key;
1717 Py_hash_t hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001718
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001719 if (dictresize(mp, Py_SIZE(seq))) {
Petri Lehtinena94200e2011-10-24 21:12:58 +03001720 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001722 }
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001723
1724 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001725 if (insertdict(mp, key, hash, value)) {
1726 Py_DECREF(d);
1727 return NULL;
1728 }
1729 }
1730 return d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 }
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001732 if (PyAnySet_CheckExact(seq)) {
1733 PyDictObject *mp = (PyDictObject *)d;
1734 Py_ssize_t pos = 0;
1735 PyObject *key;
1736 Py_hash_t hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001737
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001738 if (dictresize(mp, PySet_GET_SIZE(seq))) {
Petri Lehtinena94200e2011-10-24 21:12:58 +03001739 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001741 }
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001742
1743 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001744 if (insertdict(mp, key, hash, value)) {
1745 Py_DECREF(d);
1746 return NULL;
1747 }
1748 }
1749 return d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 it = PyObject_GetIter(seq);
1754 if (it == NULL){
1755 Py_DECREF(d);
1756 return NULL;
1757 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 if (PyDict_CheckExact(d)) {
1760 while ((key = PyIter_Next(it)) != NULL) {
1761 status = PyDict_SetItem(d, key, value);
1762 Py_DECREF(key);
1763 if (status < 0)
1764 goto Fail;
1765 }
1766 } else {
1767 while ((key = PyIter_Next(it)) != NULL) {
1768 status = PyObject_SetItem(d, key, value);
1769 Py_DECREF(key);
1770 if (status < 0)
1771 goto Fail;
1772 }
1773 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 if (PyErr_Occurred())
1776 goto Fail;
1777 Py_DECREF(it);
1778 return d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001779
1780Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 Py_DECREF(it);
1782 Py_DECREF(d);
1783 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001784}
1785
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001786static int
1787dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 PyObject *arg = NULL;
1790 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1793 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001796 _Py_IDENTIFIER(keys);
1797 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 result = PyDict_Merge(self, arg, 1);
1799 else
1800 result = PyDict_MergeFromSeq2(self, arg, 1);
1801 }
1802 if (result == 0 && kwds != NULL) {
1803 if (PyArg_ValidateKeywordArguments(kwds))
1804 result = PyDict_Merge(self, kwds, 1);
1805 else
1806 result = -1;
1807 }
1808 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001809}
1810
1811static PyObject *
1812dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 if (dict_update_common(self, args, kwds, "update") != -1)
1815 Py_RETURN_NONE;
1816 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001817}
1818
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001819/* Update unconditionally replaces existing items.
1820 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001821 otherwise it leaves existing items unchanged.
1822
1823 PyDict_{Update,Merge} update/merge from a mapping object.
1824
Tim Petersf582b822001-12-11 18:51:08 +00001825 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001826 producing iterable objects of length 2.
1827*/
1828
Tim Petersf582b822001-12-11 18:51:08 +00001829int
Tim Peters1fc240e2001-10-26 05:06:50 +00001830PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1831{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 PyObject *it; /* iter(seq2) */
1833 Py_ssize_t i; /* index into seq2 of current element */
1834 PyObject *item; /* seq2[i] */
1835 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 assert(d != NULL);
1838 assert(PyDict_Check(d));
1839 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 it = PyObject_GetIter(seq2);
1842 if (it == NULL)
1843 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 for (i = 0; ; ++i) {
1846 PyObject *key, *value;
1847 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 fast = NULL;
1850 item = PyIter_Next(it);
1851 if (item == NULL) {
1852 if (PyErr_Occurred())
1853 goto Fail;
1854 break;
1855 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 /* Convert item to sequence, and verify length 2. */
1858 fast = PySequence_Fast(item, "");
1859 if (fast == NULL) {
1860 if (PyErr_ExceptionMatches(PyExc_TypeError))
1861 PyErr_Format(PyExc_TypeError,
1862 "cannot convert dictionary update "
1863 "sequence element #%zd to a sequence",
1864 i);
1865 goto Fail;
1866 }
1867 n = PySequence_Fast_GET_SIZE(fast);
1868 if (n != 2) {
1869 PyErr_Format(PyExc_ValueError,
1870 "dictionary update sequence element #%zd "
1871 "has length %zd; 2 is required",
1872 i, n);
1873 goto Fail;
1874 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 /* Update/merge with this (key, value) pair. */
1877 key = PySequence_Fast_GET_ITEM(fast, 0);
1878 value = PySequence_Fast_GET_ITEM(fast, 1);
1879 if (override || PyDict_GetItem(d, key) == NULL) {
1880 int status = PyDict_SetItem(d, key, value);
1881 if (status < 0)
1882 goto Fail;
1883 }
1884 Py_DECREF(fast);
1885 Py_DECREF(item);
1886 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 i = 0;
1889 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00001890Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 Py_XDECREF(item);
1892 Py_XDECREF(fast);
1893 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001894Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 Py_DECREF(it);
1896 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001897}
1898
Tim Peters6d6c1a32001-08-02 04:15:00 +00001899int
1900PyDict_Update(PyObject *a, PyObject *b)
1901{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001903}
1904
1905int
1906PyDict_Merge(PyObject *a, PyObject *b, int override)
1907{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001908 PyDictObject *mp, *other;
1909 Py_ssize_t i, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001910 PyDictKeyEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 /* We accept for the argument either a concrete dictionary object,
1913 * or an abstract "mapping" object. For the former, we can do
1914 * things quite efficiently. For the latter, we only require that
1915 * PyMapping_Keys() and PyObject_GetItem() be supported.
1916 */
1917 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1918 PyErr_BadInternalCall();
1919 return -1;
1920 }
1921 mp = (PyDictObject*)a;
1922 if (PyDict_Check(b)) {
1923 other = (PyDictObject*)b;
1924 if (other == mp || other->ma_used == 0)
1925 /* a.update(a) or a.update({}); nothing to do */
1926 return 0;
1927 if (mp->ma_used == 0)
1928 /* Since the target dict is empty, PyDict_GetItem()
1929 * always returns NULL. Setting override to 1
1930 * skips the unnecessary test.
1931 */
1932 override = 1;
1933 /* Do one big resize at the start, rather than
1934 * incrementally resizing as we insert new items. Expect
1935 * that there will be no (or few) overlapping keys.
1936 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001937 if (mp->ma_keys->dk_usable * 3 < other->ma_used * 2)
1938 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001940 for (i = 0, n = DK_SIZE(other->ma_keys); i < n; i++) {
1941 PyObject *value;
1942 entry = &other->ma_keys->dk_entries[i];
1943 if (other->ma_values)
1944 value = other->ma_values[i];
1945 else
1946 value = entry->me_value;
1947
1948 if (value != NULL &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 (override ||
1950 PyDict_GetItem(a, entry->me_key) == NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 if (insertdict(mp, entry->me_key,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001952 entry->me_hash,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001953 value) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 return -1;
1955 }
1956 }
1957 }
1958 else {
1959 /* Do it the generic, slower way */
1960 PyObject *keys = PyMapping_Keys(b);
1961 PyObject *iter;
1962 PyObject *key, *value;
1963 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 if (keys == NULL)
1966 /* Docstring says this is equivalent to E.keys() so
1967 * if E doesn't have a .keys() method we want
1968 * AttributeError to percolate up. Might as well
1969 * do the same for any other error.
1970 */
1971 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 iter = PyObject_GetIter(keys);
1974 Py_DECREF(keys);
1975 if (iter == NULL)
1976 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
1979 if (!override && PyDict_GetItem(a, key) != NULL) {
1980 Py_DECREF(key);
1981 continue;
1982 }
1983 value = PyObject_GetItem(b, key);
1984 if (value == NULL) {
1985 Py_DECREF(iter);
1986 Py_DECREF(key);
1987 return -1;
1988 }
1989 status = PyDict_SetItem(a, key, value);
1990 Py_DECREF(key);
1991 Py_DECREF(value);
1992 if (status < 0) {
1993 Py_DECREF(iter);
1994 return -1;
1995 }
1996 }
1997 Py_DECREF(iter);
1998 if (PyErr_Occurred())
1999 /* Iterator completed, via error */
2000 return -1;
2001 }
2002 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002003}
2004
2005static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002006dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002009}
2010
2011PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002012PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002015 PyDictObject *mp;
2016 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 if (o == NULL || !PyDict_Check(o)) {
2019 PyErr_BadInternalCall();
2020 return NULL;
2021 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002022 mp = (PyDictObject *)o;
2023 if (_PyDict_HasSplitTable(mp)) {
2024 PyDictObject *split_copy;
2025 PyObject **newvalues = new_values(DK_SIZE(mp->ma_keys));
2026 if (newvalues == NULL)
2027 return PyErr_NoMemory();
2028 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2029 if (split_copy == NULL) {
2030 free_values(newvalues);
2031 return NULL;
2032 }
2033 split_copy->ma_values = newvalues;
2034 split_copy->ma_keys = mp->ma_keys;
2035 split_copy->ma_used = mp->ma_used;
2036 DK_INCREF(mp->ma_keys);
2037 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2038 PyObject *value = mp->ma_values[i];
2039 Py_XINCREF(value);
2040 split_copy->ma_values[i] = value;
2041 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002042 if (_PyObject_GC_IS_TRACKED(mp))
2043 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002044 return (PyObject *)split_copy;
2045 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 copy = PyDict_New();
2047 if (copy == NULL)
2048 return NULL;
2049 if (PyDict_Merge(copy, o, 1) == 0)
2050 return copy;
2051 Py_DECREF(copy);
2052 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002053}
2054
Martin v. Löwis18e16552006-02-15 17:27:45 +00002055Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002056PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 if (mp == NULL || !PyDict_Check(mp)) {
2059 PyErr_BadInternalCall();
2060 return -1;
2061 }
2062 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002063}
2064
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002065PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002066PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002067{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 if (mp == NULL || !PyDict_Check(mp)) {
2069 PyErr_BadInternalCall();
2070 return NULL;
2071 }
2072 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002073}
2074
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002075PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002076PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 if (mp == NULL || !PyDict_Check(mp)) {
2079 PyErr_BadInternalCall();
2080 return NULL;
2081 }
2082 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002083}
2084
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002085PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002086PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 if (mp == NULL || !PyDict_Check(mp)) {
2089 PyErr_BadInternalCall();
2090 return NULL;
2091 }
2092 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002093}
2094
Tim Peterse63415e2001-05-08 04:38:29 +00002095/* Return 1 if dicts equal, 0 if not, -1 if error.
2096 * Gets out as soon as any difference is detected.
2097 * Uses only Py_EQ comparison.
2098 */
2099static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002100dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 if (a->ma_used != b->ma_used)
2105 /* can't be equal if # of entries differ */
2106 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002108 for (i = 0; i < DK_SIZE(a->ma_keys); i++) {
2109 PyDictKeyEntry *ep = &a->ma_keys->dk_entries[i];
2110 PyObject *aval;
2111 if (a->ma_values)
2112 aval = a->ma_values[i];
2113 else
2114 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 if (aval != NULL) {
2116 int cmp;
2117 PyObject *bval;
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002118 PyObject **vaddr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002119 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 /* temporarily bump aval's refcount to ensure it stays
2121 alive until we're done with it */
2122 Py_INCREF(aval);
2123 /* ditto for key */
2124 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002125 /* reuse the known hash value */
2126 if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr) == NULL)
2127 bval = NULL;
2128 else
2129 bval = *vaddr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 Py_DECREF(key);
2131 if (bval == NULL) {
2132 Py_DECREF(aval);
2133 if (PyErr_Occurred())
2134 return -1;
2135 return 0;
2136 }
2137 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2138 Py_DECREF(aval);
2139 if (cmp <= 0) /* error or not equal */
2140 return cmp;
2141 }
2142 }
2143 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002144}
Tim Peterse63415e2001-05-08 04:38:29 +00002145
2146static PyObject *
2147dict_richcompare(PyObject *v, PyObject *w, int op)
2148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 int cmp;
2150 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2153 res = Py_NotImplemented;
2154 }
2155 else if (op == Py_EQ || op == Py_NE) {
2156 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2157 if (cmp < 0)
2158 return NULL;
2159 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2160 }
2161 else
2162 res = Py_NotImplemented;
2163 Py_INCREF(res);
2164 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002165}
Tim Peterse63415e2001-05-08 04:38:29 +00002166
Larry Hastings61272b72014-01-07 12:41:53 -08002167/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07002168
2169@coexist
2170dict.__contains__
2171
2172 key: object
2173 /
2174
2175True if D has a key k, else False"
Larry Hastings61272b72014-01-07 12:41:53 -08002176[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07002177
2178PyDoc_STRVAR(dict___contains____doc__,
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002179"__contains__(key)\n"
2180"True if D has a key k, else False\"");
Larry Hastings31826802013-10-19 00:09:25 -07002181
2182#define DICT___CONTAINS___METHODDEF \
2183 {"__contains__", (PyCFunction)dict___contains__, METH_O|METH_COEXIST, dict___contains____doc__},
2184
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002185static PyObject *
Larry Hastings31826802013-10-19 00:09:25 -07002186dict___contains__(PyObject *self, PyObject *key)
Larry Hastings61272b72014-01-07 12:41:53 -08002187/*[clinic end generated code: checksum=3bbac5ce898ae630d9668fa1c8b3afb645ff22e8]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002188{
Larry Hastings31826802013-10-19 00:09:25 -07002189 register PyDictObject *mp = (PyDictObject *)self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002190 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002191 PyDictKeyEntry *ep;
2192 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002195 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 hash = PyObject_Hash(key);
2197 if (hash == -1)
2198 return NULL;
2199 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002200 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201 if (ep == NULL)
2202 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002203 return PyBool_FromLong(*value_addr != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002204}
2205
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002206static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002207dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 PyObject *key;
2210 PyObject *failobj = Py_None;
2211 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002212 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002213 PyDictKeyEntry *ep;
2214 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2217 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002220 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 hash = PyObject_Hash(key);
2222 if (hash == -1)
2223 return NULL;
2224 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002225 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002226 if (ep == NULL)
2227 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002228 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 if (val == NULL)
2230 val = failobj;
2231 Py_INCREF(val);
2232 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002233}
2234
Benjamin Peterson00e98862013-03-07 22:16:29 -05002235PyObject *
2236PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002237{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002238 PyDictObject *mp = (PyDictObject *)d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002239 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002240 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002241 PyDictKeyEntry *ep;
2242 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002243
Benjamin Peterson00e98862013-03-07 22:16:29 -05002244 if (!PyDict_Check(d)) {
2245 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002247 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002249 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 hash = PyObject_Hash(key);
2251 if (hash == -1)
2252 return NULL;
2253 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002254 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 if (ep == NULL)
2256 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002257 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 if (val == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002259 if (mp->ma_keys->dk_usable <= 0) {
2260 /* Need to resize. */
2261 if (insertion_resize(mp) < 0)
2262 return NULL;
2263 ep = find_empty_slot(mp, key, hash, &value_addr);
2264 }
Benjamin Peterson00e98862013-03-07 22:16:29 -05002265 Py_INCREF(defaultobj);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002266 Py_INCREF(key);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002267 MAINTAIN_TRACKING(mp, key, defaultobj);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002268 ep->me_key = key;
2269 ep->me_hash = hash;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002270 *value_addr = defaultobj;
2271 val = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002272 mp->ma_keys->dk_usable--;
2273 mp->ma_used++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00002276}
2277
Benjamin Peterson00e98862013-03-07 22:16:29 -05002278static PyObject *
2279dict_setdefault(PyDictObject *mp, PyObject *args)
2280{
2281 PyObject *key, *val;
2282 PyObject *defaultobj = Py_None;
2283
2284 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2285 return NULL;
2286
Benjamin Peterson55898502013-03-08 08:36:49 -05002287 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002288 Py_XINCREF(val);
2289 return val;
2290}
Guido van Rossum164452c2000-08-08 16:12:54 +00002291
2292static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002293dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 PyDict_Clear((PyObject *)mp);
2296 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002297}
2298
Guido van Rossumba6ab842000-12-12 22:02:18 +00002299static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002300dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002301{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002302 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 PyObject *old_value, *old_key;
2304 PyObject *key, *deflt = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002305 PyDictKeyEntry *ep;
2306 PyObject **value_addr;
Guido van Rossume027d982002-04-12 15:11:59 +00002307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2309 return NULL;
2310 if (mp->ma_used == 0) {
2311 if (deflt) {
2312 Py_INCREF(deflt);
2313 return deflt;
2314 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07002315 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 return NULL;
2317 }
2318 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002319 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 hash = PyObject_Hash(key);
2321 if (hash == -1)
2322 return NULL;
2323 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002324 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 if (ep == NULL)
2326 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002327 old_value = *value_addr;
2328 if (old_value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 if (deflt) {
2330 Py_INCREF(deflt);
2331 return deflt;
2332 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07002333 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 return NULL;
2335 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002336 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002338 if (!_PyDict_HasSplitTable(mp)) {
2339 ENSURE_ALLOWS_DELETIONS(mp);
2340 old_key = ep->me_key;
2341 Py_INCREF(dummy);
2342 ep->me_key = dummy;
2343 Py_DECREF(old_key);
2344 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 return old_value;
Guido van Rossume027d982002-04-12 15:11:59 +00002346}
2347
2348static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002349dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002350{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002351 Py_hash_t i = 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002352 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002354
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 /* Allocate the result tuple before checking the size. Believe it
2357 * or not, this allocation could trigger a garbage collection which
2358 * could empty the dict, so if we checked the size first and that
2359 * happened, the result would be an infinite loop (searching for an
2360 * entry that no longer exists). Note that the usual popitem()
2361 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2362 * tuple away if the dict *is* empty isn't a significant
2363 * inefficiency -- possible, but unlikely in practice.
2364 */
2365 res = PyTuple_New(2);
2366 if (res == NULL)
2367 return NULL;
2368 if (mp->ma_used == 0) {
2369 Py_DECREF(res);
2370 PyErr_SetString(PyExc_KeyError,
2371 "popitem(): dictionary is empty");
2372 return NULL;
2373 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002374 /* Convert split table to combined table */
2375 if (mp->ma_keys->dk_lookup == lookdict_split) {
2376 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2377 Py_DECREF(res);
2378 return NULL;
2379 }
2380 }
2381 ENSURE_ALLOWS_DELETIONS(mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 /* Set ep to "the first" dict entry with a value. We abuse the hash
2383 * field of slot 0 to hold a search finger:
2384 * If slot 0 has a value, use slot 0.
2385 * Else slot 0 is being used to hold a search finger,
2386 * and we use its hash value as the first index to look.
2387 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002388 ep = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 if (ep->me_value == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002390 Py_ssize_t mask = DK_MASK(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 i = ep->me_hash;
2392 /* The hash field may be a real hash value, or it may be a
2393 * legit search finger, or it may be a once-legit search
2394 * finger that's out of bounds now because it wrapped around
2395 * or the table shrunk -- simply make sure it's in bounds now.
2396 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002397 if (i > mask || i < 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 i = 1; /* skip slot 0 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002399 while ((ep = &mp->ma_keys->dk_entries[i])->me_value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002401 if (i > mask)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 i = 1;
2403 }
2404 }
2405 PyTuple_SET_ITEM(res, 0, ep->me_key);
2406 PyTuple_SET_ITEM(res, 1, ep->me_value);
2407 Py_INCREF(dummy);
2408 ep->me_key = dummy;
2409 ep->me_value = NULL;
2410 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002411 assert(mp->ma_keys->dk_entries[0].me_value == NULL);
2412 mp->ma_keys->dk_entries[0].me_hash = i + 1; /* next place to start */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002414}
2415
Jeremy Hylton8caad492000-06-23 14:18:11 +00002416static int
2417dict_traverse(PyObject *op, visitproc visit, void *arg)
2418{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002419 Py_ssize_t i, n;
2420 PyDictObject *mp = (PyDictObject *)op;
2421 if (mp->ma_keys->dk_lookup == lookdict) {
2422 for (i = 0; i < DK_SIZE(mp->ma_keys); i++) {
2423 if (mp->ma_keys->dk_entries[i].me_value != NULL) {
2424 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2425 Py_VISIT(mp->ma_keys->dk_entries[i].me_key);
2426 }
2427 }
2428 } else {
2429 if (mp->ma_values != NULL) {
2430 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2431 Py_VISIT(mp->ma_values[i]);
2432 }
2433 }
2434 else {
2435 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2436 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2437 }
2438 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 }
2440 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002441}
2442
2443static int
2444dict_tp_clear(PyObject *op)
2445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 PyDict_Clear(op);
2447 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002448}
2449
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002450static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002451
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002452static PyObject *
2453dict_sizeof(PyDictObject *mp)
2454{
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002455 Py_ssize_t size, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002456
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002457 size = DK_SIZE(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 res = sizeof(PyDictObject);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002459 if (mp->ma_values)
2460 res += size * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002461 /* If the dictionary is split, the keys portion is accounted-for
2462 in the type object. */
2463 if (mp->ma_keys->dk_refcnt == 1)
2464 res += sizeof(PyDictKeysObject) + (size-1) * sizeof(PyDictKeyEntry);
2465 return PyLong_FromSsize_t(res);
2466}
2467
2468Py_ssize_t
2469_PyDict_KeysSize(PyDictKeysObject *keys)
2470{
2471 return sizeof(PyDictKeysObject) + (DK_SIZE(keys)-1) * sizeof(PyDictKeyEntry);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002472}
2473
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002474PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2475
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002476PyDoc_STRVAR(sizeof__doc__,
2477"D.__sizeof__() -> size of D in memory, in bytes");
2478
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002479PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002480"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002481
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002482PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002483"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 +00002484
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002485PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002486"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002487If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002488
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002489PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002490"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000024912-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002492
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002493PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04002494"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
2495If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
2496If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
2497In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002498
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002499PyDoc_STRVAR(fromkeys__doc__,
2500"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
2501v defaults to None.");
2502
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002503PyDoc_STRVAR(clear__doc__,
2504"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002505
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002506PyDoc_STRVAR(copy__doc__,
2507"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002508
Guido van Rossumb90c8482007-02-10 01:11:45 +00002509/* Forward */
2510static PyObject *dictkeys_new(PyObject *);
2511static PyObject *dictitems_new(PyObject *);
2512static PyObject *dictvalues_new(PyObject *);
2513
Guido van Rossum45c85d12007-07-27 16:31:40 +00002514PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002516PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002518PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002520
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002521static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002522 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2524 getitem__doc__},
2525 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2526 sizeof__doc__},
2527 {"get", (PyCFunction)dict_get, METH_VARARGS,
2528 get__doc__},
2529 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2530 setdefault_doc__},
2531 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2532 pop__doc__},
2533 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2534 popitem__doc__},
2535 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2536 keys__doc__},
2537 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2538 items__doc__},
2539 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2540 values__doc__},
2541 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2542 update__doc__},
2543 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2544 fromkeys__doc__},
2545 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2546 clear__doc__},
2547 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2548 copy__doc__},
2549 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002550};
2551
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002552/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002553int
2554PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002555{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002556 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002558 PyDictKeyEntry *ep;
2559 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002562 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 hash = PyObject_Hash(key);
2564 if (hash == -1)
2565 return -1;
2566 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002567 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2568 return (ep == NULL) ? -1 : (*value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002569}
2570
Thomas Wouterscf297e42007-02-23 15:07:44 +00002571/* Internal version of PyDict_Contains used when the hash value is already known */
2572int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002573_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002574{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002576 PyDictKeyEntry *ep;
2577 PyObject **value_addr;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002578
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002579 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2580 return (ep == NULL) ? -1 : (*value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002581}
2582
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002583/* Hack to implement "key in dict" */
2584static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002585 0, /* sq_length */
2586 0, /* sq_concat */
2587 0, /* sq_repeat */
2588 0, /* sq_item */
2589 0, /* sq_slice */
2590 0, /* sq_ass_item */
2591 0, /* sq_ass_slice */
2592 PyDict_Contains, /* sq_contains */
2593 0, /* sq_inplace_concat */
2594 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002595};
2596
Guido van Rossum09e563a2001-05-01 12:10:21 +00002597static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002598dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2599{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002601 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 assert(type != NULL && type->tp_alloc != NULL);
2604 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02002605 if (self == NULL)
2606 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002607 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002608
Victor Stinnera9f61a52013-07-16 22:17:26 +02002609 /* The object has been implicitly tracked by tp_alloc */
2610 if (type == &PyDict_Type)
2611 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002612
2613 d->ma_used = 0;
2614 d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
2615 if (d->ma_keys == NULL) {
2616 Py_DECREF(self);
2617 return NULL;
2618 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002620}
2621
Tim Peters25786c02001-09-02 08:22:48 +00002622static int
2623dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002626}
2627
Tim Peters6d6c1a32001-08-02 04:15:00 +00002628static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002629dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002630{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002632}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002633
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002634PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002635"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002636"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002637" (key, value) pairs\n"
2638"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002639" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002640" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002641" d[k] = v\n"
2642"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2643" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002644
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002645PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2647 "dict",
2648 sizeof(PyDictObject),
2649 0,
2650 (destructor)dict_dealloc, /* tp_dealloc */
2651 0, /* tp_print */
2652 0, /* tp_getattr */
2653 0, /* tp_setattr */
2654 0, /* tp_reserved */
2655 (reprfunc)dict_repr, /* tp_repr */
2656 0, /* tp_as_number */
2657 &dict_as_sequence, /* tp_as_sequence */
2658 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002659 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 0, /* tp_call */
2661 0, /* tp_str */
2662 PyObject_GenericGetAttr, /* tp_getattro */
2663 0, /* tp_setattro */
2664 0, /* tp_as_buffer */
2665 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2666 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2667 dictionary_doc, /* tp_doc */
2668 dict_traverse, /* tp_traverse */
2669 dict_tp_clear, /* tp_clear */
2670 dict_richcompare, /* tp_richcompare */
2671 0, /* tp_weaklistoffset */
2672 (getiterfunc)dict_iter, /* tp_iter */
2673 0, /* tp_iternext */
2674 mapp_methods, /* tp_methods */
2675 0, /* tp_members */
2676 0, /* tp_getset */
2677 0, /* tp_base */
2678 0, /* tp_dict */
2679 0, /* tp_descr_get */
2680 0, /* tp_descr_set */
2681 0, /* tp_dictoffset */
2682 dict_init, /* tp_init */
2683 PyType_GenericAlloc, /* tp_alloc */
2684 dict_new, /* tp_new */
2685 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002686};
2687
Victor Stinner3c1e4812012-03-26 22:10:51 +02002688PyObject *
2689_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
2690{
2691 PyObject *kv;
2692 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02002693 if (kv == NULL) {
2694 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002695 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02002696 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02002697 return PyDict_GetItem(dp, kv);
2698}
2699
Guido van Rossum3cca2451997-05-16 14:23:33 +00002700/* For backward compatibility with old dictionary interface */
2701
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002702PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002703PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002704{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 PyObject *kv, *rv;
2706 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02002707 if (kv == NULL) {
2708 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02002710 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 rv = PyDict_GetItem(v, kv);
2712 Py_DECREF(kv);
2713 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002714}
2715
2716int
Victor Stinner3c1e4812012-03-26 22:10:51 +02002717_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
2718{
2719 PyObject *kv;
2720 kv = _PyUnicode_FromId(key); /* borrowed */
2721 if (kv == NULL)
2722 return -1;
2723 return PyDict_SetItem(v, kv, item);
2724}
2725
2726int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002727PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 PyObject *kv;
2730 int err;
2731 kv = PyUnicode_FromString(key);
2732 if (kv == NULL)
2733 return -1;
2734 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2735 err = PyDict_SetItem(v, kv, item);
2736 Py_DECREF(kv);
2737 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002738}
2739
2740int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01002741_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
2742{
2743 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
2744 if (kv == NULL)
2745 return -1;
2746 return PyDict_DelItem(v, kv);
2747}
2748
2749int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002750PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 PyObject *kv;
2753 int err;
2754 kv = PyUnicode_FromString(key);
2755 if (kv == NULL)
2756 return -1;
2757 err = PyDict_DelItem(v, kv);
2758 Py_DECREF(kv);
2759 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002760}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002761
Raymond Hettinger019a1482004-03-18 02:41:19 +00002762/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002763
2764typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 PyObject_HEAD
2766 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2767 Py_ssize_t di_used;
2768 Py_ssize_t di_pos;
2769 PyObject* di_result; /* reusable result tuple for iteritems */
2770 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002771} dictiterobject;
2772
2773static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002774dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002776 dictiterobject *di;
2777 di = PyObject_GC_New(dictiterobject, itertype);
2778 if (di == NULL)
2779 return NULL;
2780 Py_INCREF(dict);
2781 di->di_dict = dict;
2782 di->di_used = dict->ma_used;
2783 di->di_pos = 0;
2784 di->len = dict->ma_used;
2785 if (itertype == &PyDictIterItem_Type) {
2786 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2787 if (di->di_result == NULL) {
2788 Py_DECREF(di);
2789 return NULL;
2790 }
2791 }
2792 else
2793 di->di_result = NULL;
2794 _PyObject_GC_TRACK(di);
2795 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002796}
2797
2798static void
2799dictiter_dealloc(dictiterobject *di)
2800{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 Py_XDECREF(di->di_dict);
2802 Py_XDECREF(di->di_result);
2803 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002804}
2805
2806static int
2807dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2808{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 Py_VISIT(di->di_dict);
2810 Py_VISIT(di->di_result);
2811 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002812}
2813
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002814static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002815dictiter_len(dictiterobject *di)
2816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 Py_ssize_t len = 0;
2818 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2819 len = di->len;
2820 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002821}
2822
Guido van Rossumb90c8482007-02-10 01:11:45 +00002823PyDoc_STRVAR(length_hint_doc,
2824 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002825
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002826static PyObject *
2827dictiter_reduce(dictiterobject *di);
2828
2829PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2830
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002831static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2833 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002834 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
2835 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002837};
2838
Raymond Hettinger019a1482004-03-18 02:41:19 +00002839static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 PyObject *key;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002842 Py_ssize_t i, mask, offset;
2843 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002845 PyObject **value_ptr;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 if (d == NULL)
2848 return NULL;
2849 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 if (di->di_used != d->ma_used) {
2852 PyErr_SetString(PyExc_RuntimeError,
2853 "dictionary changed size during iteration");
2854 di->di_used = -1; /* Make this state sticky */
2855 return NULL;
2856 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002858 i = di->di_pos;
2859 if (i < 0)
2860 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002861 k = d->ma_keys;
2862 if (d->ma_values) {
2863 value_ptr = &d->ma_values[i];
2864 offset = sizeof(PyObject *);
2865 }
2866 else {
2867 value_ptr = &k->dk_entries[i].me_value;
2868 offset = sizeof(PyDictKeyEntry);
2869 }
2870 mask = DK_SIZE(k)-1;
2871 while (i <= mask && *value_ptr == NULL) {
2872 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002874 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 di->di_pos = i+1;
2876 if (i > mask)
2877 goto fail;
2878 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002879 key = k->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 Py_INCREF(key);
2881 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002882
2883fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 Py_DECREF(d);
2885 di->di_dict = NULL;
2886 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002887}
2888
Raymond Hettinger019a1482004-03-18 02:41:19 +00002889PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2891 "dict_keyiterator", /* tp_name */
2892 sizeof(dictiterobject), /* tp_basicsize */
2893 0, /* tp_itemsize */
2894 /* methods */
2895 (destructor)dictiter_dealloc, /* tp_dealloc */
2896 0, /* tp_print */
2897 0, /* tp_getattr */
2898 0, /* tp_setattr */
2899 0, /* tp_reserved */
2900 0, /* tp_repr */
2901 0, /* tp_as_number */
2902 0, /* tp_as_sequence */
2903 0, /* tp_as_mapping */
2904 0, /* tp_hash */
2905 0, /* tp_call */
2906 0, /* tp_str */
2907 PyObject_GenericGetAttr, /* tp_getattro */
2908 0, /* tp_setattro */
2909 0, /* tp_as_buffer */
2910 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2911 0, /* tp_doc */
2912 (traverseproc)dictiter_traverse, /* tp_traverse */
2913 0, /* tp_clear */
2914 0, /* tp_richcompare */
2915 0, /* tp_weaklistoffset */
2916 PyObject_SelfIter, /* tp_iter */
2917 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2918 dictiter_methods, /* tp_methods */
2919 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002920};
2921
2922static PyObject *dictiter_iternextvalue(dictiterobject *di)
2923{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002924 PyObject *value;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002925 Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002927 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 if (d == NULL)
2930 return NULL;
2931 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002933 if (di->di_used != d->ma_used) {
2934 PyErr_SetString(PyExc_RuntimeError,
2935 "dictionary changed size during iteration");
2936 di->di_used = -1; /* Make this state sticky */
2937 return NULL;
2938 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002940 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002941 mask = DK_SIZE(d->ma_keys)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002942 if (i < 0 || i > mask)
2943 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002944 if (d->ma_values) {
2945 value_ptr = &d->ma_values[i];
2946 offset = sizeof(PyObject *);
2947 }
2948 else {
2949 value_ptr = &d->ma_keys->dk_entries[i].me_value;
2950 offset = sizeof(PyDictKeyEntry);
2951 }
2952 while (i <= mask && *value_ptr == NULL) {
2953 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 i++;
2955 if (i > mask)
2956 goto fail;
2957 }
2958 di->di_pos = i+1;
2959 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002960 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961 Py_INCREF(value);
2962 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002963
2964fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002965 Py_DECREF(d);
2966 di->di_dict = NULL;
2967 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002968}
2969
2970PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2972 "dict_valueiterator", /* tp_name */
2973 sizeof(dictiterobject), /* tp_basicsize */
2974 0, /* tp_itemsize */
2975 /* methods */
2976 (destructor)dictiter_dealloc, /* tp_dealloc */
2977 0, /* tp_print */
2978 0, /* tp_getattr */
2979 0, /* tp_setattr */
2980 0, /* tp_reserved */
2981 0, /* tp_repr */
2982 0, /* tp_as_number */
2983 0, /* tp_as_sequence */
2984 0, /* tp_as_mapping */
2985 0, /* tp_hash */
2986 0, /* tp_call */
2987 0, /* tp_str */
2988 PyObject_GenericGetAttr, /* tp_getattro */
2989 0, /* tp_setattro */
2990 0, /* tp_as_buffer */
2991 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2992 0, /* tp_doc */
2993 (traverseproc)dictiter_traverse, /* tp_traverse */
2994 0, /* tp_clear */
2995 0, /* tp_richcompare */
2996 0, /* tp_weaklistoffset */
2997 PyObject_SelfIter, /* tp_iter */
2998 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2999 dictiter_methods, /* tp_methods */
3000 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003001};
3002
3003static PyObject *dictiter_iternextitem(dictiterobject *di)
3004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005 PyObject *key, *value, *result = di->di_result;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003006 Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003007 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003008 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003010 if (d == NULL)
3011 return NULL;
3012 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014 if (di->di_used != d->ma_used) {
3015 PyErr_SetString(PyExc_RuntimeError,
3016 "dictionary changed size during iteration");
3017 di->di_used = -1; /* Make this state sticky */
3018 return NULL;
3019 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 i = di->di_pos;
3022 if (i < 0)
3023 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003024 mask = DK_SIZE(d->ma_keys)-1;
3025 if (d->ma_values) {
3026 value_ptr = &d->ma_values[i];
3027 offset = sizeof(PyObject *);
3028 }
3029 else {
3030 value_ptr = &d->ma_keys->dk_entries[i].me_value;
3031 offset = sizeof(PyDictKeyEntry);
3032 }
3033 while (i <= mask && *value_ptr == NULL) {
3034 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003036 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 di->di_pos = i+1;
3038 if (i > mask)
3039 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 if (result->ob_refcnt == 1) {
3042 Py_INCREF(result);
3043 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3044 Py_DECREF(PyTuple_GET_ITEM(result, 1));
3045 } else {
3046 result = PyTuple_New(2);
3047 if (result == NULL)
3048 return NULL;
3049 }
3050 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003051 key = d->ma_keys->dk_entries[i].me_key;
3052 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003053 Py_INCREF(key);
3054 Py_INCREF(value);
3055 PyTuple_SET_ITEM(result, 0, key);
3056 PyTuple_SET_ITEM(result, 1, value);
3057 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003058
3059fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003060 Py_DECREF(d);
3061 di->di_dict = NULL;
3062 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003063}
3064
3065PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3067 "dict_itemiterator", /* tp_name */
3068 sizeof(dictiterobject), /* tp_basicsize */
3069 0, /* tp_itemsize */
3070 /* methods */
3071 (destructor)dictiter_dealloc, /* tp_dealloc */
3072 0, /* tp_print */
3073 0, /* tp_getattr */
3074 0, /* tp_setattr */
3075 0, /* tp_reserved */
3076 0, /* tp_repr */
3077 0, /* tp_as_number */
3078 0, /* tp_as_sequence */
3079 0, /* tp_as_mapping */
3080 0, /* tp_hash */
3081 0, /* tp_call */
3082 0, /* tp_str */
3083 PyObject_GenericGetAttr, /* tp_getattro */
3084 0, /* tp_setattro */
3085 0, /* tp_as_buffer */
3086 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3087 0, /* tp_doc */
3088 (traverseproc)dictiter_traverse, /* tp_traverse */
3089 0, /* tp_clear */
3090 0, /* tp_richcompare */
3091 0, /* tp_weaklistoffset */
3092 PyObject_SelfIter, /* tp_iter */
3093 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3094 dictiter_methods, /* tp_methods */
3095 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003096};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003097
3098
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003099static PyObject *
3100dictiter_reduce(dictiterobject *di)
3101{
3102 PyObject *list;
3103 dictiterobject tmp;
3104
3105 list = PyList_New(0);
3106 if (!list)
3107 return NULL;
3108
3109 /* copy the itertor state */
3110 tmp = *di;
3111 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003112
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003113 /* iterate the temporary into a list */
3114 for(;;) {
3115 PyObject *element = 0;
3116 if (Py_TYPE(di) == &PyDictIterItem_Type)
3117 element = dictiter_iternextitem(&tmp);
3118 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3119 element = dictiter_iternextkey(&tmp);
3120 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3121 element = dictiter_iternextvalue(&tmp);
3122 else
3123 assert(0);
3124 if (element) {
3125 if (PyList_Append(list, element)) {
3126 Py_DECREF(element);
3127 Py_DECREF(list);
3128 Py_XDECREF(tmp.di_dict);
3129 return NULL;
3130 }
3131 Py_DECREF(element);
3132 } else
3133 break;
3134 }
3135 Py_XDECREF(tmp.di_dict);
3136 /* check for error */
3137 if (tmp.di_dict != NULL) {
3138 /* we have an error */
3139 Py_DECREF(list);
3140 return NULL;
3141 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003142 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003143}
3144
Guido van Rossum3ac67412007-02-10 18:55:06 +00003145/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003146/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003147/***********************************************/
3148
Guido van Rossumb90c8482007-02-10 01:11:45 +00003149/* The instance lay-out is the same for all three; but the type differs. */
3150
3151typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 PyObject_HEAD
3153 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003154} dictviewobject;
3155
3156
3157static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00003158dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003160 Py_XDECREF(dv->dv_dict);
3161 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003162}
3163
3164static int
3165dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
3166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003167 Py_VISIT(dv->dv_dict);
3168 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003169}
3170
Guido van Rossum83825ac2007-02-10 04:54:19 +00003171static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00003172dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174 Py_ssize_t len = 0;
3175 if (dv->dv_dict != NULL)
3176 len = dv->dv_dict->ma_used;
3177 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003178}
3179
3180static PyObject *
3181dictview_new(PyObject *dict, PyTypeObject *type)
3182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 dictviewobject *dv;
3184 if (dict == NULL) {
3185 PyErr_BadInternalCall();
3186 return NULL;
3187 }
3188 if (!PyDict_Check(dict)) {
3189 /* XXX Get rid of this restriction later */
3190 PyErr_Format(PyExc_TypeError,
3191 "%s() requires a dict argument, not '%s'",
3192 type->tp_name, dict->ob_type->tp_name);
3193 return NULL;
3194 }
3195 dv = PyObject_GC_New(dictviewobject, type);
3196 if (dv == NULL)
3197 return NULL;
3198 Py_INCREF(dict);
3199 dv->dv_dict = (PyDictObject *)dict;
3200 _PyObject_GC_TRACK(dv);
3201 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003202}
3203
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003204/* TODO(guido): The views objects are not complete:
3205
3206 * support more set operations
3207 * support arbitrary mappings?
3208 - either these should be static or exported in dictobject.h
3209 - if public then they should probably be in builtins
3210*/
3211
Guido van Rossumaac530c2007-08-24 22:33:45 +00003212/* Return 1 if self is a subset of other, iterating over self;
3213 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003214static int
3215all_contained_in(PyObject *self, PyObject *other)
3216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 PyObject *iter = PyObject_GetIter(self);
3218 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003220 if (iter == NULL)
3221 return -1;
3222 for (;;) {
3223 PyObject *next = PyIter_Next(iter);
3224 if (next == NULL) {
3225 if (PyErr_Occurred())
3226 ok = -1;
3227 break;
3228 }
3229 ok = PySequence_Contains(other, next);
3230 Py_DECREF(next);
3231 if (ok <= 0)
3232 break;
3233 }
3234 Py_DECREF(iter);
3235 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003236}
3237
3238static PyObject *
3239dictview_richcompare(PyObject *self, PyObject *other, int op)
3240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 Py_ssize_t len_self, len_other;
3242 int ok;
3243 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 assert(self != NULL);
3246 assert(PyDictViewSet_Check(self));
3247 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003248
Brian Curtindfc80e32011-08-10 20:28:54 -05003249 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3250 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 len_self = PyObject_Size(self);
3253 if (len_self < 0)
3254 return NULL;
3255 len_other = PyObject_Size(other);
3256 if (len_other < 0)
3257 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003259 ok = 0;
3260 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 case Py_NE:
3263 case Py_EQ:
3264 if (len_self == len_other)
3265 ok = all_contained_in(self, other);
3266 if (op == Py_NE && ok >= 0)
3267 ok = !ok;
3268 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 case Py_LT:
3271 if (len_self < len_other)
3272 ok = all_contained_in(self, other);
3273 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 case Py_LE:
3276 if (len_self <= len_other)
3277 ok = all_contained_in(self, other);
3278 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 case Py_GT:
3281 if (len_self > len_other)
3282 ok = all_contained_in(other, self);
3283 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 case Py_GE:
3286 if (len_self >= len_other)
3287 ok = all_contained_in(other, self);
3288 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 }
3291 if (ok < 0)
3292 return NULL;
3293 result = ok ? Py_True : Py_False;
3294 Py_INCREF(result);
3295 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003296}
3297
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003298static PyObject *
3299dictview_repr(dictviewobject *dv)
3300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 PyObject *seq;
3302 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 seq = PySequence_List((PyObject *)dv);
3305 if (seq == NULL)
3306 return NULL;
3307
3308 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3309 Py_DECREF(seq);
3310 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003311}
3312
Guido van Rossum3ac67412007-02-10 18:55:06 +00003313/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003314
3315static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003316dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 if (dv->dv_dict == NULL) {
3319 Py_RETURN_NONE;
3320 }
3321 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003322}
3323
3324static int
3325dictkeys_contains(dictviewobject *dv, PyObject *obj)
3326{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 if (dv->dv_dict == NULL)
3328 return 0;
3329 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003330}
3331
Guido van Rossum83825ac2007-02-10 04:54:19 +00003332static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 (lenfunc)dictview_len, /* sq_length */
3334 0, /* sq_concat */
3335 0, /* sq_repeat */
3336 0, /* sq_item */
3337 0, /* sq_slice */
3338 0, /* sq_ass_item */
3339 0, /* sq_ass_slice */
3340 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003341};
3342
Guido van Rossum523259b2007-08-24 23:41:22 +00003343static PyObject*
3344dictviews_sub(PyObject* self, PyObject *other)
3345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 PyObject *result = PySet_New(self);
3347 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003348 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 if (result == NULL)
3351 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003352
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003353 tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003354 if (tmp == NULL) {
3355 Py_DECREF(result);
3356 return NULL;
3357 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 Py_DECREF(tmp);
3360 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003361}
3362
3363static PyObject*
3364dictviews_and(PyObject* self, PyObject *other)
3365{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003366 PyObject *result = PySet_New(self);
3367 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003368 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 if (result == NULL)
3371 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003372
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003373 tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374 if (tmp == NULL) {
3375 Py_DECREF(result);
3376 return NULL;
3377 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 Py_DECREF(tmp);
3380 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003381}
3382
3383static PyObject*
3384dictviews_or(PyObject* self, PyObject *other)
3385{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003386 PyObject *result = PySet_New(self);
3387 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003388 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003390 if (result == NULL)
3391 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003392
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003393 tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 if (tmp == NULL) {
3395 Py_DECREF(result);
3396 return NULL;
3397 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 Py_DECREF(tmp);
3400 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003401}
3402
3403static PyObject*
3404dictviews_xor(PyObject* self, PyObject *other)
3405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 PyObject *result = PySet_New(self);
3407 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003408 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003410 if (result == NULL)
3411 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003412
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003413 tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003414 other);
3415 if (tmp == NULL) {
3416 Py_DECREF(result);
3417 return NULL;
3418 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003420 Py_DECREF(tmp);
3421 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003422}
3423
3424static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003425 0, /*nb_add*/
3426 (binaryfunc)dictviews_sub, /*nb_subtract*/
3427 0, /*nb_multiply*/
3428 0, /*nb_remainder*/
3429 0, /*nb_divmod*/
3430 0, /*nb_power*/
3431 0, /*nb_negative*/
3432 0, /*nb_positive*/
3433 0, /*nb_absolute*/
3434 0, /*nb_bool*/
3435 0, /*nb_invert*/
3436 0, /*nb_lshift*/
3437 0, /*nb_rshift*/
3438 (binaryfunc)dictviews_and, /*nb_and*/
3439 (binaryfunc)dictviews_xor, /*nb_xor*/
3440 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003441};
3442
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003443static PyObject*
3444dictviews_isdisjoint(PyObject *self, PyObject *other)
3445{
3446 PyObject *it;
3447 PyObject *item = NULL;
3448
3449 if (self == other) {
3450 if (dictview_len((dictviewobject *)self) == 0)
3451 Py_RETURN_TRUE;
3452 else
3453 Py_RETURN_FALSE;
3454 }
3455
3456 /* Iterate over the shorter object (only if other is a set,
3457 * because PySequence_Contains may be expensive otherwise): */
3458 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
3459 Py_ssize_t len_self = dictview_len((dictviewobject *)self);
3460 Py_ssize_t len_other = PyObject_Size(other);
3461 if (len_other == -1)
3462 return NULL;
3463
3464 if ((len_other > len_self)) {
3465 PyObject *tmp = other;
3466 other = self;
3467 self = tmp;
3468 }
3469 }
3470
3471 it = PyObject_GetIter(other);
3472 if (it == NULL)
3473 return NULL;
3474
3475 while ((item = PyIter_Next(it)) != NULL) {
3476 int contains = PySequence_Contains(self, item);
3477 Py_DECREF(item);
3478 if (contains == -1) {
3479 Py_DECREF(it);
3480 return NULL;
3481 }
3482
3483 if (contains) {
3484 Py_DECREF(it);
3485 Py_RETURN_FALSE;
3486 }
3487 }
3488 Py_DECREF(it);
3489 if (PyErr_Occurred())
3490 return NULL; /* PyIter_Next raised an exception. */
3491 Py_RETURN_TRUE;
3492}
3493
3494PyDoc_STRVAR(isdisjoint_doc,
3495"Return True if the view and the given iterable have a null intersection.");
3496
Guido van Rossumb90c8482007-02-10 01:11:45 +00003497static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003498 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3499 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003500 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003501};
3502
3503PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3505 "dict_keys", /* tp_name */
3506 sizeof(dictviewobject), /* tp_basicsize */
3507 0, /* tp_itemsize */
3508 /* methods */
3509 (destructor)dictview_dealloc, /* tp_dealloc */
3510 0, /* tp_print */
3511 0, /* tp_getattr */
3512 0, /* tp_setattr */
3513 0, /* tp_reserved */
3514 (reprfunc)dictview_repr, /* tp_repr */
3515 &dictviews_as_number, /* tp_as_number */
3516 &dictkeys_as_sequence, /* tp_as_sequence */
3517 0, /* tp_as_mapping */
3518 0, /* tp_hash */
3519 0, /* tp_call */
3520 0, /* tp_str */
3521 PyObject_GenericGetAttr, /* tp_getattro */
3522 0, /* tp_setattro */
3523 0, /* tp_as_buffer */
3524 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3525 0, /* tp_doc */
3526 (traverseproc)dictview_traverse, /* tp_traverse */
3527 0, /* tp_clear */
3528 dictview_richcompare, /* tp_richcompare */
3529 0, /* tp_weaklistoffset */
3530 (getiterfunc)dictkeys_iter, /* tp_iter */
3531 0, /* tp_iternext */
3532 dictkeys_methods, /* tp_methods */
3533 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003534};
3535
3536static PyObject *
3537dictkeys_new(PyObject *dict)
3538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003539 return dictview_new(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003540}
3541
Guido van Rossum3ac67412007-02-10 18:55:06 +00003542/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003543
3544static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003545dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003547 if (dv->dv_dict == NULL) {
3548 Py_RETURN_NONE;
3549 }
3550 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003551}
3552
3553static int
3554dictitems_contains(dictviewobject *dv, PyObject *obj)
3555{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003556 PyObject *key, *value, *found;
3557 if (dv->dv_dict == NULL)
3558 return 0;
3559 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3560 return 0;
3561 key = PyTuple_GET_ITEM(obj, 0);
3562 value = PyTuple_GET_ITEM(obj, 1);
3563 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3564 if (found == NULL) {
3565 if (PyErr_Occurred())
3566 return -1;
3567 return 0;
3568 }
3569 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003570}
3571
Guido van Rossum83825ac2007-02-10 04:54:19 +00003572static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003573 (lenfunc)dictview_len, /* sq_length */
3574 0, /* sq_concat */
3575 0, /* sq_repeat */
3576 0, /* sq_item */
3577 0, /* sq_slice */
3578 0, /* sq_ass_item */
3579 0, /* sq_ass_slice */
3580 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003581};
3582
Guido van Rossumb90c8482007-02-10 01:11:45 +00003583static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003584 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3585 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003586 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003587};
3588
3589PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003590 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3591 "dict_items", /* tp_name */
3592 sizeof(dictviewobject), /* tp_basicsize */
3593 0, /* tp_itemsize */
3594 /* methods */
3595 (destructor)dictview_dealloc, /* tp_dealloc */
3596 0, /* tp_print */
3597 0, /* tp_getattr */
3598 0, /* tp_setattr */
3599 0, /* tp_reserved */
3600 (reprfunc)dictview_repr, /* tp_repr */
3601 &dictviews_as_number, /* tp_as_number */
3602 &dictitems_as_sequence, /* tp_as_sequence */
3603 0, /* tp_as_mapping */
3604 0, /* tp_hash */
3605 0, /* tp_call */
3606 0, /* tp_str */
3607 PyObject_GenericGetAttr, /* tp_getattro */
3608 0, /* tp_setattro */
3609 0, /* tp_as_buffer */
3610 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3611 0, /* tp_doc */
3612 (traverseproc)dictview_traverse, /* tp_traverse */
3613 0, /* tp_clear */
3614 dictview_richcompare, /* tp_richcompare */
3615 0, /* tp_weaklistoffset */
3616 (getiterfunc)dictitems_iter, /* tp_iter */
3617 0, /* tp_iternext */
3618 dictitems_methods, /* tp_methods */
3619 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003620};
3621
3622static PyObject *
3623dictitems_new(PyObject *dict)
3624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003625 return dictview_new(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003626}
3627
Guido van Rossum3ac67412007-02-10 18:55:06 +00003628/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003629
3630static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003631dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003633 if (dv->dv_dict == NULL) {
3634 Py_RETURN_NONE;
3635 }
3636 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003637}
3638
Guido van Rossum83825ac2007-02-10 04:54:19 +00003639static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003640 (lenfunc)dictview_len, /* sq_length */
3641 0, /* sq_concat */
3642 0, /* sq_repeat */
3643 0, /* sq_item */
3644 0, /* sq_slice */
3645 0, /* sq_ass_item */
3646 0, /* sq_ass_slice */
3647 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003648};
3649
Guido van Rossumb90c8482007-02-10 01:11:45 +00003650static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003651 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003652};
3653
3654PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003655 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3656 "dict_values", /* tp_name */
3657 sizeof(dictviewobject), /* tp_basicsize */
3658 0, /* tp_itemsize */
3659 /* methods */
3660 (destructor)dictview_dealloc, /* tp_dealloc */
3661 0, /* tp_print */
3662 0, /* tp_getattr */
3663 0, /* tp_setattr */
3664 0, /* tp_reserved */
3665 (reprfunc)dictview_repr, /* tp_repr */
3666 0, /* tp_as_number */
3667 &dictvalues_as_sequence, /* tp_as_sequence */
3668 0, /* tp_as_mapping */
3669 0, /* tp_hash */
3670 0, /* tp_call */
3671 0, /* tp_str */
3672 PyObject_GenericGetAttr, /* tp_getattro */
3673 0, /* tp_setattro */
3674 0, /* tp_as_buffer */
3675 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3676 0, /* tp_doc */
3677 (traverseproc)dictview_traverse, /* tp_traverse */
3678 0, /* tp_clear */
3679 0, /* tp_richcompare */
3680 0, /* tp_weaklistoffset */
3681 (getiterfunc)dictvalues_iter, /* tp_iter */
3682 0, /* tp_iternext */
3683 dictvalues_methods, /* tp_methods */
3684 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003685};
3686
3687static PyObject *
3688dictvalues_new(PyObject *dict)
3689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003690 return dictview_new(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003691}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003692
3693/* Returns NULL if cannot allocate a new PyDictKeysObject,
3694 but does not set an error */
3695PyDictKeysObject *
3696_PyDict_NewKeysForClass(void)
3697{
3698 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_SPLIT);
3699 if (keys == NULL)
3700 PyErr_Clear();
3701 else
3702 keys->dk_lookup = lookdict_split;
3703 return keys;
3704}
3705
3706#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
3707
3708PyObject *
3709PyObject_GenericGetDict(PyObject *obj, void *context)
3710{
3711 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
3712 if (dictptr == NULL) {
3713 PyErr_SetString(PyExc_AttributeError,
3714 "This object has no __dict__");
3715 return NULL;
3716 }
3717 dict = *dictptr;
3718 if (dict == NULL) {
3719 PyTypeObject *tp = Py_TYPE(obj);
3720 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
3721 DK_INCREF(CACHED_KEYS(tp));
3722 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
3723 }
3724 else {
3725 *dictptr = dict = PyDict_New();
3726 }
3727 }
3728 Py_XINCREF(dict);
3729 return dict;
3730}
3731
3732int
3733_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
3734 PyObject *key, PyObject *value)
3735{
3736 PyObject *dict;
3737 int res;
3738 PyDictKeysObject *cached;
3739
3740 assert(dictptr != NULL);
3741 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
3742 assert(dictptr != NULL);
3743 dict = *dictptr;
3744 if (dict == NULL) {
3745 DK_INCREF(cached);
3746 dict = new_dict_with_shared_keys(cached);
3747 if (dict == NULL)
3748 return -1;
3749 *dictptr = dict;
3750 }
3751 if (value == NULL) {
3752 res = PyDict_DelItem(dict, key);
3753 if (cached != ((PyDictObject *)dict)->ma_keys) {
3754 CACHED_KEYS(tp) = NULL;
3755 DK_DECREF(cached);
3756 }
3757 } else {
3758 res = PyDict_SetItem(dict, key, value);
3759 if (cached != ((PyDictObject *)dict)->ma_keys) {
3760 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04003761 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003762 CACHED_KEYS(tp) = make_keys_shared(dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003763 } else {
3764 CACHED_KEYS(tp) = NULL;
3765 }
3766 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04003767 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
3768 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003769 }
3770 }
3771 } else {
3772 dict = *dictptr;
3773 if (dict == NULL) {
3774 dict = PyDict_New();
3775 if (dict == NULL)
3776 return -1;
3777 *dictptr = dict;
3778 }
3779 if (value == NULL) {
3780 res = PyDict_DelItem(dict, key);
3781 } else {
3782 res = PyDict_SetItem(dict, key, value);
3783 }
3784 }
3785 return res;
3786}
3787
3788void
3789_PyDictKeys_DecRef(PyDictKeysObject *keys)
3790{
3791 DK_DECREF(keys);
3792}
3793
3794
3795/* ARGSUSED */
3796static PyObject *
3797dummy_repr(PyObject *op)
3798{
3799 return PyUnicode_FromString("<dummy key>");
3800}
3801
3802/* ARGUSED */
3803static void
3804dummy_dealloc(PyObject* ignore)
3805{
3806 /* This should never get called, but we also don't want to SEGV if
3807 * we accidentally decref dummy-key out of existence.
3808 */
3809 Py_FatalError("deallocating <dummy key>");
3810}
3811
3812static PyTypeObject PyDictDummy_Type = {
3813 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3814 "<dummy key> type",
3815 0,
3816 0,
3817 dummy_dealloc, /*tp_dealloc*/ /*never called*/
3818 0, /*tp_print*/
3819 0, /*tp_getattr*/
3820 0, /*tp_setattr*/
3821 0, /*tp_reserved*/
3822 dummy_repr, /*tp_repr*/
3823 0, /*tp_as_number*/
3824 0, /*tp_as_sequence*/
3825 0, /*tp_as_mapping*/
3826 0, /*tp_hash */
3827 0, /*tp_call */
3828 0, /*tp_str */
3829 0, /*tp_getattro */
3830 0, /*tp_setattro */
3831 0, /*tp_as_buffer */
3832 Py_TPFLAGS_DEFAULT, /*tp_flags */
3833};
3834
3835static PyObject _dummy_struct = {
3836 _PyObject_EXTRA_INIT
3837 2, &PyDictDummy_Type
3838};
3839