blob: f1f31ed07c52bd0c93b37c33299a2fd418c28dd0 [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"
Eric Snow96c6af92015-05-29 22:21:39 -060070#include "dict-common.h"
Christian Heimes0ded5b52007-12-10 15:50:56 +000071#include "stringlib/eq.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000072
Larry Hastings61272b72014-01-07 12:41:53 -080073/*[clinic input]
Larry Hastingsc2047262014-01-25 20:43:29 -080074class dict "PyDictObject *" "&PyDict_Type"
Larry Hastings61272b72014-01-07 12:41:53 -080075[clinic start generated code]*/
Larry Hastings581ee362014-01-28 05:00:08 -080076/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f157a5a0ce9589d6]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -080077
Benjamin Peterson7d95e402012-04-23 11:24:50 -040078
79/*
80To ensure the lookup algorithm terminates, there must be at least one Unused
81slot (NULL key) in the table.
82To avoid slowing down lookups on a near-full table, we resize the table when
83it's USABLE_FRACTION (currently two-thirds) full.
84*/
Guido van Rossum16e93a81997-01-28 00:00:11 +000085
Tim Peterseb28ef22001-06-02 05:27:19 +000086#define PERTURB_SHIFT 5
87
Guido van Rossum16e93a81997-01-28 00:00:11 +000088/*
Tim Peterseb28ef22001-06-02 05:27:19 +000089Major subtleties ahead: Most hash schemes depend on having a "good" hash
90function, in the sense of simulating randomness. Python doesn't: its most
91important hash functions (for strings and ints) are very regular in common
92cases:
Tim Peters15d49292001-05-27 07:39:22 +000093
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000094 >>> map(hash, (0, 1, 2, 3))
95 [0, 1, 2, 3]
96 >>> map(hash, ("namea", "nameb", "namec", "named"))
97 [-1658398457, -1658398460, -1658398459, -1658398462]
98 >>>
Tim Peters15d49292001-05-27 07:39:22 +000099
Tim Peterseb28ef22001-06-02 05:27:19 +0000100This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
101the low-order i bits as the initial table index is extremely fast, and there
102are no collisions at all for dicts indexed by a contiguous range of ints.
103The same is approximately true when keys are "consecutive" strings. So this
104gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +0000105
Tim Peterseb28ef22001-06-02 05:27:19 +0000106OTOH, when collisions occur, the tendency to fill contiguous slices of the
107hash table makes a good collision resolution strategy crucial. Taking only
108the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000110their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
111 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +0000112
Tim Peterseb28ef22001-06-02 05:27:19 +0000113But catering to unusual cases should not slow the usual ones, so we just take
114the last i bits anyway. It's up to collision resolution to do the rest. If
115we *usually* find the key we're looking for on the first try (and, it turns
116out, we usually do -- the table load factor is kept under 2/3, so the odds
117are solidly in our favor), then it makes best sense to keep the initial index
118computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +0000119
Tim Peterseb28ef22001-06-02 05:27:19 +0000120The first half of collision resolution is to visit table indices via this
121recurrence:
Tim Peters15d49292001-05-27 07:39:22 +0000122
Tim Peterseb28ef22001-06-02 05:27:19 +0000123 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +0000124
Tim Peterseb28ef22001-06-02 05:27:19 +0000125For any initial j in range(2**i), repeating that 2**i times generates each
126int in range(2**i) exactly once (see any text on random-number generation for
127proof). By itself, this doesn't help much: like linear probing (setting
128j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
129order. This would be bad, except that's not the only thing we do, and it's
130actually *good* in the common cases where hash keys are consecutive. In an
131example that's really too small to make this entirely clear, for a table of
132size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +0000133
Tim Peterseb28ef22001-06-02 05:27:19 +0000134 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
135
136If two things come in at index 5, the first place we look after is index 2,
137not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
138Linear probing is deadly in this case because there the fixed probe order
139is the *same* as the order consecutive keys are likely to arrive. But it's
140extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
141and certain that consecutive hash codes do not.
142
143The other half of the strategy is to get the other bits of the hash code
144into play. This is done by initializing a (unsigned) vrbl "perturb" to the
145full hash code, and changing the recurrence to:
146
147 j = (5*j) + 1 + perturb;
148 perturb >>= PERTURB_SHIFT;
149 use j % 2**i as the next table index;
150
151Now the probe sequence depends (eventually) on every bit in the hash code,
152and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
153because it quickly magnifies small differences in the bits that didn't affect
154the initial index. Note that because perturb is unsigned, if the recurrence
155is executed often enough perturb eventually becomes and remains 0. At that
156point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
157that's certain to find an empty slot eventually (since it generates every int
158in range(2**i), and we make sure there's always at least one empty slot).
159
160Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
161small so that the high bits of the hash code continue to affect the probe
162sequence across iterations; but you want it large so that in really bad cases
163the high-order hash bits have an effect on early iterations. 5 was "the
164best" in minimizing total collisions across experiments Tim Peters ran (on
165both normal and pathological cases), but 4 and 6 weren't significantly worse.
166
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000167Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000168approach, using repeated multiplication by x in GF(2**n) where an irreducible
169polynomial for each table size was chosen such that x was a primitive root.
170Christian Tismer later extended that to use division by x instead, as an
171efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000172also gave excellent collision statistics, but was more expensive: two
173if-tests were required inside the loop; computing "the next" index took about
174the same number of operations but without as much potential parallelism
175(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
176above, and then shifting perturb can be done while the table index is being
177masked); and the PyDictObject struct required a member to hold the table's
178polynomial. In Tim's experiments the current scheme ran faster, produced
179equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000180
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000181*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000182
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400183/* Object used as dummy key to fill deleted entries
184 * This could be any unique object,
185 * use a custom type in order to minimise coupling.
186*/
187static PyObject _dummy_struct;
188
189#define dummy (&_dummy_struct)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000190
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000191#ifdef Py_REF_DEBUG
192PyObject *
193_PyDict_Dummy(void)
194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 return dummy;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000196}
197#endif
198
Fred Drake1bff34a2000-08-31 19:31:38 +0000199/* forward declarations */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400200static PyDictKeyEntry *lookdict(PyDictObject *mp, PyObject *key,
201 Py_hash_t hash, PyObject ***value_addr);
202static PyDictKeyEntry *lookdict_unicode(PyDictObject *mp, PyObject *key,
203 Py_hash_t hash, PyObject ***value_addr);
204static PyDictKeyEntry *
205lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
206 Py_hash_t hash, PyObject ***value_addr);
207static PyDictKeyEntry *lookdict_split(PyDictObject *mp, PyObject *key,
208 Py_hash_t hash, PyObject ***value_addr);
Fred Drake1bff34a2000-08-31 19:31:38 +0000209
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400210static int dictresize(PyDictObject *mp, Py_ssize_t minused);
Tim Petersdea48ec2001-05-22 20:40:22 +0000211
Raymond Hettinger43442782004-03-17 21:55:03 +0000212/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes2202f872008-02-06 14:31:34 +0000213#ifndef PyDict_MAXFREELIST
214#define PyDict_MAXFREELIST 80
215#endif
216static PyDictObject *free_list[PyDict_MAXFREELIST];
217static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000218
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300219#include "clinic/dictobject.c.h"
220
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100221int
222PyDict_ClearFreeList(void)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 PyDictObject *op;
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100225 int ret = numfree;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 while (numfree) {
227 op = free_list[--numfree];
228 assert(PyDict_CheckExact(op));
229 PyObject_GC_Del(op);
230 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100231 return ret;
232}
233
David Malcolm49526f42012-06-22 14:55:41 -0400234/* Print summary info about the state of the optimized allocator */
235void
236_PyDict_DebugMallocStats(FILE *out)
237{
238 _PyDebugAllocatorStats(out,
239 "free PyDictObject", numfree, sizeof(PyDictObject));
240}
241
242
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100243void
244PyDict_Fini(void)
245{
246 PyDict_ClearFreeList();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000247}
248
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200249#define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
250#define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
251
252#define DK_INCREF(dk) (DK_DEBUG_INCREF ++(dk)->dk_refcnt)
253#define DK_DECREF(dk) if (DK_DEBUG_DECREF (--(dk)->dk_refcnt) == 0) free_keys_object(dk)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400254#define DK_SIZE(dk) ((dk)->dk_size)
255#define DK_MASK(dk) (((dk)->dk_size)-1)
256#define IS_POWER_OF_2(x) (((x) & (x-1)) == 0)
257
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200258/* USABLE_FRACTION is the maximum dictionary load.
259 * Currently set to (2n+1)/3. Increasing this ratio makes dictionaries more
260 * dense resulting in more collisions. Decreasing it improves sparseness
261 * at the expense of spreading entries over more cache lines and at the
262 * cost of total memory consumed.
263 *
264 * USABLE_FRACTION must obey the following:
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400265 * (0 < USABLE_FRACTION(n) < n) for all n >= 2
266 *
267 * USABLE_FRACTION should be very quick to calculate.
268 * Fractions around 5/8 to 2/3 seem to work well in practice.
269 */
270
271/* Use (2n+1)/3 rather than 2n+3 because: it makes no difference for
272 * combined tables (the two fractions round to the same number n < ),
273 * but 2*4/3 is 2 whereas (2*4+1)/3 is 3 which potentially saves quite
274 * a lot of space for small, split tables */
275#define USABLE_FRACTION(n) ((((n) << 1)+1)/3)
276
277/* Alternative fraction that is otherwise close enough to (2n+1)/3 to make
278 * little difference. 8 * 2/3 == 8 * 5/8 == 5. 16 * 2/3 == 16 * 5/8 == 10.
279 * 32 * 2/3 = 21, 32 * 5/8 = 20.
280 * Its advantage is that it is faster to compute on machines with slow division.
281 * #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
282*/
283
Victor Stinnera9f61a52013-07-16 22:17:26 +0200284/* GROWTH_RATE. Growth rate upon hitting maximum load.
285 * Currently set to used*2 + capacity/2.
286 * This means that dicts double in size when growing without deletions,
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700287 * but have more head room when the number of deletions is on a par with the
288 * number of insertions.
289 * Raising this to used*4 doubles memory consumption depending on the size of
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200290 * the dictionary, but results in half the number of resizes, less effort to
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700291 * resize.
292 * GROWTH_RATE was set to used*4 up to version 3.2.
293 * GROWTH_RATE was set to used*2 in version 3.3.0
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200294 */
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700295#define GROWTH_RATE(d) (((d)->ma_used*2)+((d)->ma_keys->dk_size>>1))
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400296
297#define ENSURE_ALLOWS_DELETIONS(d) \
298 if ((d)->ma_keys->dk_lookup == lookdict_unicode_nodummy) { \
299 (d)->ma_keys->dk_lookup = lookdict_unicode; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000300 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400301
302/* This immutable, empty PyDictKeysObject is used for PyDict_Clear()
303 * (which cannot fail and thus can do no allocation).
304 */
305static PyDictKeysObject empty_keys_struct = {
306 2, /* dk_refcnt 1 for this struct, 1 for dummy_struct */
307 1, /* dk_size */
308 lookdict_split, /* dk_lookup */
309 0, /* dk_usable (immutable) */
310 {
311 { 0, 0, 0 } /* dk_entries (empty) */
312 }
313};
314
315static PyObject *empty_values[1] = { NULL };
316
317#define Py_EMPTY_KEYS &empty_keys_struct
318
319static PyDictKeysObject *new_keys_object(Py_ssize_t size)
320{
321 PyDictKeysObject *dk;
322 Py_ssize_t i;
323 PyDictKeyEntry *ep0;
324
325 assert(size >= PyDict_MINSIZE_SPLIT);
326 assert(IS_POWER_OF_2(size));
327 dk = PyMem_MALLOC(sizeof(PyDictKeysObject) +
328 sizeof(PyDictKeyEntry) * (size-1));
329 if (dk == NULL) {
330 PyErr_NoMemory();
331 return NULL;
332 }
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200333 DK_DEBUG_INCREF dk->dk_refcnt = 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400334 dk->dk_size = size;
335 dk->dk_usable = USABLE_FRACTION(size);
336 ep0 = &dk->dk_entries[0];
337 /* Hash value of slot 0 is used by popitem, so it must be initialized */
338 ep0->me_hash = 0;
339 for (i = 0; i < size; i++) {
340 ep0[i].me_key = NULL;
341 ep0[i].me_value = NULL;
342 }
343 dk->dk_lookup = lookdict_unicode_nodummy;
344 return dk;
345}
346
347static void
348free_keys_object(PyDictKeysObject *keys)
349{
350 PyDictKeyEntry *entries = &keys->dk_entries[0];
351 Py_ssize_t i, n;
352 for (i = 0, n = DK_SIZE(keys); i < n; i++) {
353 Py_XDECREF(entries[i].me_key);
354 Py_XDECREF(entries[i].me_value);
355 }
356 PyMem_FREE(keys);
357}
358
359#define new_values(size) PyMem_NEW(PyObject *, size)
360
361#define free_values(values) PyMem_FREE(values)
362
363/* Consumes a reference to the keys object */
364static PyObject *
365new_dict(PyDictKeysObject *keys, PyObject **values)
366{
367 PyDictObject *mp;
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200368 assert(keys != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 if (numfree) {
370 mp = free_list[--numfree];
371 assert (mp != NULL);
372 assert (Py_TYPE(mp) == &PyDict_Type);
373 _Py_NewReference((PyObject *)mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400375 else {
376 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
377 if (mp == NULL) {
378 DK_DECREF(keys);
379 free_values(values);
380 return NULL;
381 }
382 }
383 mp->ma_keys = keys;
384 mp->ma_values = values;
385 mp->ma_used = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000387}
388
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400389/* Consumes a reference to the keys object */
390static PyObject *
391new_dict_with_shared_keys(PyDictKeysObject *keys)
392{
393 PyObject **values;
394 Py_ssize_t i, size;
395
396 size = DK_SIZE(keys);
397 values = new_values(size);
398 if (values == NULL) {
399 DK_DECREF(keys);
400 return PyErr_NoMemory();
401 }
402 for (i = 0; i < size; i++) {
403 values[i] = NULL;
404 }
405 return new_dict(keys, values);
406}
407
408PyObject *
409PyDict_New(void)
410{
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200411 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_COMBINED);
412 if (keys == NULL)
413 return NULL;
414 return new_dict(keys, NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400415}
416
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000417/*
418The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000419This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000420Open addressing is preferred over chaining since the link overhead for
421chaining would be substantial (100% with typical malloc overhead).
422
Tim Peterseb28ef22001-06-02 05:27:19 +0000423The initial probe index is computed as hash mod the table size. Subsequent
424probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000425
426All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000427
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000428The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000429contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000430Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000431
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000432lookdict() is general-purpose, and may return NULL if (and only if) a
433comparison raises an exception (this was new in Python 2.5).
Guido van Rossum89d8c602007-09-18 17:26:56 +0000434lookdict_unicode() below is specialized to string keys, comparison of which can
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400435never raise an exception; that function can never return NULL.
436lookdict_unicode_nodummy is further specialized for string keys that cannot be
437the <dummy> value.
438For both, when the key isn't found a PyDictEntry* is returned
439where the key would have been found, *value_addr points to the matching value
440slot.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000441*/
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400442static PyDictKeyEntry *
443lookdict(PyDictObject *mp, PyObject *key,
444 Py_hash_t hash, PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000445{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200446 size_t i;
447 size_t perturb;
448 PyDictKeyEntry *freeslot;
449 size_t mask;
Antoine Pitrou9a234902012-05-13 20:48:01 +0200450 PyDictKeyEntry *ep0;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200451 PyDictKeyEntry *ep;
452 int cmp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000454
Antoine Pitrou9a234902012-05-13 20:48:01 +0200455top:
456 mask = DK_MASK(mp->ma_keys);
457 ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 i = (size_t)hash & mask;
459 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400460 if (ep->me_key == NULL || ep->me_key == key) {
461 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400463 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 if (ep->me_key == dummy)
465 freeslot = ep;
466 else {
467 if (ep->me_hash == hash) {
468 startkey = ep->me_key;
469 Py_INCREF(startkey);
470 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
471 Py_DECREF(startkey);
472 if (cmp < 0)
473 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400474 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
475 if (cmp > 0) {
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 }
480 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200481 /* The dict was mutated, restart */
482 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 }
484 }
485 freeslot = NULL;
486 }
Tim Peters15d49292001-05-27 07:39:22 +0000487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 /* In the loop, me_key == dummy is by far (factor of 100s) the
489 least likely outcome, so test for that last. */
490 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
491 i = (i << 2) + i + perturb + 1;
492 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400493 if (ep->me_key == NULL) {
494 if (freeslot == NULL) {
495 *value_addr = &ep->me_value;
496 return ep;
497 } else {
498 *value_addr = &freeslot->me_value;
499 return freeslot;
500 }
501 }
502 if (ep->me_key == key) {
503 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400505 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 if (ep->me_hash == hash && ep->me_key != dummy) {
507 startkey = ep->me_key;
508 Py_INCREF(startkey);
509 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
510 Py_DECREF(startkey);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400511 if (cmp < 0) {
512 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400514 }
515 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
516 if (cmp > 0) {
517 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400519 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 }
521 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200522 /* The dict was mutated, restart */
523 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 }
525 }
526 else if (ep->me_key == dummy && freeslot == NULL)
527 freeslot = ep;
528 }
529 assert(0); /* NOT REACHED */
530 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000531}
532
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400533/* Specialized version for string-only keys */
534static PyDictKeyEntry *
535lookdict_unicode(PyDictObject *mp, PyObject *key,
536 Py_hash_t hash, PyObject ***value_addr)
Fred Drake1bff34a2000-08-31 19:31:38 +0000537{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200538 size_t i;
539 size_t perturb;
540 PyDictKeyEntry *freeslot;
541 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400542 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200543 PyDictKeyEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 /* Make sure this function doesn't have to handle non-unicode keys,
546 including subclasses of str; e.g., one reason to subclass
547 unicodes is to override __eq__, and for speed we don't cater to
548 that here. */
549 if (!PyUnicode_CheckExact(key)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400550 mp->ma_keys->dk_lookup = lookdict;
551 return lookdict(mp, key, hash, value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100553 i = (size_t)hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400555 if (ep->me_key == NULL || ep->me_key == key) {
556 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400558 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 if (ep->me_key == dummy)
560 freeslot = ep;
561 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400562 if (ep->me_hash == hash && unicode_eq(ep->me_key, key)) {
563 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400565 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 freeslot = NULL;
567 }
Tim Peters15d49292001-05-27 07:39:22 +0000568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 /* In the loop, me_key == dummy is by far (factor of 100s) the
570 least likely outcome, so test for that last. */
571 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
572 i = (i << 2) + i + perturb + 1;
573 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400574 if (ep->me_key == NULL) {
575 if (freeslot == NULL) {
576 *value_addr = &ep->me_value;
577 return ep;
578 } else {
579 *value_addr = &freeslot->me_value;
580 return freeslot;
581 }
582 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 if (ep->me_key == key
584 || (ep->me_hash == hash
585 && ep->me_key != dummy
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400586 && unicode_eq(ep->me_key, key))) {
587 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400589 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 if (ep->me_key == dummy && freeslot == NULL)
591 freeslot = ep;
592 }
593 assert(0); /* NOT REACHED */
594 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000595}
596
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400597/* Faster version of lookdict_unicode when it is known that no <dummy> keys
598 * will be present. */
599static PyDictKeyEntry *
600lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
601 Py_hash_t hash, PyObject ***value_addr)
602{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200603 size_t i;
604 size_t perturb;
605 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400606 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200607 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400608
609 /* Make sure this function doesn't have to handle non-unicode keys,
610 including subclasses of str; e.g., one reason to subclass
611 unicodes is to override __eq__, and for speed we don't cater to
612 that here. */
613 if (!PyUnicode_CheckExact(key)) {
614 mp->ma_keys->dk_lookup = lookdict;
615 return lookdict(mp, key, hash, value_addr);
616 }
617 i = (size_t)hash & mask;
618 ep = &ep0[i];
619 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
620 if (ep->me_key == NULL || ep->me_key == key ||
621 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
622 *value_addr = &ep->me_value;
623 return ep;
624 }
625 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
626 i = (i << 2) + i + perturb + 1;
627 ep = &ep0[i & mask];
628 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
629 if (ep->me_key == NULL || ep->me_key == key ||
630 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
631 *value_addr = &ep->me_value;
632 return ep;
633 }
634 }
635 assert(0); /* NOT REACHED */
636 return 0;
637}
638
639/* Version of lookdict for split tables.
640 * All split tables and only split tables use this lookup function.
641 * Split tables only contain unicode keys and no dummy keys,
642 * so algorithm is the same as lookdict_unicode_nodummy.
643 */
644static PyDictKeyEntry *
645lookdict_split(PyDictObject *mp, PyObject *key,
646 Py_hash_t hash, PyObject ***value_addr)
647{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200648 size_t i;
649 size_t perturb;
650 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400651 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200652 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400653
654 if (!PyUnicode_CheckExact(key)) {
Benjamin Petersondb780d02012-04-23 13:44:32 -0400655 ep = lookdict(mp, key, hash, value_addr);
656 /* lookdict expects a combined-table, so fix value_addr */
657 i = ep - ep0;
658 *value_addr = &mp->ma_values[i];
659 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400660 }
661 i = (size_t)hash & mask;
662 ep = &ep0[i];
663 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
664 if (ep->me_key == NULL || ep->me_key == key ||
665 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
666 *value_addr = &mp->ma_values[i];
667 return ep;
668 }
669 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
670 i = (i << 2) + i + perturb + 1;
671 ep = &ep0[i & mask];
672 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
673 if (ep->me_key == NULL || ep->me_key == key ||
674 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
675 *value_addr = &mp->ma_values[i & mask];
676 return ep;
677 }
678 }
679 assert(0); /* NOT REACHED */
680 return 0;
681}
682
Benjamin Petersonfb886362010-04-24 18:21:17 +0000683int
684_PyDict_HasOnlyStringKeys(PyObject *dict)
685{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 Py_ssize_t pos = 0;
687 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +0000688 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 /* Shortcut */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400690 if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 return 1;
692 while (PyDict_Next(dict, &pos, &key, &value))
693 if (!PyUnicode_Check(key))
694 return 0;
695 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +0000696}
697
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000698#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 do { \
700 if (!_PyObject_GC_IS_TRACKED(mp)) { \
701 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
702 _PyObject_GC_MAY_BE_TRACKED(value)) { \
703 _PyObject_GC_TRACK(mp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 } \
705 } \
706 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000707
708void
709_PyDict_MaybeUntrack(PyObject *op)
710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 PyDictObject *mp;
712 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400713 Py_ssize_t i, size;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
716 return;
717
718 mp = (PyDictObject *) op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400719 size = DK_SIZE(mp->ma_keys);
720 if (_PyDict_HasSplitTable(mp)) {
721 for (i = 0; i < size; i++) {
722 if ((value = mp->ma_values[i]) == NULL)
723 continue;
724 if (_PyObject_GC_MAY_BE_TRACKED(value)) {
725 assert(!_PyObject_GC_MAY_BE_TRACKED(
726 mp->ma_keys->dk_entries[i].me_key));
727 return;
728 }
729 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400731 else {
732 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
733 for (i = 0; i < size; i++) {
734 if ((value = ep0[i].me_value) == NULL)
735 continue;
736 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
737 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
738 return;
739 }
740 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000742}
743
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400744/* Internal function to find slot for an item from its hash
745 * when it is known that the key is not present in the dict.
746 */
747static PyDictKeyEntry *
748find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
749 PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000750{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400751 size_t i;
752 size_t perturb;
753 size_t mask = DK_MASK(mp->ma_keys);
754 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
755 PyDictKeyEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000756
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400757 assert(key != NULL);
758 if (!PyUnicode_CheckExact(key))
759 mp->ma_keys->dk_lookup = lookdict;
760 i = hash & mask;
761 ep = &ep0[i];
762 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
763 i = (i << 2) + i + perturb + 1;
764 ep = &ep0[i & mask];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400766 assert(ep->me_value == NULL);
767 if (mp->ma_values)
768 *value_addr = &mp->ma_values[i & mask];
769 else
770 *value_addr = &ep->me_value;
771 return ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000772}
773
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400774static int
775insertion_resize(PyDictObject *mp)
776{
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700777 return dictresize(mp, GROWTH_RATE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400778}
Antoine Pitroue965d972012-02-27 00:45:12 +0100779
780/*
781Internal routine to insert a new item into the table.
782Used both by the internal resize routine and by the public insert routine.
Antoine Pitroue965d972012-02-27 00:45:12 +0100783Returns -1 if an error occurred, or 0 on success.
784*/
785static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400786insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +0100787{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400788 PyObject *old_value;
789 PyObject **value_addr;
790 PyDictKeyEntry *ep;
791 assert(key != dummy);
Antoine Pitroue965d972012-02-27 00:45:12 +0100792
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400793 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
794 if (insertion_resize(mp) < 0)
795 return -1;
796 }
797
798 ep = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr);
Antoine Pitroue965d972012-02-27 00:45:12 +0100799 if (ep == NULL) {
Antoine Pitroue965d972012-02-27 00:45:12 +0100800 return -1;
801 }
Antoine Pitroud6967322014-10-18 00:35:00 +0200802 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400803 Py_INCREF(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400804 MAINTAIN_TRACKING(mp, key, value);
805 old_value = *value_addr;
806 if (old_value != NULL) {
807 assert(ep->me_key != NULL && ep->me_key != dummy);
808 *value_addr = value;
Antoine Pitroud6967322014-10-18 00:35:00 +0200809 Py_DECREF(old_value); /* which **CAN** re-enter (see issue #22653) */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400810 }
811 else {
812 if (ep->me_key == NULL) {
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400813 Py_INCREF(key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400814 if (mp->ma_keys->dk_usable <= 0) {
815 /* Need to resize. */
816 if (insertion_resize(mp) < 0) {
817 Py_DECREF(key);
818 Py_DECREF(value);
819 return -1;
820 }
821 ep = find_empty_slot(mp, key, hash, &value_addr);
822 }
823 mp->ma_keys->dk_usable--;
824 assert(mp->ma_keys->dk_usable >= 0);
825 ep->me_key = key;
826 ep->me_hash = hash;
827 }
828 else {
829 if (ep->me_key == dummy) {
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400830 Py_INCREF(key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400831 ep->me_key = key;
832 ep->me_hash = hash;
833 Py_DECREF(dummy);
834 } else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400835 assert(_PyDict_HasSplitTable(mp));
836 }
837 }
838 mp->ma_used++;
839 *value_addr = value;
Antoine Pitroud6967322014-10-18 00:35:00 +0200840 assert(ep->me_key != NULL && ep->me_key != dummy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400841 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400842 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +0100843}
844
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000845/*
846Internal routine used by dictresize() to insert an item which is
847known to be absent from the dict. This routine also assumes that
848the dict contains no deleted entries. Besides the performance benefit,
849using insertdict() in dictresize() is dangerous (SF bug #1456209).
850Note that no refcounts are changed by this routine; if needed, the caller
851is responsible for incref'ing `key` and `value`.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400852Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
853must set them correctly
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000854*/
855static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400856insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000858{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400859 size_t i;
860 size_t perturb;
861 PyDictKeysObject *k = mp->ma_keys;
862 size_t mask = (size_t)DK_SIZE(k)-1;
863 PyDictKeyEntry *ep0 = &k->dk_entries[0];
864 PyDictKeyEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000865
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400866 assert(k->dk_lookup != NULL);
867 assert(value != NULL);
868 assert(key != NULL);
869 assert(key != dummy);
870 assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
871 i = hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 ep = &ep0[i];
873 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
874 i = (i << 2) + i + perturb + 1;
875 ep = &ep0[i & mask];
876 }
877 assert(ep->me_value == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000879 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000881}
882
883/*
884Restructure the table by allocating a new table and reinserting all
885items again. When entries have been deleted, the new table may
886actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400887If a table is split (its keys and hashes are shared, its values are not),
888then the values are temporarily copied into the table, it is resized as
889a combined table, then the me_value slots in the old table are NULLed out.
890After resizing a table is always combined,
891but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000892*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000893static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000894dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000895{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 Py_ssize_t newsize;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400897 PyDictKeysObject *oldkeys;
898 PyObject **oldvalues;
899 Py_ssize_t i, oldsize;
Tim Peters91a364d2001-05-19 07:04:38 +0000900
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400901/* Find the smallest table size > minused. */
902 for (newsize = PyDict_MINSIZE_COMBINED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 newsize <= minused && newsize > 0;
904 newsize <<= 1)
905 ;
906 if (newsize <= 0) {
907 PyErr_NoMemory();
908 return -1;
909 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400910 oldkeys = mp->ma_keys;
911 oldvalues = mp->ma_values;
912 /* Allocate a new table. */
913 mp->ma_keys = new_keys_object(newsize);
914 if (mp->ma_keys == NULL) {
915 mp->ma_keys = oldkeys;
916 return -1;
917 }
918 if (oldkeys->dk_lookup == lookdict)
919 mp->ma_keys->dk_lookup = lookdict;
920 oldsize = DK_SIZE(oldkeys);
921 mp->ma_values = NULL;
922 /* If empty then nothing to copy so just return */
923 if (oldsize == 1) {
924 assert(oldkeys == Py_EMPTY_KEYS);
925 DK_DECREF(oldkeys);
926 return 0;
927 }
928 /* Main loop below assumes we can transfer refcount to new keys
929 * and that value is stored in me_value.
930 * Increment ref-counts and copy values here to compensate
931 * This (resizing a split table) should be relatively rare */
932 if (oldvalues != NULL) {
933 for (i = 0; i < oldsize; i++) {
934 if (oldvalues[i] != NULL) {
935 Py_INCREF(oldkeys->dk_entries[i].me_key);
936 oldkeys->dk_entries[i].me_value = oldvalues[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 }
939 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400940 /* Main loop */
941 for (i = 0; i < oldsize; i++) {
942 PyDictKeyEntry *ep = &oldkeys->dk_entries[i];
943 if (ep->me_value != NULL) {
944 assert(ep->me_key != dummy);
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000945 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400948 mp->ma_keys->dk_usable -= mp->ma_used;
949 if (oldvalues != NULL) {
950 /* NULL out me_value slot in oldkeys, in case it was shared */
951 for (i = 0; i < oldsize; i++)
952 oldkeys->dk_entries[i].me_value = NULL;
953 assert(oldvalues != empty_values);
954 free_values(oldvalues);
955 DK_DECREF(oldkeys);
956 }
957 else {
958 assert(oldkeys->dk_lookup != lookdict_split);
959 if (oldkeys->dk_lookup != lookdict_unicode_nodummy) {
960 PyDictKeyEntry *ep0 = &oldkeys->dk_entries[0];
961 for (i = 0; i < oldsize; i++) {
962 if (ep0[i].me_key == dummy)
963 Py_DECREF(dummy);
964 }
965 }
966 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200967 DK_DEBUG_DECREF PyMem_FREE(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400968 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000970}
971
Benjamin Peterson15ee8212012-04-24 14:44:18 -0400972/* Returns NULL if unable to split table.
973 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400974static PyDictKeysObject *
975make_keys_shared(PyObject *op)
976{
977 Py_ssize_t i;
978 Py_ssize_t size;
979 PyDictObject *mp = (PyDictObject *)op;
980
Benjamin Peterson15ee8212012-04-24 14:44:18 -0400981 if (!PyDict_CheckExact(op))
982 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400983 if (!_PyDict_HasSplitTable(mp)) {
984 PyDictKeyEntry *ep0;
985 PyObject **values;
986 assert(mp->ma_keys->dk_refcnt == 1);
987 if (mp->ma_keys->dk_lookup == lookdict) {
988 return NULL;
989 }
990 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
991 /* Remove dummy keys */
992 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
993 return NULL;
994 }
995 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
996 /* Copy values into a new array */
997 ep0 = &mp->ma_keys->dk_entries[0];
998 size = DK_SIZE(mp->ma_keys);
999 values = new_values(size);
1000 if (values == NULL) {
1001 PyErr_SetString(PyExc_MemoryError,
1002 "Not enough memory to allocate new values array");
1003 return NULL;
1004 }
1005 for (i = 0; i < size; i++) {
1006 values[i] = ep0[i].me_value;
1007 ep0[i].me_value = NULL;
1008 }
1009 mp->ma_keys->dk_lookup = lookdict_split;
1010 mp->ma_values = values;
1011 }
1012 DK_INCREF(mp->ma_keys);
1013 return mp->ma_keys;
1014}
Christian Heimes99170a52007-12-19 02:07:34 +00001015
1016PyObject *
1017_PyDict_NewPresized(Py_ssize_t minused)
1018{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001019 Py_ssize_t newsize;
1020 PyDictKeysObject *new_keys;
1021 for (newsize = PyDict_MINSIZE_COMBINED;
1022 newsize <= minused && newsize > 0;
1023 newsize <<= 1)
1024 ;
1025 new_keys = new_keys_object(newsize);
1026 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001028 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001029}
1030
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001031/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1032 * that may occur (originally dicts supported only string keys, and exceptions
1033 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001034 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001035 * (suppressed) occurred while computing the key's hash, or that some error
1036 * (suppressed) occurred when comparing keys in the dict's internal probe
1037 * sequence. A nasty example of the latter is when a Python-coded comparison
1038 * function hits a stack-depth error, which can cause this to return NULL
1039 * even if the key is present.
1040 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001042PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001043{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001044 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001046 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001048 PyObject **value_addr;
1049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 if (!PyDict_Check(op))
1051 return NULL;
1052 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001053 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 {
1055 hash = PyObject_Hash(key);
1056 if (hash == -1) {
1057 PyErr_Clear();
1058 return NULL;
1059 }
1060 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 /* We can arrive here with a NULL tstate during initialization: try
1063 running "python -Wi" for an example related to string interning.
1064 Let's just hope that no exception occurs then... This must be
1065 _PyThreadState_Current and not PyThreadState_GET() because in debug
1066 mode, the latter complains if tstate is NULL. */
1067 tstate = (PyThreadState*)_Py_atomic_load_relaxed(
1068 &_PyThreadState_Current);
1069 if (tstate != NULL && tstate->curexc_type != NULL) {
1070 /* preserve the existing exception */
1071 PyObject *err_type, *err_value, *err_tb;
1072 PyErr_Fetch(&err_type, &err_value, &err_tb);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001073 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 /* ignore errors */
1075 PyErr_Restore(err_type, err_value, err_tb);
1076 if (ep == NULL)
1077 return NULL;
1078 }
1079 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001080 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 if (ep == NULL) {
1082 PyErr_Clear();
1083 return NULL;
1084 }
1085 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001086 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001087}
1088
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001089PyObject *
1090_PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1091{
1092 PyDictObject *mp = (PyDictObject *)op;
1093 PyDictKeyEntry *ep;
1094 PyThreadState *tstate;
1095 PyObject **value_addr;
1096
1097 if (!PyDict_Check(op))
1098 return NULL;
1099
1100 /* We can arrive here with a NULL tstate during initialization: try
1101 running "python -Wi" for an example related to string interning.
1102 Let's just hope that no exception occurs then... This must be
1103 _PyThreadState_Current and not PyThreadState_GET() because in debug
1104 mode, the latter complains if tstate is NULL. */
1105 tstate = (PyThreadState*)_Py_atomic_load_relaxed(
1106 &_PyThreadState_Current);
1107 if (tstate != NULL && tstate->curexc_type != NULL) {
1108 /* preserve the existing exception */
1109 PyObject *err_type, *err_value, *err_tb;
1110 PyErr_Fetch(&err_type, &err_value, &err_tb);
1111 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
1112 /* ignore errors */
1113 PyErr_Restore(err_type, err_value, err_tb);
1114 if (ep == NULL)
1115 return NULL;
1116 }
1117 else {
1118 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
1119 if (ep == NULL) {
1120 PyErr_Clear();
1121 return NULL;
1122 }
1123 }
1124 return *value_addr;
1125}
1126
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001127/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1128 This returns NULL *with* an exception set if an exception occurred.
1129 It returns NULL *without* an exception set if the key wasn't present.
1130*/
1131PyObject *
1132PyDict_GetItemWithError(PyObject *op, PyObject *key)
1133{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001134 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001136 PyDictKeyEntry *ep;
1137 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 if (!PyDict_Check(op)) {
1140 PyErr_BadInternalCall();
1141 return NULL;
1142 }
1143 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001144 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 {
1146 hash = PyObject_Hash(key);
1147 if (hash == -1) {
1148 return NULL;
1149 }
1150 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001151
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001152 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 if (ep == NULL)
1154 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001155 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001156}
1157
Brett Cannonfd074152012-04-14 14:10:13 -04001158PyObject *
1159_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1160{
1161 PyObject *kv;
1162 kv = _PyUnicode_FromId(key); /* borrowed */
1163 if (kv == NULL)
1164 return NULL;
1165 return PyDict_GetItemWithError(dp, kv);
1166}
1167
Victor Stinnerb4efc962015-11-20 09:24:02 +01001168/* Fast version of global value lookup (LOAD_GLOBAL).
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001169 * Lookup in globals, then builtins.
Victor Stinnerb4efc962015-11-20 09:24:02 +01001170 *
1171 * Raise an exception and return NULL if an error occurred (ex: computing the
1172 * key hash failed, key comparison failed, ...). Return NULL if the key doesn't
1173 * exist. Return the value if the key exists.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001174 */
1175PyObject *
1176_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001177{
Victor Stinnerb4efc962015-11-20 09:24:02 +01001178 Py_hash_t hash;
1179 PyDictKeyEntry *entry;
1180 PyObject **value_addr;
1181 PyObject *value;
1182
1183 if (!PyUnicode_CheckExact(key) ||
1184 (hash = ((PyASCIIObject *) key)->hash) == -1)
1185 {
1186 hash = PyObject_Hash(key);
1187 if (hash == -1)
1188 return NULL;
Antoine Pitroue965d972012-02-27 00:45:12 +01001189 }
Victor Stinnerb4efc962015-11-20 09:24:02 +01001190
1191 /* namespace 1: globals */
1192 entry = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr);
1193 if (entry == NULL)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001194 return NULL;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001195 value = *value_addr;
1196 if (value != NULL)
1197 return value;
1198
1199 /* namespace 2: builtins */
1200 entry = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr);
1201 if (entry == NULL)
1202 return NULL;
1203 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001204}
1205
Antoine Pitroue965d972012-02-27 00:45:12 +01001206/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1207 * dictionary if it's merely replacing the value for an existing key.
1208 * This means that it's safe to loop over a dictionary with PyDict_Next()
1209 * and occasionally replace a value -- but you can't insert new keys or
1210 * remove them.
1211 */
1212int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001213PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001214{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001215 PyDictObject *mp;
1216 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001217 if (!PyDict_Check(op)) {
1218 PyErr_BadInternalCall();
1219 return -1;
1220 }
1221 assert(key);
1222 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001223 mp = (PyDictObject *)op;
1224 if (!PyUnicode_CheckExact(key) ||
1225 (hash = ((PyASCIIObject *) key)->hash) == -1)
1226 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001227 hash = PyObject_Hash(key);
1228 if (hash == -1)
1229 return -1;
1230 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001231
1232 /* insertdict() handles any resizing that might be necessary */
1233 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001234}
1235
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001236int
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001237_PyDict_SetItem_KnownHash(PyObject *op, PyObject *key, PyObject *value,
1238 Py_hash_t hash)
1239{
1240 PyDictObject *mp;
1241
1242 if (!PyDict_Check(op)) {
1243 PyErr_BadInternalCall();
1244 return -1;
1245 }
1246 assert(key);
1247 assert(value);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001248 assert(hash != -1);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001249 mp = (PyDictObject *)op;
1250
1251 /* insertdict() handles any resizing that might be necessary */
1252 return insertdict(mp, key, hash, value);
1253}
1254
1255int
Tim Peters1f5871e2000-07-04 17:44:48 +00001256PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001257{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001258 PyDictObject *mp;
1259 Py_hash_t hash;
1260 PyDictKeyEntry *ep;
1261 PyObject *old_key, *old_value;
1262 PyObject **value_addr;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 if (!PyDict_Check(op)) {
1265 PyErr_BadInternalCall();
1266 return -1;
1267 }
1268 assert(key);
1269 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001270 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 hash = PyObject_Hash(key);
1272 if (hash == -1)
1273 return -1;
1274 }
1275 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001276 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 if (ep == NULL)
1278 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001279 if (*value_addr == NULL) {
Raymond Hettinger69492da2013-09-02 15:59:26 -07001280 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 return -1;
1282 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001283 old_value = *value_addr;
1284 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001286 if (!_PyDict_HasSplitTable(mp)) {
1287 ENSURE_ALLOWS_DELETIONS(mp);
1288 old_key = ep->me_key;
1289 Py_INCREF(dummy);
1290 ep->me_key = dummy;
1291 Py_DECREF(old_key);
1292 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001295}
1296
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001297int
1298_PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1299{
1300 PyDictObject *mp;
1301 PyDictKeyEntry *ep;
1302 PyObject *old_key, *old_value;
1303 PyObject **value_addr;
1304
1305 if (!PyDict_Check(op)) {
1306 PyErr_BadInternalCall();
1307 return -1;
1308 }
1309 assert(key);
1310 assert(hash != -1);
1311 mp = (PyDictObject *)op;
1312 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
1313 if (ep == NULL)
1314 return -1;
1315 if (*value_addr == NULL) {
1316 _PyErr_SetKeyError(key);
1317 return -1;
1318 }
1319 old_value = *value_addr;
1320 *value_addr = NULL;
1321 mp->ma_used--;
1322 if (!_PyDict_HasSplitTable(mp)) {
1323 ENSURE_ALLOWS_DELETIONS(mp);
1324 old_key = ep->me_key;
1325 Py_INCREF(dummy);
1326 ep->me_key = dummy;
1327 Py_DECREF(old_key);
1328 }
1329 Py_DECREF(old_value);
1330 return 0;
1331}
1332
Guido van Rossum25831651993-05-19 14:50:45 +00001333void
Tim Peters1f5871e2000-07-04 17:44:48 +00001334PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001337 PyDictKeysObject *oldkeys;
1338 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 if (!PyDict_Check(op))
1342 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001343 mp = ((PyDictObject *)op);
1344 oldkeys = mp->ma_keys;
1345 oldvalues = mp->ma_values;
1346 if (oldvalues == empty_values)
1347 return;
1348 /* Empty the dict... */
1349 DK_INCREF(Py_EMPTY_KEYS);
1350 mp->ma_keys = Py_EMPTY_KEYS;
1351 mp->ma_values = empty_values;
1352 mp->ma_used = 0;
1353 /* ...then clear the keys and values */
1354 if (oldvalues != NULL) {
1355 n = DK_SIZE(oldkeys);
1356 for (i = 0; i < n; i++)
1357 Py_CLEAR(oldvalues[i]);
1358 free_values(oldvalues);
1359 DK_DECREF(oldkeys);
1360 }
1361 else {
1362 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001363 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001364 }
1365}
1366
1367/* Returns -1 if no more items (or op is not a dict),
1368 * index of item otherwise. Stores value in pvalue
1369 */
1370Py_LOCAL_INLINE(Py_ssize_t)
1371dict_next(PyObject *op, Py_ssize_t i, PyObject **pvalue)
1372{
1373 Py_ssize_t mask, offset;
1374 PyDictObject *mp;
1375 PyObject **value_ptr;
1376
1377
1378 if (!PyDict_Check(op))
1379 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001381 if (i < 0)
1382 return -1;
1383 if (mp->ma_values) {
1384 value_ptr = &mp->ma_values[i];
1385 offset = sizeof(PyObject *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001387 else {
1388 value_ptr = &mp->ma_keys->dk_entries[i].me_value;
1389 offset = sizeof(PyDictKeyEntry);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001391 mask = DK_MASK(mp->ma_keys);
1392 while (i <= mask && *value_ptr == NULL) {
1393 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1394 i++;
1395 }
1396 if (i > mask)
1397 return -1;
1398 if (pvalue)
1399 *pvalue = *value_ptr;
1400 return i;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001401}
1402
Tim Peters080c88b2003-02-15 03:01:11 +00001403/*
1404 * Iterate over a dict. Use like so:
1405 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001406 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001407 * PyObject *key, *value;
1408 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001409 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +00001410 * Refer to borrowed references in key and value.
1411 * }
1412 *
1413 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001414 * mutates the dict. One exception: it is safe if the loop merely changes
1415 * the values associated with the keys (but doesn't insert new keys or
1416 * delete keys), via PyDict_SetItem().
1417 */
Guido van Rossum25831651993-05-19 14:50:45 +00001418int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001419PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001420{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001421 PyDictObject *mp;
1422 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 if (i < 0)
1424 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001425 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 *ppos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001428 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001430}
1431
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001432/* Internal version of PyDict_Next that returns a hash value in addition
1433 * to the key and value.
1434 */
Thomas Wouterscf297e42007-02-23 15:07:44 +00001435int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001436_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1437 PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001438{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001439 PyDictObject *mp;
1440 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 if (i < 0)
1442 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001443 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 *ppos = i+1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001445 *phash = mp->ma_keys->dk_entries[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001447 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001449}
1450
Eric Snow96c6af92015-05-29 22:21:39 -06001451/* Internal version of dict.pop(). */
1452PyObject *
1453_PyDict_Pop(PyDictObject *mp, PyObject *key, PyObject *deflt)
1454{
1455 Py_hash_t hash;
1456 PyObject *old_value, *old_key;
1457 PyDictKeyEntry *ep;
1458 PyObject **value_addr;
1459
1460 if (mp->ma_used == 0) {
1461 if (deflt) {
1462 Py_INCREF(deflt);
1463 return deflt;
1464 }
1465 _PyErr_SetKeyError(key);
1466 return NULL;
1467 }
1468 if (!PyUnicode_CheckExact(key) ||
1469 (hash = ((PyASCIIObject *) key)->hash) == -1) {
1470 hash = PyObject_Hash(key);
1471 if (hash == -1)
1472 return NULL;
1473 }
1474 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
1475 if (ep == NULL)
1476 return NULL;
1477 old_value = *value_addr;
1478 if (old_value == NULL) {
1479 if (deflt) {
1480 Py_INCREF(deflt);
1481 return deflt;
1482 }
1483 _PyErr_SetKeyError(key);
1484 return NULL;
1485 }
1486 *value_addr = NULL;
1487 mp->ma_used--;
1488 if (!_PyDict_HasSplitTable(mp)) {
1489 ENSURE_ALLOWS_DELETIONS(mp);
1490 old_key = ep->me_key;
1491 Py_INCREF(dummy);
1492 ep->me_key = dummy;
1493 Py_DECREF(old_key);
1494 }
1495 return old_value;
1496}
1497
1498/* Internal version of dict.from_keys(). It is subclass-friendly. */
1499PyObject *
1500_PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
1501{
1502 PyObject *it; /* iter(iterable) */
1503 PyObject *key;
1504 PyObject *d;
1505 int status;
1506
1507 d = PyObject_CallObject(cls, NULL);
1508 if (d == NULL)
1509 return NULL;
1510
1511 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
1512 if (PyDict_CheckExact(iterable)) {
1513 PyDictObject *mp = (PyDictObject *)d;
1514 PyObject *oldvalue;
1515 Py_ssize_t pos = 0;
1516 PyObject *key;
1517 Py_hash_t hash;
1518
1519 if (dictresize(mp, Py_SIZE(iterable))) {
1520 Py_DECREF(d);
1521 return NULL;
1522 }
1523
1524 while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) {
1525 if (insertdict(mp, key, hash, value)) {
1526 Py_DECREF(d);
1527 return NULL;
1528 }
1529 }
1530 return d;
1531 }
1532 if (PyAnySet_CheckExact(iterable)) {
1533 PyDictObject *mp = (PyDictObject *)d;
1534 Py_ssize_t pos = 0;
1535 PyObject *key;
1536 Py_hash_t hash;
1537
1538 if (dictresize(mp, PySet_GET_SIZE(iterable))) {
1539 Py_DECREF(d);
1540 return NULL;
1541 }
1542
1543 while (_PySet_NextEntry(iterable, &pos, &key, &hash)) {
1544 if (insertdict(mp, key, hash, value)) {
1545 Py_DECREF(d);
1546 return NULL;
1547 }
1548 }
1549 return d;
1550 }
1551 }
1552
1553 it = PyObject_GetIter(iterable);
1554 if (it == NULL){
1555 Py_DECREF(d);
1556 return NULL;
1557 }
1558
1559 if (PyDict_CheckExact(d)) {
1560 while ((key = PyIter_Next(it)) != NULL) {
1561 status = PyDict_SetItem(d, key, value);
1562 Py_DECREF(key);
1563 if (status < 0)
1564 goto Fail;
1565 }
1566 } else {
1567 while ((key = PyIter_Next(it)) != NULL) {
1568 status = PyObject_SetItem(d, key, value);
1569 Py_DECREF(key);
1570 if (status < 0)
1571 goto Fail;
1572 }
1573 }
1574
1575 if (PyErr_Occurred())
1576 goto Fail;
1577 Py_DECREF(it);
1578 return d;
1579
1580Fail:
1581 Py_DECREF(it);
1582 Py_DECREF(d);
1583 return NULL;
1584}
1585
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001586/* Methods */
1587
1588static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001589dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001590{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001591 PyObject **values = mp->ma_values;
1592 PyDictKeysObject *keys = mp->ma_keys;
1593 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 PyObject_GC_UnTrack(mp);
1595 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001596 if (values != NULL) {
1597 if (values != empty_values) {
1598 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
1599 Py_XDECREF(values[i]);
1600 }
1601 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001603 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02001605 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001606 assert(keys->dk_refcnt == 1);
1607 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001608 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1610 free_list[numfree++] = mp;
1611 else
1612 Py_TYPE(mp)->tp_free((PyObject *)mp);
1613 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001614}
1615
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001616
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001617static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001618dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001621 PyObject *key = NULL, *value = NULL;
1622 _PyUnicodeWriter writer;
1623 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00001624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 i = Py_ReprEnter((PyObject *)mp);
1626 if (i != 0) {
1627 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1628 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001631 Py_ReprLeave((PyObject *)mp);
1632 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 }
Tim Petersa7259592001-06-16 05:11:17 +00001634
Victor Stinnerf91929b2013-11-19 13:07:38 +01001635 _PyUnicodeWriter_Init(&writer);
1636 writer.overallocate = 1;
1637 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
1638 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00001639
Victor Stinnerf91929b2013-11-19 13:07:38 +01001640 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
1641 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 /* Do repr() on each key+value pair, and insert ": " between them.
1644 Note that repr may mutate the dict. */
1645 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001646 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001648 PyObject *s;
1649 int res;
1650
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001651 /* Prevent repr from deleting key or value during key format. */
1652 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02001654
Victor Stinnerf91929b2013-11-19 13:07:38 +01001655 if (!first) {
1656 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
1657 goto error;
1658 }
1659 first = 0;
1660
1661 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01001663 goto error;
1664 res = _PyUnicodeWriter_WriteStr(&writer, s);
1665 Py_DECREF(s);
1666 if (res < 0)
1667 goto error;
1668
1669 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
1670 goto error;
1671
1672 s = PyObject_Repr(value);
1673 if (s == NULL)
1674 goto error;
1675 res = _PyUnicodeWriter_WriteStr(&writer, s);
1676 Py_DECREF(s);
1677 if (res < 0)
1678 goto error;
1679
1680 Py_CLEAR(key);
1681 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 }
Tim Petersa7259592001-06-16 05:11:17 +00001683
Victor Stinnerf91929b2013-11-19 13:07:38 +01001684 writer.overallocate = 0;
1685 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
1686 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01001689
1690 return _PyUnicodeWriter_Finish(&writer);
1691
1692error:
1693 Py_ReprLeave((PyObject *)mp);
1694 _PyUnicodeWriter_Dealloc(&writer);
1695 Py_XDECREF(key);
1696 Py_XDECREF(value);
1697 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001698}
1699
Martin v. Löwis18e16552006-02-15 17:27:45 +00001700static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001701dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001704}
1705
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001706static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001707dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001708{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 PyObject *v;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001710 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001711 PyDictKeyEntry *ep;
1712 PyObject **value_addr;
1713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001715 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 hash = PyObject_Hash(key);
1717 if (hash == -1)
1718 return NULL;
1719 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001720 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 if (ep == NULL)
1722 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001723 v = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 if (v == NULL) {
1725 if (!PyDict_CheckExact(mp)) {
1726 /* Look up __missing__ method if we're a subclass. */
1727 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05001728 _Py_IDENTIFIER(__missing__);
1729 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 if (missing != NULL) {
1731 res = PyObject_CallFunctionObjArgs(missing,
1732 key, NULL);
1733 Py_DECREF(missing);
1734 return res;
1735 }
1736 else if (PyErr_Occurred())
1737 return NULL;
1738 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07001739 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 return NULL;
1741 }
1742 else
1743 Py_INCREF(v);
1744 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001745}
1746
1747static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001748dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001749{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 if (w == NULL)
1751 return PyDict_DelItem((PyObject *)mp, v);
1752 else
1753 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001754}
1755
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001756static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 (lenfunc)dict_length, /*mp_length*/
1758 (binaryfunc)dict_subscript, /*mp_subscript*/
1759 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001760};
1761
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001762static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001763dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001764{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001765 PyObject *v;
1766 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001767 PyDictKeyEntry *ep;
1768 Py_ssize_t size, n, offset;
1769 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001770
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001771 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 n = mp->ma_used;
1773 v = PyList_New(n);
1774 if (v == NULL)
1775 return NULL;
1776 if (n != mp->ma_used) {
1777 /* Durnit. The allocations caused the dict to resize.
1778 * Just start over, this shouldn't normally happen.
1779 */
1780 Py_DECREF(v);
1781 goto again;
1782 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001783 ep = &mp->ma_keys->dk_entries[0];
1784 size = DK_SIZE(mp->ma_keys);
1785 if (mp->ma_values) {
1786 value_ptr = mp->ma_values;
1787 offset = sizeof(PyObject *);
1788 }
1789 else {
1790 value_ptr = &ep[0].me_value;
1791 offset = sizeof(PyDictKeyEntry);
1792 }
1793 for (i = 0, j = 0; i < size; i++) {
1794 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 PyObject *key = ep[i].me_key;
1796 Py_INCREF(key);
1797 PyList_SET_ITEM(v, j, key);
1798 j++;
1799 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001800 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 }
1802 assert(j == n);
1803 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001804}
1805
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001806static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001807dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001808{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001809 PyObject *v;
1810 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001811 Py_ssize_t size, n, offset;
1812 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001813
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001814 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 n = mp->ma_used;
1816 v = PyList_New(n);
1817 if (v == NULL)
1818 return NULL;
1819 if (n != mp->ma_used) {
1820 /* Durnit. The allocations caused the dict to resize.
1821 * Just start over, this shouldn't normally happen.
1822 */
1823 Py_DECREF(v);
1824 goto again;
1825 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001826 size = DK_SIZE(mp->ma_keys);
1827 if (mp->ma_values) {
1828 value_ptr = mp->ma_values;
1829 offset = sizeof(PyObject *);
1830 }
1831 else {
1832 value_ptr = &mp->ma_keys->dk_entries[0].me_value;
1833 offset = sizeof(PyDictKeyEntry);
1834 }
1835 for (i = 0, j = 0; i < size; i++) {
1836 PyObject *value = *value_ptr;
1837 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1838 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 Py_INCREF(value);
1840 PyList_SET_ITEM(v, j, value);
1841 j++;
1842 }
1843 }
1844 assert(j == n);
1845 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001846}
1847
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001848static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001849dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001850{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001851 PyObject *v;
1852 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001853 Py_ssize_t size, offset;
1854 PyObject *item, *key;
1855 PyDictKeyEntry *ep;
1856 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 /* Preallocate the list of tuples, to avoid allocations during
1859 * the loop over the items, which could trigger GC, which
1860 * could resize the dict. :-(
1861 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001862 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 n = mp->ma_used;
1864 v = PyList_New(n);
1865 if (v == NULL)
1866 return NULL;
1867 for (i = 0; i < n; i++) {
1868 item = PyTuple_New(2);
1869 if (item == NULL) {
1870 Py_DECREF(v);
1871 return NULL;
1872 }
1873 PyList_SET_ITEM(v, i, item);
1874 }
1875 if (n != mp->ma_used) {
1876 /* Durnit. The allocations caused the dict to resize.
1877 * Just start over, this shouldn't normally happen.
1878 */
1879 Py_DECREF(v);
1880 goto again;
1881 }
1882 /* Nothing we do below makes any function calls. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001883 ep = mp->ma_keys->dk_entries;
1884 size = DK_SIZE(mp->ma_keys);
1885 if (mp->ma_values) {
1886 value_ptr = mp->ma_values;
1887 offset = sizeof(PyObject *);
1888 }
1889 else {
1890 value_ptr = &ep[0].me_value;
1891 offset = sizeof(PyDictKeyEntry);
1892 }
1893 for (i = 0, j = 0; i < size; i++) {
1894 PyObject *value = *value_ptr;
1895 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1896 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 key = ep[i].me_key;
1898 item = PyList_GET_ITEM(v, j);
1899 Py_INCREF(key);
1900 PyTuple_SET_ITEM(item, 0, key);
1901 Py_INCREF(value);
1902 PyTuple_SET_ITEM(item, 1, value);
1903 j++;
1904 }
1905 }
1906 assert(j == n);
1907 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001908}
1909
Larry Hastings5c661892014-01-24 06:17:25 -08001910/*[clinic input]
1911@classmethod
1912dict.fromkeys
Larry Hastings5c661892014-01-24 06:17:25 -08001913 iterable: object
1914 value: object=None
1915 /
1916
1917Returns a new dict with keys from iterable and values equal to value.
1918[clinic start generated code]*/
1919
Larry Hastings5c661892014-01-24 06:17:25 -08001920static PyObject *
1921dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001922/*[clinic end generated code: output=8fb98e4b10384999 input=b85a667f9bf4669d]*/
Larry Hastings5c661892014-01-24 06:17:25 -08001923{
Eric Snow96c6af92015-05-29 22:21:39 -06001924 return _PyDict_FromKeys((PyObject *)type, iterable, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001925}
1926
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001927static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001928dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, const char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 PyObject *arg = NULL;
1931 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1934 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001937 _Py_IDENTIFIER(keys);
1938 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 result = PyDict_Merge(self, arg, 1);
1940 else
1941 result = PyDict_MergeFromSeq2(self, arg, 1);
1942 }
1943 if (result == 0 && kwds != NULL) {
1944 if (PyArg_ValidateKeywordArguments(kwds))
1945 result = PyDict_Merge(self, kwds, 1);
1946 else
1947 result = -1;
1948 }
1949 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001950}
1951
1952static PyObject *
1953dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1954{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 if (dict_update_common(self, args, kwds, "update") != -1)
1956 Py_RETURN_NONE;
1957 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001958}
1959
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001960/* Update unconditionally replaces existing items.
1961 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001962 otherwise it leaves existing items unchanged.
1963
1964 PyDict_{Update,Merge} update/merge from a mapping object.
1965
Tim Petersf582b822001-12-11 18:51:08 +00001966 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001967 producing iterable objects of length 2.
1968*/
1969
Tim Petersf582b822001-12-11 18:51:08 +00001970int
Tim Peters1fc240e2001-10-26 05:06:50 +00001971PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 PyObject *it; /* iter(seq2) */
1974 Py_ssize_t i; /* index into seq2 of current element */
1975 PyObject *item; /* seq2[i] */
1976 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 assert(d != NULL);
1979 assert(PyDict_Check(d));
1980 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 it = PyObject_GetIter(seq2);
1983 if (it == NULL)
1984 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 for (i = 0; ; ++i) {
1987 PyObject *key, *value;
1988 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 fast = NULL;
1991 item = PyIter_Next(it);
1992 if (item == NULL) {
1993 if (PyErr_Occurred())
1994 goto Fail;
1995 break;
1996 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 /* Convert item to sequence, and verify length 2. */
1999 fast = PySequence_Fast(item, "");
2000 if (fast == NULL) {
2001 if (PyErr_ExceptionMatches(PyExc_TypeError))
2002 PyErr_Format(PyExc_TypeError,
2003 "cannot convert dictionary update "
2004 "sequence element #%zd to a sequence",
2005 i);
2006 goto Fail;
2007 }
2008 n = PySequence_Fast_GET_SIZE(fast);
2009 if (n != 2) {
2010 PyErr_Format(PyExc_ValueError,
2011 "dictionary update sequence element #%zd "
2012 "has length %zd; 2 is required",
2013 i, n);
2014 goto Fail;
2015 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 /* Update/merge with this (key, value) pair. */
2018 key = PySequence_Fast_GET_ITEM(fast, 0);
2019 value = PySequence_Fast_GET_ITEM(fast, 1);
2020 if (override || PyDict_GetItem(d, key) == NULL) {
2021 int status = PyDict_SetItem(d, key, value);
2022 if (status < 0)
2023 goto Fail;
2024 }
2025 Py_DECREF(fast);
2026 Py_DECREF(item);
2027 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 i = 0;
2030 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00002031Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 Py_XDECREF(item);
2033 Py_XDECREF(fast);
2034 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002035Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 Py_DECREF(it);
2037 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00002038}
2039
Tim Peters6d6c1a32001-08-02 04:15:00 +00002040int
2041PyDict_Update(PyObject *a, PyObject *b)
2042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002044}
2045
2046int
2047PyDict_Merge(PyObject *a, PyObject *b, int override)
2048{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002049 PyDictObject *mp, *other;
2050 Py_ssize_t i, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002051 PyDictKeyEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 /* We accept for the argument either a concrete dictionary object,
2054 * or an abstract "mapping" object. For the former, we can do
2055 * things quite efficiently. For the latter, we only require that
2056 * PyMapping_Keys() and PyObject_GetItem() be supported.
2057 */
2058 if (a == NULL || !PyDict_Check(a) || b == NULL) {
2059 PyErr_BadInternalCall();
2060 return -1;
2061 }
2062 mp = (PyDictObject*)a;
2063 if (PyDict_Check(b)) {
2064 other = (PyDictObject*)b;
2065 if (other == mp || other->ma_used == 0)
2066 /* a.update(a) or a.update({}); nothing to do */
2067 return 0;
2068 if (mp->ma_used == 0)
2069 /* Since the target dict is empty, PyDict_GetItem()
2070 * always returns NULL. Setting override to 1
2071 * skips the unnecessary test.
2072 */
2073 override = 1;
2074 /* Do one big resize at the start, rather than
2075 * incrementally resizing as we insert new items. Expect
2076 * that there will be no (or few) overlapping keys.
2077 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002078 if (mp->ma_keys->dk_usable * 3 < other->ma_used * 2)
2079 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002081 for (i = 0, n = DK_SIZE(other->ma_keys); i < n; i++) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002082 PyObject *key, *value;
2083 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002084 entry = &other->ma_keys->dk_entries[i];
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002085 key = entry->me_key;
2086 hash = entry->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002087 if (other->ma_values)
2088 value = other->ma_values[i];
2089 else
2090 value = entry->me_value;
2091
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002092 if (value != NULL) {
2093 int err = 0;
2094 Py_INCREF(key);
2095 Py_INCREF(value);
2096 if (override || PyDict_GetItem(a, key) == NULL)
2097 err = insertdict(mp, key, hash, value);
2098 Py_DECREF(value);
2099 Py_DECREF(key);
2100 if (err != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 return -1;
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002102
2103 if (n != DK_SIZE(other->ma_keys)) {
2104 PyErr_SetString(PyExc_RuntimeError,
2105 "dict mutated during update");
2106 return -1;
2107 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 }
2109 }
2110 }
2111 else {
2112 /* Do it the generic, slower way */
2113 PyObject *keys = PyMapping_Keys(b);
2114 PyObject *iter;
2115 PyObject *key, *value;
2116 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 if (keys == NULL)
2119 /* Docstring says this is equivalent to E.keys() so
2120 * if E doesn't have a .keys() method we want
2121 * AttributeError to percolate up. Might as well
2122 * do the same for any other error.
2123 */
2124 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 iter = PyObject_GetIter(keys);
2127 Py_DECREF(keys);
2128 if (iter == NULL)
2129 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
2132 if (!override && PyDict_GetItem(a, key) != NULL) {
2133 Py_DECREF(key);
2134 continue;
2135 }
2136 value = PyObject_GetItem(b, key);
2137 if (value == NULL) {
2138 Py_DECREF(iter);
2139 Py_DECREF(key);
2140 return -1;
2141 }
2142 status = PyDict_SetItem(a, key, value);
2143 Py_DECREF(key);
2144 Py_DECREF(value);
2145 if (status < 0) {
2146 Py_DECREF(iter);
2147 return -1;
2148 }
2149 }
2150 Py_DECREF(iter);
2151 if (PyErr_Occurred())
2152 /* Iterator completed, via error */
2153 return -1;
2154 }
2155 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002156}
2157
2158static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002159dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002162}
2163
2164PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002165PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002168 PyDictObject *mp;
2169 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 if (o == NULL || !PyDict_Check(o)) {
2172 PyErr_BadInternalCall();
2173 return NULL;
2174 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002175 mp = (PyDictObject *)o;
2176 if (_PyDict_HasSplitTable(mp)) {
2177 PyDictObject *split_copy;
2178 PyObject **newvalues = new_values(DK_SIZE(mp->ma_keys));
2179 if (newvalues == NULL)
2180 return PyErr_NoMemory();
2181 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2182 if (split_copy == NULL) {
2183 free_values(newvalues);
2184 return NULL;
2185 }
2186 split_copy->ma_values = newvalues;
2187 split_copy->ma_keys = mp->ma_keys;
2188 split_copy->ma_used = mp->ma_used;
2189 DK_INCREF(mp->ma_keys);
2190 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2191 PyObject *value = mp->ma_values[i];
2192 Py_XINCREF(value);
2193 split_copy->ma_values[i] = value;
2194 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002195 if (_PyObject_GC_IS_TRACKED(mp))
2196 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002197 return (PyObject *)split_copy;
2198 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 copy = PyDict_New();
2200 if (copy == NULL)
2201 return NULL;
2202 if (PyDict_Merge(copy, o, 1) == 0)
2203 return copy;
2204 Py_DECREF(copy);
2205 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002206}
2207
Martin v. Löwis18e16552006-02-15 17:27:45 +00002208Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002209PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211 if (mp == NULL || !PyDict_Check(mp)) {
2212 PyErr_BadInternalCall();
2213 return -1;
2214 }
2215 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002216}
2217
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002218PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002219PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 if (mp == NULL || !PyDict_Check(mp)) {
2222 PyErr_BadInternalCall();
2223 return NULL;
2224 }
2225 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002226}
2227
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002228PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002229PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 if (mp == NULL || !PyDict_Check(mp)) {
2232 PyErr_BadInternalCall();
2233 return NULL;
2234 }
2235 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002236}
2237
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002238PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002239PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 if (mp == NULL || !PyDict_Check(mp)) {
2242 PyErr_BadInternalCall();
2243 return NULL;
2244 }
2245 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002246}
2247
Tim Peterse63415e2001-05-08 04:38:29 +00002248/* Return 1 if dicts equal, 0 if not, -1 if error.
2249 * Gets out as soon as any difference is detected.
2250 * Uses only Py_EQ comparison.
2251 */
2252static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002253dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002254{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 if (a->ma_used != b->ma_used)
2258 /* can't be equal if # of entries differ */
2259 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002261 for (i = 0; i < DK_SIZE(a->ma_keys); i++) {
2262 PyDictKeyEntry *ep = &a->ma_keys->dk_entries[i];
2263 PyObject *aval;
2264 if (a->ma_values)
2265 aval = a->ma_values[i];
2266 else
2267 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 if (aval != NULL) {
2269 int cmp;
2270 PyObject *bval;
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002271 PyObject **vaddr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002272 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 /* temporarily bump aval's refcount to ensure it stays
2274 alive until we're done with it */
2275 Py_INCREF(aval);
2276 /* ditto for key */
2277 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002278 /* reuse the known hash value */
2279 if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr) == NULL)
2280 bval = NULL;
2281 else
2282 bval = *vaddr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 Py_DECREF(key);
2284 if (bval == NULL) {
2285 Py_DECREF(aval);
2286 if (PyErr_Occurred())
2287 return -1;
2288 return 0;
2289 }
2290 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2291 Py_DECREF(aval);
2292 if (cmp <= 0) /* error or not equal */
2293 return cmp;
2294 }
2295 }
2296 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002297}
Tim Peterse63415e2001-05-08 04:38:29 +00002298
2299static PyObject *
2300dict_richcompare(PyObject *v, PyObject *w, int op)
2301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 int cmp;
2303 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2306 res = Py_NotImplemented;
2307 }
2308 else if (op == Py_EQ || op == Py_NE) {
2309 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2310 if (cmp < 0)
2311 return NULL;
2312 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2313 }
2314 else
2315 res = Py_NotImplemented;
2316 Py_INCREF(res);
2317 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002318}
Tim Peterse63415e2001-05-08 04:38:29 +00002319
Larry Hastings61272b72014-01-07 12:41:53 -08002320/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07002321
2322@coexist
2323dict.__contains__
2324
2325 key: object
2326 /
2327
Meador Ingee02de8c2014-01-14 16:48:31 -06002328True if D has a key k, else False.
Larry Hastings61272b72014-01-07 12:41:53 -08002329[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07002330
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002331static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08002332dict___contains__(PyDictObject *self, PyObject *key)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002333/*[clinic end generated code: output=a3d03db709ed6e6b input=b852b2a19b51ab24]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002334{
Larry Hastingsc2047262014-01-25 20:43:29 -08002335 register PyDictObject *mp = self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002336 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002337 PyDictKeyEntry *ep;
2338 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002341 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 hash = PyObject_Hash(key);
2343 if (hash == -1)
2344 return NULL;
2345 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002346 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 if (ep == NULL)
2348 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002349 return PyBool_FromLong(*value_addr != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002350}
2351
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002352static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002353dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002354{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 PyObject *key;
2356 PyObject *failobj = Py_None;
2357 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002358 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002359 PyDictKeyEntry *ep;
2360 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2363 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002366 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 hash = PyObject_Hash(key);
2368 if (hash == -1)
2369 return NULL;
2370 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002371 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 if (ep == NULL)
2373 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002374 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 if (val == NULL)
2376 val = failobj;
2377 Py_INCREF(val);
2378 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002379}
2380
Benjamin Peterson00e98862013-03-07 22:16:29 -05002381PyObject *
2382PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002383{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002384 PyDictObject *mp = (PyDictObject *)d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002386 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002387 PyDictKeyEntry *ep;
2388 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002389
Benjamin Peterson00e98862013-03-07 22:16:29 -05002390 if (!PyDict_Check(d)) {
2391 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002393 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002394 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002395 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 hash = PyObject_Hash(key);
2397 if (hash == -1)
2398 return NULL;
2399 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002400 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 if (ep == NULL)
2402 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002403 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 if (val == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002405 if (mp->ma_keys->dk_usable <= 0) {
2406 /* Need to resize. */
2407 if (insertion_resize(mp) < 0)
2408 return NULL;
2409 ep = find_empty_slot(mp, key, hash, &value_addr);
2410 }
Benjamin Peterson00e98862013-03-07 22:16:29 -05002411 Py_INCREF(defaultobj);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002412 Py_INCREF(key);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002413 MAINTAIN_TRACKING(mp, key, defaultobj);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002414 ep->me_key = key;
2415 ep->me_hash = hash;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002416 *value_addr = defaultobj;
2417 val = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002418 mp->ma_keys->dk_usable--;
2419 mp->ma_used++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00002422}
2423
Benjamin Peterson00e98862013-03-07 22:16:29 -05002424static PyObject *
2425dict_setdefault(PyDictObject *mp, PyObject *args)
2426{
2427 PyObject *key, *val;
2428 PyObject *defaultobj = Py_None;
2429
2430 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2431 return NULL;
2432
Benjamin Peterson55898502013-03-08 08:36:49 -05002433 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002434 Py_XINCREF(val);
2435 return val;
2436}
Guido van Rossum164452c2000-08-08 16:12:54 +00002437
2438static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002439dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 PyDict_Clear((PyObject *)mp);
2442 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002443}
2444
Guido van Rossumba6ab842000-12-12 22:02:18 +00002445static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002446dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00002449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2451 return NULL;
Eric Snow96c6af92015-05-29 22:21:39 -06002452
2453 return _PyDict_Pop(mp, key, deflt);
Guido van Rossume027d982002-04-12 15:11:59 +00002454}
2455
2456static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002457dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002458{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002459 Py_hash_t i = 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002460 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002462
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 /* Allocate the result tuple before checking the size. Believe it
2465 * or not, this allocation could trigger a garbage collection which
2466 * could empty the dict, so if we checked the size first and that
2467 * happened, the result would be an infinite loop (searching for an
2468 * entry that no longer exists). Note that the usual popitem()
2469 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2470 * tuple away if the dict *is* empty isn't a significant
2471 * inefficiency -- possible, but unlikely in practice.
2472 */
2473 res = PyTuple_New(2);
2474 if (res == NULL)
2475 return NULL;
2476 if (mp->ma_used == 0) {
2477 Py_DECREF(res);
2478 PyErr_SetString(PyExc_KeyError,
2479 "popitem(): dictionary is empty");
2480 return NULL;
2481 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002482 /* Convert split table to combined table */
2483 if (mp->ma_keys->dk_lookup == lookdict_split) {
2484 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2485 Py_DECREF(res);
2486 return NULL;
2487 }
2488 }
2489 ENSURE_ALLOWS_DELETIONS(mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 /* Set ep to "the first" dict entry with a value. We abuse the hash
2491 * field of slot 0 to hold a search finger:
2492 * If slot 0 has a value, use slot 0.
2493 * Else slot 0 is being used to hold a search finger,
2494 * and we use its hash value as the first index to look.
2495 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002496 ep = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 if (ep->me_value == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002498 Py_ssize_t mask = DK_MASK(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 i = ep->me_hash;
2500 /* The hash field may be a real hash value, or it may be a
2501 * legit search finger, or it may be a once-legit search
2502 * finger that's out of bounds now because it wrapped around
2503 * or the table shrunk -- simply make sure it's in bounds now.
2504 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002505 if (i > mask || i < 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 i = 1; /* skip slot 0 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002507 while ((ep = &mp->ma_keys->dk_entries[i])->me_value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002509 if (i > mask)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 i = 1;
2511 }
2512 }
2513 PyTuple_SET_ITEM(res, 0, ep->me_key);
2514 PyTuple_SET_ITEM(res, 1, ep->me_value);
2515 Py_INCREF(dummy);
2516 ep->me_key = dummy;
2517 ep->me_value = NULL;
2518 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002519 assert(mp->ma_keys->dk_entries[0].me_value == NULL);
2520 mp->ma_keys->dk_entries[0].me_hash = i + 1; /* next place to start */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002522}
2523
Jeremy Hylton8caad492000-06-23 14:18:11 +00002524static int
2525dict_traverse(PyObject *op, visitproc visit, void *arg)
2526{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002527 Py_ssize_t i, n;
2528 PyDictObject *mp = (PyDictObject *)op;
2529 if (mp->ma_keys->dk_lookup == lookdict) {
2530 for (i = 0; i < DK_SIZE(mp->ma_keys); i++) {
2531 if (mp->ma_keys->dk_entries[i].me_value != NULL) {
2532 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2533 Py_VISIT(mp->ma_keys->dk_entries[i].me_key);
2534 }
2535 }
2536 } else {
2537 if (mp->ma_values != NULL) {
2538 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2539 Py_VISIT(mp->ma_values[i]);
2540 }
2541 }
2542 else {
2543 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2544 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2545 }
2546 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002547 }
2548 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002549}
2550
2551static int
2552dict_tp_clear(PyObject *op)
2553{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 PyDict_Clear(op);
2555 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002556}
2557
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002558static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002559
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002560Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06002561_PyDict_SizeOf(PyDictObject *mp)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002562{
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002563 Py_ssize_t size, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002564
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002565 size = DK_SIZE(mp->ma_keys);
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002566 res = _PyObject_SIZE(Py_TYPE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002567 if (mp->ma_values)
2568 res += size * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002569 /* If the dictionary is split, the keys portion is accounted-for
2570 in the type object. */
2571 if (mp->ma_keys->dk_refcnt == 1)
2572 res += sizeof(PyDictKeysObject) + (size-1) * sizeof(PyDictKeyEntry);
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002573 return res;
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002574}
2575
2576Py_ssize_t
2577_PyDict_KeysSize(PyDictKeysObject *keys)
2578{
2579 return sizeof(PyDictKeysObject) + (DK_SIZE(keys)-1) * sizeof(PyDictKeyEntry);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002580}
2581
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002582PyObject *
2583dict_sizeof(PyDictObject *mp)
2584{
2585 return PyLong_FromSsize_t(_PyDict_SizeOf(mp));
2586}
2587
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002588PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2589
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002590PyDoc_STRVAR(sizeof__doc__,
2591"D.__sizeof__() -> size of D in memory, in bytes");
2592
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002593PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002594"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002595
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002596PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002597"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 +00002598
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002599PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002600"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002601If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002602
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002603PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002604"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000026052-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002606
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002607PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04002608"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
2609If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
2610If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
2611In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002612
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002613PyDoc_STRVAR(clear__doc__,
2614"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002615
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002616PyDoc_STRVAR(copy__doc__,
2617"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002618
Guido van Rossumb90c8482007-02-10 01:11:45 +00002619/* Forward */
2620static PyObject *dictkeys_new(PyObject *);
2621static PyObject *dictitems_new(PyObject *);
2622static PyObject *dictvalues_new(PyObject *);
2623
Guido van Rossum45c85d12007-07-27 16:31:40 +00002624PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002626PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002628PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002630
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002631static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002632 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2634 getitem__doc__},
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002635 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 sizeof__doc__},
2637 {"get", (PyCFunction)dict_get, METH_VARARGS,
2638 get__doc__},
2639 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2640 setdefault_doc__},
2641 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2642 pop__doc__},
2643 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2644 popitem__doc__},
2645 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2646 keys__doc__},
2647 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2648 items__doc__},
2649 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2650 values__doc__},
2651 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2652 update__doc__},
Larry Hastings5c661892014-01-24 06:17:25 -08002653 DICT_FROMKEYS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2655 clear__doc__},
2656 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2657 copy__doc__},
2658 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002659};
2660
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002661/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002662int
2663PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002664{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002665 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002667 PyDictKeyEntry *ep;
2668 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002671 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 hash = PyObject_Hash(key);
2673 if (hash == -1)
2674 return -1;
2675 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002676 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2677 return (ep == NULL) ? -1 : (*value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002678}
2679
Thomas Wouterscf297e42007-02-23 15:07:44 +00002680/* Internal version of PyDict_Contains used when the hash value is already known */
2681int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002682_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002685 PyDictKeyEntry *ep;
2686 PyObject **value_addr;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002687
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002688 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2689 return (ep == NULL) ? -1 : (*value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002690}
2691
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002692/* Hack to implement "key in dict" */
2693static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 0, /* sq_length */
2695 0, /* sq_concat */
2696 0, /* sq_repeat */
2697 0, /* sq_item */
2698 0, /* sq_slice */
2699 0, /* sq_ass_item */
2700 0, /* sq_ass_slice */
2701 PyDict_Contains, /* sq_contains */
2702 0, /* sq_inplace_concat */
2703 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002704};
2705
Guido van Rossum09e563a2001-05-01 12:10:21 +00002706static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002707dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2708{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002710 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 assert(type != NULL && type->tp_alloc != NULL);
2713 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02002714 if (self == NULL)
2715 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002716 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002717
Victor Stinnera9f61a52013-07-16 22:17:26 +02002718 /* The object has been implicitly tracked by tp_alloc */
2719 if (type == &PyDict_Type)
2720 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002721
2722 d->ma_used = 0;
2723 d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
2724 if (d->ma_keys == NULL) {
2725 Py_DECREF(self);
2726 return NULL;
2727 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002729}
2730
Tim Peters25786c02001-09-02 08:22:48 +00002731static int
2732dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2733{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002735}
2736
Tim Peters6d6c1a32001-08-02 04:15:00 +00002737static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002738dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002741}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002742
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002743PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002744"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002745"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002746" (key, value) pairs\n"
2747"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002748" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002749" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002750" d[k] = v\n"
2751"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2752" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002753
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002754PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2756 "dict",
2757 sizeof(PyDictObject),
2758 0,
2759 (destructor)dict_dealloc, /* tp_dealloc */
2760 0, /* tp_print */
2761 0, /* tp_getattr */
2762 0, /* tp_setattr */
2763 0, /* tp_reserved */
2764 (reprfunc)dict_repr, /* tp_repr */
2765 0, /* tp_as_number */
2766 &dict_as_sequence, /* tp_as_sequence */
2767 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002768 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 0, /* tp_call */
2770 0, /* tp_str */
2771 PyObject_GenericGetAttr, /* tp_getattro */
2772 0, /* tp_setattro */
2773 0, /* tp_as_buffer */
2774 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2775 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2776 dictionary_doc, /* tp_doc */
2777 dict_traverse, /* tp_traverse */
2778 dict_tp_clear, /* tp_clear */
2779 dict_richcompare, /* tp_richcompare */
2780 0, /* tp_weaklistoffset */
2781 (getiterfunc)dict_iter, /* tp_iter */
2782 0, /* tp_iternext */
2783 mapp_methods, /* tp_methods */
2784 0, /* tp_members */
2785 0, /* tp_getset */
2786 0, /* tp_base */
2787 0, /* tp_dict */
2788 0, /* tp_descr_get */
2789 0, /* tp_descr_set */
2790 0, /* tp_dictoffset */
2791 dict_init, /* tp_init */
2792 PyType_GenericAlloc, /* tp_alloc */
2793 dict_new, /* tp_new */
2794 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002795};
2796
Victor Stinner3c1e4812012-03-26 22:10:51 +02002797PyObject *
2798_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
2799{
2800 PyObject *kv;
2801 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02002802 if (kv == NULL) {
2803 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002804 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02002805 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02002806 return PyDict_GetItem(dp, kv);
2807}
2808
Guido van Rossum3cca2451997-05-16 14:23:33 +00002809/* For backward compatibility with old dictionary interface */
2810
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002811PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002812PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 PyObject *kv, *rv;
2815 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02002816 if (kv == NULL) {
2817 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02002819 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 rv = PyDict_GetItem(v, kv);
2821 Py_DECREF(kv);
2822 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002823}
2824
2825int
Victor Stinner3c1e4812012-03-26 22:10:51 +02002826_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
2827{
2828 PyObject *kv;
2829 kv = _PyUnicode_FromId(key); /* borrowed */
2830 if (kv == NULL)
2831 return -1;
2832 return PyDict_SetItem(v, kv, item);
2833}
2834
2835int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002836PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002837{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002838 PyObject *kv;
2839 int err;
2840 kv = PyUnicode_FromString(key);
2841 if (kv == NULL)
2842 return -1;
2843 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2844 err = PyDict_SetItem(v, kv, item);
2845 Py_DECREF(kv);
2846 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002847}
2848
2849int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01002850_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
2851{
2852 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
2853 if (kv == NULL)
2854 return -1;
2855 return PyDict_DelItem(v, kv);
2856}
2857
2858int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002859PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002860{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002861 PyObject *kv;
2862 int err;
2863 kv = PyUnicode_FromString(key);
2864 if (kv == NULL)
2865 return -1;
2866 err = PyDict_DelItem(v, kv);
2867 Py_DECREF(kv);
2868 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002869}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002870
Raymond Hettinger019a1482004-03-18 02:41:19 +00002871/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002872
2873typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 PyObject_HEAD
2875 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2876 Py_ssize_t di_used;
2877 Py_ssize_t di_pos;
2878 PyObject* di_result; /* reusable result tuple for iteritems */
2879 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002880} dictiterobject;
2881
2882static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002883dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 dictiterobject *di;
2886 di = PyObject_GC_New(dictiterobject, itertype);
2887 if (di == NULL)
2888 return NULL;
2889 Py_INCREF(dict);
2890 di->di_dict = dict;
2891 di->di_used = dict->ma_used;
2892 di->di_pos = 0;
2893 di->len = dict->ma_used;
2894 if (itertype == &PyDictIterItem_Type) {
2895 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2896 if (di->di_result == NULL) {
2897 Py_DECREF(di);
2898 return NULL;
2899 }
2900 }
2901 else
2902 di->di_result = NULL;
2903 _PyObject_GC_TRACK(di);
2904 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002905}
2906
2907static void
2908dictiter_dealloc(dictiterobject *di)
2909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 Py_XDECREF(di->di_dict);
2911 Py_XDECREF(di->di_result);
2912 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002913}
2914
2915static int
2916dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 Py_VISIT(di->di_dict);
2919 Py_VISIT(di->di_result);
2920 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002921}
2922
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002923static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002924dictiter_len(dictiterobject *di)
2925{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 Py_ssize_t len = 0;
2927 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2928 len = di->len;
2929 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002930}
2931
Guido van Rossumb90c8482007-02-10 01:11:45 +00002932PyDoc_STRVAR(length_hint_doc,
2933 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002934
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002935static PyObject *
2936dictiter_reduce(dictiterobject *di);
2937
2938PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2939
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002940static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002941 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2942 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002943 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
2944 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002946};
2947
Raymond Hettinger019a1482004-03-18 02:41:19 +00002948static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 PyObject *key;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002951 Py_ssize_t i, mask, offset;
2952 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002954 PyObject **value_ptr;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002956 if (d == NULL)
2957 return NULL;
2958 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 if (di->di_used != d->ma_used) {
2961 PyErr_SetString(PyExc_RuntimeError,
2962 "dictionary changed size during iteration");
2963 di->di_used = -1; /* Make this state sticky */
2964 return NULL;
2965 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 i = di->di_pos;
2968 if (i < 0)
2969 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002970 k = d->ma_keys;
2971 if (d->ma_values) {
2972 value_ptr = &d->ma_values[i];
2973 offset = sizeof(PyObject *);
2974 }
2975 else {
2976 value_ptr = &k->dk_entries[i].me_value;
2977 offset = sizeof(PyDictKeyEntry);
2978 }
2979 mask = DK_SIZE(k)-1;
2980 while (i <= mask && *value_ptr == NULL) {
2981 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002982 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002983 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002984 di->di_pos = i+1;
2985 if (i > mask)
2986 goto fail;
2987 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002988 key = k->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002989 Py_INCREF(key);
2990 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002991
2992fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 Py_DECREF(d);
2994 di->di_dict = NULL;
2995 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002996}
2997
Raymond Hettinger019a1482004-03-18 02:41:19 +00002998PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002999 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3000 "dict_keyiterator", /* tp_name */
3001 sizeof(dictiterobject), /* tp_basicsize */
3002 0, /* tp_itemsize */
3003 /* methods */
3004 (destructor)dictiter_dealloc, /* tp_dealloc */
3005 0, /* tp_print */
3006 0, /* tp_getattr */
3007 0, /* tp_setattr */
3008 0, /* tp_reserved */
3009 0, /* tp_repr */
3010 0, /* tp_as_number */
3011 0, /* tp_as_sequence */
3012 0, /* tp_as_mapping */
3013 0, /* tp_hash */
3014 0, /* tp_call */
3015 0, /* tp_str */
3016 PyObject_GenericGetAttr, /* tp_getattro */
3017 0, /* tp_setattro */
3018 0, /* tp_as_buffer */
3019 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3020 0, /* tp_doc */
3021 (traverseproc)dictiter_traverse, /* tp_traverse */
3022 0, /* tp_clear */
3023 0, /* tp_richcompare */
3024 0, /* tp_weaklistoffset */
3025 PyObject_SelfIter, /* tp_iter */
3026 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
3027 dictiter_methods, /* tp_methods */
3028 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003029};
3030
3031static PyObject *dictiter_iternextvalue(dictiterobject *di)
3032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003033 PyObject *value;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003034 Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003036 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038 if (d == NULL)
3039 return NULL;
3040 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 if (di->di_used != d->ma_used) {
3043 PyErr_SetString(PyExc_RuntimeError,
3044 "dictionary changed size during iteration");
3045 di->di_used = -1; /* Make this state sticky */
3046 return NULL;
3047 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003049 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003050 mask = DK_SIZE(d->ma_keys)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 if (i < 0 || i > mask)
3052 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003053 if (d->ma_values) {
3054 value_ptr = &d->ma_values[i];
3055 offset = sizeof(PyObject *);
3056 }
3057 else {
3058 value_ptr = &d->ma_keys->dk_entries[i].me_value;
3059 offset = sizeof(PyDictKeyEntry);
3060 }
3061 while (i <= mask && *value_ptr == NULL) {
3062 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 i++;
3064 if (i > mask)
3065 goto fail;
3066 }
3067 di->di_pos = i+1;
3068 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003069 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 Py_INCREF(value);
3071 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003072
3073fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 Py_DECREF(d);
3075 di->di_dict = NULL;
3076 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003077}
3078
3079PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3081 "dict_valueiterator", /* tp_name */
3082 sizeof(dictiterobject), /* tp_basicsize */
3083 0, /* tp_itemsize */
3084 /* methods */
3085 (destructor)dictiter_dealloc, /* tp_dealloc */
3086 0, /* tp_print */
3087 0, /* tp_getattr */
3088 0, /* tp_setattr */
3089 0, /* tp_reserved */
3090 0, /* tp_repr */
3091 0, /* tp_as_number */
3092 0, /* tp_as_sequence */
3093 0, /* tp_as_mapping */
3094 0, /* tp_hash */
3095 0, /* tp_call */
3096 0, /* tp_str */
3097 PyObject_GenericGetAttr, /* tp_getattro */
3098 0, /* tp_setattro */
3099 0, /* tp_as_buffer */
3100 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3101 0, /* tp_doc */
3102 (traverseproc)dictiter_traverse, /* tp_traverse */
3103 0, /* tp_clear */
3104 0, /* tp_richcompare */
3105 0, /* tp_weaklistoffset */
3106 PyObject_SelfIter, /* tp_iter */
3107 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
3108 dictiter_methods, /* tp_methods */
3109 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003110};
3111
3112static PyObject *dictiter_iternextitem(dictiterobject *di)
3113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 PyObject *key, *value, *result = di->di_result;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003115 Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003117 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 if (d == NULL)
3120 return NULL;
3121 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003123 if (di->di_used != d->ma_used) {
3124 PyErr_SetString(PyExc_RuntimeError,
3125 "dictionary changed size during iteration");
3126 di->di_used = -1; /* Make this state sticky */
3127 return NULL;
3128 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003130 i = di->di_pos;
3131 if (i < 0)
3132 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003133 mask = DK_SIZE(d->ma_keys)-1;
3134 if (d->ma_values) {
3135 value_ptr = &d->ma_values[i];
3136 offset = sizeof(PyObject *);
3137 }
3138 else {
3139 value_ptr = &d->ma_keys->dk_entries[i].me_value;
3140 offset = sizeof(PyDictKeyEntry);
3141 }
3142 while (i <= mask && *value_ptr == NULL) {
3143 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003145 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 di->di_pos = i+1;
3147 if (i > mask)
3148 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003150 if (result->ob_refcnt == 1) {
3151 Py_INCREF(result);
3152 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3153 Py_DECREF(PyTuple_GET_ITEM(result, 1));
3154 } else {
3155 result = PyTuple_New(2);
3156 if (result == NULL)
3157 return NULL;
3158 }
3159 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003160 key = d->ma_keys->dk_entries[i].me_key;
3161 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162 Py_INCREF(key);
3163 Py_INCREF(value);
Eric Snow96c6af92015-05-29 22:21:39 -06003164 PyTuple_SET_ITEM(result, 0, key); /* steals reference */
3165 PyTuple_SET_ITEM(result, 1, value); /* steals reference */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003167
3168fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 Py_DECREF(d);
3170 di->di_dict = NULL;
3171 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003172}
3173
3174PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003175 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3176 "dict_itemiterator", /* tp_name */
3177 sizeof(dictiterobject), /* tp_basicsize */
3178 0, /* tp_itemsize */
3179 /* methods */
3180 (destructor)dictiter_dealloc, /* tp_dealloc */
3181 0, /* tp_print */
3182 0, /* tp_getattr */
3183 0, /* tp_setattr */
3184 0, /* tp_reserved */
3185 0, /* tp_repr */
3186 0, /* tp_as_number */
3187 0, /* tp_as_sequence */
3188 0, /* tp_as_mapping */
3189 0, /* tp_hash */
3190 0, /* tp_call */
3191 0, /* tp_str */
3192 PyObject_GenericGetAttr, /* tp_getattro */
3193 0, /* tp_setattro */
3194 0, /* tp_as_buffer */
3195 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3196 0, /* tp_doc */
3197 (traverseproc)dictiter_traverse, /* tp_traverse */
3198 0, /* tp_clear */
3199 0, /* tp_richcompare */
3200 0, /* tp_weaklistoffset */
3201 PyObject_SelfIter, /* tp_iter */
3202 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3203 dictiter_methods, /* tp_methods */
3204 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003205};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003206
3207
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003208static PyObject *
3209dictiter_reduce(dictiterobject *di)
3210{
3211 PyObject *list;
3212 dictiterobject tmp;
3213
3214 list = PyList_New(0);
3215 if (!list)
3216 return NULL;
3217
3218 /* copy the itertor state */
3219 tmp = *di;
3220 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003221
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003222 /* iterate the temporary into a list */
3223 for(;;) {
3224 PyObject *element = 0;
3225 if (Py_TYPE(di) == &PyDictIterItem_Type)
3226 element = dictiter_iternextitem(&tmp);
3227 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3228 element = dictiter_iternextkey(&tmp);
3229 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3230 element = dictiter_iternextvalue(&tmp);
3231 else
3232 assert(0);
3233 if (element) {
3234 if (PyList_Append(list, element)) {
3235 Py_DECREF(element);
3236 Py_DECREF(list);
3237 Py_XDECREF(tmp.di_dict);
3238 return NULL;
3239 }
3240 Py_DECREF(element);
3241 } else
3242 break;
3243 }
3244 Py_XDECREF(tmp.di_dict);
3245 /* check for error */
3246 if (tmp.di_dict != NULL) {
3247 /* we have an error */
3248 Py_DECREF(list);
3249 return NULL;
3250 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003251 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003252}
3253
Guido van Rossum3ac67412007-02-10 18:55:06 +00003254/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003255/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003256/***********************************************/
3257
Guido van Rossumb90c8482007-02-10 01:11:45 +00003258/* The instance lay-out is the same for all three; but the type differs. */
3259
Guido van Rossumb90c8482007-02-10 01:11:45 +00003260static void
Eric Snow96c6af92015-05-29 22:21:39 -06003261dictview_dealloc(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 Py_XDECREF(dv->dv_dict);
3264 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003265}
3266
3267static int
Eric Snow96c6af92015-05-29 22:21:39 -06003268dictview_traverse(_PyDictViewObject *dv, visitproc visit, void *arg)
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 Py_VISIT(dv->dv_dict);
3271 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003272}
3273
Guido van Rossum83825ac2007-02-10 04:54:19 +00003274static Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06003275dictview_len(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003276{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003277 Py_ssize_t len = 0;
3278 if (dv->dv_dict != NULL)
3279 len = dv->dv_dict->ma_used;
3280 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003281}
3282
Eric Snow96c6af92015-05-29 22:21:39 -06003283PyObject *
3284_PyDictView_New(PyObject *dict, PyTypeObject *type)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003285{
Eric Snow96c6af92015-05-29 22:21:39 -06003286 _PyDictViewObject *dv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 if (dict == NULL) {
3288 PyErr_BadInternalCall();
3289 return NULL;
3290 }
3291 if (!PyDict_Check(dict)) {
3292 /* XXX Get rid of this restriction later */
3293 PyErr_Format(PyExc_TypeError,
3294 "%s() requires a dict argument, not '%s'",
3295 type->tp_name, dict->ob_type->tp_name);
3296 return NULL;
3297 }
Eric Snow96c6af92015-05-29 22:21:39 -06003298 dv = PyObject_GC_New(_PyDictViewObject, type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 if (dv == NULL)
3300 return NULL;
3301 Py_INCREF(dict);
3302 dv->dv_dict = (PyDictObject *)dict;
3303 _PyObject_GC_TRACK(dv);
3304 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003305}
3306
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003307/* TODO(guido): The views objects are not complete:
3308
3309 * support more set operations
3310 * support arbitrary mappings?
3311 - either these should be static or exported in dictobject.h
3312 - if public then they should probably be in builtins
3313*/
3314
Guido van Rossumaac530c2007-08-24 22:33:45 +00003315/* Return 1 if self is a subset of other, iterating over self;
3316 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003317static int
3318all_contained_in(PyObject *self, PyObject *other)
3319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 PyObject *iter = PyObject_GetIter(self);
3321 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003323 if (iter == NULL)
3324 return -1;
3325 for (;;) {
3326 PyObject *next = PyIter_Next(iter);
3327 if (next == NULL) {
3328 if (PyErr_Occurred())
3329 ok = -1;
3330 break;
3331 }
3332 ok = PySequence_Contains(other, next);
3333 Py_DECREF(next);
3334 if (ok <= 0)
3335 break;
3336 }
3337 Py_DECREF(iter);
3338 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003339}
3340
3341static PyObject *
3342dictview_richcompare(PyObject *self, PyObject *other, int op)
3343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 Py_ssize_t len_self, len_other;
3345 int ok;
3346 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003348 assert(self != NULL);
3349 assert(PyDictViewSet_Check(self));
3350 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003351
Brian Curtindfc80e32011-08-10 20:28:54 -05003352 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3353 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 len_self = PyObject_Size(self);
3356 if (len_self < 0)
3357 return NULL;
3358 len_other = PyObject_Size(other);
3359 if (len_other < 0)
3360 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 ok = 0;
3363 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003365 case Py_NE:
3366 case Py_EQ:
3367 if (len_self == len_other)
3368 ok = all_contained_in(self, other);
3369 if (op == Py_NE && ok >= 0)
3370 ok = !ok;
3371 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 case Py_LT:
3374 if (len_self < len_other)
3375 ok = all_contained_in(self, other);
3376 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 case Py_LE:
3379 if (len_self <= len_other)
3380 ok = all_contained_in(self, other);
3381 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 case Py_GT:
3384 if (len_self > len_other)
3385 ok = all_contained_in(other, self);
3386 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003388 case Py_GE:
3389 if (len_self >= len_other)
3390 ok = all_contained_in(other, self);
3391 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003393 }
3394 if (ok < 0)
3395 return NULL;
3396 result = ok ? Py_True : Py_False;
3397 Py_INCREF(result);
3398 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003399}
3400
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003401static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003402dictview_repr(_PyDictViewObject *dv)
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 PyObject *seq;
3405 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003407 seq = PySequence_List((PyObject *)dv);
3408 if (seq == NULL)
3409 return NULL;
3410
3411 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3412 Py_DECREF(seq);
3413 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003414}
3415
Guido van Rossum3ac67412007-02-10 18:55:06 +00003416/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003417
3418static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003419dictkeys_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 if (dv->dv_dict == NULL) {
3422 Py_RETURN_NONE;
3423 }
3424 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003425}
3426
3427static int
Eric Snow96c6af92015-05-29 22:21:39 -06003428dictkeys_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003429{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 if (dv->dv_dict == NULL)
3431 return 0;
3432 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003433}
3434
Guido van Rossum83825ac2007-02-10 04:54:19 +00003435static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003436 (lenfunc)dictview_len, /* sq_length */
3437 0, /* sq_concat */
3438 0, /* sq_repeat */
3439 0, /* sq_item */
3440 0, /* sq_slice */
3441 0, /* sq_ass_item */
3442 0, /* sq_ass_slice */
3443 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003444};
3445
Guido van Rossum523259b2007-08-24 23:41:22 +00003446static PyObject*
3447dictviews_sub(PyObject* self, PyObject *other)
3448{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 PyObject *result = PySet_New(self);
3450 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003451 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 if (result == NULL)
3454 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003455
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003456 tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003457 if (tmp == NULL) {
3458 Py_DECREF(result);
3459 return NULL;
3460 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003462 Py_DECREF(tmp);
3463 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003464}
3465
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003466PyObject*
3467_PyDictView_Intersect(PyObject* self, PyObject *other)
Guido van Rossum523259b2007-08-24 23:41:22 +00003468{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003469 PyObject *result = PySet_New(self);
3470 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003471 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003473 if (result == NULL)
3474 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003475
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003476 tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003477 if (tmp == NULL) {
3478 Py_DECREF(result);
3479 return NULL;
3480 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003482 Py_DECREF(tmp);
3483 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003484}
3485
3486static PyObject*
3487dictviews_or(PyObject* self, PyObject *other)
3488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003489 PyObject *result = PySet_New(self);
3490 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003491 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 if (result == NULL)
3494 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003495
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003496 tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003497 if (tmp == NULL) {
3498 Py_DECREF(result);
3499 return NULL;
3500 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003502 Py_DECREF(tmp);
3503 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003504}
3505
3506static PyObject*
3507dictviews_xor(PyObject* self, PyObject *other)
3508{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003509 PyObject *result = PySet_New(self);
3510 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003511 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003513 if (result == NULL)
3514 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003515
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003516 tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003517 other);
3518 if (tmp == NULL) {
3519 Py_DECREF(result);
3520 return NULL;
3521 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003523 Py_DECREF(tmp);
3524 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003525}
3526
3527static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003528 0, /*nb_add*/
3529 (binaryfunc)dictviews_sub, /*nb_subtract*/
3530 0, /*nb_multiply*/
3531 0, /*nb_remainder*/
3532 0, /*nb_divmod*/
3533 0, /*nb_power*/
3534 0, /*nb_negative*/
3535 0, /*nb_positive*/
3536 0, /*nb_absolute*/
3537 0, /*nb_bool*/
3538 0, /*nb_invert*/
3539 0, /*nb_lshift*/
3540 0, /*nb_rshift*/
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003541 (binaryfunc)_PyDictView_Intersect, /*nb_and*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542 (binaryfunc)dictviews_xor, /*nb_xor*/
3543 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003544};
3545
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003546static PyObject*
3547dictviews_isdisjoint(PyObject *self, PyObject *other)
3548{
3549 PyObject *it;
3550 PyObject *item = NULL;
3551
3552 if (self == other) {
Eric Snow96c6af92015-05-29 22:21:39 -06003553 if (dictview_len((_PyDictViewObject *)self) == 0)
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003554 Py_RETURN_TRUE;
3555 else
3556 Py_RETURN_FALSE;
3557 }
3558
3559 /* Iterate over the shorter object (only if other is a set,
3560 * because PySequence_Contains may be expensive otherwise): */
3561 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
Eric Snow96c6af92015-05-29 22:21:39 -06003562 Py_ssize_t len_self = dictview_len((_PyDictViewObject *)self);
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003563 Py_ssize_t len_other = PyObject_Size(other);
3564 if (len_other == -1)
3565 return NULL;
3566
3567 if ((len_other > len_self)) {
3568 PyObject *tmp = other;
3569 other = self;
3570 self = tmp;
3571 }
3572 }
3573
3574 it = PyObject_GetIter(other);
3575 if (it == NULL)
3576 return NULL;
3577
3578 while ((item = PyIter_Next(it)) != NULL) {
3579 int contains = PySequence_Contains(self, item);
3580 Py_DECREF(item);
3581 if (contains == -1) {
3582 Py_DECREF(it);
3583 return NULL;
3584 }
3585
3586 if (contains) {
3587 Py_DECREF(it);
3588 Py_RETURN_FALSE;
3589 }
3590 }
3591 Py_DECREF(it);
3592 if (PyErr_Occurred())
3593 return NULL; /* PyIter_Next raised an exception. */
3594 Py_RETURN_TRUE;
3595}
3596
3597PyDoc_STRVAR(isdisjoint_doc,
3598"Return True if the view and the given iterable have a null intersection.");
3599
Guido van Rossumb90c8482007-02-10 01:11:45 +00003600static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003601 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3602 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003603 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003604};
3605
3606PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003607 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3608 "dict_keys", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06003609 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003610 0, /* tp_itemsize */
3611 /* methods */
3612 (destructor)dictview_dealloc, /* tp_dealloc */
3613 0, /* tp_print */
3614 0, /* tp_getattr */
3615 0, /* tp_setattr */
3616 0, /* tp_reserved */
3617 (reprfunc)dictview_repr, /* tp_repr */
3618 &dictviews_as_number, /* tp_as_number */
3619 &dictkeys_as_sequence, /* tp_as_sequence */
3620 0, /* tp_as_mapping */
3621 0, /* tp_hash */
3622 0, /* tp_call */
3623 0, /* tp_str */
3624 PyObject_GenericGetAttr, /* tp_getattro */
3625 0, /* tp_setattro */
3626 0, /* tp_as_buffer */
3627 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3628 0, /* tp_doc */
3629 (traverseproc)dictview_traverse, /* tp_traverse */
3630 0, /* tp_clear */
3631 dictview_richcompare, /* tp_richcompare */
3632 0, /* tp_weaklistoffset */
3633 (getiterfunc)dictkeys_iter, /* tp_iter */
3634 0, /* tp_iternext */
3635 dictkeys_methods, /* tp_methods */
3636 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003637};
3638
3639static PyObject *
3640dictkeys_new(PyObject *dict)
3641{
Eric Snow96c6af92015-05-29 22:21:39 -06003642 return _PyDictView_New(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003643}
3644
Guido van Rossum3ac67412007-02-10 18:55:06 +00003645/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003646
3647static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003648dictitems_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003650 if (dv->dv_dict == NULL) {
3651 Py_RETURN_NONE;
3652 }
3653 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003654}
3655
3656static int
Eric Snow96c6af92015-05-29 22:21:39 -06003657dictitems_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003658{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003659 PyObject *key, *value, *found;
3660 if (dv->dv_dict == NULL)
3661 return 0;
3662 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3663 return 0;
3664 key = PyTuple_GET_ITEM(obj, 0);
3665 value = PyTuple_GET_ITEM(obj, 1);
3666 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3667 if (found == NULL) {
3668 if (PyErr_Occurred())
3669 return -1;
3670 return 0;
3671 }
3672 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003673}
3674
Guido van Rossum83825ac2007-02-10 04:54:19 +00003675static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676 (lenfunc)dictview_len, /* sq_length */
3677 0, /* sq_concat */
3678 0, /* sq_repeat */
3679 0, /* sq_item */
3680 0, /* sq_slice */
3681 0, /* sq_ass_item */
3682 0, /* sq_ass_slice */
3683 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003684};
3685
Guido van Rossumb90c8482007-02-10 01:11:45 +00003686static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003687 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3688 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003690};
3691
3692PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003693 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3694 "dict_items", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06003695 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003696 0, /* tp_itemsize */
3697 /* methods */
3698 (destructor)dictview_dealloc, /* tp_dealloc */
3699 0, /* tp_print */
3700 0, /* tp_getattr */
3701 0, /* tp_setattr */
3702 0, /* tp_reserved */
3703 (reprfunc)dictview_repr, /* tp_repr */
3704 &dictviews_as_number, /* tp_as_number */
3705 &dictitems_as_sequence, /* tp_as_sequence */
3706 0, /* tp_as_mapping */
3707 0, /* tp_hash */
3708 0, /* tp_call */
3709 0, /* tp_str */
3710 PyObject_GenericGetAttr, /* tp_getattro */
3711 0, /* tp_setattro */
3712 0, /* tp_as_buffer */
3713 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3714 0, /* tp_doc */
3715 (traverseproc)dictview_traverse, /* tp_traverse */
3716 0, /* tp_clear */
3717 dictview_richcompare, /* tp_richcompare */
3718 0, /* tp_weaklistoffset */
3719 (getiterfunc)dictitems_iter, /* tp_iter */
3720 0, /* tp_iternext */
3721 dictitems_methods, /* tp_methods */
3722 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003723};
3724
3725static PyObject *
3726dictitems_new(PyObject *dict)
3727{
Eric Snow96c6af92015-05-29 22:21:39 -06003728 return _PyDictView_New(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003729}
3730
Guido van Rossum3ac67412007-02-10 18:55:06 +00003731/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003732
3733static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003734dictvalues_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 if (dv->dv_dict == NULL) {
3737 Py_RETURN_NONE;
3738 }
3739 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003740}
3741
Guido van Rossum83825ac2007-02-10 04:54:19 +00003742static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003743 (lenfunc)dictview_len, /* sq_length */
3744 0, /* sq_concat */
3745 0, /* sq_repeat */
3746 0, /* sq_item */
3747 0, /* sq_slice */
3748 0, /* sq_ass_item */
3749 0, /* sq_ass_slice */
3750 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003751};
3752
Guido van Rossumb90c8482007-02-10 01:11:45 +00003753static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003754 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003755};
3756
3757PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003758 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3759 "dict_values", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06003760 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003761 0, /* tp_itemsize */
3762 /* methods */
3763 (destructor)dictview_dealloc, /* tp_dealloc */
3764 0, /* tp_print */
3765 0, /* tp_getattr */
3766 0, /* tp_setattr */
3767 0, /* tp_reserved */
3768 (reprfunc)dictview_repr, /* tp_repr */
3769 0, /* tp_as_number */
3770 &dictvalues_as_sequence, /* tp_as_sequence */
3771 0, /* tp_as_mapping */
3772 0, /* tp_hash */
3773 0, /* tp_call */
3774 0, /* tp_str */
3775 PyObject_GenericGetAttr, /* tp_getattro */
3776 0, /* tp_setattro */
3777 0, /* tp_as_buffer */
3778 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3779 0, /* tp_doc */
3780 (traverseproc)dictview_traverse, /* tp_traverse */
3781 0, /* tp_clear */
3782 0, /* tp_richcompare */
3783 0, /* tp_weaklistoffset */
3784 (getiterfunc)dictvalues_iter, /* tp_iter */
3785 0, /* tp_iternext */
3786 dictvalues_methods, /* tp_methods */
3787 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003788};
3789
3790static PyObject *
3791dictvalues_new(PyObject *dict)
3792{
Eric Snow96c6af92015-05-29 22:21:39 -06003793 return _PyDictView_New(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003794}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003795
3796/* Returns NULL if cannot allocate a new PyDictKeysObject,
3797 but does not set an error */
3798PyDictKeysObject *
3799_PyDict_NewKeysForClass(void)
3800{
3801 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_SPLIT);
3802 if (keys == NULL)
3803 PyErr_Clear();
3804 else
3805 keys->dk_lookup = lookdict_split;
3806 return keys;
3807}
3808
3809#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
3810
3811PyObject *
3812PyObject_GenericGetDict(PyObject *obj, void *context)
3813{
3814 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
3815 if (dictptr == NULL) {
3816 PyErr_SetString(PyExc_AttributeError,
3817 "This object has no __dict__");
3818 return NULL;
3819 }
3820 dict = *dictptr;
3821 if (dict == NULL) {
3822 PyTypeObject *tp = Py_TYPE(obj);
3823 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
3824 DK_INCREF(CACHED_KEYS(tp));
3825 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
3826 }
3827 else {
3828 *dictptr = dict = PyDict_New();
3829 }
3830 }
3831 Py_XINCREF(dict);
3832 return dict;
3833}
3834
3835int
3836_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
3837 PyObject *key, PyObject *value)
3838{
3839 PyObject *dict;
3840 int res;
3841 PyDictKeysObject *cached;
3842
3843 assert(dictptr != NULL);
3844 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
3845 assert(dictptr != NULL);
3846 dict = *dictptr;
3847 if (dict == NULL) {
3848 DK_INCREF(cached);
3849 dict = new_dict_with_shared_keys(cached);
3850 if (dict == NULL)
3851 return -1;
3852 *dictptr = dict;
3853 }
3854 if (value == NULL) {
3855 res = PyDict_DelItem(dict, key);
3856 if (cached != ((PyDictObject *)dict)->ma_keys) {
3857 CACHED_KEYS(tp) = NULL;
3858 DK_DECREF(cached);
3859 }
3860 } else {
3861 res = PyDict_SetItem(dict, key, value);
3862 if (cached != ((PyDictObject *)dict)->ma_keys) {
3863 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04003864 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003865 CACHED_KEYS(tp) = make_keys_shared(dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003866 } else {
3867 CACHED_KEYS(tp) = NULL;
3868 }
3869 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04003870 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
3871 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003872 }
3873 }
3874 } else {
3875 dict = *dictptr;
3876 if (dict == NULL) {
3877 dict = PyDict_New();
3878 if (dict == NULL)
3879 return -1;
3880 *dictptr = dict;
3881 }
3882 if (value == NULL) {
3883 res = PyDict_DelItem(dict, key);
3884 } else {
3885 res = PyDict_SetItem(dict, key, value);
3886 }
3887 }
3888 return res;
3889}
3890
3891void
3892_PyDictKeys_DecRef(PyDictKeysObject *keys)
3893{
3894 DK_DECREF(keys);
3895}
3896
3897
3898/* ARGSUSED */
3899static PyObject *
3900dummy_repr(PyObject *op)
3901{
3902 return PyUnicode_FromString("<dummy key>");
3903}
3904
3905/* ARGUSED */
3906static void
3907dummy_dealloc(PyObject* ignore)
3908{
3909 /* This should never get called, but we also don't want to SEGV if
3910 * we accidentally decref dummy-key out of existence.
3911 */
3912 Py_FatalError("deallocating <dummy key>");
3913}
3914
3915static PyTypeObject PyDictDummy_Type = {
3916 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3917 "<dummy key> type",
3918 0,
3919 0,
3920 dummy_dealloc, /*tp_dealloc*/ /*never called*/
3921 0, /*tp_print*/
3922 0, /*tp_getattr*/
3923 0, /*tp_setattr*/
3924 0, /*tp_reserved*/
3925 dummy_repr, /*tp_repr*/
3926 0, /*tp_as_number*/
3927 0, /*tp_as_sequence*/
3928 0, /*tp_as_mapping*/
3929 0, /*tp_hash */
3930 0, /*tp_call */
3931 0, /*tp_str */
3932 0, /*tp_getattro */
3933 0, /*tp_setattro */
3934 0, /*tp_as_buffer */
3935 Py_TPFLAGS_DEFAULT, /*tp_flags */
3936};
3937
3938static PyObject _dummy_struct = {
3939 _PyObject_EXTRA_INIT
3940 2, &PyDictDummy_Type
3941};
3942