blob: 64941937e748ad8beb76100d9cd744c11098acd9 [file] [log] [blame]
Guido van Rossum2bc13791999-03-24 19:06:42 +00001/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002
Raymond Hettinger930427b2003-05-03 06:51:59 +00003/* The distribution includes a separate file, Objects/dictnotes.txt,
Tim Peters60b29962006-01-01 01:19:23 +00004 describing explorations into dictionary design and optimization.
Raymond Hettinger930427b2003-05-03 06:51:59 +00005 It covers typical dictionary use patterns, the parameters for
6 tuning dictionaries, and several ideas for possible optimizations.
7*/
8
Victor Stinner742da042016-09-07 17:40:12 -07009/* PyDictKeysObject
10
11This implements the dictionary's hashtable.
12
Berker Peksag71c01d42016-09-09 03:57:23 +030013As of Python 3.6, this is compact and ordered. Basic idea is described here.
Benjamin Peterson003f0592016-09-08 10:14:31 -070014https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html
Victor Stinner742da042016-09-07 17:40:12 -070015
16layout:
17
18+---------------+
19| dk_refcnt |
20| dk_size |
21| dk_lookup |
22| dk_usable |
23| dk_nentries |
24+---------------+
25| dk_indices |
26| |
27+---------------+
28| dk_entries |
29| |
30+---------------+
31
32dk_indices is actual hashtable. It holds index in entries, or DKIX_EMPTY(-1)
33or DKIX_DUMMY(-2).
34Size of indices is dk_size. Type of each index in indices is vary on dk_size:
35
36* int8 for dk_size <= 128
37* int16 for 256 <= dk_size <= 2**15
38* int32 for 2**16 <= dk_size <= 2**31
39* int64 for 2**32 <= dk_size
40
41dk_entries is array of PyDictKeyEntry. It's size is USABLE_FRACTION(dk_size).
42DK_ENTRIES(dk) can be used to get pointer to entries.
43
44NOTE: Since negative value is used for DKIX_EMPTY and DKIX_DUMMY, type of
45dk_indices entry is signed integer and int16 is used for table which
46dk_size == 256.
47*/
48
Benjamin Peterson7d95e402012-04-23 11:24:50 -040049
50/*
Benjamin Peterson7d95e402012-04-23 11:24:50 -040051The DictObject can be in one of two forms.
Victor Stinner742da042016-09-07 17:40:12 -070052
Benjamin Peterson7d95e402012-04-23 11:24:50 -040053Either:
54 A combined table:
55 ma_values == NULL, dk_refcnt == 1.
56 Values are stored in the me_value field of the PyDictKeysObject.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040057Or:
58 A split table:
59 ma_values != NULL, dk_refcnt >= 1
60 Values are stored in the ma_values array.
Victor Stinner742da042016-09-07 17:40:12 -070061 Only string (unicode) keys are allowed.
62 All dicts sharing same key must have same insertion order.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040063
Victor Stinner742da042016-09-07 17:40:12 -070064There are four kinds of slots in the table (slot is index, and
65DK_ENTRIES(keys)[index] if index >= 0):
66
671. Unused. index == DKIX_EMPTY
68 Does not hold an active (key, value) pair now and never did. Unused can
69 transition to Active upon key insertion. This is each slot's initial state.
70
712. Active. index >= 0, me_key != NULL and me_value != NULL
72 Holds an active (key, value) pair. Active can transition to Dummy or
73 Pending upon key deletion (for combined and split tables respectively).
74 This is the only case in which me_value != NULL.
75
763. Dummy. index == DKIX_DUMMY (combined only)
77 Previously held an active (key, value) pair, but that was deleted and an
78 active pair has not yet overwritten the slot. Dummy can transition to
79 Active upon key insertion. Dummy slots cannot be made Unused again
80 else the probe sequence in case of collision would have no way to know
81 they were once active.
82
834. Pending. index >= 0, key != NULL, and value == NULL (split only)
84 Not yet inserted in split-table.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040085*/
86
Victor Stinner742da042016-09-07 17:40:12 -070087/*
88Preserving insertion order
Benjamin Peterson7d95e402012-04-23 11:24:50 -040089
Victor Stinner742da042016-09-07 17:40:12 -070090It's simple for combined table. Since dk_entries is mostly append only, we can
91get insertion order by just iterating dk_entries.
92
93One exception is .popitem(). It removes last item in dk_entries and decrement
94dk_nentries to achieve amortized O(1). Since there are DKIX_DUMMY remains in
95dk_indices, we can't increment dk_usable even though dk_nentries is
96decremented.
97
98In split table, inserting into pending entry is allowed only for dk_entries[ix]
99where ix == mp->ma_used. Inserting into other index and deleting item cause
100converting the dict to the combined table.
101*/
102
103/* PyDict_MINSIZE is the starting size for any new dict.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400104 * 8 allows dicts with no more than 5 active entries; experiments suggested
105 * this suffices for the majority of dicts (consisting mostly of usually-small
106 * dicts created to pass keyword arguments).
107 * Making this 8, rather than 4 reduces the number of resizes for most
108 * dictionaries, without any significant extra memory use.
109 */
Victor Stinner742da042016-09-07 17:40:12 -0700110#define PyDict_MINSIZE 8
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400111
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112#include "Python.h"
Eric Snow96c6af92015-05-29 22:21:39 -0600113#include "dict-common.h"
Victor Stinner990397e2016-09-09 20:22:59 -0700114#include "stringlib/eq.h" /* to get unicode_eq() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000115
Larry Hastings61272b72014-01-07 12:41:53 -0800116/*[clinic input]
Larry Hastingsc2047262014-01-25 20:43:29 -0800117class dict "PyDictObject *" "&PyDict_Type"
Larry Hastings61272b72014-01-07 12:41:53 -0800118[clinic start generated code]*/
Larry Hastings581ee362014-01-28 05:00:08 -0800119/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f157a5a0ce9589d6]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800120
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400121
122/*
123To ensure the lookup algorithm terminates, there must be at least one Unused
124slot (NULL key) in the table.
125To avoid slowing down lookups on a near-full table, we resize the table when
126it's USABLE_FRACTION (currently two-thirds) full.
127*/
Guido van Rossum16e93a81997-01-28 00:00:11 +0000128
Tim Peterseb28ef22001-06-02 05:27:19 +0000129#define PERTURB_SHIFT 5
130
Guido van Rossum16e93a81997-01-28 00:00:11 +0000131/*
Tim Peterseb28ef22001-06-02 05:27:19 +0000132Major subtleties ahead: Most hash schemes depend on having a "good" hash
133function, in the sense of simulating randomness. Python doesn't: its most
R David Murray537ad7a2016-07-10 12:33:18 -0400134important hash functions (for ints) are very regular in common
Tim Peterseb28ef22001-06-02 05:27:19 +0000135cases:
Tim Peters15d49292001-05-27 07:39:22 +0000136
R David Murray537ad7a2016-07-10 12:33:18 -0400137 >>>[hash(i) for i in range(4)]
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000138 [0, 1, 2, 3]
Tim Peters15d49292001-05-27 07:39:22 +0000139
Tim Peterseb28ef22001-06-02 05:27:19 +0000140This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
141the low-order i bits as the initial table index is extremely fast, and there
R David Murray537ad7a2016-07-10 12:33:18 -0400142are no collisions at all for dicts indexed by a contiguous range of ints. So
143this gives better-than-random behavior in common cases, and that's very
144desirable.
Tim Peters15d49292001-05-27 07:39:22 +0000145
Tim Peterseb28ef22001-06-02 05:27:19 +0000146OTOH, when collisions occur, the tendency to fill contiguous slices of the
147hash table makes a good collision resolution strategy crucial. Taking only
148the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000150their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
151 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +0000152
Tim Peterseb28ef22001-06-02 05:27:19 +0000153But catering to unusual cases should not slow the usual ones, so we just take
154the last i bits anyway. It's up to collision resolution to do the rest. If
155we *usually* find the key we're looking for on the first try (and, it turns
156out, we usually do -- the table load factor is kept under 2/3, so the odds
157are solidly in our favor), then it makes best sense to keep the initial index
158computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +0000159
Tim Peterseb28ef22001-06-02 05:27:19 +0000160The first half of collision resolution is to visit table indices via this
161recurrence:
Tim Peters15d49292001-05-27 07:39:22 +0000162
Tim Peterseb28ef22001-06-02 05:27:19 +0000163 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +0000164
Tim Peterseb28ef22001-06-02 05:27:19 +0000165For any initial j in range(2**i), repeating that 2**i times generates each
166int in range(2**i) exactly once (see any text on random-number generation for
167proof). By itself, this doesn't help much: like linear probing (setting
168j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
169order. This would be bad, except that's not the only thing we do, and it's
170actually *good* in the common cases where hash keys are consecutive. In an
171example that's really too small to make this entirely clear, for a table of
172size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +0000173
Tim Peterseb28ef22001-06-02 05:27:19 +0000174 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
175
176If two things come in at index 5, the first place we look after is index 2,
177not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
178Linear probing is deadly in this case because there the fixed probe order
179is the *same* as the order consecutive keys are likely to arrive. But it's
180extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
181and certain that consecutive hash codes do not.
182
183The other half of the strategy is to get the other bits of the hash code
184into play. This is done by initializing a (unsigned) vrbl "perturb" to the
185full hash code, and changing the recurrence to:
186
Tim Peterseb28ef22001-06-02 05:27:19 +0000187 perturb >>= PERTURB_SHIFT;
INADA Naoki267941c2016-10-06 15:19:07 +0900188 j = (5*j) + 1 + perturb;
Tim Peterseb28ef22001-06-02 05:27:19 +0000189 use j % 2**i as the next table index;
190
191Now the probe sequence depends (eventually) on every bit in the hash code,
192and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
193because it quickly magnifies small differences in the bits that didn't affect
194the initial index. Note that because perturb is unsigned, if the recurrence
195is executed often enough perturb eventually becomes and remains 0. At that
196point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
197that's certain to find an empty slot eventually (since it generates every int
198in range(2**i), and we make sure there's always at least one empty slot).
199
200Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
201small so that the high bits of the hash code continue to affect the probe
202sequence across iterations; but you want it large so that in really bad cases
203the high-order hash bits have an effect on early iterations. 5 was "the
204best" in minimizing total collisions across experiments Tim Peters ran (on
205both normal and pathological cases), but 4 and 6 weren't significantly worse.
206
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000207Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000208approach, using repeated multiplication by x in GF(2**n) where an irreducible
209polynomial for each table size was chosen such that x was a primitive root.
210Christian Tismer later extended that to use division by x instead, as an
211efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000212also gave excellent collision statistics, but was more expensive: two
213if-tests were required inside the loop; computing "the next" index took about
214the same number of operations but without as much potential parallelism
215(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
216above, and then shifting perturb can be done while the table index is being
217masked); and the PyDictObject struct required a member to hold the table's
218polynomial. In Tim's experiments the current scheme ran faster, produced
219equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000220
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000221*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000222
Fred Drake1bff34a2000-08-31 19:31:38 +0000223/* forward declarations */
Victor Stinner742da042016-09-07 17:40:12 -0700224static Py_ssize_t lookdict(PyDictObject *mp, PyObject *key,
225 Py_hash_t hash, PyObject ***value_addr,
226 Py_ssize_t *hashpos);
227static Py_ssize_t lookdict_unicode(PyDictObject *mp, PyObject *key,
228 Py_hash_t hash, PyObject ***value_addr,
229 Py_ssize_t *hashpos);
230static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400231lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700232 Py_hash_t hash, PyObject ***value_addr,
233 Py_ssize_t *hashpos);
234static Py_ssize_t lookdict_split(PyDictObject *mp, PyObject *key,
235 Py_hash_t hash, PyObject ***value_addr,
236 Py_ssize_t *hashpos);
Fred Drake1bff34a2000-08-31 19:31:38 +0000237
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400238static int dictresize(PyDictObject *mp, Py_ssize_t minused);
Tim Petersdea48ec2001-05-22 20:40:22 +0000239
Benjamin Peterson3c569292016-09-08 13:16:41 -0700240/*Global counter used to set ma_version_tag field of dictionary.
Victor Stinner3b6a6b42016-09-08 12:51:24 -0700241 * It is incremented each time that a dictionary is created and each
242 * time that a dictionary is modified. */
243static uint64_t pydict_global_version = 0;
244
245#define DICT_NEXT_VERSION() (++pydict_global_version)
246
Victor Stinner742da042016-09-07 17:40:12 -0700247/* Dictionary reuse scheme to save calls to malloc and free */
Christian Heimes2202f872008-02-06 14:31:34 +0000248#ifndef PyDict_MAXFREELIST
249#define PyDict_MAXFREELIST 80
250#endif
251static PyDictObject *free_list[PyDict_MAXFREELIST];
252static int numfree = 0;
Victor Stinner742da042016-09-07 17:40:12 -0700253static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST];
254static int numfreekeys = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000255
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300256#include "clinic/dictobject.c.h"
257
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100258int
259PyDict_ClearFreeList(void)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000260{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 PyDictObject *op;
Victor Stinner742da042016-09-07 17:40:12 -0700262 int ret = numfree + numfreekeys;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 while (numfree) {
264 op = free_list[--numfree];
265 assert(PyDict_CheckExact(op));
266 PyObject_GC_Del(op);
267 }
Victor Stinner742da042016-09-07 17:40:12 -0700268 while (numfreekeys) {
269 PyObject_FREE(keys_free_list[--numfreekeys]);
270 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100271 return ret;
272}
273
David Malcolm49526f42012-06-22 14:55:41 -0400274/* Print summary info about the state of the optimized allocator */
275void
276_PyDict_DebugMallocStats(FILE *out)
277{
278 _PyDebugAllocatorStats(out,
279 "free PyDictObject", numfree, sizeof(PyDictObject));
280}
281
282
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100283void
284PyDict_Fini(void)
285{
286 PyDict_ClearFreeList();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000287}
288
Victor Stinner742da042016-09-07 17:40:12 -0700289#define DK_SIZE(dk) ((dk)->dk_size)
290#if SIZEOF_VOID_P > 4
Victor Stinner58f7c5a2016-09-08 11:37:36 -0700291#define DK_IXSIZE(dk) \
292 (DK_SIZE(dk) <= 0xff ? \
293 1 : DK_SIZE(dk) <= 0xffff ? \
294 2 : DK_SIZE(dk) <= 0xffffffff ? \
Benjamin Peterson3c569292016-09-08 13:16:41 -0700295 4 : sizeof(int64_t))
Victor Stinner742da042016-09-07 17:40:12 -0700296#else
Victor Stinner58f7c5a2016-09-08 11:37:36 -0700297#define DK_IXSIZE(dk) \
298 (DK_SIZE(dk) <= 0xff ? \
299 1 : DK_SIZE(dk) <= 0xffff ? \
Benjamin Peterson3c569292016-09-08 13:16:41 -0700300 2 : sizeof(int32_t))
Victor Stinner742da042016-09-07 17:40:12 -0700301#endif
Victor Stinner58f7c5a2016-09-08 11:37:36 -0700302#define DK_ENTRIES(dk) \
Benjamin Peterson186122e2016-09-08 12:20:12 -0700303 ((PyDictKeyEntry*)(&(dk)->dk_indices.as_1[DK_SIZE(dk) * DK_IXSIZE(dk)]))
Victor Stinner742da042016-09-07 17:40:12 -0700304
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200305#define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
306#define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
307
308#define DK_INCREF(dk) (DK_DEBUG_INCREF ++(dk)->dk_refcnt)
309#define DK_DECREF(dk) if (DK_DEBUG_DECREF (--(dk)->dk_refcnt) == 0) free_keys_object(dk)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400310#define DK_MASK(dk) (((dk)->dk_size)-1)
311#define IS_POWER_OF_2(x) (((x) & (x-1)) == 0)
312
Victor Stinner742da042016-09-07 17:40:12 -0700313/* lookup indices. returns DKIX_EMPTY, DKIX_DUMMY, or ix >=0 */
Benjamin Peterson73222252016-09-08 09:58:47 -0700314static inline Py_ssize_t
Victor Stinner742da042016-09-07 17:40:12 -0700315dk_get_index(PyDictKeysObject *keys, Py_ssize_t i)
316{
317 Py_ssize_t s = DK_SIZE(keys);
Victor Stinner71211e32016-09-08 10:52:46 -0700318 Py_ssize_t ix;
319
Victor Stinner742da042016-09-07 17:40:12 -0700320 if (s <= 0xff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700321 int8_t *indices = keys->dk_indices.as_1;
Victor Stinner208857e2016-09-08 11:35:46 -0700322 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700323 }
324 else if (s <= 0xffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700325 int16_t *indices = keys->dk_indices.as_2;
Victor Stinner208857e2016-09-08 11:35:46 -0700326 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700327 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700328#if SIZEOF_VOID_P > 4
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300329 else if (s > 0xffffffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700330 int64_t *indices = keys->dk_indices.as_8;
Victor Stinner208857e2016-09-08 11:35:46 -0700331 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700332 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700333#endif
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300334 else {
335 int32_t *indices = keys->dk_indices.as_4;
336 ix = indices[i];
337 }
Victor Stinner71211e32016-09-08 10:52:46 -0700338 assert(ix >= DKIX_DUMMY);
339 return ix;
Victor Stinner742da042016-09-07 17:40:12 -0700340}
341
342/* write to indices. */
Benjamin Peterson73222252016-09-08 09:58:47 -0700343static inline void
Victor Stinner742da042016-09-07 17:40:12 -0700344dk_set_index(PyDictKeysObject *keys, Py_ssize_t i, Py_ssize_t ix)
345{
346 Py_ssize_t s = DK_SIZE(keys);
Victor Stinner71211e32016-09-08 10:52:46 -0700347
348 assert(ix >= DKIX_DUMMY);
349
Victor Stinner742da042016-09-07 17:40:12 -0700350 if (s <= 0xff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700351 int8_t *indices = keys->dk_indices.as_1;
Victor Stinner71211e32016-09-08 10:52:46 -0700352 assert(ix <= 0x7f);
Victor Stinner208857e2016-09-08 11:35:46 -0700353 indices[i] = (char)ix;
Victor Stinner742da042016-09-07 17:40:12 -0700354 }
355 else if (s <= 0xffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700356 int16_t *indices = keys->dk_indices.as_2;
Victor Stinner71211e32016-09-08 10:52:46 -0700357 assert(ix <= 0x7fff);
Victor Stinner208857e2016-09-08 11:35:46 -0700358 indices[i] = (int16_t)ix;
Victor Stinner742da042016-09-07 17:40:12 -0700359 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700360#if SIZEOF_VOID_P > 4
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300361 else if (s > 0xffffffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700362 int64_t *indices = keys->dk_indices.as_8;
Victor Stinner208857e2016-09-08 11:35:46 -0700363 indices[i] = ix;
Victor Stinner742da042016-09-07 17:40:12 -0700364 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700365#endif
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300366 else {
367 int32_t *indices = keys->dk_indices.as_4;
368 assert(ix <= 0x7fffffff);
369 indices[i] = (int32_t)ix;
370 }
Victor Stinner742da042016-09-07 17:40:12 -0700371}
372
373
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200374/* USABLE_FRACTION is the maximum dictionary load.
Victor Stinner742da042016-09-07 17:40:12 -0700375 * Increasing this ratio makes dictionaries more dense resulting in more
376 * collisions. Decreasing it improves sparseness at the expense of spreading
377 * indices over more cache lines and at the cost of total memory consumed.
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200378 *
379 * USABLE_FRACTION must obey the following:
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400380 * (0 < USABLE_FRACTION(n) < n) for all n >= 2
381 *
Victor Stinner742da042016-09-07 17:40:12 -0700382 * USABLE_FRACTION should be quick to calculate.
383 * Fractions around 1/2 to 2/3 seem to work well in practice.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400384 */
Victor Stinner742da042016-09-07 17:40:12 -0700385#define USABLE_FRACTION(n) (((n) << 1)/3)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400386
Victor Stinner742da042016-09-07 17:40:12 -0700387/* ESTIMATE_SIZE is reverse function of USABLE_FRACTION.
388 * This can be used to reserve enough size to insert n entries without
389 * resizing.
390 */
INADA Naoki2c5a8302016-12-07 18:34:44 +0900391#define ESTIMATE_SIZE(n) (((n)*3+1) >> 1)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400392
Victor Stinner742da042016-09-07 17:40:12 -0700393/* Alternative fraction that is otherwise close enough to 2n/3 to make
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400394 * little difference. 8 * 2/3 == 8 * 5/8 == 5. 16 * 2/3 == 16 * 5/8 == 10.
395 * 32 * 2/3 = 21, 32 * 5/8 = 20.
396 * Its advantage is that it is faster to compute on machines with slow division.
397 * #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
Victor Stinner742da042016-09-07 17:40:12 -0700398 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400399
Victor Stinnera9f61a52013-07-16 22:17:26 +0200400/* GROWTH_RATE. Growth rate upon hitting maximum load.
401 * Currently set to used*2 + capacity/2.
402 * This means that dicts double in size when growing without deletions,
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700403 * but have more head room when the number of deletions is on a par with the
404 * number of insertions.
405 * Raising this to used*4 doubles memory consumption depending on the size of
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200406 * the dictionary, but results in half the number of resizes, less effort to
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700407 * resize.
408 * GROWTH_RATE was set to used*4 up to version 3.2.
409 * GROWTH_RATE was set to used*2 in version 3.3.0
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200410 */
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700411#define GROWTH_RATE(d) (((d)->ma_used*2)+((d)->ma_keys->dk_size>>1))
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400412
413#define ENSURE_ALLOWS_DELETIONS(d) \
414 if ((d)->ma_keys->dk_lookup == lookdict_unicode_nodummy) { \
415 (d)->ma_keys->dk_lookup = lookdict_unicode; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400417
418/* This immutable, empty PyDictKeysObject is used for PyDict_Clear()
419 * (which cannot fail and thus can do no allocation).
420 */
421static PyDictKeysObject empty_keys_struct = {
Serhiy Storchaka97932e42016-09-26 23:01:23 +0300422 1, /* dk_refcnt */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400423 1, /* dk_size */
424 lookdict_split, /* dk_lookup */
425 0, /* dk_usable (immutable) */
Victor Stinner742da042016-09-07 17:40:12 -0700426 0, /* dk_nentries */
Benjamin Peterson186122e2016-09-08 12:20:12 -0700427 .dk_indices = { .as_1 = {DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY,
428 DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY}},
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400429};
430
431static PyObject *empty_values[1] = { NULL };
432
433#define Py_EMPTY_KEYS &empty_keys_struct
434
Victor Stinner611b0fa2016-09-14 15:02:01 +0200435/* Uncomment to check the dict content in _PyDict_CheckConsistency() */
436/* #define DEBUG_PYDICT */
437
438
439#ifdef Py_DEBUG
440static int
441_PyDict_CheckConsistency(PyDictObject *mp)
442{
443 PyDictKeysObject *keys = mp->ma_keys;
444 int splitted = _PyDict_HasSplitTable(mp);
445 Py_ssize_t usable = USABLE_FRACTION(keys->dk_size);
446#ifdef DEBUG_PYDICT
447 PyDictKeyEntry *entries = DK_ENTRIES(keys);
448 Py_ssize_t i;
449#endif
450
451 assert(0 <= mp->ma_used && mp->ma_used <= usable);
452 assert(IS_POWER_OF_2(keys->dk_size));
453 assert(0 <= keys->dk_usable
454 && keys->dk_usable <= usable);
455 assert(0 <= keys->dk_nentries
456 && keys->dk_nentries <= usable);
457 assert(keys->dk_usable + keys->dk_nentries <= usable);
458
459 if (!splitted) {
460 /* combined table */
461 assert(keys->dk_refcnt == 1);
462 }
463
464#ifdef DEBUG_PYDICT
465 for (i=0; i < keys->dk_size; i++) {
466 Py_ssize_t ix = dk_get_index(keys, i);
467 assert(DKIX_DUMMY <= ix && ix <= usable);
468 }
469
470 for (i=0; i < usable; i++) {
471 PyDictKeyEntry *entry = &entries[i];
472 PyObject *key = entry->me_key;
473
474 if (key != NULL) {
475 if (PyUnicode_CheckExact(key)) {
476 Py_hash_t hash = ((PyASCIIObject *)key)->hash;
477 assert(hash != -1);
478 assert(entry->me_hash == hash);
479 }
480 else {
481 /* test_dict fails if PyObject_Hash() is called again */
482 assert(entry->me_hash != -1);
483 }
484 if (!splitted) {
485 assert(entry->me_value != NULL);
486 }
487 }
488
489 if (splitted) {
490 assert(entry->me_value == NULL);
491 }
492 }
493
494 if (splitted) {
495 /* splitted table */
496 for (i=0; i < mp->ma_used; i++) {
497 assert(mp->ma_values[i] != NULL);
498 }
499 }
500#endif
501
502 return 1;
503}
504#endif
505
506
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400507static PyDictKeysObject *new_keys_object(Py_ssize_t size)
508{
509 PyDictKeysObject *dk;
Victor Stinner742da042016-09-07 17:40:12 -0700510 Py_ssize_t es, usable;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400511
Victor Stinner742da042016-09-07 17:40:12 -0700512 assert(size >= PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400513 assert(IS_POWER_OF_2(size));
Victor Stinner742da042016-09-07 17:40:12 -0700514
515 usable = USABLE_FRACTION(size);
516 if (size <= 0xff) {
517 es = 1;
518 }
519 else if (size <= 0xffff) {
520 es = 2;
521 }
522#if SIZEOF_VOID_P > 4
523 else if (size <= 0xffffffff) {
524 es = 4;
525 }
526#endif
527 else {
528 es = sizeof(Py_ssize_t);
529 }
530
531 if (size == PyDict_MINSIZE && numfreekeys > 0) {
532 dk = keys_free_list[--numfreekeys];
533 }
534 else {
Victor Stinner98ee9d52016-09-08 09:33:56 -0700535 dk = PyObject_MALLOC(sizeof(PyDictKeysObject)
536 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
537 + es * size
538 + sizeof(PyDictKeyEntry) * usable);
Victor Stinner742da042016-09-07 17:40:12 -0700539 if (dk == NULL) {
540 PyErr_NoMemory();
541 return NULL;
542 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400543 }
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200544 DK_DEBUG_INCREF dk->dk_refcnt = 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400545 dk->dk_size = size;
Victor Stinner742da042016-09-07 17:40:12 -0700546 dk->dk_usable = usable;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400547 dk->dk_lookup = lookdict_unicode_nodummy;
Victor Stinner742da042016-09-07 17:40:12 -0700548 dk->dk_nentries = 0;
Benjamin Peterson186122e2016-09-08 12:20:12 -0700549 memset(&dk->dk_indices.as_1[0], 0xff, es * size);
Victor Stinner742da042016-09-07 17:40:12 -0700550 memset(DK_ENTRIES(dk), 0, sizeof(PyDictKeyEntry) * usable);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400551 return dk;
552}
553
554static void
555free_keys_object(PyDictKeysObject *keys)
556{
Victor Stinner742da042016-09-07 17:40:12 -0700557 PyDictKeyEntry *entries = DK_ENTRIES(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400558 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -0700559 for (i = 0, n = keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400560 Py_XDECREF(entries[i].me_key);
561 Py_XDECREF(entries[i].me_value);
562 }
Victor Stinner742da042016-09-07 17:40:12 -0700563 if (keys->dk_size == PyDict_MINSIZE && numfreekeys < PyDict_MAXFREELIST) {
564 keys_free_list[numfreekeys++] = keys;
565 return;
566 }
Raymond Hettingerce5179f2016-01-31 08:56:21 -0800567 PyObject_FREE(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400568}
569
570#define new_values(size) PyMem_NEW(PyObject *, size)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400571#define free_values(values) PyMem_FREE(values)
572
573/* Consumes a reference to the keys object */
574static PyObject *
575new_dict(PyDictKeysObject *keys, PyObject **values)
576{
577 PyDictObject *mp;
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200578 assert(keys != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 if (numfree) {
580 mp = free_list[--numfree];
581 assert (mp != NULL);
582 assert (Py_TYPE(mp) == &PyDict_Type);
583 _Py_NewReference((PyObject *)mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400585 else {
586 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
587 if (mp == NULL) {
588 DK_DECREF(keys);
589 free_values(values);
590 return NULL;
591 }
592 }
593 mp->ma_keys = keys;
594 mp->ma_values = values;
595 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -0700596 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +0200597 assert(_PyDict_CheckConsistency(mp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000599}
600
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400601/* Consumes a reference to the keys object */
602static PyObject *
603new_dict_with_shared_keys(PyDictKeysObject *keys)
604{
605 PyObject **values;
606 Py_ssize_t i, size;
607
Victor Stinner742da042016-09-07 17:40:12 -0700608 size = USABLE_FRACTION(DK_SIZE(keys));
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400609 values = new_values(size);
610 if (values == NULL) {
611 DK_DECREF(keys);
612 return PyErr_NoMemory();
613 }
614 for (i = 0; i < size; i++) {
615 values[i] = NULL;
616 }
617 return new_dict(keys, values);
618}
619
620PyObject *
621PyDict_New(void)
622{
Victor Stinner742da042016-09-07 17:40:12 -0700623 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200624 if (keys == NULL)
625 return NULL;
626 return new_dict(keys, NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400627}
628
Victor Stinner742da042016-09-07 17:40:12 -0700629/* Search index of hash table from offset of entry table */
630static Py_ssize_t
631lookdict_index(PyDictKeysObject *k, Py_hash_t hash, Py_ssize_t index)
632{
INADA Naoki267941c2016-10-06 15:19:07 +0900633 size_t i;
Victor Stinner742da042016-09-07 17:40:12 -0700634 size_t mask = DK_MASK(k);
635 Py_ssize_t ix;
636
637 i = (size_t)hash & mask;
638 ix = dk_get_index(k, i);
639 if (ix == index) {
640 return i;
641 }
642 if (ix == DKIX_EMPTY) {
643 return DKIX_EMPTY;
644 }
645
INADA Naoki267941c2016-10-06 15:19:07 +0900646 for (size_t perturb = hash;;) {
647 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700648 i = mask & ((i << 2) + i + perturb + 1);
649 ix = dk_get_index(k, i);
650 if (ix == index) {
651 return i;
652 }
653 if (ix == DKIX_EMPTY) {
654 return DKIX_EMPTY;
655 }
656 }
657 assert(0); /* NOT REACHED */
658 return DKIX_ERROR;
659}
660
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000661/*
662The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000663This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000664Open addressing is preferred over chaining since the link overhead for
665chaining would be substantial (100% with typical malloc overhead).
666
Tim Peterseb28ef22001-06-02 05:27:19 +0000667The initial probe index is computed as hash mod the table size. Subsequent
668probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000669
670All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000671
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000672The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000673contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000674Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000675
Victor Stinner742da042016-09-07 17:40:12 -0700676lookdict() is general-purpose, and may return DKIX_ERROR if (and only if) a
Victor Stinnera4348cc2016-09-08 12:01:25 -0700677comparison raises an exception.
Guido van Rossum89d8c602007-09-18 17:26:56 +0000678lookdict_unicode() below is specialized to string keys, comparison of which can
Victor Stinner742da042016-09-07 17:40:12 -0700679never raise an exception; that function can never return DKIX_ERROR.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400680lookdict_unicode_nodummy is further specialized for string keys that cannot be
681the <dummy> value.
Victor Stinner742da042016-09-07 17:40:12 -0700682For both, when the key isn't found a DKIX_EMPTY is returned. hashpos returns
683where the key index should be inserted.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000684*/
Victor Stinner742da042016-09-07 17:40:12 -0700685static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400686lookdict(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700687 Py_hash_t hash, PyObject ***value_addr, Py_ssize_t *hashpos)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000688{
INADA Naoki267941c2016-10-06 15:19:07 +0900689 size_t i, mask;
Victor Stinner742da042016-09-07 17:40:12 -0700690 Py_ssize_t ix, freeslot;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200691 int cmp;
Victor Stinner742da042016-09-07 17:40:12 -0700692 PyDictKeysObject *dk;
693 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000695
Antoine Pitrou9a234902012-05-13 20:48:01 +0200696top:
Victor Stinner742da042016-09-07 17:40:12 -0700697 dk = mp->ma_keys;
698 mask = DK_MASK(dk);
699 ep0 = DK_ENTRIES(dk);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700701
702 ix = dk_get_index(dk, i);
703 if (ix == DKIX_EMPTY) {
704 if (hashpos != NULL)
705 *hashpos = i;
706 *value_addr = NULL;
707 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400708 }
Victor Stinner742da042016-09-07 17:40:12 -0700709 if (ix == DKIX_DUMMY) {
710 freeslot = i;
711 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 else {
Victor Stinner742da042016-09-07 17:40:12 -0700713 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300714 assert(ep->me_key != NULL);
Victor Stinner742da042016-09-07 17:40:12 -0700715 if (ep->me_key == key) {
716 *value_addr = &ep->me_value;
717 if (hashpos != NULL)
718 *hashpos = i;
719 return ix;
720 }
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300721 if (ep->me_hash == hash) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 startkey = ep->me_key;
723 Py_INCREF(startkey);
724 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
725 Py_DECREF(startkey);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200726 if (cmp < 0) {
727 *value_addr = NULL;
Victor Stinner742da042016-09-07 17:40:12 -0700728 return DKIX_ERROR;
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200729 }
Victor Stinner742da042016-09-07 17:40:12 -0700730 if (dk == mp->ma_keys && ep->me_key == startkey) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400731 if (cmp > 0) {
732 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700733 if (hashpos != NULL)
734 *hashpos = i;
735 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400736 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 }
738 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200739 /* The dict was mutated, restart */
740 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 }
742 }
Victor Stinner742da042016-09-07 17:40:12 -0700743 freeslot = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 }
Tim Peters15d49292001-05-27 07:39:22 +0000745
INADA Naoki267941c2016-10-06 15:19:07 +0900746 for (size_t perturb = hash;;) {
747 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700748 i = ((i << 2) + i + perturb + 1) & mask;
749 ix = dk_get_index(dk, i);
750 if (ix == DKIX_EMPTY) {
751 if (hashpos != NULL) {
752 *hashpos = (freeslot == -1) ? (Py_ssize_t)i : freeslot;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400753 }
Victor Stinner742da042016-09-07 17:40:12 -0700754 *value_addr = NULL;
755 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400756 }
Victor Stinner742da042016-09-07 17:40:12 -0700757 if (ix == DKIX_DUMMY) {
758 if (freeslot == -1)
759 freeslot = i;
760 continue;
761 }
762 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300763 assert(ep->me_key != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400764 if (ep->me_key == key) {
Victor Stinner742da042016-09-07 17:40:12 -0700765 if (hashpos != NULL) {
766 *hashpos = i;
767 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400768 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700769 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400770 }
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300771 if (ep->me_hash == hash) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 startkey = ep->me_key;
773 Py_INCREF(startkey);
774 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
775 Py_DECREF(startkey);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400776 if (cmp < 0) {
777 *value_addr = NULL;
Victor Stinner742da042016-09-07 17:40:12 -0700778 return DKIX_ERROR;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400779 }
Victor Stinner742da042016-09-07 17:40:12 -0700780 if (dk == mp->ma_keys && ep->me_key == startkey) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400781 if (cmp > 0) {
Victor Stinner742da042016-09-07 17:40:12 -0700782 if (hashpos != NULL) {
783 *hashpos = i;
784 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400785 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700786 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400787 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 }
789 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200790 /* The dict was mutated, restart */
791 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 }
793 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 }
795 assert(0); /* NOT REACHED */
796 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000797}
798
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400799/* Specialized version for string-only keys */
Victor Stinner742da042016-09-07 17:40:12 -0700800static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400801lookdict_unicode(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700802 Py_hash_t hash, PyObject ***value_addr, Py_ssize_t *hashpos)
Fred Drake1bff34a2000-08-31 19:31:38 +0000803{
INADA Naoki267941c2016-10-06 15:19:07 +0900804 size_t i;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200805 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700806 Py_ssize_t ix, freeslot;
807 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Fred Drake1bff34a2000-08-31 19:31:38 +0000808
Victor Stinner742da042016-09-07 17:40:12 -0700809 assert(mp->ma_values == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 /* Make sure this function doesn't have to handle non-unicode keys,
811 including subclasses of str; e.g., one reason to subclass
812 unicodes is to override __eq__, and for speed we don't cater to
813 that here. */
814 if (!PyUnicode_CheckExact(key)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400815 mp->ma_keys->dk_lookup = lookdict;
Victor Stinner742da042016-09-07 17:40:12 -0700816 return lookdict(mp, key, hash, value_addr, hashpos);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100818 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700819 ix = dk_get_index(mp->ma_keys, i);
820 if (ix == DKIX_EMPTY) {
821 if (hashpos != NULL)
822 *hashpos = i;
823 *value_addr = NULL;
824 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400825 }
Victor Stinner742da042016-09-07 17:40:12 -0700826 if (ix == DKIX_DUMMY) {
827 freeslot = i;
828 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 else {
Victor Stinner742da042016-09-07 17:40:12 -0700830 ep = &ep0[ix];
Victor Stinner742da042016-09-07 17:40:12 -0700831 assert(ep->me_key != NULL);
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300832 if (ep->me_key == key
833 || (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700834 if (hashpos != NULL)
835 *hashpos = i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400836 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700837 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400838 }
Victor Stinner742da042016-09-07 17:40:12 -0700839 freeslot = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 }
Tim Peters15d49292001-05-27 07:39:22 +0000841
INADA Naoki267941c2016-10-06 15:19:07 +0900842 for (size_t perturb = hash;;) {
843 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700844 i = mask & ((i << 2) + i + perturb + 1);
845 ix = dk_get_index(mp->ma_keys, i);
846 if (ix == DKIX_EMPTY) {
847 if (hashpos != NULL) {
848 *hashpos = (freeslot == -1) ? (Py_ssize_t)i : freeslot;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400849 }
Victor Stinner742da042016-09-07 17:40:12 -0700850 *value_addr = NULL;
851 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400852 }
Victor Stinner742da042016-09-07 17:40:12 -0700853 if (ix == DKIX_DUMMY) {
854 if (freeslot == -1)
855 freeslot = i;
856 continue;
857 }
858 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300859 assert(ep->me_key != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 if (ep->me_key == key
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300861 || (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400862 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700863 if (hashpos != NULL) {
864 *hashpos = i;
865 }
866 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 }
869 assert(0); /* NOT REACHED */
870 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000871}
872
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400873/* Faster version of lookdict_unicode when it is known that no <dummy> keys
874 * will be present. */
Victor Stinner742da042016-09-07 17:40:12 -0700875static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400876lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700877 Py_hash_t hash, PyObject ***value_addr,
878 Py_ssize_t *hashpos)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400879{
INADA Naoki267941c2016-10-06 15:19:07 +0900880 size_t i;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200881 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700882 Py_ssize_t ix;
883 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400884
Victor Stinner742da042016-09-07 17:40:12 -0700885 assert(mp->ma_values == NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400886 /* Make sure this function doesn't have to handle non-unicode keys,
887 including subclasses of str; e.g., one reason to subclass
888 unicodes is to override __eq__, and for speed we don't cater to
889 that here. */
890 if (!PyUnicode_CheckExact(key)) {
891 mp->ma_keys->dk_lookup = lookdict;
Victor Stinner742da042016-09-07 17:40:12 -0700892 return lookdict(mp, key, hash, value_addr, hashpos);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400893 }
894 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700895 ix = dk_get_index(mp->ma_keys, i);
896 assert (ix != DKIX_DUMMY);
897 if (ix == DKIX_EMPTY) {
898 if (hashpos != NULL)
899 *hashpos = i;
900 *value_addr = NULL;
901 return DKIX_EMPTY;
902 }
903 ep = &ep0[ix];
Victor Stinnerdee6e252016-09-08 11:16:07 -0700904 assert(ep->me_key != NULL);
905 assert(PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700906 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400907 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700908 if (hashpos != NULL)
909 *hashpos = i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400910 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700911 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400912 }
INADA Naoki267941c2016-10-06 15:19:07 +0900913 for (size_t perturb = hash;;) {
914 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700915 i = mask & ((i << 2) + i + perturb + 1);
916 ix = dk_get_index(mp->ma_keys, i);
917 assert (ix != DKIX_DUMMY);
918 if (ix == DKIX_EMPTY) {
919 if (hashpos != NULL)
920 *hashpos = i;
921 *value_addr = NULL;
922 return DKIX_EMPTY;
923 }
924 ep = &ep0[ix];
925 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
926 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400927 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700928 if (hashpos != NULL)
929 *hashpos = i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400930 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700931 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400932 }
933 }
934 assert(0); /* NOT REACHED */
935 return 0;
936}
937
938/* Version of lookdict for split tables.
939 * All split tables and only split tables use this lookup function.
940 * Split tables only contain unicode keys and no dummy keys,
941 * so algorithm is the same as lookdict_unicode_nodummy.
942 */
Victor Stinner742da042016-09-07 17:40:12 -0700943static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400944lookdict_split(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700945 Py_hash_t hash, PyObject ***value_addr, Py_ssize_t *hashpos)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400946{
INADA Naoki267941c2016-10-06 15:19:07 +0900947 size_t i;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200948 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700949 Py_ssize_t ix;
950 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400951
Victor Stinner742da042016-09-07 17:40:12 -0700952 /* mp must split table */
953 assert(mp->ma_values != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400954 if (!PyUnicode_CheckExact(key)) {
Victor Stinner742da042016-09-07 17:40:12 -0700955 ix = lookdict(mp, key, hash, value_addr, hashpos);
956 if (ix >= 0) {
957 *value_addr = &mp->ma_values[ix];
958 }
959 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400960 }
Victor Stinner742da042016-09-07 17:40:12 -0700961
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400962 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700963 ix = dk_get_index(mp->ma_keys, i);
964 if (ix == DKIX_EMPTY) {
965 if (hashpos != NULL)
966 *hashpos = i;
967 *value_addr = NULL;
968 return DKIX_EMPTY;
969 }
970 assert(ix >= 0);
971 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300972 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700973 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400974 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700975 if (hashpos != NULL)
976 *hashpos = i;
977 *value_addr = &mp->ma_values[ix];
978 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400979 }
INADA Naoki267941c2016-10-06 15:19:07 +0900980 for (size_t perturb = hash;;) {
981 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700982 i = mask & ((i << 2) + i + perturb + 1);
983 ix = dk_get_index(mp->ma_keys, i);
984 if (ix == DKIX_EMPTY) {
985 if (hashpos != NULL)
986 *hashpos = i;
987 *value_addr = NULL;
988 return DKIX_EMPTY;
989 }
990 assert(ix >= 0);
991 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300992 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700993 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400994 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700995 if (hashpos != NULL)
996 *hashpos = i;
997 *value_addr = &mp->ma_values[ix];
998 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400999 }
1000 }
1001 assert(0); /* NOT REACHED */
1002 return 0;
1003}
1004
Benjamin Petersonfb886362010-04-24 18:21:17 +00001005int
1006_PyDict_HasOnlyStringKeys(PyObject *dict)
1007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 Py_ssize_t pos = 0;
1009 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +00001010 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 /* Shortcut */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001012 if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 return 1;
1014 while (PyDict_Next(dict, &pos, &key, &value))
1015 if (!PyUnicode_Check(key))
1016 return 0;
1017 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +00001018}
1019
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001020#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 do { \
1022 if (!_PyObject_GC_IS_TRACKED(mp)) { \
1023 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
1024 _PyObject_GC_MAY_BE_TRACKED(value)) { \
1025 _PyObject_GC_TRACK(mp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 } \
1027 } \
1028 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001029
1030void
1031_PyDict_MaybeUntrack(PyObject *op)
1032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 PyDictObject *mp;
1034 PyObject *value;
Victor Stinner742da042016-09-07 17:40:12 -07001035 Py_ssize_t i, numentries;
1036 PyDictKeyEntry *ep0;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
1039 return;
1040
1041 mp = (PyDictObject *) op;
Victor Stinner742da042016-09-07 17:40:12 -07001042 ep0 = DK_ENTRIES(mp->ma_keys);
1043 numentries = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001044 if (_PyDict_HasSplitTable(mp)) {
Victor Stinner742da042016-09-07 17:40:12 -07001045 for (i = 0; i < numentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001046 if ((value = mp->ma_values[i]) == NULL)
1047 continue;
1048 if (_PyObject_GC_MAY_BE_TRACKED(value)) {
Victor Stinner742da042016-09-07 17:40:12 -07001049 assert(!_PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001050 return;
1051 }
1052 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001054 else {
Victor Stinner742da042016-09-07 17:40:12 -07001055 for (i = 0; i < numentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001056 if ((value = ep0[i].me_value) == NULL)
1057 continue;
1058 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
1059 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
1060 return;
1061 }
1062 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001064}
1065
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001066/* Internal function to find slot for an item from its hash
Victor Stinner3c336c52016-09-12 14:17:40 +02001067 when it is known that the key is not present in the dict.
1068
1069 The dict must be combined. */
Victor Stinner99264802016-09-13 09:38:29 +02001070static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001071find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Victor Stinner742da042016-09-07 17:40:12 -07001072 PyObject ***value_addr, Py_ssize_t *hashpos)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001073{
INADA Naoki267941c2016-10-06 15:19:07 +09001074 size_t i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001075 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07001076 Py_ssize_t ix;
1077 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001078
Victor Stinner3c336c52016-09-12 14:17:40 +02001079 assert(!_PyDict_HasSplitTable(mp));
Victor Stinner742da042016-09-07 17:40:12 -07001080 assert(hashpos != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001081 assert(key != NULL);
Victor Stinner3c336c52016-09-12 14:17:40 +02001082
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001083 if (!PyUnicode_CheckExact(key))
1084 mp->ma_keys->dk_lookup = lookdict;
1085 i = hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -07001086 ix = dk_get_index(mp->ma_keys, i);
INADA Naoki267941c2016-10-06 15:19:07 +09001087 for (size_t perturb = hash; ix != DKIX_EMPTY;) {
1088 perturb >>= PERTURB_SHIFT;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001089 i = (i << 2) + i + perturb + 1;
Victor Stinner742da042016-09-07 17:40:12 -07001090 ix = dk_get_index(mp->ma_keys, i & mask);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 }
Victor Stinner742da042016-09-07 17:40:12 -07001092 ep = &ep0[mp->ma_keys->dk_nentries];
1093 *hashpos = i & mask;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001094 assert(ep->me_value == NULL);
Victor Stinner99264802016-09-13 09:38:29 +02001095 *value_addr = &ep->me_value;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001096}
1097
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001098static int
1099insertion_resize(PyDictObject *mp)
1100{
Raymond Hettinger36f74aa2013-05-17 03:01:13 -07001101 return dictresize(mp, GROWTH_RATE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001102}
Antoine Pitroue965d972012-02-27 00:45:12 +01001103
1104/*
1105Internal routine to insert a new item into the table.
1106Used both by the internal resize routine and by the public insert routine.
Antoine Pitroue965d972012-02-27 00:45:12 +01001107Returns -1 if an error occurred, or 0 on success.
1108*/
1109static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001110insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001111{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001112 PyObject *old_value;
1113 PyObject **value_addr;
Victor Stinner742da042016-09-07 17:40:12 -07001114 PyDictKeyEntry *ep, *ep0;
1115 Py_ssize_t hashpos, ix;
Antoine Pitroue965d972012-02-27 00:45:12 +01001116
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001117 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
1118 if (insertion_resize(mp) < 0)
1119 return -1;
1120 }
1121
Victor Stinner742da042016-09-07 17:40:12 -07001122 ix = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr, &hashpos);
1123 if (ix == DKIX_ERROR) {
Antoine Pitroue965d972012-02-27 00:45:12 +01001124 return -1;
1125 }
Victor Stinner742da042016-09-07 17:40:12 -07001126
Antoine Pitroud6967322014-10-18 00:35:00 +02001127 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
Benjamin Petersona6f195e2012-04-30 10:23:40 -04001128 Py_INCREF(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001129 MAINTAIN_TRACKING(mp, key, value);
Victor Stinner742da042016-09-07 17:40:12 -07001130
1131 /* When insertion order is different from shared key, we can't share
1132 * the key anymore. Convert this instance to combine table.
1133 */
1134 if (_PyDict_HasSplitTable(mp) &&
1135 ((ix >= 0 && *value_addr == NULL && mp->ma_used != ix) ||
1136 (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {
1137 if (insertion_resize(mp) < 0) {
1138 Py_DECREF(value);
1139 return -1;
1140 }
1141 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
1142 ix = DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001143 }
Victor Stinner742da042016-09-07 17:40:12 -07001144
1145 if (ix == DKIX_EMPTY) {
1146 /* Insert into new slot. */
1147 if (mp->ma_keys->dk_usable <= 0) {
1148 /* Need to resize. */
1149 if (insertion_resize(mp) < 0) {
1150 Py_DECREF(value);
1151 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001152 }
Victor Stinner742da042016-09-07 17:40:12 -07001153 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
1154 }
1155 ep0 = DK_ENTRIES(mp->ma_keys);
1156 ep = &ep0[mp->ma_keys->dk_nentries];
1157 dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
1158 Py_INCREF(key);
1159 ep->me_key = key;
1160 ep->me_hash = hash;
1161 if (mp->ma_values) {
1162 assert (mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
1163 mp->ma_values[mp->ma_keys->dk_nentries] = value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001164 }
1165 else {
Victor Stinner742da042016-09-07 17:40:12 -07001166 ep->me_value = value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001167 }
1168 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001169 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07001170 mp->ma_keys->dk_usable--;
1171 mp->ma_keys->dk_nentries++;
1172 assert(mp->ma_keys->dk_usable >= 0);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001173 assert(_PyDict_CheckConsistency(mp));
Victor Stinner742da042016-09-07 17:40:12 -07001174 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001175 }
Victor Stinner742da042016-09-07 17:40:12 -07001176
1177 assert(value_addr != NULL);
1178
1179 old_value = *value_addr;
1180 if (old_value != NULL) {
1181 *value_addr = value;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001182 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02001183 assert(_PyDict_CheckConsistency(mp));
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001184
Victor Stinner742da042016-09-07 17:40:12 -07001185 Py_DECREF(old_value); /* which **CAN** re-enter (see issue #22653) */
1186 return 0;
1187 }
1188
1189 /* pending state */
1190 assert(_PyDict_HasSplitTable(mp));
1191 assert(ix == mp->ma_used);
1192 *value_addr = value;
1193 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001194 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02001195 assert(_PyDict_CheckConsistency(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001196 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +01001197}
1198
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001199/*
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001200Internal routine used by dictresize() to insert an item which is
1201known to be absent from the dict. This routine also assumes that
1202the dict contains no deleted entries. Besides the performance benefit,
1203using insertdict() in dictresize() is dangerous (SF bug #1456209).
1204Note that no refcounts are changed by this routine; if needed, the caller
1205is responsible for incref'ing `key` and `value`.
1206Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
1207must set them correctly
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001208*/
1209static void
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001210insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
1211 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001212{
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001213 size_t i;
1214 PyDictKeysObject *k = mp->ma_keys;
1215 size_t mask = (size_t)DK_SIZE(k)-1;
1216 PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys);
1217 PyDictKeyEntry *ep;
1218
1219 assert(k->dk_lookup != NULL);
1220 assert(value != NULL);
1221 assert(key != NULL);
1222 assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
1223 i = hash & mask;
1224 for (size_t perturb = hash; dk_get_index(k, i) != DKIX_EMPTY;) {
1225 perturb >>= PERTURB_SHIFT;
1226 i = mask & ((i << 2) + i + perturb + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 }
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001228 ep = &ep0[k->dk_nentries];
1229 assert(ep->me_value == NULL);
1230 dk_set_index(k, i, k->dk_nentries);
1231 k->dk_nentries++;
1232 ep->me_key = key;
1233 ep->me_hash = hash;
1234 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001235}
1236
1237/*
1238Restructure the table by allocating a new table and reinserting all
1239items again. When entries have been deleted, the new table may
1240actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001241If a table is split (its keys and hashes are shared, its values are not),
1242then the values are temporarily copied into the table, it is resized as
1243a combined table, then the me_value slots in the old table are NULLed out.
1244After resizing a table is always combined,
1245but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001246*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001247static int
Victor Stinner3d3f2642016-12-15 17:21:23 +01001248dictresize(PyDictObject *mp, Py_ssize_t minsize)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001249{
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001250 Py_ssize_t i, newsize;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001251 PyDictKeysObject *oldkeys;
1252 PyObject **oldvalues;
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001253 PyDictKeyEntry *ep0;
Tim Peters91a364d2001-05-19 07:04:38 +00001254
Victor Stinner742da042016-09-07 17:40:12 -07001255 /* Find the smallest table size > minused. */
1256 for (newsize = PyDict_MINSIZE;
Victor Stinner3d3f2642016-12-15 17:21:23 +01001257 newsize < minsize && newsize > 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 newsize <<= 1)
1259 ;
1260 if (newsize <= 0) {
1261 PyErr_NoMemory();
1262 return -1;
1263 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001264 oldkeys = mp->ma_keys;
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001265 oldvalues = mp->ma_values;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001266 /* Allocate a new table. */
1267 mp->ma_keys = new_keys_object(newsize);
1268 if (mp->ma_keys == NULL) {
1269 mp->ma_keys = oldkeys;
1270 return -1;
1271 }
Victor Stinner3d3f2642016-12-15 17:21:23 +01001272 // New table must be large enough.
1273 assert(mp->ma_keys->dk_usable >= mp->ma_used);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001274 if (oldkeys->dk_lookup == lookdict)
1275 mp->ma_keys->dk_lookup = lookdict;
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001276 mp->ma_values = NULL;
1277 ep0 = DK_ENTRIES(oldkeys);
1278 /* Main loop below assumes we can transfer refcount to new keys
1279 * and that value is stored in me_value.
1280 * Increment ref-counts and copy values here to compensate
1281 * This (resizing a split table) should be relatively rare */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001282 if (oldvalues != NULL) {
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001283 for (i = 0; i < oldkeys->dk_nentries; i++) {
1284 if (oldvalues[i] != NULL) {
1285 Py_INCREF(ep0[i].me_key);
1286 ep0[i].me_value = oldvalues[i];
1287 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 }
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001289 }
1290 /* Main loop */
1291 for (i = 0; i < oldkeys->dk_nentries; i++) {
1292 PyDictKeyEntry *ep = &ep0[i];
1293 if (ep->me_value != NULL) {
1294 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
1295 }
1296 }
1297 mp->ma_keys->dk_usable -= mp->ma_used;
1298 if (oldvalues != NULL) {
1299 /* NULL out me_value slot in oldkeys, in case it was shared */
1300 for (i = 0; i < oldkeys->dk_nentries; i++)
1301 ep0[i].me_value = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001302 DK_DECREF(oldkeys);
Victor Stinner742da042016-09-07 17:40:12 -07001303 if (oldvalues != empty_values) {
1304 free_values(oldvalues);
1305 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001306 }
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001307 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001308 assert(oldkeys->dk_lookup != lookdict_split);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001309 assert(oldkeys->dk_refcnt == 1);
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001310 DK_DEBUG_DECREF PyObject_FREE(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001311 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001313}
1314
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001315/* Returns NULL if unable to split table.
1316 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001317static PyDictKeysObject *
1318make_keys_shared(PyObject *op)
1319{
1320 Py_ssize_t i;
1321 Py_ssize_t size;
1322 PyDictObject *mp = (PyDictObject *)op;
1323
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001324 if (!PyDict_CheckExact(op))
1325 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001326 if (!_PyDict_HasSplitTable(mp)) {
1327 PyDictKeyEntry *ep0;
1328 PyObject **values;
1329 assert(mp->ma_keys->dk_refcnt == 1);
1330 if (mp->ma_keys->dk_lookup == lookdict) {
1331 return NULL;
1332 }
1333 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
1334 /* Remove dummy keys */
1335 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
1336 return NULL;
1337 }
1338 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
1339 /* Copy values into a new array */
Victor Stinner742da042016-09-07 17:40:12 -07001340 ep0 = DK_ENTRIES(mp->ma_keys);
1341 size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001342 values = new_values(size);
1343 if (values == NULL) {
1344 PyErr_SetString(PyExc_MemoryError,
1345 "Not enough memory to allocate new values array");
1346 return NULL;
1347 }
1348 for (i = 0; i < size; i++) {
1349 values[i] = ep0[i].me_value;
1350 ep0[i].me_value = NULL;
1351 }
1352 mp->ma_keys->dk_lookup = lookdict_split;
1353 mp->ma_values = values;
1354 }
1355 DK_INCREF(mp->ma_keys);
1356 return mp->ma_keys;
1357}
Christian Heimes99170a52007-12-19 02:07:34 +00001358
1359PyObject *
1360_PyDict_NewPresized(Py_ssize_t minused)
1361{
INADA Naoki2c5a8302016-12-07 18:34:44 +09001362 const Py_ssize_t max_presize = 128 * 1024;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001363 Py_ssize_t newsize;
1364 PyDictKeysObject *new_keys;
INADA Naoki2c5a8302016-12-07 18:34:44 +09001365
1366 /* There are no strict guarantee that returned dict can contain minused
1367 * items without resize. So we create medium size dict instead of very
1368 * large dict or MemoryError.
1369 */
1370 if (minused > USABLE_FRACTION(max_presize)) {
1371 newsize = max_presize;
1372 }
1373 else {
1374 Py_ssize_t minsize = ESTIMATE_SIZE(minused);
1375 newsize = PyDict_MINSIZE;
1376 while (newsize < minsize) {
1377 newsize <<= 1;
1378 }
1379 }
1380 assert(IS_POWER_OF_2(newsize));
1381
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001382 new_keys = new_keys_object(newsize);
1383 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001385 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001386}
1387
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001388/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1389 * that may occur (originally dicts supported only string keys, and exceptions
1390 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001391 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001392 * (suppressed) occurred while computing the key's hash, or that some error
1393 * (suppressed) occurred when comparing keys in the dict's internal probe
1394 * sequence. A nasty example of the latter is when a Python-coded comparison
1395 * function hits a stack-depth error, which can cause this to return NULL
1396 * even if the key is present.
1397 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001399PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001400{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001401 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001402 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 PyDictObject *mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001405 PyObject **value_addr;
1406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 if (!PyDict_Check(op))
1408 return NULL;
1409 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001410 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 {
1412 hash = PyObject_Hash(key);
1413 if (hash == -1) {
1414 PyErr_Clear();
1415 return NULL;
1416 }
1417 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 /* We can arrive here with a NULL tstate during initialization: try
1420 running "python -Wi" for an example related to string interning.
1421 Let's just hope that no exception occurs then... This must be
1422 _PyThreadState_Current and not PyThreadState_GET() because in debug
1423 mode, the latter complains if tstate is NULL. */
Victor Stinnerbfd316e2016-01-20 11:12:38 +01001424 tstate = _PyThreadState_UncheckedGet();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 if (tstate != NULL && tstate->curexc_type != NULL) {
1426 /* preserve the existing exception */
1427 PyObject *err_type, *err_value, *err_tb;
1428 PyErr_Fetch(&err_type, &err_value, &err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001429 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 /* ignore errors */
1431 PyErr_Restore(err_type, err_value, err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001432 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 return NULL;
1434 }
1435 else {
Victor Stinner742da042016-09-07 17:40:12 -07001436 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1437 if (ix < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 PyErr_Clear();
1439 return NULL;
1440 }
1441 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001442 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001443}
1444
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001445/* Same as PyDict_GetItemWithError() but with hash supplied by caller.
1446 This returns NULL *with* an exception set if an exception occurred.
1447 It returns NULL *without* an exception set if the key wasn't present.
1448*/
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001449PyObject *
1450_PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1451{
Victor Stinner742da042016-09-07 17:40:12 -07001452 Py_ssize_t ix;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001453 PyDictObject *mp = (PyDictObject *)op;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001454 PyObject **value_addr;
1455
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001456 if (!PyDict_Check(op)) {
1457 PyErr_BadInternalCall();
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001458 return NULL;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001459 }
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001460
1461 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1462 if (ix < 0) {
1463 return NULL;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001464 }
1465 return *value_addr;
1466}
1467
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001468/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1469 This returns NULL *with* an exception set if an exception occurred.
1470 It returns NULL *without* an exception set if the key wasn't present.
1471*/
1472PyObject *
1473PyDict_GetItemWithError(PyObject *op, PyObject *key)
1474{
Victor Stinner742da042016-09-07 17:40:12 -07001475 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001476 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001478 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 if (!PyDict_Check(op)) {
1481 PyErr_BadInternalCall();
1482 return NULL;
1483 }
1484 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001485 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 {
1487 hash = PyObject_Hash(key);
1488 if (hash == -1) {
1489 return NULL;
1490 }
1491 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001492
Victor Stinner742da042016-09-07 17:40:12 -07001493 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1494 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001496 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001497}
1498
Brett Cannonfd074152012-04-14 14:10:13 -04001499PyObject *
1500_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1501{
1502 PyObject *kv;
1503 kv = _PyUnicode_FromId(key); /* borrowed */
1504 if (kv == NULL)
1505 return NULL;
1506 return PyDict_GetItemWithError(dp, kv);
1507}
1508
Victor Stinnerb4efc962015-11-20 09:24:02 +01001509/* Fast version of global value lookup (LOAD_GLOBAL).
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001510 * Lookup in globals, then builtins.
Victor Stinnerb4efc962015-11-20 09:24:02 +01001511 *
1512 * Raise an exception and return NULL if an error occurred (ex: computing the
1513 * key hash failed, key comparison failed, ...). Return NULL if the key doesn't
1514 * exist. Return the value if the key exists.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001515 */
1516PyObject *
1517_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001518{
Victor Stinner742da042016-09-07 17:40:12 -07001519 Py_ssize_t ix;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001520 Py_hash_t hash;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001521 PyObject **value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001522
1523 if (!PyUnicode_CheckExact(key) ||
1524 (hash = ((PyASCIIObject *) key)->hash) == -1)
1525 {
1526 hash = PyObject_Hash(key);
1527 if (hash == -1)
1528 return NULL;
Antoine Pitroue965d972012-02-27 00:45:12 +01001529 }
Victor Stinnerb4efc962015-11-20 09:24:02 +01001530
1531 /* namespace 1: globals */
Victor Stinner742da042016-09-07 17:40:12 -07001532 ix = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr, NULL);
1533 if (ix == DKIX_ERROR)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001534 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001535 if (ix != DKIX_EMPTY && *value_addr != NULL)
1536 return *value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001537
1538 /* namespace 2: builtins */
Victor Stinner742da042016-09-07 17:40:12 -07001539 ix = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr, NULL);
1540 if (ix < 0)
Victor Stinnerb4efc962015-11-20 09:24:02 +01001541 return NULL;
1542 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001543}
1544
Antoine Pitroue965d972012-02-27 00:45:12 +01001545/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1546 * dictionary if it's merely replacing the value for an existing key.
1547 * This means that it's safe to loop over a dictionary with PyDict_Next()
1548 * and occasionally replace a value -- but you can't insert new keys or
1549 * remove them.
1550 */
1551int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001552PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001553{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001554 PyDictObject *mp;
1555 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001556 if (!PyDict_Check(op)) {
1557 PyErr_BadInternalCall();
1558 return -1;
1559 }
1560 assert(key);
1561 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001562 mp = (PyDictObject *)op;
1563 if (!PyUnicode_CheckExact(key) ||
1564 (hash = ((PyASCIIObject *) key)->hash) == -1)
1565 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001566 hash = PyObject_Hash(key);
1567 if (hash == -1)
1568 return -1;
1569 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001570
1571 /* insertdict() handles any resizing that might be necessary */
1572 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001573}
1574
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001575int
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001576_PyDict_SetItem_KnownHash(PyObject *op, PyObject *key, PyObject *value,
1577 Py_hash_t hash)
1578{
1579 PyDictObject *mp;
1580
1581 if (!PyDict_Check(op)) {
1582 PyErr_BadInternalCall();
1583 return -1;
1584 }
1585 assert(key);
1586 assert(value);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001587 assert(hash != -1);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001588 mp = (PyDictObject *)op;
1589
1590 /* insertdict() handles any resizing that might be necessary */
1591 return insertdict(mp, key, hash, value);
1592}
1593
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001594static int
Antoine Pitroud741ed42016-12-27 14:23:43 +01001595delitem_common(PyDictObject *mp, Py_ssize_t hashpos, Py_ssize_t ix,
1596 PyObject **value_addr)
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001597{
1598 PyObject *old_key, *old_value;
Antoine Pitroud741ed42016-12-27 14:23:43 +01001599 PyDictKeyEntry *ep;
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001600
1601 old_value = *value_addr;
Antoine Pitroud741ed42016-12-27 14:23:43 +01001602 assert(old_value != NULL);
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001603 *value_addr = NULL;
1604 mp->ma_used--;
Antoine Pitroud741ed42016-12-27 14:23:43 +01001605 mp->ma_version_tag = DICT_NEXT_VERSION();
1606 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1607 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1608 ENSURE_ALLOWS_DELETIONS(mp);
1609 old_key = ep->me_key;
1610 ep->me_key = NULL;
1611 Py_DECREF(old_key);
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001612 Py_DECREF(old_value);
Antoine Pitroud741ed42016-12-27 14:23:43 +01001613
1614 assert(_PyDict_CheckConsistency(mp));
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001615 return 0;
1616}
1617
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001618int
Tim Peters1f5871e2000-07-04 17:44:48 +00001619PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001620{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001621 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 assert(key);
1623 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001624 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 hash = PyObject_Hash(key);
1626 if (hash == -1)
1627 return -1;
1628 }
Victor Stinner742da042016-09-07 17:40:12 -07001629
1630 return _PyDict_DelItem_KnownHash(op, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001631}
1632
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001633int
1634_PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1635{
Victor Stinner742da042016-09-07 17:40:12 -07001636 Py_ssize_t hashpos, ix;
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001637 PyDictObject *mp;
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001638 PyObject **value_addr;
1639
1640 if (!PyDict_Check(op)) {
1641 PyErr_BadInternalCall();
1642 return -1;
1643 }
1644 assert(key);
1645 assert(hash != -1);
1646 mp = (PyDictObject *)op;
Victor Stinner742da042016-09-07 17:40:12 -07001647 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1648 if (ix == DKIX_ERROR)
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001649 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07001650 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001651 _PyErr_SetKeyError(key);
1652 return -1;
1653 }
Victor Stinner742da042016-09-07 17:40:12 -07001654 assert(dk_get_index(mp->ma_keys, hashpos) == ix);
Victor Stinner78601a32016-09-09 19:28:36 -07001655
1656 // Split table doesn't allow deletion. Combine it.
1657 if (_PyDict_HasSplitTable(mp)) {
1658 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1659 return -1;
1660 }
1661 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1662 assert(ix >= 0);
1663 }
Antoine Pitroud741ed42016-12-27 14:23:43 +01001664 return delitem_common(mp, hashpos, ix, value_addr);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001665}
1666
Antoine Pitroud741ed42016-12-27 14:23:43 +01001667/* This function promises that the predicate -> deletion sequence is atomic
1668 * (i.e. protected by the GIL), assuming the predicate itself doesn't
1669 * release the GIL.
1670 */
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001671int
1672_PyDict_DelItemIf(PyObject *op, PyObject *key,
1673 int (*predicate)(PyObject *value))
1674{
Antoine Pitroud741ed42016-12-27 14:23:43 +01001675 Py_ssize_t hashpos, ix;
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001676 PyDictObject *mp;
1677 Py_hash_t hash;
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001678 PyObject **value_addr;
1679 int res;
1680
1681 if (!PyDict_Check(op)) {
1682 PyErr_BadInternalCall();
1683 return -1;
1684 }
1685 assert(key);
1686 hash = PyObject_Hash(key);
1687 if (hash == -1)
1688 return -1;
1689 mp = (PyDictObject *)op;
Antoine Pitroud741ed42016-12-27 14:23:43 +01001690 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1691 if (ix == DKIX_ERROR)
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001692 return -1;
Antoine Pitroud741ed42016-12-27 14:23:43 +01001693 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001694 _PyErr_SetKeyError(key);
1695 return -1;
1696 }
Antoine Pitroud741ed42016-12-27 14:23:43 +01001697 assert(dk_get_index(mp->ma_keys, hashpos) == ix);
1698
1699 // Split table doesn't allow deletion. Combine it.
1700 if (_PyDict_HasSplitTable(mp)) {
1701 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1702 return -1;
1703 }
1704 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1705 assert(ix >= 0);
1706 }
1707
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001708 res = predicate(*value_addr);
1709 if (res == -1)
1710 return -1;
1711 if (res > 0)
Antoine Pitroud741ed42016-12-27 14:23:43 +01001712 return delitem_common(mp, hashpos, ix, value_addr);
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001713 else
1714 return 0;
1715}
1716
1717
Guido van Rossum25831651993-05-19 14:50:45 +00001718void
Tim Peters1f5871e2000-07-04 17:44:48 +00001719PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001722 PyDictKeysObject *oldkeys;
1723 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 if (!PyDict_Check(op))
1727 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001728 mp = ((PyDictObject *)op);
1729 oldkeys = mp->ma_keys;
1730 oldvalues = mp->ma_values;
1731 if (oldvalues == empty_values)
1732 return;
1733 /* Empty the dict... */
1734 DK_INCREF(Py_EMPTY_KEYS);
1735 mp->ma_keys = Py_EMPTY_KEYS;
1736 mp->ma_values = empty_values;
1737 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001738 mp->ma_version_tag = DICT_NEXT_VERSION();
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001739 /* ...then clear the keys and values */
1740 if (oldvalues != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001741 n = oldkeys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001742 for (i = 0; i < n; i++)
1743 Py_CLEAR(oldvalues[i]);
1744 free_values(oldvalues);
1745 DK_DECREF(oldkeys);
1746 }
1747 else {
1748 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001749 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001750 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02001751 assert(_PyDict_CheckConsistency(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001752}
1753
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001754/* Internal version of PyDict_Next that returns a hash value in addition
1755 * to the key and value.
1756 * Return 1 on success, return 0 when the reached the end of the dictionary
1757 * (or if op is not a dictionary)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001758 */
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001759int
1760_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1761 PyObject **pvalue, Py_hash_t *phash)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001762{
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001763 Py_ssize_t i, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001764 PyDictObject *mp;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001765 PyDictKeyEntry *entry_ptr;
1766 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001767
1768 if (!PyDict_Check(op))
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001769 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 mp = (PyDictObject *)op;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001771 i = *ppos;
Victor Stinner742da042016-09-07 17:40:12 -07001772 n = mp->ma_keys->dk_nentries;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001773 if ((size_t)i >= (size_t)n)
1774 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001775 if (mp->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001776 PyObject **value_ptr = &mp->ma_values[i];
1777 while (i < n && *value_ptr == NULL) {
1778 value_ptr++;
1779 i++;
Victor Stinner742da042016-09-07 17:40:12 -07001780 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001781 if (i >= n)
1782 return 0;
1783 entry_ptr = &DK_ENTRIES(mp->ma_keys)[i];
1784 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001786 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001787 entry_ptr = &DK_ENTRIES(mp->ma_keys)[i];
1788 while (i < n && entry_ptr->me_value == NULL) {
1789 entry_ptr++;
1790 i++;
Victor Stinner742da042016-09-07 17:40:12 -07001791 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001792 if (i >= n)
1793 return 0;
1794 value = entry_ptr->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001796 *ppos = i+1;
1797 if (pkey)
1798 *pkey = entry_ptr->me_key;
1799 if (phash)
1800 *phash = entry_ptr->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001801 if (pvalue)
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001802 *pvalue = value;
1803 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001804}
1805
Tim Peters080c88b2003-02-15 03:01:11 +00001806/*
1807 * Iterate over a dict. Use like so:
1808 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001809 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001810 * PyObject *key, *value;
1811 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001812 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001813 * Refer to borrowed references in key and value.
Tim Peters080c88b2003-02-15 03:01:11 +00001814 * }
1815 *
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001816 * Return 1 on success, return 0 when the reached the end of the dictionary
1817 * (or if op is not a dictionary)
1818 *
Tim Peters080c88b2003-02-15 03:01:11 +00001819 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001820 * mutates the dict. One exception: it is safe if the loop merely changes
1821 * the values associated with the keys (but doesn't insert new keys or
1822 * delete keys), via PyDict_SetItem().
1823 */
Guido van Rossum25831651993-05-19 14:50:45 +00001824int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001825PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001826{
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001827 return _PyDict_Next(op, ppos, pkey, pvalue, NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00001828}
1829
Eric Snow96c6af92015-05-29 22:21:39 -06001830/* Internal version of dict.pop(). */
1831PyObject *
Yury Selivanov684ef2c2016-10-28 19:01:21 -04001832_PyDict_Pop(PyObject *dict, PyObject *key, PyObject *deflt)
Eric Snow96c6af92015-05-29 22:21:39 -06001833{
1834 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001835 Py_ssize_t ix, hashpos;
Eric Snow96c6af92015-05-29 22:21:39 -06001836 PyObject *old_value, *old_key;
1837 PyDictKeyEntry *ep;
1838 PyObject **value_addr;
Yury Selivanov684ef2c2016-10-28 19:01:21 -04001839 PyDictObject *mp;
1840
1841 assert(PyDict_Check(dict));
1842 mp = (PyDictObject *)dict;
Eric Snow96c6af92015-05-29 22:21:39 -06001843
1844 if (mp->ma_used == 0) {
1845 if (deflt) {
1846 Py_INCREF(deflt);
1847 return deflt;
1848 }
1849 _PyErr_SetKeyError(key);
1850 return NULL;
1851 }
1852 if (!PyUnicode_CheckExact(key) ||
1853 (hash = ((PyASCIIObject *) key)->hash) == -1) {
1854 hash = PyObject_Hash(key);
1855 if (hash == -1)
1856 return NULL;
1857 }
Victor Stinner742da042016-09-07 17:40:12 -07001858 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1859 if (ix == DKIX_ERROR)
Eric Snow96c6af92015-05-29 22:21:39 -06001860 return NULL;
Victor Stinnerd0ad11f2016-09-13 16:56:38 +02001861 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Eric Snow96c6af92015-05-29 22:21:39 -06001862 if (deflt) {
1863 Py_INCREF(deflt);
1864 return deflt;
1865 }
1866 _PyErr_SetKeyError(key);
1867 return NULL;
1868 }
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001869
Victor Stinner78601a32016-09-09 19:28:36 -07001870 // Split table doesn't allow deletion. Combine it.
1871 if (_PyDict_HasSplitTable(mp)) {
1872 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1873 return NULL;
1874 }
1875 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1876 assert(ix >= 0);
1877 }
1878
Victor Stinner742da042016-09-07 17:40:12 -07001879 old_value = *value_addr;
Victor Stinner78601a32016-09-09 19:28:36 -07001880 assert(old_value != NULL);
Eric Snow96c6af92015-05-29 22:21:39 -06001881 *value_addr = NULL;
1882 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001883 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner78601a32016-09-09 19:28:36 -07001884 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1885 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1886 ENSURE_ALLOWS_DELETIONS(mp);
1887 old_key = ep->me_key;
1888 ep->me_key = NULL;
1889 Py_DECREF(old_key);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001890
1891 assert(_PyDict_CheckConsistency(mp));
Eric Snow96c6af92015-05-29 22:21:39 -06001892 return old_value;
1893}
1894
1895/* Internal version of dict.from_keys(). It is subclass-friendly. */
1896PyObject *
1897_PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
1898{
1899 PyObject *it; /* iter(iterable) */
1900 PyObject *key;
1901 PyObject *d;
1902 int status;
1903
1904 d = PyObject_CallObject(cls, NULL);
1905 if (d == NULL)
1906 return NULL;
1907
1908 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
1909 if (PyDict_CheckExact(iterable)) {
1910 PyDictObject *mp = (PyDictObject *)d;
1911 PyObject *oldvalue;
1912 Py_ssize_t pos = 0;
1913 PyObject *key;
1914 Py_hash_t hash;
1915
Victor Stinner742da042016-09-07 17:40:12 -07001916 if (dictresize(mp, ESTIMATE_SIZE(Py_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001917 Py_DECREF(d);
1918 return NULL;
1919 }
1920
1921 while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) {
1922 if (insertdict(mp, key, hash, value)) {
1923 Py_DECREF(d);
1924 return NULL;
1925 }
1926 }
1927 return d;
1928 }
1929 if (PyAnySet_CheckExact(iterable)) {
1930 PyDictObject *mp = (PyDictObject *)d;
1931 Py_ssize_t pos = 0;
1932 PyObject *key;
1933 Py_hash_t hash;
1934
Victor Stinner742da042016-09-07 17:40:12 -07001935 if (dictresize(mp, ESTIMATE_SIZE(PySet_GET_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001936 Py_DECREF(d);
1937 return NULL;
1938 }
1939
1940 while (_PySet_NextEntry(iterable, &pos, &key, &hash)) {
1941 if (insertdict(mp, key, hash, value)) {
1942 Py_DECREF(d);
1943 return NULL;
1944 }
1945 }
1946 return d;
1947 }
1948 }
1949
1950 it = PyObject_GetIter(iterable);
1951 if (it == NULL){
1952 Py_DECREF(d);
1953 return NULL;
1954 }
1955
1956 if (PyDict_CheckExact(d)) {
1957 while ((key = PyIter_Next(it)) != NULL) {
1958 status = PyDict_SetItem(d, key, value);
1959 Py_DECREF(key);
1960 if (status < 0)
1961 goto Fail;
1962 }
1963 } else {
1964 while ((key = PyIter_Next(it)) != NULL) {
1965 status = PyObject_SetItem(d, key, value);
1966 Py_DECREF(key);
1967 if (status < 0)
1968 goto Fail;
1969 }
1970 }
1971
1972 if (PyErr_Occurred())
1973 goto Fail;
1974 Py_DECREF(it);
1975 return d;
1976
1977Fail:
1978 Py_DECREF(it);
1979 Py_DECREF(d);
1980 return NULL;
1981}
1982
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001983/* Methods */
1984
1985static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001986dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001987{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001988 PyObject **values = mp->ma_values;
1989 PyDictKeysObject *keys = mp->ma_keys;
1990 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 PyObject_GC_UnTrack(mp);
1992 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001993 if (values != NULL) {
1994 if (values != empty_values) {
Victor Stinner742da042016-09-07 17:40:12 -07001995 for (i = 0, n = mp->ma_keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001996 Py_XDECREF(values[i]);
1997 }
1998 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002000 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002002 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02002003 assert(keys->dk_refcnt == 1);
2004 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002005 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
2007 free_list[numfree++] = mp;
2008 else
2009 Py_TYPE(mp)->tp_free((PyObject *)mp);
2010 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002011}
2012
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002013
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002014static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002015dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01002018 PyObject *key = NULL, *value = NULL;
2019 _PyUnicodeWriter writer;
2020 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 i = Py_ReprEnter((PyObject *)mp);
2023 if (i != 0) {
2024 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
2025 }
Guido van Rossum255443b1998-04-10 22:47:14 +00002026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01002028 Py_ReprLeave((PyObject *)mp);
2029 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 }
Tim Petersa7259592001-06-16 05:11:17 +00002031
Victor Stinnerf91929b2013-11-19 13:07:38 +01002032 _PyUnicodeWriter_Init(&writer);
2033 writer.overallocate = 1;
2034 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
2035 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00002036
Victor Stinnerf91929b2013-11-19 13:07:38 +01002037 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
2038 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 /* Do repr() on each key+value pair, and insert ": " between them.
2041 Note that repr may mutate the dict. */
2042 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01002043 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01002045 PyObject *s;
2046 int res;
2047
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002048 /* Prevent repr from deleting key or value during key format. */
2049 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02002051
Victor Stinnerf91929b2013-11-19 13:07:38 +01002052 if (!first) {
2053 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
2054 goto error;
2055 }
2056 first = 0;
2057
2058 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01002060 goto error;
2061 res = _PyUnicodeWriter_WriteStr(&writer, s);
2062 Py_DECREF(s);
2063 if (res < 0)
2064 goto error;
2065
2066 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
2067 goto error;
2068
2069 s = PyObject_Repr(value);
2070 if (s == NULL)
2071 goto error;
2072 res = _PyUnicodeWriter_WriteStr(&writer, s);
2073 Py_DECREF(s);
2074 if (res < 0)
2075 goto error;
2076
2077 Py_CLEAR(key);
2078 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 }
Tim Petersa7259592001-06-16 05:11:17 +00002080
Victor Stinnerf91929b2013-11-19 13:07:38 +01002081 writer.overallocate = 0;
2082 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
2083 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00002084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01002086
2087 return _PyUnicodeWriter_Finish(&writer);
2088
2089error:
2090 Py_ReprLeave((PyObject *)mp);
2091 _PyUnicodeWriter_Dealloc(&writer);
2092 Py_XDECREF(key);
2093 Py_XDECREF(value);
2094 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002095}
2096
Martin v. Löwis18e16552006-02-15 17:27:45 +00002097static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002098dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002101}
2102
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002103static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002104dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 PyObject *v;
Victor Stinner742da042016-09-07 17:40:12 -07002107 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002108 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002109 PyObject **value_addr;
2110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002112 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 hash = PyObject_Hash(key);
2114 if (hash == -1)
2115 return NULL;
2116 }
Victor Stinner742da042016-09-07 17:40:12 -07002117 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2118 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002120 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 if (!PyDict_CheckExact(mp)) {
2122 /* Look up __missing__ method if we're a subclass. */
2123 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05002124 _Py_IDENTIFIER(__missing__);
2125 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 if (missing != NULL) {
2127 res = PyObject_CallFunctionObjArgs(missing,
2128 key, NULL);
2129 Py_DECREF(missing);
2130 return res;
2131 }
2132 else if (PyErr_Occurred())
2133 return NULL;
2134 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07002135 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 return NULL;
2137 }
Victor Stinner742da042016-09-07 17:40:12 -07002138 v = *value_addr;
2139 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002141}
2142
2143static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002144dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 if (w == NULL)
2147 return PyDict_DelItem((PyObject *)mp, v);
2148 else
2149 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002150}
2151
Guido van Rossuma9e7a811997-05-13 21:02:11 +00002152static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 (lenfunc)dict_length, /*mp_length*/
2154 (binaryfunc)dict_subscript, /*mp_subscript*/
2155 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002156};
2157
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002158static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002159dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002160{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002161 PyObject *v;
2162 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002163 PyDictKeyEntry *ep;
2164 Py_ssize_t size, n, offset;
2165 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002166
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002167 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 n = mp->ma_used;
2169 v = PyList_New(n);
2170 if (v == NULL)
2171 return NULL;
2172 if (n != mp->ma_used) {
2173 /* Durnit. The allocations caused the dict to resize.
2174 * Just start over, this shouldn't normally happen.
2175 */
2176 Py_DECREF(v);
2177 goto again;
2178 }
Victor Stinner742da042016-09-07 17:40:12 -07002179 ep = DK_ENTRIES(mp->ma_keys);
2180 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002181 if (mp->ma_values) {
2182 value_ptr = mp->ma_values;
2183 offset = sizeof(PyObject *);
2184 }
2185 else {
2186 value_ptr = &ep[0].me_value;
2187 offset = sizeof(PyDictKeyEntry);
2188 }
2189 for (i = 0, j = 0; i < size; i++) {
2190 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 PyObject *key = ep[i].me_key;
2192 Py_INCREF(key);
2193 PyList_SET_ITEM(v, j, key);
2194 j++;
2195 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002196 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 }
2198 assert(j == n);
2199 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002200}
2201
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002202static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002203dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002204{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002205 PyObject *v;
2206 Py_ssize_t i, j;
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002207 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002208 Py_ssize_t size, n, offset;
2209 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002210
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002211 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 n = mp->ma_used;
2213 v = PyList_New(n);
2214 if (v == NULL)
2215 return NULL;
2216 if (n != mp->ma_used) {
2217 /* Durnit. The allocations caused the dict to resize.
2218 * Just start over, this shouldn't normally happen.
2219 */
2220 Py_DECREF(v);
2221 goto again;
2222 }
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002223 ep = DK_ENTRIES(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002224 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002225 if (mp->ma_values) {
2226 value_ptr = mp->ma_values;
2227 offset = sizeof(PyObject *);
2228 }
2229 else {
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002230 value_ptr = &ep[0].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002231 offset = sizeof(PyDictKeyEntry);
2232 }
2233 for (i = 0, j = 0; i < size; i++) {
2234 PyObject *value = *value_ptr;
2235 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2236 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 Py_INCREF(value);
2238 PyList_SET_ITEM(v, j, value);
2239 j++;
2240 }
2241 }
2242 assert(j == n);
2243 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002244}
2245
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002246static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002247dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002248{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002249 PyObject *v;
2250 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002251 Py_ssize_t size, offset;
2252 PyObject *item, *key;
2253 PyDictKeyEntry *ep;
2254 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 /* Preallocate the list of tuples, to avoid allocations during
2257 * the loop over the items, which could trigger GC, which
2258 * could resize the dict. :-(
2259 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002260 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 n = mp->ma_used;
2262 v = PyList_New(n);
2263 if (v == NULL)
2264 return NULL;
2265 for (i = 0; i < n; i++) {
2266 item = PyTuple_New(2);
2267 if (item == NULL) {
2268 Py_DECREF(v);
2269 return NULL;
2270 }
2271 PyList_SET_ITEM(v, i, item);
2272 }
2273 if (n != mp->ma_used) {
2274 /* Durnit. The allocations caused the dict to resize.
2275 * Just start over, this shouldn't normally happen.
2276 */
2277 Py_DECREF(v);
2278 goto again;
2279 }
2280 /* Nothing we do below makes any function calls. */
Victor Stinner742da042016-09-07 17:40:12 -07002281 ep = DK_ENTRIES(mp->ma_keys);
2282 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002283 if (mp->ma_values) {
2284 value_ptr = mp->ma_values;
2285 offset = sizeof(PyObject *);
2286 }
2287 else {
2288 value_ptr = &ep[0].me_value;
2289 offset = sizeof(PyDictKeyEntry);
2290 }
2291 for (i = 0, j = 0; i < size; i++) {
2292 PyObject *value = *value_ptr;
2293 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2294 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 key = ep[i].me_key;
2296 item = PyList_GET_ITEM(v, j);
2297 Py_INCREF(key);
2298 PyTuple_SET_ITEM(item, 0, key);
2299 Py_INCREF(value);
2300 PyTuple_SET_ITEM(item, 1, value);
2301 j++;
2302 }
2303 }
2304 assert(j == n);
2305 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002306}
2307
Larry Hastings5c661892014-01-24 06:17:25 -08002308/*[clinic input]
2309@classmethod
2310dict.fromkeys
Larry Hastings5c661892014-01-24 06:17:25 -08002311 iterable: object
2312 value: object=None
2313 /
2314
2315Returns a new dict with keys from iterable and values equal to value.
2316[clinic start generated code]*/
2317
Larry Hastings5c661892014-01-24 06:17:25 -08002318static PyObject *
2319dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002320/*[clinic end generated code: output=8fb98e4b10384999 input=b85a667f9bf4669d]*/
Larry Hastings5c661892014-01-24 06:17:25 -08002321{
Eric Snow96c6af92015-05-29 22:21:39 -06002322 return _PyDict_FromKeys((PyObject *)type, iterable, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002323}
2324
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002325static int
Victor Stinner742da042016-09-07 17:40:12 -07002326dict_update_common(PyObject *self, PyObject *args, PyObject *kwds,
2327 const char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 PyObject *arg = NULL;
2330 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
2333 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002336 _Py_IDENTIFIER(keys);
2337 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 result = PyDict_Merge(self, arg, 1);
2339 else
2340 result = PyDict_MergeFromSeq2(self, arg, 1);
2341 }
2342 if (result == 0 && kwds != NULL) {
2343 if (PyArg_ValidateKeywordArguments(kwds))
2344 result = PyDict_Merge(self, kwds, 1);
2345 else
2346 result = -1;
2347 }
2348 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002349}
2350
2351static PyObject *
2352dict_update(PyObject *self, PyObject *args, PyObject *kwds)
2353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 if (dict_update_common(self, args, kwds, "update") != -1)
2355 Py_RETURN_NONE;
2356 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002357}
2358
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002359/* Update unconditionally replaces existing items.
2360 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00002361 otherwise it leaves existing items unchanged.
2362
2363 PyDict_{Update,Merge} update/merge from a mapping object.
2364
Tim Petersf582b822001-12-11 18:51:08 +00002365 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00002366 producing iterable objects of length 2.
2367*/
2368
Tim Petersf582b822001-12-11 18:51:08 +00002369int
Tim Peters1fc240e2001-10-26 05:06:50 +00002370PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
2371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 PyObject *it; /* iter(seq2) */
2373 Py_ssize_t i; /* index into seq2 of current element */
2374 PyObject *item; /* seq2[i] */
2375 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00002376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 assert(d != NULL);
2378 assert(PyDict_Check(d));
2379 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00002380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 it = PyObject_GetIter(seq2);
2382 if (it == NULL)
2383 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 for (i = 0; ; ++i) {
2386 PyObject *key, *value;
2387 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00002388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 fast = NULL;
2390 item = PyIter_Next(it);
2391 if (item == NULL) {
2392 if (PyErr_Occurred())
2393 goto Fail;
2394 break;
2395 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 /* Convert item to sequence, and verify length 2. */
2398 fast = PySequence_Fast(item, "");
2399 if (fast == NULL) {
2400 if (PyErr_ExceptionMatches(PyExc_TypeError))
2401 PyErr_Format(PyExc_TypeError,
2402 "cannot convert dictionary update "
2403 "sequence element #%zd to a sequence",
2404 i);
2405 goto Fail;
2406 }
2407 n = PySequence_Fast_GET_SIZE(fast);
2408 if (n != 2) {
2409 PyErr_Format(PyExc_ValueError,
2410 "dictionary update sequence element #%zd "
2411 "has length %zd; 2 is required",
2412 i, n);
2413 goto Fail;
2414 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 /* Update/merge with this (key, value) pair. */
2417 key = PySequence_Fast_GET_ITEM(fast, 0);
2418 value = PySequence_Fast_GET_ITEM(fast, 1);
2419 if (override || PyDict_GetItem(d, key) == NULL) {
2420 int status = PyDict_SetItem(d, key, value);
2421 if (status < 0)
2422 goto Fail;
2423 }
2424 Py_DECREF(fast);
2425 Py_DECREF(item);
2426 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 i = 0;
Victor Stinner611b0fa2016-09-14 15:02:01 +02002429 assert(_PyDict_CheckConsistency((PyDictObject *)d));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00002431Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 Py_XDECREF(item);
2433 Py_XDECREF(fast);
2434 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002435Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 Py_DECREF(it);
2437 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00002438}
2439
doko@ubuntu.comde69ee72016-10-11 08:04:02 +02002440static int
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002441dict_merge(PyObject *a, PyObject *b, int override)
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002442{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002443 PyDictObject *mp, *other;
2444 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -07002445 PyDictKeyEntry *entry, *ep0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002446
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002447 assert(0 <= override && override <= 2);
2448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 /* We accept for the argument either a concrete dictionary object,
2450 * or an abstract "mapping" object. For the former, we can do
2451 * things quite efficiently. For the latter, we only require that
2452 * PyMapping_Keys() and PyObject_GetItem() be supported.
2453 */
2454 if (a == NULL || !PyDict_Check(a) || b == NULL) {
2455 PyErr_BadInternalCall();
2456 return -1;
2457 }
2458 mp = (PyDictObject*)a;
2459 if (PyDict_Check(b)) {
2460 other = (PyDictObject*)b;
2461 if (other == mp || other->ma_used == 0)
2462 /* a.update(a) or a.update({}); nothing to do */
2463 return 0;
2464 if (mp->ma_used == 0)
2465 /* Since the target dict is empty, PyDict_GetItem()
2466 * always returns NULL. Setting override to 1
2467 * skips the unnecessary test.
2468 */
2469 override = 1;
2470 /* Do one big resize at the start, rather than
2471 * incrementally resizing as we insert new items. Expect
2472 * that there will be no (or few) overlapping keys.
2473 */
INADA Naokib1152be2016-10-27 19:26:50 +09002474 if (USABLE_FRACTION(mp->ma_keys->dk_size) < other->ma_used) {
2475 if (dictresize(mp, ESTIMATE_SIZE(mp->ma_used + other->ma_used))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 return -1;
INADA Naokib1152be2016-10-27 19:26:50 +09002477 }
2478 }
Victor Stinner742da042016-09-07 17:40:12 -07002479 ep0 = DK_ENTRIES(other->ma_keys);
2480 for (i = 0, n = other->ma_keys->dk_nentries; i < n; i++) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002481 PyObject *key, *value;
2482 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002483 entry = &ep0[i];
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002484 key = entry->me_key;
2485 hash = entry->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002486 if (other->ma_values)
2487 value = other->ma_values[i];
2488 else
2489 value = entry->me_value;
2490
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002491 if (value != NULL) {
2492 int err = 0;
2493 Py_INCREF(key);
2494 Py_INCREF(value);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002495 if (override == 1)
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002496 err = insertdict(mp, key, hash, value);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002497 else if (_PyDict_GetItem_KnownHash(a, key, hash) == NULL) {
2498 if (PyErr_Occurred()) {
2499 Py_DECREF(value);
2500 Py_DECREF(key);
2501 return -1;
2502 }
2503 err = insertdict(mp, key, hash, value);
2504 }
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002505 else if (override != 0) {
2506 _PyErr_SetKeyError(key);
2507 Py_DECREF(value);
2508 Py_DECREF(key);
2509 return -1;
2510 }
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002511 Py_DECREF(value);
2512 Py_DECREF(key);
2513 if (err != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 return -1;
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002515
Victor Stinner742da042016-09-07 17:40:12 -07002516 if (n != other->ma_keys->dk_nentries) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002517 PyErr_SetString(PyExc_RuntimeError,
2518 "dict mutated during update");
2519 return -1;
2520 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 }
2522 }
2523 }
2524 else {
2525 /* Do it the generic, slower way */
2526 PyObject *keys = PyMapping_Keys(b);
2527 PyObject *iter;
2528 PyObject *key, *value;
2529 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 if (keys == NULL)
2532 /* Docstring says this is equivalent to E.keys() so
2533 * if E doesn't have a .keys() method we want
2534 * AttributeError to percolate up. Might as well
2535 * do the same for any other error.
2536 */
2537 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 iter = PyObject_GetIter(keys);
2540 Py_DECREF(keys);
2541 if (iter == NULL)
2542 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002545 if (override != 1 && PyDict_GetItem(a, key) != NULL) {
2546 if (override != 0) {
2547 _PyErr_SetKeyError(key);
2548 Py_DECREF(key);
2549 Py_DECREF(iter);
2550 return -1;
2551 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 Py_DECREF(key);
2553 continue;
2554 }
2555 value = PyObject_GetItem(b, key);
2556 if (value == NULL) {
2557 Py_DECREF(iter);
2558 Py_DECREF(key);
2559 return -1;
2560 }
2561 status = PyDict_SetItem(a, key, value);
2562 Py_DECREF(key);
2563 Py_DECREF(value);
2564 if (status < 0) {
2565 Py_DECREF(iter);
2566 return -1;
2567 }
2568 }
2569 Py_DECREF(iter);
2570 if (PyErr_Occurred())
2571 /* Iterator completed, via error */
2572 return -1;
2573 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02002574 assert(_PyDict_CheckConsistency((PyDictObject *)a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002576}
2577
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002578int
2579PyDict_Update(PyObject *a, PyObject *b)
2580{
2581 return dict_merge(a, b, 1);
2582}
2583
2584int
2585PyDict_Merge(PyObject *a, PyObject *b, int override)
2586{
2587 /* XXX Deprecate override not in (0, 1). */
2588 return dict_merge(a, b, override != 0);
2589}
2590
2591int
2592_PyDict_MergeEx(PyObject *a, PyObject *b, int override)
2593{
2594 return dict_merge(a, b, override);
2595}
2596
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002597static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002598dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002599{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002601}
2602
2603PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002604PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002607 PyDictObject *mp;
2608 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 if (o == NULL || !PyDict_Check(o)) {
2611 PyErr_BadInternalCall();
2612 return NULL;
2613 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002614 mp = (PyDictObject *)o;
2615 if (_PyDict_HasSplitTable(mp)) {
2616 PyDictObject *split_copy;
Victor Stinner742da042016-09-07 17:40:12 -07002617 Py_ssize_t size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
2618 PyObject **newvalues;
2619 newvalues = new_values(size);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002620 if (newvalues == NULL)
2621 return PyErr_NoMemory();
2622 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2623 if (split_copy == NULL) {
2624 free_values(newvalues);
2625 return NULL;
2626 }
2627 split_copy->ma_values = newvalues;
2628 split_copy->ma_keys = mp->ma_keys;
2629 split_copy->ma_used = mp->ma_used;
2630 DK_INCREF(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002631 for (i = 0, n = size; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002632 PyObject *value = mp->ma_values[i];
2633 Py_XINCREF(value);
2634 split_copy->ma_values[i] = value;
2635 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002636 if (_PyObject_GC_IS_TRACKED(mp))
2637 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002638 return (PyObject *)split_copy;
2639 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 copy = PyDict_New();
2641 if (copy == NULL)
2642 return NULL;
2643 if (PyDict_Merge(copy, o, 1) == 0)
2644 return copy;
2645 Py_DECREF(copy);
2646 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002647}
2648
Martin v. Löwis18e16552006-02-15 17:27:45 +00002649Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002650PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 if (mp == NULL || !PyDict_Check(mp)) {
2653 PyErr_BadInternalCall();
2654 return -1;
2655 }
2656 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002657}
2658
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002659PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002660PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 if (mp == NULL || !PyDict_Check(mp)) {
2663 PyErr_BadInternalCall();
2664 return NULL;
2665 }
2666 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002667}
2668
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002669PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002670PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 if (mp == NULL || !PyDict_Check(mp)) {
2673 PyErr_BadInternalCall();
2674 return NULL;
2675 }
2676 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002677}
2678
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002679PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002680PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002681{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 if (mp == NULL || !PyDict_Check(mp)) {
2683 PyErr_BadInternalCall();
2684 return NULL;
2685 }
2686 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002687}
2688
Tim Peterse63415e2001-05-08 04:38:29 +00002689/* Return 1 if dicts equal, 0 if not, -1 if error.
2690 * Gets out as soon as any difference is detected.
2691 * Uses only Py_EQ comparison.
2692 */
2693static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002694dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002695{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 if (a->ma_used != b->ma_used)
2699 /* can't be equal if # of entries differ */
2700 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Victor Stinner742da042016-09-07 17:40:12 -07002702 for (i = 0; i < a->ma_keys->dk_nentries; i++) {
2703 PyDictKeyEntry *ep = &DK_ENTRIES(a->ma_keys)[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002704 PyObject *aval;
2705 if (a->ma_values)
2706 aval = a->ma_values[i];
2707 else
2708 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 if (aval != NULL) {
2710 int cmp;
2711 PyObject *bval;
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002712 PyObject **vaddr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002713 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 /* temporarily bump aval's refcount to ensure it stays
2715 alive until we're done with it */
2716 Py_INCREF(aval);
2717 /* ditto for key */
2718 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002719 /* reuse the known hash value */
Victor Stinner742da042016-09-07 17:40:12 -07002720 if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr, NULL) < 0)
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002721 bval = NULL;
2722 else
2723 bval = *vaddr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 Py_DECREF(key);
2725 if (bval == NULL) {
2726 Py_DECREF(aval);
2727 if (PyErr_Occurred())
2728 return -1;
2729 return 0;
2730 }
2731 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2732 Py_DECREF(aval);
2733 if (cmp <= 0) /* error or not equal */
2734 return cmp;
2735 }
2736 }
2737 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002738}
Tim Peterse63415e2001-05-08 04:38:29 +00002739
2740static PyObject *
2741dict_richcompare(PyObject *v, PyObject *w, int op)
2742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 int cmp;
2744 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2747 res = Py_NotImplemented;
2748 }
2749 else if (op == Py_EQ || op == Py_NE) {
2750 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2751 if (cmp < 0)
2752 return NULL;
2753 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2754 }
2755 else
2756 res = Py_NotImplemented;
2757 Py_INCREF(res);
2758 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002759}
Tim Peterse63415e2001-05-08 04:38:29 +00002760
Larry Hastings61272b72014-01-07 12:41:53 -08002761/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07002762
2763@coexist
2764dict.__contains__
2765
2766 key: object
2767 /
2768
Meador Ingee02de8c2014-01-14 16:48:31 -06002769True if D has a key k, else False.
Larry Hastings61272b72014-01-07 12:41:53 -08002770[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07002771
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002772static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08002773dict___contains__(PyDictObject *self, PyObject *key)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002774/*[clinic end generated code: output=a3d03db709ed6e6b input=b852b2a19b51ab24]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002775{
Larry Hastingsc2047262014-01-25 20:43:29 -08002776 register PyDictObject *mp = self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002777 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002778 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002779 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002782 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 hash = PyObject_Hash(key);
2784 if (hash == -1)
2785 return NULL;
2786 }
Victor Stinner742da042016-09-07 17:40:12 -07002787 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2788 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002790 if (ix == DKIX_EMPTY || *value_addr == NULL)
2791 Py_RETURN_FALSE;
2792 Py_RETURN_TRUE;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002793}
2794
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002795static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002796dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002797{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 PyObject *key;
2799 PyObject *failobj = Py_None;
2800 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002801 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002802 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002803 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2806 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002808 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002809 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 hash = PyObject_Hash(key);
2811 if (hash == -1)
2812 return NULL;
2813 }
Victor Stinner742da042016-09-07 17:40:12 -07002814 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2815 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002817 if (ix == DKIX_EMPTY || *value_addr == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 val = failobj;
Victor Stinner742da042016-09-07 17:40:12 -07002819 else
2820 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 Py_INCREF(val);
2822 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002823}
2824
Benjamin Peterson00e98862013-03-07 22:16:29 -05002825PyObject *
2826PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002827{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002828 PyDictObject *mp = (PyDictObject *)d;
INADA Naoki93f26f72016-11-02 18:45:16 +09002829 PyObject *value;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002830 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002831 Py_ssize_t hashpos, ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002832 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002833
Benjamin Peterson00e98862013-03-07 22:16:29 -05002834 if (!PyDict_Check(d)) {
2835 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002837 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002840 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 hash = PyObject_Hash(key);
2842 if (hash == -1)
2843 return NULL;
2844 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002845
2846 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
2847 if (insertion_resize(mp) < 0)
2848 return NULL;
2849 }
2850
Victor Stinner742da042016-09-07 17:40:12 -07002851 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
2852 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002853 return NULL;
INADA Naoki93f26f72016-11-02 18:45:16 +09002854
2855 if (_PyDict_HasSplitTable(mp) &&
2856 ((ix >= 0 && *value_addr == NULL && mp->ma_used != ix) ||
2857 (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {
2858 if (insertion_resize(mp) < 0) {
2859 return NULL;
2860 }
2861 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
2862 ix = DKIX_EMPTY;
2863 }
2864
2865 if (ix == DKIX_EMPTY) {
2866 PyDictKeyEntry *ep, *ep0;
2867 value = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002868 if (mp->ma_keys->dk_usable <= 0) {
Victor Stinner3c336c52016-09-12 14:17:40 +02002869 if (insertion_resize(mp) < 0) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002870 return NULL;
Victor Stinner3c336c52016-09-12 14:17:40 +02002871 }
Victor Stinner742da042016-09-07 17:40:12 -07002872 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002873 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002874 ep0 = DK_ENTRIES(mp->ma_keys);
2875 ep = &ep0[mp->ma_keys->dk_nentries];
2876 dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002877 Py_INCREF(key);
INADA Naoki93f26f72016-11-02 18:45:16 +09002878 Py_INCREF(value);
2879 MAINTAIN_TRACKING(mp, key, value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002880 ep->me_key = key;
2881 ep->me_hash = hash;
Victor Stinner742da042016-09-07 17:40:12 -07002882 if (mp->ma_values) {
INADA Naoki93f26f72016-11-02 18:45:16 +09002883 assert(mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
2884 mp->ma_values[mp->ma_keys->dk_nentries] = value;
Victor Stinner742da042016-09-07 17:40:12 -07002885 }
2886 else {
INADA Naoki93f26f72016-11-02 18:45:16 +09002887 ep->me_value = value;
Victor Stinner742da042016-09-07 17:40:12 -07002888 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002889 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002890 mp->ma_version_tag = DICT_NEXT_VERSION();
INADA Naoki93f26f72016-11-02 18:45:16 +09002891 mp->ma_keys->dk_usable--;
2892 mp->ma_keys->dk_nentries++;
2893 assert(mp->ma_keys->dk_usable >= 0);
2894 }
2895 else if (*value_addr == NULL) {
2896 value = defaultobj;
2897 assert(_PyDict_HasSplitTable(mp));
2898 assert(ix == mp->ma_used);
2899 Py_INCREF(value);
2900 MAINTAIN_TRACKING(mp, key, value);
2901 *value_addr = value;
2902 mp->ma_used++;
2903 mp->ma_version_tag = DICT_NEXT_VERSION();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02002905 else {
INADA Naoki93f26f72016-11-02 18:45:16 +09002906 value = *value_addr;
Victor Stinner611b0fa2016-09-14 15:02:01 +02002907 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002908
2909 assert(_PyDict_CheckConsistency(mp));
2910 return value;
Guido van Rossum164452c2000-08-08 16:12:54 +00002911}
2912
Benjamin Peterson00e98862013-03-07 22:16:29 -05002913static PyObject *
2914dict_setdefault(PyDictObject *mp, PyObject *args)
2915{
2916 PyObject *key, *val;
2917 PyObject *defaultobj = Py_None;
2918
2919 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2920 return NULL;
2921
Benjamin Peterson55898502013-03-08 08:36:49 -05002922 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002923 Py_XINCREF(val);
2924 return val;
2925}
Guido van Rossum164452c2000-08-08 16:12:54 +00002926
2927static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002928dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 PyDict_Clear((PyObject *)mp);
2931 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002932}
2933
Guido van Rossumba6ab842000-12-12 22:02:18 +00002934static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002935dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002936{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00002938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2940 return NULL;
Eric Snow96c6af92015-05-29 22:21:39 -06002941
Yury Selivanov684ef2c2016-10-28 19:01:21 -04002942 return _PyDict_Pop((PyObject*)mp, key, deflt);
Guido van Rossume027d982002-04-12 15:11:59 +00002943}
2944
2945static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002946dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002947{
Victor Stinner742da042016-09-07 17:40:12 -07002948 Py_ssize_t i, j;
2949 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 /* Allocate the result tuple before checking the size. Believe it
2953 * or not, this allocation could trigger a garbage collection which
2954 * could empty the dict, so if we checked the size first and that
2955 * happened, the result would be an infinite loop (searching for an
2956 * entry that no longer exists). Note that the usual popitem()
2957 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2958 * tuple away if the dict *is* empty isn't a significant
2959 * inefficiency -- possible, but unlikely in practice.
2960 */
2961 res = PyTuple_New(2);
2962 if (res == NULL)
2963 return NULL;
2964 if (mp->ma_used == 0) {
2965 Py_DECREF(res);
2966 PyErr_SetString(PyExc_KeyError,
2967 "popitem(): dictionary is empty");
2968 return NULL;
2969 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002970 /* Convert split table to combined table */
2971 if (mp->ma_keys->dk_lookup == lookdict_split) {
2972 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2973 Py_DECREF(res);
2974 return NULL;
2975 }
2976 }
2977 ENSURE_ALLOWS_DELETIONS(mp);
Victor Stinner742da042016-09-07 17:40:12 -07002978
2979 /* Pop last item */
2980 ep0 = DK_ENTRIES(mp->ma_keys);
2981 i = mp->ma_keys->dk_nentries - 1;
2982 while (i >= 0 && ep0[i].me_value == NULL) {
2983 i--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002984 }
Victor Stinner742da042016-09-07 17:40:12 -07002985 assert(i >= 0);
2986
2987 ep = &ep0[i];
2988 j = lookdict_index(mp->ma_keys, ep->me_hash, i);
2989 assert(j >= 0);
2990 assert(dk_get_index(mp->ma_keys, j) == i);
2991 dk_set_index(mp->ma_keys, j, DKIX_DUMMY);
2992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 PyTuple_SET_ITEM(res, 0, ep->me_key);
2994 PyTuple_SET_ITEM(res, 1, ep->me_value);
Victor Stinner742da042016-09-07 17:40:12 -07002995 ep->me_key = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 ep->me_value = NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002997 /* We can't dk_usable++ since there is DKIX_DUMMY in indices */
2998 mp->ma_keys->dk_nentries = i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002999 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07003000 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02003001 assert(_PyDict_CheckConsistency(mp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003002 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00003003}
3004
Jeremy Hylton8caad492000-06-23 14:18:11 +00003005static int
3006dict_traverse(PyObject *op, visitproc visit, void *arg)
3007{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003008 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson55f44522016-09-05 12:12:59 -07003009 PyDictKeysObject *keys = mp->ma_keys;
Serhiy Storchaka46825d22016-09-26 21:29:34 +03003010 PyDictKeyEntry *entries = DK_ENTRIES(keys);
Victor Stinner742da042016-09-07 17:40:12 -07003011 Py_ssize_t i, n = keys->dk_nentries;
3012
Benjamin Peterson55f44522016-09-05 12:12:59 -07003013 if (keys->dk_lookup == lookdict) {
3014 for (i = 0; i < n; i++) {
3015 if (entries[i].me_value != NULL) {
3016 Py_VISIT(entries[i].me_value);
3017 Py_VISIT(entries[i].me_key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003018 }
3019 }
Victor Stinner742da042016-09-07 17:40:12 -07003020 }
3021 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003022 if (mp->ma_values != NULL) {
Benjamin Peterson55f44522016-09-05 12:12:59 -07003023 for (i = 0; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003024 Py_VISIT(mp->ma_values[i]);
3025 }
3026 }
3027 else {
Benjamin Peterson55f44522016-09-05 12:12:59 -07003028 for (i = 0; i < n; i++) {
3029 Py_VISIT(entries[i].me_value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003030 }
3031 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 }
3033 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00003034}
3035
3036static int
3037dict_tp_clear(PyObject *op)
3038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 PyDict_Clear(op);
3040 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00003041}
3042
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003043static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00003044
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003045Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06003046_PyDict_SizeOf(PyDictObject *mp)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003047{
Victor Stinner742da042016-09-07 17:40:12 -07003048 Py_ssize_t size, usable, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003049
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003050 size = DK_SIZE(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07003051 usable = USABLE_FRACTION(size);
3052
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02003053 res = _PyObject_SIZE(Py_TYPE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003054 if (mp->ma_values)
Victor Stinner742da042016-09-07 17:40:12 -07003055 res += usable * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02003056 /* If the dictionary is split, the keys portion is accounted-for
3057 in the type object. */
3058 if (mp->ma_keys->dk_refcnt == 1)
Victor Stinner98ee9d52016-09-08 09:33:56 -07003059 res += (sizeof(PyDictKeysObject)
3060 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
3061 + DK_IXSIZE(mp->ma_keys) * size
3062 + sizeof(PyDictKeyEntry) * usable);
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003063 return res;
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02003064}
3065
3066Py_ssize_t
3067_PyDict_KeysSize(PyDictKeysObject *keys)
3068{
Victor Stinner98ee9d52016-09-08 09:33:56 -07003069 return (sizeof(PyDictKeysObject)
3070 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
3071 + DK_IXSIZE(keys) * DK_SIZE(keys)
3072 + USABLE_FRACTION(DK_SIZE(keys)) * sizeof(PyDictKeyEntry));
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003073}
3074
doko@ubuntu.com17210f52016-01-14 14:04:59 +01003075static PyObject *
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003076dict_sizeof(PyDictObject *mp)
3077{
3078 return PyLong_FromSsize_t(_PyDict_SizeOf(mp));
3079}
3080
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00003081PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
3082
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003083PyDoc_STRVAR(sizeof__doc__,
3084"D.__sizeof__() -> size of D in memory, in bytes");
3085
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003086PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00003087"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003088
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003089PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00003090"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 +00003091
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003092PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00003093"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00003094If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00003095
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003096PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00003097"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000030982-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003099
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003100PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04003101"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
3102If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
3103If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
3104In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00003105
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003106PyDoc_STRVAR(clear__doc__,
3107"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003108
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003109PyDoc_STRVAR(copy__doc__,
3110"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00003111
Guido van Rossumb90c8482007-02-10 01:11:45 +00003112/* Forward */
3113static PyObject *dictkeys_new(PyObject *);
3114static PyObject *dictitems_new(PyObject *);
3115static PyObject *dictvalues_new(PyObject *);
3116
Guido van Rossum45c85d12007-07-27 16:31:40 +00003117PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00003119PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00003121PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00003123
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003124static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07003125 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
3127 getitem__doc__},
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003128 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003129 sizeof__doc__},
3130 {"get", (PyCFunction)dict_get, METH_VARARGS,
3131 get__doc__},
3132 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
3133 setdefault_doc__},
3134 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
3135 pop__doc__},
3136 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
3137 popitem__doc__},
3138 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
3139 keys__doc__},
3140 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
3141 items__doc__},
3142 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
3143 values__doc__},
3144 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
3145 update__doc__},
Larry Hastings5c661892014-01-24 06:17:25 -08003146 DICT_FROMKEYS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
3148 clear__doc__},
3149 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
3150 copy__doc__},
3151 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003152};
3153
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003154/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00003155int
3156PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003157{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00003158 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07003159 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003160 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003161 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003163 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003164 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003165 hash = PyObject_Hash(key);
3166 if (hash == -1)
3167 return -1;
3168 }
Victor Stinner742da042016-09-07 17:40:12 -07003169 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
3170 if (ix == DKIX_ERROR)
3171 return -1;
3172 return (ix != DKIX_EMPTY && *value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003173}
3174
Thomas Wouterscf297e42007-02-23 15:07:44 +00003175/* Internal version of PyDict_Contains used when the hash value is already known */
3176int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00003177_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00003178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003179 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003180 PyObject **value_addr;
Victor Stinner742da042016-09-07 17:40:12 -07003181 Py_ssize_t ix;
Thomas Wouterscf297e42007-02-23 15:07:44 +00003182
Victor Stinner742da042016-09-07 17:40:12 -07003183 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
3184 if (ix == DKIX_ERROR)
3185 return -1;
3186 return (ix != DKIX_EMPTY && *value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00003187}
3188
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003189/* Hack to implement "key in dict" */
3190static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 0, /* sq_length */
3192 0, /* sq_concat */
3193 0, /* sq_repeat */
3194 0, /* sq_item */
3195 0, /* sq_slice */
3196 0, /* sq_ass_item */
3197 0, /* sq_ass_slice */
3198 PyDict_Contains, /* sq_contains */
3199 0, /* sq_inplace_concat */
3200 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003201};
3202
Guido van Rossum09e563a2001-05-01 12:10:21 +00003203static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003204dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003207 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 assert(type != NULL && type->tp_alloc != NULL);
3210 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02003211 if (self == NULL)
3212 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003213 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003214
Victor Stinnera9f61a52013-07-16 22:17:26 +02003215 /* The object has been implicitly tracked by tp_alloc */
3216 if (type == &PyDict_Type)
3217 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003218
3219 d->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07003220 d->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07003221 d->ma_keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003222 if (d->ma_keys == NULL) {
3223 Py_DECREF(self);
3224 return NULL;
3225 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02003226 assert(_PyDict_CheckConsistency(d));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003228}
3229
Tim Peters25786c02001-09-02 08:22:48 +00003230static int
3231dict_init(PyObject *self, PyObject *args, PyObject *kwds)
3232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00003234}
3235
Tim Peters6d6c1a32001-08-02 04:15:00 +00003236static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003237dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00003238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00003240}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003241
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003242PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00003243"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00003244"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003245" (key, value) pairs\n"
3246"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00003247" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003248" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00003249" d[k] = v\n"
3250"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
3251" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00003252
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003253PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3255 "dict",
3256 sizeof(PyDictObject),
3257 0,
3258 (destructor)dict_dealloc, /* tp_dealloc */
3259 0, /* tp_print */
3260 0, /* tp_getattr */
3261 0, /* tp_setattr */
3262 0, /* tp_reserved */
3263 (reprfunc)dict_repr, /* tp_repr */
3264 0, /* tp_as_number */
3265 &dict_as_sequence, /* tp_as_sequence */
3266 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00003267 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 0, /* tp_call */
3269 0, /* tp_str */
3270 PyObject_GenericGetAttr, /* tp_getattro */
3271 0, /* tp_setattro */
3272 0, /* tp_as_buffer */
3273 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3274 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
3275 dictionary_doc, /* tp_doc */
3276 dict_traverse, /* tp_traverse */
3277 dict_tp_clear, /* tp_clear */
3278 dict_richcompare, /* tp_richcompare */
3279 0, /* tp_weaklistoffset */
3280 (getiterfunc)dict_iter, /* tp_iter */
3281 0, /* tp_iternext */
3282 mapp_methods, /* tp_methods */
3283 0, /* tp_members */
3284 0, /* tp_getset */
3285 0, /* tp_base */
3286 0, /* tp_dict */
3287 0, /* tp_descr_get */
3288 0, /* tp_descr_set */
3289 0, /* tp_dictoffset */
3290 dict_init, /* tp_init */
3291 PyType_GenericAlloc, /* tp_alloc */
3292 dict_new, /* tp_new */
3293 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003294};
3295
Victor Stinner3c1e4812012-03-26 22:10:51 +02003296PyObject *
3297_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
3298{
3299 PyObject *kv;
3300 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02003301 if (kv == NULL) {
3302 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003303 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02003304 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02003305 return PyDict_GetItem(dp, kv);
3306}
3307
Guido van Rossum3cca2451997-05-16 14:23:33 +00003308/* For backward compatibility with old dictionary interface */
3309
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003310PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003311PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 PyObject *kv, *rv;
3314 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003315 if (kv == NULL) {
3316 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003318 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 rv = PyDict_GetItem(v, kv);
3320 Py_DECREF(kv);
3321 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003322}
3323
3324int
Victor Stinner3c1e4812012-03-26 22:10:51 +02003325_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
3326{
3327 PyObject *kv;
3328 kv = _PyUnicode_FromId(key); /* borrowed */
3329 if (kv == NULL)
3330 return -1;
3331 return PyDict_SetItem(v, kv, item);
3332}
3333
3334int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003335PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 PyObject *kv;
3338 int err;
3339 kv = PyUnicode_FromString(key);
3340 if (kv == NULL)
3341 return -1;
3342 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
3343 err = PyDict_SetItem(v, kv, item);
3344 Py_DECREF(kv);
3345 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003346}
3347
3348int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01003349_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
3350{
3351 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
3352 if (kv == NULL)
3353 return -1;
3354 return PyDict_DelItem(v, kv);
3355}
3356
3357int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003358PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003359{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 PyObject *kv;
3361 int err;
3362 kv = PyUnicode_FromString(key);
3363 if (kv == NULL)
3364 return -1;
3365 err = PyDict_DelItem(v, kv);
3366 Py_DECREF(kv);
3367 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003368}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003369
Raymond Hettinger019a1482004-03-18 02:41:19 +00003370/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003371
3372typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 PyObject_HEAD
3374 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
3375 Py_ssize_t di_used;
3376 Py_ssize_t di_pos;
3377 PyObject* di_result; /* reusable result tuple for iteritems */
3378 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003379} dictiterobject;
3380
3381static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003382dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 dictiterobject *di;
3385 di = PyObject_GC_New(dictiterobject, itertype);
3386 if (di == NULL)
3387 return NULL;
3388 Py_INCREF(dict);
3389 di->di_dict = dict;
3390 di->di_used = dict->ma_used;
3391 di->di_pos = 0;
3392 di->len = dict->ma_used;
3393 if (itertype == &PyDictIterItem_Type) {
3394 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
3395 if (di->di_result == NULL) {
3396 Py_DECREF(di);
3397 return NULL;
3398 }
3399 }
3400 else
3401 di->di_result = NULL;
3402 _PyObject_GC_TRACK(di);
3403 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003404}
3405
3406static void
3407dictiter_dealloc(dictiterobject *di)
3408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003409 Py_XDECREF(di->di_dict);
3410 Py_XDECREF(di->di_result);
3411 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003412}
3413
3414static int
3415dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
3416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 Py_VISIT(di->di_dict);
3418 Py_VISIT(di->di_result);
3419 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003420}
3421
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003422static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003423dictiter_len(dictiterobject *di)
3424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003425 Py_ssize_t len = 0;
3426 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
3427 len = di->len;
3428 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003429}
3430
Guido van Rossumb90c8482007-02-10 01:11:45 +00003431PyDoc_STRVAR(length_hint_doc,
3432 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003433
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003434static PyObject *
3435dictiter_reduce(dictiterobject *di);
3436
3437PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3438
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003439static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
3441 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003442 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
3443 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003444 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003445};
3446
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003447static PyObject*
3448dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00003449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003450 PyObject *key;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003451 Py_ssize_t i, n;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003452 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00003454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003455 if (d == NULL)
3456 return NULL;
3457 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00003458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 if (di->di_used != d->ma_used) {
3460 PyErr_SetString(PyExc_RuntimeError,
3461 "dictionary changed size during iteration");
3462 di->di_used = -1; /* Make this state sticky */
3463 return NULL;
3464 }
Guido van Rossum2147df72002-07-16 20:30:22 +00003465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003466 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003467 k = d->ma_keys;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003468 n = k->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003469 if (d->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003470 PyObject **value_ptr = &d->ma_values[i];
3471 while (i < n && *value_ptr == NULL) {
3472 value_ptr++;
3473 i++;
3474 }
3475 if (i >= n)
3476 goto fail;
3477 key = DK_ENTRIES(k)[i].me_key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003478 }
3479 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003480 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(k)[i];
3481 while (i < n && entry_ptr->me_value == NULL) {
3482 entry_ptr++;
3483 i++;
3484 }
3485 if (i >= n)
3486 goto fail;
3487 key = entry_ptr->me_key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003488 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003489 di->di_pos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003490 di->len--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003491 Py_INCREF(key);
3492 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003493
3494fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003495 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003496 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003497 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003498}
3499
Raymond Hettinger019a1482004-03-18 02:41:19 +00003500PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3502 "dict_keyiterator", /* tp_name */
3503 sizeof(dictiterobject), /* tp_basicsize */
3504 0, /* tp_itemsize */
3505 /* methods */
3506 (destructor)dictiter_dealloc, /* tp_dealloc */
3507 0, /* tp_print */
3508 0, /* tp_getattr */
3509 0, /* tp_setattr */
3510 0, /* tp_reserved */
3511 0, /* tp_repr */
3512 0, /* tp_as_number */
3513 0, /* tp_as_sequence */
3514 0, /* tp_as_mapping */
3515 0, /* tp_hash */
3516 0, /* tp_call */
3517 0, /* tp_str */
3518 PyObject_GenericGetAttr, /* tp_getattro */
3519 0, /* tp_setattro */
3520 0, /* tp_as_buffer */
3521 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3522 0, /* tp_doc */
3523 (traverseproc)dictiter_traverse, /* tp_traverse */
3524 0, /* tp_clear */
3525 0, /* tp_richcompare */
3526 0, /* tp_weaklistoffset */
3527 PyObject_SelfIter, /* tp_iter */
3528 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
3529 dictiter_methods, /* tp_methods */
3530 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003531};
3532
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003533static PyObject *
3534dictiter_iternextvalue(dictiterobject *di)
Raymond Hettinger019a1482004-03-18 02:41:19 +00003535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 PyObject *value;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003537 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003540 if (d == NULL)
3541 return NULL;
3542 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003544 if (di->di_used != d->ma_used) {
3545 PyErr_SetString(PyExc_RuntimeError,
3546 "dictionary changed size during iteration");
3547 di->di_used = -1; /* Make this state sticky */
3548 return NULL;
3549 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 i = di->di_pos;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003552 n = d->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003553 if (d->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003554 PyObject **value_ptr = &d->ma_values[i];
3555 while (i < n && *value_ptr == NULL) {
3556 value_ptr++;
3557 i++;
3558 }
3559 if (i >= n)
3560 goto fail;
3561 value = *value_ptr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003562 }
3563 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003564 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(d->ma_keys)[i];
3565 while (i < n && entry_ptr->me_value == NULL) {
3566 entry_ptr++;
3567 i++;
3568 }
3569 if (i >= n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003570 goto fail;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003571 value = entry_ptr->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 }
3573 di->di_pos = i+1;
3574 di->len--;
3575 Py_INCREF(value);
3576 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003577
3578fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003579 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003580 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003581 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003582}
3583
3584PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003585 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3586 "dict_valueiterator", /* tp_name */
3587 sizeof(dictiterobject), /* tp_basicsize */
3588 0, /* tp_itemsize */
3589 /* methods */
3590 (destructor)dictiter_dealloc, /* tp_dealloc */
3591 0, /* tp_print */
3592 0, /* tp_getattr */
3593 0, /* tp_setattr */
3594 0, /* tp_reserved */
3595 0, /* tp_repr */
3596 0, /* tp_as_number */
3597 0, /* tp_as_sequence */
3598 0, /* tp_as_mapping */
3599 0, /* tp_hash */
3600 0, /* tp_call */
3601 0, /* tp_str */
3602 PyObject_GenericGetAttr, /* tp_getattro */
3603 0, /* tp_setattro */
3604 0, /* tp_as_buffer */
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003605 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 0, /* tp_doc */
3607 (traverseproc)dictiter_traverse, /* tp_traverse */
3608 0, /* tp_clear */
3609 0, /* tp_richcompare */
3610 0, /* tp_weaklistoffset */
3611 PyObject_SelfIter, /* tp_iter */
3612 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
3613 dictiter_methods, /* tp_methods */
3614 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003615};
3616
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003617static PyObject *
3618dictiter_iternextitem(dictiterobject *di)
Raymond Hettinger019a1482004-03-18 02:41:19 +00003619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003620 PyObject *key, *value, *result = di->di_result;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003621 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003622 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003624 if (d == NULL)
3625 return NULL;
3626 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003628 if (di->di_used != d->ma_used) {
3629 PyErr_SetString(PyExc_RuntimeError,
3630 "dictionary changed size during iteration");
3631 di->di_used = -1; /* Make this state sticky */
3632 return NULL;
3633 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 i = di->di_pos;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003636 n = d->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003637 if (d->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003638 PyObject **value_ptr = &d->ma_values[i];
3639 while (i < n && *value_ptr == NULL) {
3640 value_ptr++;
3641 i++;
3642 }
3643 if (i >= n)
3644 goto fail;
3645 key = DK_ENTRIES(d->ma_keys)[i].me_key;
3646 value = *value_ptr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003647 }
3648 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003649 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(d->ma_keys)[i];
3650 while (i < n && entry_ptr->me_value == NULL) {
3651 entry_ptr++;
3652 i++;
3653 }
3654 if (i >= n)
3655 goto fail;
3656 key = entry_ptr->me_key;
3657 value = entry_ptr->me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003658 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003659 di->di_pos = i+1;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003660 di->len--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003661 if (result->ob_refcnt == 1) {
3662 Py_INCREF(result);
3663 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3664 Py_DECREF(PyTuple_GET_ITEM(result, 1));
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003665 }
3666 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003667 result = PyTuple_New(2);
3668 if (result == NULL)
3669 return NULL;
3670 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003671 Py_INCREF(key);
3672 Py_INCREF(value);
Eric Snow96c6af92015-05-29 22:21:39 -06003673 PyTuple_SET_ITEM(result, 0, key); /* steals reference */
3674 PyTuple_SET_ITEM(result, 1, value); /* steals reference */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003675 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003676
3677fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003678 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003679 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003681}
3682
3683PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003684 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3685 "dict_itemiterator", /* tp_name */
3686 sizeof(dictiterobject), /* tp_basicsize */
3687 0, /* tp_itemsize */
3688 /* methods */
3689 (destructor)dictiter_dealloc, /* tp_dealloc */
3690 0, /* tp_print */
3691 0, /* tp_getattr */
3692 0, /* tp_setattr */
3693 0, /* tp_reserved */
3694 0, /* tp_repr */
3695 0, /* tp_as_number */
3696 0, /* tp_as_sequence */
3697 0, /* tp_as_mapping */
3698 0, /* tp_hash */
3699 0, /* tp_call */
3700 0, /* tp_str */
3701 PyObject_GenericGetAttr, /* tp_getattro */
3702 0, /* tp_setattro */
3703 0, /* tp_as_buffer */
3704 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3705 0, /* tp_doc */
3706 (traverseproc)dictiter_traverse, /* tp_traverse */
3707 0, /* tp_clear */
3708 0, /* tp_richcompare */
3709 0, /* tp_weaklistoffset */
3710 PyObject_SelfIter, /* tp_iter */
3711 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3712 dictiter_methods, /* tp_methods */
3713 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003714};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003715
3716
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003717static PyObject *
3718dictiter_reduce(dictiterobject *di)
3719{
3720 PyObject *list;
3721 dictiterobject tmp;
3722
3723 list = PyList_New(0);
3724 if (!list)
3725 return NULL;
3726
3727 /* copy the itertor state */
3728 tmp = *di;
3729 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003730
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003731 /* iterate the temporary into a list */
3732 for(;;) {
3733 PyObject *element = 0;
3734 if (Py_TYPE(di) == &PyDictIterItem_Type)
3735 element = dictiter_iternextitem(&tmp);
3736 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3737 element = dictiter_iternextkey(&tmp);
3738 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3739 element = dictiter_iternextvalue(&tmp);
3740 else
3741 assert(0);
3742 if (element) {
3743 if (PyList_Append(list, element)) {
3744 Py_DECREF(element);
3745 Py_DECREF(list);
3746 Py_XDECREF(tmp.di_dict);
3747 return NULL;
3748 }
3749 Py_DECREF(element);
3750 } else
3751 break;
3752 }
3753 Py_XDECREF(tmp.di_dict);
3754 /* check for error */
3755 if (tmp.di_dict != NULL) {
3756 /* we have an error */
3757 Py_DECREF(list);
3758 return NULL;
3759 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003760 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003761}
3762
Guido van Rossum3ac67412007-02-10 18:55:06 +00003763/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003764/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003765/***********************************************/
3766
Guido van Rossumb90c8482007-02-10 01:11:45 +00003767/* The instance lay-out is the same for all three; but the type differs. */
3768
Guido van Rossumb90c8482007-02-10 01:11:45 +00003769static void
Eric Snow96c6af92015-05-29 22:21:39 -06003770dictview_dealloc(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003771{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003772 Py_XDECREF(dv->dv_dict);
3773 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003774}
3775
3776static int
Eric Snow96c6af92015-05-29 22:21:39 -06003777dictview_traverse(_PyDictViewObject *dv, visitproc visit, void *arg)
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003778{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003779 Py_VISIT(dv->dv_dict);
3780 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003781}
3782
Guido van Rossum83825ac2007-02-10 04:54:19 +00003783static Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06003784dictview_len(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 Py_ssize_t len = 0;
3787 if (dv->dv_dict != NULL)
3788 len = dv->dv_dict->ma_used;
3789 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003790}
3791
Eric Snow96c6af92015-05-29 22:21:39 -06003792PyObject *
3793_PyDictView_New(PyObject *dict, PyTypeObject *type)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003794{
Eric Snow96c6af92015-05-29 22:21:39 -06003795 _PyDictViewObject *dv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003796 if (dict == NULL) {
3797 PyErr_BadInternalCall();
3798 return NULL;
3799 }
3800 if (!PyDict_Check(dict)) {
3801 /* XXX Get rid of this restriction later */
3802 PyErr_Format(PyExc_TypeError,
3803 "%s() requires a dict argument, not '%s'",
3804 type->tp_name, dict->ob_type->tp_name);
3805 return NULL;
3806 }
Eric Snow96c6af92015-05-29 22:21:39 -06003807 dv = PyObject_GC_New(_PyDictViewObject, type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003808 if (dv == NULL)
3809 return NULL;
3810 Py_INCREF(dict);
3811 dv->dv_dict = (PyDictObject *)dict;
3812 _PyObject_GC_TRACK(dv);
3813 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003814}
3815
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003816/* TODO(guido): The views objects are not complete:
3817
3818 * support more set operations
3819 * support arbitrary mappings?
3820 - either these should be static or exported in dictobject.h
3821 - if public then they should probably be in builtins
3822*/
3823
Guido van Rossumaac530c2007-08-24 22:33:45 +00003824/* Return 1 if self is a subset of other, iterating over self;
3825 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003826static int
3827all_contained_in(PyObject *self, PyObject *other)
3828{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003829 PyObject *iter = PyObject_GetIter(self);
3830 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003832 if (iter == NULL)
3833 return -1;
3834 for (;;) {
3835 PyObject *next = PyIter_Next(iter);
3836 if (next == NULL) {
3837 if (PyErr_Occurred())
3838 ok = -1;
3839 break;
3840 }
3841 ok = PySequence_Contains(other, next);
3842 Py_DECREF(next);
3843 if (ok <= 0)
3844 break;
3845 }
3846 Py_DECREF(iter);
3847 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003848}
3849
3850static PyObject *
3851dictview_richcompare(PyObject *self, PyObject *other, int op)
3852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003853 Py_ssize_t len_self, len_other;
3854 int ok;
3855 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003857 assert(self != NULL);
3858 assert(PyDictViewSet_Check(self));
3859 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003860
Brian Curtindfc80e32011-08-10 20:28:54 -05003861 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3862 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003864 len_self = PyObject_Size(self);
3865 if (len_self < 0)
3866 return NULL;
3867 len_other = PyObject_Size(other);
3868 if (len_other < 0)
3869 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 ok = 0;
3872 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003874 case Py_NE:
3875 case Py_EQ:
3876 if (len_self == len_other)
3877 ok = all_contained_in(self, other);
3878 if (op == Py_NE && ok >= 0)
3879 ok = !ok;
3880 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003882 case Py_LT:
3883 if (len_self < len_other)
3884 ok = all_contained_in(self, other);
3885 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003887 case Py_LE:
3888 if (len_self <= len_other)
3889 ok = all_contained_in(self, other);
3890 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003892 case Py_GT:
3893 if (len_self > len_other)
3894 ok = all_contained_in(other, self);
3895 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003897 case Py_GE:
3898 if (len_self >= len_other)
3899 ok = all_contained_in(other, self);
3900 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003902 }
3903 if (ok < 0)
3904 return NULL;
3905 result = ok ? Py_True : Py_False;
3906 Py_INCREF(result);
3907 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003908}
3909
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003910static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003911dictview_repr(_PyDictViewObject *dv)
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003913 PyObject *seq;
3914 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003916 seq = PySequence_List((PyObject *)dv);
3917 if (seq == NULL)
3918 return NULL;
3919
3920 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3921 Py_DECREF(seq);
3922 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003923}
3924
Guido van Rossum3ac67412007-02-10 18:55:06 +00003925/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003926
3927static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003928dictkeys_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003930 if (dv->dv_dict == NULL) {
3931 Py_RETURN_NONE;
3932 }
3933 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003934}
3935
3936static int
Eric Snow96c6af92015-05-29 22:21:39 -06003937dictkeys_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003938{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003939 if (dv->dv_dict == NULL)
3940 return 0;
3941 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003942}
3943
Guido van Rossum83825ac2007-02-10 04:54:19 +00003944static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003945 (lenfunc)dictview_len, /* sq_length */
3946 0, /* sq_concat */
3947 0, /* sq_repeat */
3948 0, /* sq_item */
3949 0, /* sq_slice */
3950 0, /* sq_ass_item */
3951 0, /* sq_ass_slice */
3952 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003953};
3954
Guido van Rossum523259b2007-08-24 23:41:22 +00003955static PyObject*
3956dictviews_sub(PyObject* self, PyObject *other)
3957{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003958 PyObject *result = PySet_New(self);
3959 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003960 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003962 if (result == NULL)
3963 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003964
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003965 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003966 if (tmp == NULL) {
3967 Py_DECREF(result);
3968 return NULL;
3969 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003971 Py_DECREF(tmp);
3972 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003973}
3974
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003975PyObject*
3976_PyDictView_Intersect(PyObject* self, PyObject *other)
Guido van Rossum523259b2007-08-24 23:41:22 +00003977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 PyObject *result = PySet_New(self);
3979 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003980 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003982 if (result == NULL)
3983 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003984
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003985 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003986 if (tmp == NULL) {
3987 Py_DECREF(result);
3988 return NULL;
3989 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003991 Py_DECREF(tmp);
3992 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003993}
3994
3995static PyObject*
3996dictviews_or(PyObject* self, PyObject *other)
3997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 PyObject *result = PySet_New(self);
3999 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02004000 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02004001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004002 if (result == NULL)
4003 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00004004
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08004005 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004006 if (tmp == NULL) {
4007 Py_DECREF(result);
4008 return NULL;
4009 }
Guido van Rossum523259b2007-08-24 23:41:22 +00004010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004011 Py_DECREF(tmp);
4012 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00004013}
4014
4015static PyObject*
4016dictviews_xor(PyObject* self, PyObject *other)
4017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004018 PyObject *result = PySet_New(self);
4019 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004020 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004022 if (result == NULL)
4023 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00004024
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08004025 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004026 if (tmp == NULL) {
4027 Py_DECREF(result);
4028 return NULL;
4029 }
Guido van Rossum523259b2007-08-24 23:41:22 +00004030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004031 Py_DECREF(tmp);
4032 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00004033}
4034
4035static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004036 0, /*nb_add*/
4037 (binaryfunc)dictviews_sub, /*nb_subtract*/
4038 0, /*nb_multiply*/
4039 0, /*nb_remainder*/
4040 0, /*nb_divmod*/
4041 0, /*nb_power*/
4042 0, /*nb_negative*/
4043 0, /*nb_positive*/
4044 0, /*nb_absolute*/
4045 0, /*nb_bool*/
4046 0, /*nb_invert*/
4047 0, /*nb_lshift*/
4048 0, /*nb_rshift*/
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004049 (binaryfunc)_PyDictView_Intersect, /*nb_and*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004050 (binaryfunc)dictviews_xor, /*nb_xor*/
4051 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00004052};
4053
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004054static PyObject*
4055dictviews_isdisjoint(PyObject *self, PyObject *other)
4056{
4057 PyObject *it;
4058 PyObject *item = NULL;
4059
4060 if (self == other) {
Eric Snow96c6af92015-05-29 22:21:39 -06004061 if (dictview_len((_PyDictViewObject *)self) == 0)
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004062 Py_RETURN_TRUE;
4063 else
4064 Py_RETURN_FALSE;
4065 }
4066
4067 /* Iterate over the shorter object (only if other is a set,
4068 * because PySequence_Contains may be expensive otherwise): */
4069 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
Eric Snow96c6af92015-05-29 22:21:39 -06004070 Py_ssize_t len_self = dictview_len((_PyDictViewObject *)self);
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004071 Py_ssize_t len_other = PyObject_Size(other);
4072 if (len_other == -1)
4073 return NULL;
4074
4075 if ((len_other > len_self)) {
4076 PyObject *tmp = other;
4077 other = self;
4078 self = tmp;
4079 }
4080 }
4081
4082 it = PyObject_GetIter(other);
4083 if (it == NULL)
4084 return NULL;
4085
4086 while ((item = PyIter_Next(it)) != NULL) {
4087 int contains = PySequence_Contains(self, item);
4088 Py_DECREF(item);
4089 if (contains == -1) {
4090 Py_DECREF(it);
4091 return NULL;
4092 }
4093
4094 if (contains) {
4095 Py_DECREF(it);
4096 Py_RETURN_FALSE;
4097 }
4098 }
4099 Py_DECREF(it);
4100 if (PyErr_Occurred())
4101 return NULL; /* PyIter_Next raised an exception. */
4102 Py_RETURN_TRUE;
4103}
4104
4105PyDoc_STRVAR(isdisjoint_doc,
4106"Return True if the view and the given iterable have a null intersection.");
4107
Guido van Rossumb90c8482007-02-10 01:11:45 +00004108static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004109 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
4110 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004111 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004112};
4113
4114PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004115 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4116 "dict_keys", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004117 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004118 0, /* tp_itemsize */
4119 /* methods */
4120 (destructor)dictview_dealloc, /* tp_dealloc */
4121 0, /* tp_print */
4122 0, /* tp_getattr */
4123 0, /* tp_setattr */
4124 0, /* tp_reserved */
4125 (reprfunc)dictview_repr, /* tp_repr */
4126 &dictviews_as_number, /* tp_as_number */
4127 &dictkeys_as_sequence, /* tp_as_sequence */
4128 0, /* tp_as_mapping */
4129 0, /* tp_hash */
4130 0, /* tp_call */
4131 0, /* tp_str */
4132 PyObject_GenericGetAttr, /* tp_getattro */
4133 0, /* tp_setattro */
4134 0, /* tp_as_buffer */
4135 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4136 0, /* tp_doc */
4137 (traverseproc)dictview_traverse, /* tp_traverse */
4138 0, /* tp_clear */
4139 dictview_richcompare, /* tp_richcompare */
4140 0, /* tp_weaklistoffset */
4141 (getiterfunc)dictkeys_iter, /* tp_iter */
4142 0, /* tp_iternext */
4143 dictkeys_methods, /* tp_methods */
4144 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004145};
4146
4147static PyObject *
4148dictkeys_new(PyObject *dict)
4149{
Eric Snow96c6af92015-05-29 22:21:39 -06004150 return _PyDictView_New(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004151}
4152
Guido van Rossum3ac67412007-02-10 18:55:06 +00004153/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004154
4155static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004156dictitems_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004158 if (dv->dv_dict == NULL) {
4159 Py_RETURN_NONE;
4160 }
4161 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00004162}
4163
4164static int
Eric Snow96c6af92015-05-29 22:21:39 -06004165dictitems_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00004166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 PyObject *key, *value, *found;
4168 if (dv->dv_dict == NULL)
4169 return 0;
4170 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
4171 return 0;
4172 key = PyTuple_GET_ITEM(obj, 0);
4173 value = PyTuple_GET_ITEM(obj, 1);
Raymond Hettinger6692f012016-09-18 21:46:08 -07004174 found = PyDict_GetItemWithError((PyObject *)dv->dv_dict, key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 if (found == NULL) {
4176 if (PyErr_Occurred())
4177 return -1;
4178 return 0;
4179 }
4180 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004181}
4182
Guido van Rossum83825ac2007-02-10 04:54:19 +00004183static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 (lenfunc)dictview_len, /* sq_length */
4185 0, /* sq_concat */
4186 0, /* sq_repeat */
4187 0, /* sq_item */
4188 0, /* sq_slice */
4189 0, /* sq_ass_item */
4190 0, /* sq_ass_slice */
4191 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004192};
4193
Guido van Rossumb90c8482007-02-10 01:11:45 +00004194static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004195 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
4196 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004198};
4199
4200PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004201 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4202 "dict_items", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004203 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 0, /* tp_itemsize */
4205 /* methods */
4206 (destructor)dictview_dealloc, /* tp_dealloc */
4207 0, /* tp_print */
4208 0, /* tp_getattr */
4209 0, /* tp_setattr */
4210 0, /* tp_reserved */
4211 (reprfunc)dictview_repr, /* tp_repr */
4212 &dictviews_as_number, /* tp_as_number */
4213 &dictitems_as_sequence, /* tp_as_sequence */
4214 0, /* tp_as_mapping */
4215 0, /* tp_hash */
4216 0, /* tp_call */
4217 0, /* tp_str */
4218 PyObject_GenericGetAttr, /* tp_getattro */
4219 0, /* tp_setattro */
4220 0, /* tp_as_buffer */
4221 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4222 0, /* tp_doc */
4223 (traverseproc)dictview_traverse, /* tp_traverse */
4224 0, /* tp_clear */
4225 dictview_richcompare, /* tp_richcompare */
4226 0, /* tp_weaklistoffset */
4227 (getiterfunc)dictitems_iter, /* tp_iter */
4228 0, /* tp_iternext */
4229 dictitems_methods, /* tp_methods */
4230 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004231};
4232
4233static PyObject *
4234dictitems_new(PyObject *dict)
4235{
Eric Snow96c6af92015-05-29 22:21:39 -06004236 return _PyDictView_New(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004237}
4238
Guido van Rossum3ac67412007-02-10 18:55:06 +00004239/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004240
4241static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004242dictvalues_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 if (dv->dv_dict == NULL) {
4245 Py_RETURN_NONE;
4246 }
4247 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004248}
4249
Guido van Rossum83825ac2007-02-10 04:54:19 +00004250static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004251 (lenfunc)dictview_len, /* sq_length */
4252 0, /* sq_concat */
4253 0, /* sq_repeat */
4254 0, /* sq_item */
4255 0, /* sq_slice */
4256 0, /* sq_ass_item */
4257 0, /* sq_ass_slice */
4258 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004259};
4260
Guido van Rossumb90c8482007-02-10 01:11:45 +00004261static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004263};
4264
4265PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004266 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4267 "dict_values", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004268 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004269 0, /* tp_itemsize */
4270 /* methods */
4271 (destructor)dictview_dealloc, /* tp_dealloc */
4272 0, /* tp_print */
4273 0, /* tp_getattr */
4274 0, /* tp_setattr */
4275 0, /* tp_reserved */
4276 (reprfunc)dictview_repr, /* tp_repr */
4277 0, /* tp_as_number */
4278 &dictvalues_as_sequence, /* tp_as_sequence */
4279 0, /* tp_as_mapping */
4280 0, /* tp_hash */
4281 0, /* tp_call */
4282 0, /* tp_str */
4283 PyObject_GenericGetAttr, /* tp_getattro */
4284 0, /* tp_setattro */
4285 0, /* tp_as_buffer */
4286 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4287 0, /* tp_doc */
4288 (traverseproc)dictview_traverse, /* tp_traverse */
4289 0, /* tp_clear */
4290 0, /* tp_richcompare */
4291 0, /* tp_weaklistoffset */
4292 (getiterfunc)dictvalues_iter, /* tp_iter */
4293 0, /* tp_iternext */
4294 dictvalues_methods, /* tp_methods */
4295 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004296};
4297
4298static PyObject *
4299dictvalues_new(PyObject *dict)
4300{
Eric Snow96c6af92015-05-29 22:21:39 -06004301 return _PyDictView_New(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004302}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004303
4304/* Returns NULL if cannot allocate a new PyDictKeysObject,
4305 but does not set an error */
4306PyDictKeysObject *
4307_PyDict_NewKeysForClass(void)
4308{
Victor Stinner742da042016-09-07 17:40:12 -07004309 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004310 if (keys == NULL)
4311 PyErr_Clear();
4312 else
4313 keys->dk_lookup = lookdict_split;
4314 return keys;
4315}
4316
4317#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
4318
4319PyObject *
4320PyObject_GenericGetDict(PyObject *obj, void *context)
4321{
4322 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
4323 if (dictptr == NULL) {
4324 PyErr_SetString(PyExc_AttributeError,
4325 "This object has no __dict__");
4326 return NULL;
4327 }
4328 dict = *dictptr;
4329 if (dict == NULL) {
4330 PyTypeObject *tp = Py_TYPE(obj);
4331 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
4332 DK_INCREF(CACHED_KEYS(tp));
4333 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
4334 }
4335 else {
4336 *dictptr = dict = PyDict_New();
4337 }
4338 }
4339 Py_XINCREF(dict);
4340 return dict;
4341}
4342
4343int
4344_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
Victor Stinner742da042016-09-07 17:40:12 -07004345 PyObject *key, PyObject *value)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004346{
4347 PyObject *dict;
4348 int res;
4349 PyDictKeysObject *cached;
4350
4351 assert(dictptr != NULL);
4352 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
4353 assert(dictptr != NULL);
4354 dict = *dictptr;
4355 if (dict == NULL) {
4356 DK_INCREF(cached);
4357 dict = new_dict_with_shared_keys(cached);
4358 if (dict == NULL)
4359 return -1;
4360 *dictptr = dict;
4361 }
4362 if (value == NULL) {
4363 res = PyDict_DelItem(dict, key);
4364 if (cached != ((PyDictObject *)dict)->ma_keys) {
4365 CACHED_KEYS(tp) = NULL;
4366 DK_DECREF(cached);
4367 }
Victor Stinner3d3f2642016-12-15 17:21:23 +01004368 }
4369 else {
4370 int was_shared = cached == ((PyDictObject *)dict)->ma_keys;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004371 res = PyDict_SetItem(dict, key, value);
Victor Stinner3d3f2642016-12-15 17:21:23 +01004372 if (was_shared && cached != ((PyDictObject *)dict)->ma_keys) {
4373 /* PyDict_SetItem() may call dictresize and convert split table
4374 * into combined table. In such case, convert it to split
4375 * table again and update type's shared key only when this is
4376 * the only dict sharing key with the type.
4377 *
4378 * This is to allow using shared key in class like this:
4379 *
4380 * class C:
4381 * def __init__(self):
4382 * # one dict resize happens
4383 * self.a, self.b, self.c = 1, 2, 3
4384 * self.d, self.e, self.f = 4, 5, 6
4385 * a = C()
4386 */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004387 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004388 CACHED_KEYS(tp) = make_keys_shared(dict);
Victor Stinner742da042016-09-07 17:40:12 -07004389 }
4390 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004391 CACHED_KEYS(tp) = NULL;
4392 }
4393 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004394 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
4395 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004396 }
4397 }
4398 } else {
4399 dict = *dictptr;
4400 if (dict == NULL) {
4401 dict = PyDict_New();
4402 if (dict == NULL)
4403 return -1;
4404 *dictptr = dict;
4405 }
4406 if (value == NULL) {
4407 res = PyDict_DelItem(dict, key);
4408 } else {
4409 res = PyDict_SetItem(dict, key, value);
4410 }
4411 }
4412 return res;
4413}
4414
4415void
4416_PyDictKeys_DecRef(PyDictKeysObject *keys)
4417{
4418 DK_DECREF(keys);
4419}