blob: 97f04186748f1fee617286f7a0e223d0576a23a7 [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
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001248dictresize(PyDictObject *mp, Py_ssize_t minused)
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;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 newsize <= minused && newsize > 0;
1258 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 }
1272 if (oldkeys->dk_lookup == lookdict)
1273 mp->ma_keys->dk_lookup = lookdict;
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001274 mp->ma_values = NULL;
1275 ep0 = DK_ENTRIES(oldkeys);
1276 /* Main loop below assumes we can transfer refcount to new keys
1277 * and that value is stored in me_value.
1278 * Increment ref-counts and copy values here to compensate
1279 * This (resizing a split table) should be relatively rare */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001280 if (oldvalues != NULL) {
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001281 for (i = 0; i < oldkeys->dk_nentries; i++) {
1282 if (oldvalues[i] != NULL) {
1283 Py_INCREF(ep0[i].me_key);
1284 ep0[i].me_value = oldvalues[i];
1285 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 }
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001287 }
1288 /* Main loop */
1289 for (i = 0; i < oldkeys->dk_nentries; i++) {
1290 PyDictKeyEntry *ep = &ep0[i];
1291 if (ep->me_value != NULL) {
1292 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
1293 }
1294 }
1295 mp->ma_keys->dk_usable -= mp->ma_used;
1296 if (oldvalues != NULL) {
1297 /* NULL out me_value slot in oldkeys, in case it was shared */
1298 for (i = 0; i < oldkeys->dk_nentries; i++)
1299 ep0[i].me_value = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001300 DK_DECREF(oldkeys);
Victor Stinner742da042016-09-07 17:40:12 -07001301 if (oldvalues != empty_values) {
1302 free_values(oldvalues);
1303 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001304 }
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001305 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001306 assert(oldkeys->dk_lookup != lookdict_split);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001307 assert(oldkeys->dk_refcnt == 1);
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001308 DK_DEBUG_DECREF PyObject_FREE(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001309 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001311}
1312
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001313/* Returns NULL if unable to split table.
1314 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001315static PyDictKeysObject *
1316make_keys_shared(PyObject *op)
1317{
1318 Py_ssize_t i;
1319 Py_ssize_t size;
1320 PyDictObject *mp = (PyDictObject *)op;
1321
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001322 if (!PyDict_CheckExact(op))
1323 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001324 if (!_PyDict_HasSplitTable(mp)) {
1325 PyDictKeyEntry *ep0;
1326 PyObject **values;
1327 assert(mp->ma_keys->dk_refcnt == 1);
1328 if (mp->ma_keys->dk_lookup == lookdict) {
1329 return NULL;
1330 }
1331 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
1332 /* Remove dummy keys */
1333 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
1334 return NULL;
1335 }
1336 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
1337 /* Copy values into a new array */
Victor Stinner742da042016-09-07 17:40:12 -07001338 ep0 = DK_ENTRIES(mp->ma_keys);
1339 size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001340 values = new_values(size);
1341 if (values == NULL) {
1342 PyErr_SetString(PyExc_MemoryError,
1343 "Not enough memory to allocate new values array");
1344 return NULL;
1345 }
1346 for (i = 0; i < size; i++) {
1347 values[i] = ep0[i].me_value;
1348 ep0[i].me_value = NULL;
1349 }
1350 mp->ma_keys->dk_lookup = lookdict_split;
1351 mp->ma_values = values;
1352 }
1353 DK_INCREF(mp->ma_keys);
1354 return mp->ma_keys;
1355}
Christian Heimes99170a52007-12-19 02:07:34 +00001356
1357PyObject *
1358_PyDict_NewPresized(Py_ssize_t minused)
1359{
INADA Naoki2c5a8302016-12-07 18:34:44 +09001360 const Py_ssize_t max_presize = 128 * 1024;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001361 Py_ssize_t newsize;
1362 PyDictKeysObject *new_keys;
INADA Naoki2c5a8302016-12-07 18:34:44 +09001363
1364 /* There are no strict guarantee that returned dict can contain minused
1365 * items without resize. So we create medium size dict instead of very
1366 * large dict or MemoryError.
1367 */
1368 if (minused > USABLE_FRACTION(max_presize)) {
1369 newsize = max_presize;
1370 }
1371 else {
1372 Py_ssize_t minsize = ESTIMATE_SIZE(minused);
1373 newsize = PyDict_MINSIZE;
1374 while (newsize < minsize) {
1375 newsize <<= 1;
1376 }
1377 }
1378 assert(IS_POWER_OF_2(newsize));
1379
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001380 new_keys = new_keys_object(newsize);
1381 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001383 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001384}
1385
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001386/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1387 * that may occur (originally dicts supported only string keys, and exceptions
1388 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001389 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001390 * (suppressed) occurred while computing the key's hash, or that some error
1391 * (suppressed) occurred when comparing keys in the dict's internal probe
1392 * sequence. A nasty example of the latter is when a Python-coded comparison
1393 * function hits a stack-depth error, which can cause this to return NULL
1394 * even if the key is present.
1395 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001397PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001398{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001399 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001400 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 PyDictObject *mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001403 PyObject **value_addr;
1404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 if (!PyDict_Check(op))
1406 return NULL;
1407 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001408 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 {
1410 hash = PyObject_Hash(key);
1411 if (hash == -1) {
1412 PyErr_Clear();
1413 return NULL;
1414 }
1415 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 /* We can arrive here with a NULL tstate during initialization: try
1418 running "python -Wi" for an example related to string interning.
1419 Let's just hope that no exception occurs then... This must be
1420 _PyThreadState_Current and not PyThreadState_GET() because in debug
1421 mode, the latter complains if tstate is NULL. */
Victor Stinnerbfd316e2016-01-20 11:12:38 +01001422 tstate = _PyThreadState_UncheckedGet();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 if (tstate != NULL && tstate->curexc_type != NULL) {
1424 /* preserve the existing exception */
1425 PyObject *err_type, *err_value, *err_tb;
1426 PyErr_Fetch(&err_type, &err_value, &err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001427 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 /* ignore errors */
1429 PyErr_Restore(err_type, err_value, err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001430 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 return NULL;
1432 }
1433 else {
Victor Stinner742da042016-09-07 17:40:12 -07001434 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1435 if (ix < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 PyErr_Clear();
1437 return NULL;
1438 }
1439 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001440 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001441}
1442
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001443/* Same as PyDict_GetItemWithError() but with hash supplied by caller.
1444 This returns NULL *with* an exception set if an exception occurred.
1445 It returns NULL *without* an exception set if the key wasn't present.
1446*/
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001447PyObject *
1448_PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1449{
Victor Stinner742da042016-09-07 17:40:12 -07001450 Py_ssize_t ix;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001451 PyDictObject *mp = (PyDictObject *)op;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001452 PyObject **value_addr;
1453
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001454 if (!PyDict_Check(op)) {
1455 PyErr_BadInternalCall();
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001456 return NULL;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001457 }
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001458
1459 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1460 if (ix < 0) {
1461 return NULL;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001462 }
1463 return *value_addr;
1464}
1465
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001466/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1467 This returns NULL *with* an exception set if an exception occurred.
1468 It returns NULL *without* an exception set if the key wasn't present.
1469*/
1470PyObject *
1471PyDict_GetItemWithError(PyObject *op, PyObject *key)
1472{
Victor Stinner742da042016-09-07 17:40:12 -07001473 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001474 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001476 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 if (!PyDict_Check(op)) {
1479 PyErr_BadInternalCall();
1480 return NULL;
1481 }
1482 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001483 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 {
1485 hash = PyObject_Hash(key);
1486 if (hash == -1) {
1487 return NULL;
1488 }
1489 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001490
Victor Stinner742da042016-09-07 17:40:12 -07001491 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1492 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001494 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001495}
1496
Brett Cannonfd074152012-04-14 14:10:13 -04001497PyObject *
1498_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1499{
1500 PyObject *kv;
1501 kv = _PyUnicode_FromId(key); /* borrowed */
1502 if (kv == NULL)
1503 return NULL;
1504 return PyDict_GetItemWithError(dp, kv);
1505}
1506
Victor Stinnerb4efc962015-11-20 09:24:02 +01001507/* Fast version of global value lookup (LOAD_GLOBAL).
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001508 * Lookup in globals, then builtins.
Victor Stinnerb4efc962015-11-20 09:24:02 +01001509 *
1510 * Raise an exception and return NULL if an error occurred (ex: computing the
1511 * key hash failed, key comparison failed, ...). Return NULL if the key doesn't
1512 * exist. Return the value if the key exists.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001513 */
1514PyObject *
1515_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001516{
Victor Stinner742da042016-09-07 17:40:12 -07001517 Py_ssize_t ix;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001518 Py_hash_t hash;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001519 PyObject **value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001520
1521 if (!PyUnicode_CheckExact(key) ||
1522 (hash = ((PyASCIIObject *) key)->hash) == -1)
1523 {
1524 hash = PyObject_Hash(key);
1525 if (hash == -1)
1526 return NULL;
Antoine Pitroue965d972012-02-27 00:45:12 +01001527 }
Victor Stinnerb4efc962015-11-20 09:24:02 +01001528
1529 /* namespace 1: globals */
Victor Stinner742da042016-09-07 17:40:12 -07001530 ix = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr, NULL);
1531 if (ix == DKIX_ERROR)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001532 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001533 if (ix != DKIX_EMPTY && *value_addr != NULL)
1534 return *value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001535
1536 /* namespace 2: builtins */
Victor Stinner742da042016-09-07 17:40:12 -07001537 ix = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr, NULL);
1538 if (ix < 0)
Victor Stinnerb4efc962015-11-20 09:24:02 +01001539 return NULL;
1540 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001541}
1542
Antoine Pitroue965d972012-02-27 00:45:12 +01001543/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1544 * dictionary if it's merely replacing the value for an existing key.
1545 * This means that it's safe to loop over a dictionary with PyDict_Next()
1546 * and occasionally replace a value -- but you can't insert new keys or
1547 * remove them.
1548 */
1549int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001550PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001551{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001552 PyDictObject *mp;
1553 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001554 if (!PyDict_Check(op)) {
1555 PyErr_BadInternalCall();
1556 return -1;
1557 }
1558 assert(key);
1559 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001560 mp = (PyDictObject *)op;
1561 if (!PyUnicode_CheckExact(key) ||
1562 (hash = ((PyASCIIObject *) key)->hash) == -1)
1563 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001564 hash = PyObject_Hash(key);
1565 if (hash == -1)
1566 return -1;
1567 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001568
1569 /* insertdict() handles any resizing that might be necessary */
1570 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001571}
1572
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001573int
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001574_PyDict_SetItem_KnownHash(PyObject *op, PyObject *key, PyObject *value,
1575 Py_hash_t hash)
1576{
1577 PyDictObject *mp;
1578
1579 if (!PyDict_Check(op)) {
1580 PyErr_BadInternalCall();
1581 return -1;
1582 }
1583 assert(key);
1584 assert(value);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001585 assert(hash != -1);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001586 mp = (PyDictObject *)op;
1587
1588 /* insertdict() handles any resizing that might be necessary */
1589 return insertdict(mp, key, hash, value);
1590}
1591
1592int
Tim Peters1f5871e2000-07-04 17:44:48 +00001593PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001594{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001595 Py_hash_t hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 assert(key);
1598 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001599 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 hash = PyObject_Hash(key);
1601 if (hash == -1)
1602 return -1;
1603 }
Victor Stinner742da042016-09-07 17:40:12 -07001604
1605 return _PyDict_DelItem_KnownHash(op, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001606}
1607
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001608int
1609_PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1610{
Victor Stinner742da042016-09-07 17:40:12 -07001611 Py_ssize_t hashpos, ix;
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001612 PyDictObject *mp;
1613 PyDictKeyEntry *ep;
1614 PyObject *old_key, *old_value;
1615 PyObject **value_addr;
1616
1617 if (!PyDict_Check(op)) {
1618 PyErr_BadInternalCall();
1619 return -1;
1620 }
1621 assert(key);
1622 assert(hash != -1);
1623 mp = (PyDictObject *)op;
Victor Stinner742da042016-09-07 17:40:12 -07001624 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1625 if (ix == DKIX_ERROR)
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001626 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07001627 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001628 _PyErr_SetKeyError(key);
1629 return -1;
1630 }
Victor Stinner742da042016-09-07 17:40:12 -07001631 assert(dk_get_index(mp->ma_keys, hashpos) == ix);
Victor Stinner78601a32016-09-09 19:28:36 -07001632
1633 // Split table doesn't allow deletion. Combine it.
1634 if (_PyDict_HasSplitTable(mp)) {
1635 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1636 return -1;
1637 }
1638 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1639 assert(ix >= 0);
1640 }
1641
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001642 old_value = *value_addr;
Victor Stinner78601a32016-09-09 19:28:36 -07001643 assert(old_value != NULL);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001644 *value_addr = NULL;
1645 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001646 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner78601a32016-09-09 19:28:36 -07001647 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1648 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1649 ENSURE_ALLOWS_DELETIONS(mp);
1650 old_key = ep->me_key;
1651 ep->me_key = NULL;
1652 Py_DECREF(old_key);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001653 Py_DECREF(old_value);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001654
1655 assert(_PyDict_CheckConsistency(mp));
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001656 return 0;
1657}
1658
Guido van Rossum25831651993-05-19 14:50:45 +00001659void
Tim Peters1f5871e2000-07-04 17:44:48 +00001660PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001663 PyDictKeysObject *oldkeys;
1664 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 if (!PyDict_Check(op))
1668 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001669 mp = ((PyDictObject *)op);
1670 oldkeys = mp->ma_keys;
1671 oldvalues = mp->ma_values;
1672 if (oldvalues == empty_values)
1673 return;
1674 /* Empty the dict... */
1675 DK_INCREF(Py_EMPTY_KEYS);
1676 mp->ma_keys = Py_EMPTY_KEYS;
1677 mp->ma_values = empty_values;
1678 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001679 mp->ma_version_tag = DICT_NEXT_VERSION();
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001680 /* ...then clear the keys and values */
1681 if (oldvalues != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001682 n = oldkeys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001683 for (i = 0; i < n; i++)
1684 Py_CLEAR(oldvalues[i]);
1685 free_values(oldvalues);
1686 DK_DECREF(oldkeys);
1687 }
1688 else {
1689 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001690 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001691 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02001692 assert(_PyDict_CheckConsistency(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001693}
1694
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001695/* Internal version of PyDict_Next that returns a hash value in addition
1696 * to the key and value.
1697 * Return 1 on success, return 0 when the reached the end of the dictionary
1698 * (or if op is not a dictionary)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001699 */
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001700int
1701_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1702 PyObject **pvalue, Py_hash_t *phash)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001703{
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001704 Py_ssize_t i, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001705 PyDictObject *mp;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001706 PyDictKeyEntry *entry_ptr;
1707 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001708
1709 if (!PyDict_Check(op))
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001710 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 mp = (PyDictObject *)op;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001712 i = *ppos;
Victor Stinner742da042016-09-07 17:40:12 -07001713 n = mp->ma_keys->dk_nentries;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001714 if ((size_t)i >= (size_t)n)
1715 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001716 if (mp->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001717 PyObject **value_ptr = &mp->ma_values[i];
1718 while (i < n && *value_ptr == NULL) {
1719 value_ptr++;
1720 i++;
Victor Stinner742da042016-09-07 17:40:12 -07001721 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001722 if (i >= n)
1723 return 0;
1724 entry_ptr = &DK_ENTRIES(mp->ma_keys)[i];
1725 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001727 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001728 entry_ptr = &DK_ENTRIES(mp->ma_keys)[i];
1729 while (i < n && entry_ptr->me_value == NULL) {
1730 entry_ptr++;
1731 i++;
Victor Stinner742da042016-09-07 17:40:12 -07001732 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001733 if (i >= n)
1734 return 0;
1735 value = entry_ptr->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001737 *ppos = i+1;
1738 if (pkey)
1739 *pkey = entry_ptr->me_key;
1740 if (phash)
1741 *phash = entry_ptr->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001742 if (pvalue)
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001743 *pvalue = value;
1744 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001745}
1746
Tim Peters080c88b2003-02-15 03:01:11 +00001747/*
1748 * Iterate over a dict. Use like so:
1749 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001750 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001751 * PyObject *key, *value;
1752 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001753 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001754 * Refer to borrowed references in key and value.
Tim Peters080c88b2003-02-15 03:01:11 +00001755 * }
1756 *
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001757 * Return 1 on success, return 0 when the reached the end of the dictionary
1758 * (or if op is not a dictionary)
1759 *
Tim Peters080c88b2003-02-15 03:01:11 +00001760 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001761 * mutates the dict. One exception: it is safe if the loop merely changes
1762 * the values associated with the keys (but doesn't insert new keys or
1763 * delete keys), via PyDict_SetItem().
1764 */
Guido van Rossum25831651993-05-19 14:50:45 +00001765int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001766PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001767{
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001768 return _PyDict_Next(op, ppos, pkey, pvalue, NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00001769}
1770
Eric Snow96c6af92015-05-29 22:21:39 -06001771/* Internal version of dict.pop(). */
1772PyObject *
Yury Selivanov684ef2c2016-10-28 19:01:21 -04001773_PyDict_Pop(PyObject *dict, PyObject *key, PyObject *deflt)
Eric Snow96c6af92015-05-29 22:21:39 -06001774{
1775 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001776 Py_ssize_t ix, hashpos;
Eric Snow96c6af92015-05-29 22:21:39 -06001777 PyObject *old_value, *old_key;
1778 PyDictKeyEntry *ep;
1779 PyObject **value_addr;
Yury Selivanov684ef2c2016-10-28 19:01:21 -04001780 PyDictObject *mp;
1781
1782 assert(PyDict_Check(dict));
1783 mp = (PyDictObject *)dict;
Eric Snow96c6af92015-05-29 22:21:39 -06001784
1785 if (mp->ma_used == 0) {
1786 if (deflt) {
1787 Py_INCREF(deflt);
1788 return deflt;
1789 }
1790 _PyErr_SetKeyError(key);
1791 return NULL;
1792 }
1793 if (!PyUnicode_CheckExact(key) ||
1794 (hash = ((PyASCIIObject *) key)->hash) == -1) {
1795 hash = PyObject_Hash(key);
1796 if (hash == -1)
1797 return NULL;
1798 }
Victor Stinner742da042016-09-07 17:40:12 -07001799 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1800 if (ix == DKIX_ERROR)
Eric Snow96c6af92015-05-29 22:21:39 -06001801 return NULL;
Victor Stinnerd0ad11f2016-09-13 16:56:38 +02001802 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Eric Snow96c6af92015-05-29 22:21:39 -06001803 if (deflt) {
1804 Py_INCREF(deflt);
1805 return deflt;
1806 }
1807 _PyErr_SetKeyError(key);
1808 return NULL;
1809 }
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001810
Victor Stinner78601a32016-09-09 19:28:36 -07001811 // Split table doesn't allow deletion. Combine it.
1812 if (_PyDict_HasSplitTable(mp)) {
1813 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1814 return NULL;
1815 }
1816 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1817 assert(ix >= 0);
1818 }
1819
Victor Stinner742da042016-09-07 17:40:12 -07001820 old_value = *value_addr;
Victor Stinner78601a32016-09-09 19:28:36 -07001821 assert(old_value != NULL);
Eric Snow96c6af92015-05-29 22:21:39 -06001822 *value_addr = NULL;
1823 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001824 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner78601a32016-09-09 19:28:36 -07001825 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1826 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1827 ENSURE_ALLOWS_DELETIONS(mp);
1828 old_key = ep->me_key;
1829 ep->me_key = NULL;
1830 Py_DECREF(old_key);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001831
1832 assert(_PyDict_CheckConsistency(mp));
Eric Snow96c6af92015-05-29 22:21:39 -06001833 return old_value;
1834}
1835
1836/* Internal version of dict.from_keys(). It is subclass-friendly. */
1837PyObject *
1838_PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
1839{
1840 PyObject *it; /* iter(iterable) */
1841 PyObject *key;
1842 PyObject *d;
1843 int status;
1844
1845 d = PyObject_CallObject(cls, NULL);
1846 if (d == NULL)
1847 return NULL;
1848
1849 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
1850 if (PyDict_CheckExact(iterable)) {
1851 PyDictObject *mp = (PyDictObject *)d;
1852 PyObject *oldvalue;
1853 Py_ssize_t pos = 0;
1854 PyObject *key;
1855 Py_hash_t hash;
1856
Victor Stinner742da042016-09-07 17:40:12 -07001857 if (dictresize(mp, ESTIMATE_SIZE(Py_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001858 Py_DECREF(d);
1859 return NULL;
1860 }
1861
1862 while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) {
1863 if (insertdict(mp, key, hash, value)) {
1864 Py_DECREF(d);
1865 return NULL;
1866 }
1867 }
1868 return d;
1869 }
1870 if (PyAnySet_CheckExact(iterable)) {
1871 PyDictObject *mp = (PyDictObject *)d;
1872 Py_ssize_t pos = 0;
1873 PyObject *key;
1874 Py_hash_t hash;
1875
Victor Stinner742da042016-09-07 17:40:12 -07001876 if (dictresize(mp, ESTIMATE_SIZE(PySet_GET_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001877 Py_DECREF(d);
1878 return NULL;
1879 }
1880
1881 while (_PySet_NextEntry(iterable, &pos, &key, &hash)) {
1882 if (insertdict(mp, key, hash, value)) {
1883 Py_DECREF(d);
1884 return NULL;
1885 }
1886 }
1887 return d;
1888 }
1889 }
1890
1891 it = PyObject_GetIter(iterable);
1892 if (it == NULL){
1893 Py_DECREF(d);
1894 return NULL;
1895 }
1896
1897 if (PyDict_CheckExact(d)) {
1898 while ((key = PyIter_Next(it)) != NULL) {
1899 status = PyDict_SetItem(d, key, value);
1900 Py_DECREF(key);
1901 if (status < 0)
1902 goto Fail;
1903 }
1904 } else {
1905 while ((key = PyIter_Next(it)) != NULL) {
1906 status = PyObject_SetItem(d, key, value);
1907 Py_DECREF(key);
1908 if (status < 0)
1909 goto Fail;
1910 }
1911 }
1912
1913 if (PyErr_Occurred())
1914 goto Fail;
1915 Py_DECREF(it);
1916 return d;
1917
1918Fail:
1919 Py_DECREF(it);
1920 Py_DECREF(d);
1921 return NULL;
1922}
1923
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001924/* Methods */
1925
1926static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001927dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001928{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001929 PyObject **values = mp->ma_values;
1930 PyDictKeysObject *keys = mp->ma_keys;
1931 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932 PyObject_GC_UnTrack(mp);
1933 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001934 if (values != NULL) {
1935 if (values != empty_values) {
Victor Stinner742da042016-09-07 17:40:12 -07001936 for (i = 0, n = mp->ma_keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001937 Py_XDECREF(values[i]);
1938 }
1939 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001941 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02001943 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001944 assert(keys->dk_refcnt == 1);
1945 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001946 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1948 free_list[numfree++] = mp;
1949 else
1950 Py_TYPE(mp)->tp_free((PyObject *)mp);
1951 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001952}
1953
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001954
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001955static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001956dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001957{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001959 PyObject *key = NULL, *value = NULL;
1960 _PyUnicodeWriter writer;
1961 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00001962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 i = Py_ReprEnter((PyObject *)mp);
1964 if (i != 0) {
1965 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1966 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001969 Py_ReprLeave((PyObject *)mp);
1970 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 }
Tim Petersa7259592001-06-16 05:11:17 +00001972
Victor Stinnerf91929b2013-11-19 13:07:38 +01001973 _PyUnicodeWriter_Init(&writer);
1974 writer.overallocate = 1;
1975 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
1976 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00001977
Victor Stinnerf91929b2013-11-19 13:07:38 +01001978 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
1979 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 /* Do repr() on each key+value pair, and insert ": " between them.
1982 Note that repr may mutate the dict. */
1983 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001984 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001986 PyObject *s;
1987 int res;
1988
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001989 /* Prevent repr from deleting key or value during key format. */
1990 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02001992
Victor Stinnerf91929b2013-11-19 13:07:38 +01001993 if (!first) {
1994 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
1995 goto error;
1996 }
1997 first = 0;
1998
1999 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01002001 goto error;
2002 res = _PyUnicodeWriter_WriteStr(&writer, s);
2003 Py_DECREF(s);
2004 if (res < 0)
2005 goto error;
2006
2007 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
2008 goto error;
2009
2010 s = PyObject_Repr(value);
2011 if (s == NULL)
2012 goto error;
2013 res = _PyUnicodeWriter_WriteStr(&writer, s);
2014 Py_DECREF(s);
2015 if (res < 0)
2016 goto error;
2017
2018 Py_CLEAR(key);
2019 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 }
Tim Petersa7259592001-06-16 05:11:17 +00002021
Victor Stinnerf91929b2013-11-19 13:07:38 +01002022 writer.overallocate = 0;
2023 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
2024 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00002025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01002027
2028 return _PyUnicodeWriter_Finish(&writer);
2029
2030error:
2031 Py_ReprLeave((PyObject *)mp);
2032 _PyUnicodeWriter_Dealloc(&writer);
2033 Py_XDECREF(key);
2034 Py_XDECREF(value);
2035 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002036}
2037
Martin v. Löwis18e16552006-02-15 17:27:45 +00002038static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002039dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002042}
2043
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002044static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002045dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 PyObject *v;
Victor Stinner742da042016-09-07 17:40:12 -07002048 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002049 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002050 PyObject **value_addr;
2051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002053 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 hash = PyObject_Hash(key);
2055 if (hash == -1)
2056 return NULL;
2057 }
Victor Stinner742da042016-09-07 17:40:12 -07002058 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2059 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002061 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 if (!PyDict_CheckExact(mp)) {
2063 /* Look up __missing__ method if we're a subclass. */
2064 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05002065 _Py_IDENTIFIER(__missing__);
2066 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 if (missing != NULL) {
2068 res = PyObject_CallFunctionObjArgs(missing,
2069 key, NULL);
2070 Py_DECREF(missing);
2071 return res;
2072 }
2073 else if (PyErr_Occurred())
2074 return NULL;
2075 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07002076 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 return NULL;
2078 }
Victor Stinner742da042016-09-07 17:40:12 -07002079 v = *value_addr;
2080 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002082}
2083
2084static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002085dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 if (w == NULL)
2088 return PyDict_DelItem((PyObject *)mp, v);
2089 else
2090 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002091}
2092
Guido van Rossuma9e7a811997-05-13 21:02:11 +00002093static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 (lenfunc)dict_length, /*mp_length*/
2095 (binaryfunc)dict_subscript, /*mp_subscript*/
2096 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002097};
2098
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002099static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002100dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002101{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002102 PyObject *v;
2103 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002104 PyDictKeyEntry *ep;
2105 Py_ssize_t size, n, offset;
2106 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002107
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002108 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 n = mp->ma_used;
2110 v = PyList_New(n);
2111 if (v == NULL)
2112 return NULL;
2113 if (n != mp->ma_used) {
2114 /* Durnit. The allocations caused the dict to resize.
2115 * Just start over, this shouldn't normally happen.
2116 */
2117 Py_DECREF(v);
2118 goto again;
2119 }
Victor Stinner742da042016-09-07 17:40:12 -07002120 ep = DK_ENTRIES(mp->ma_keys);
2121 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002122 if (mp->ma_values) {
2123 value_ptr = mp->ma_values;
2124 offset = sizeof(PyObject *);
2125 }
2126 else {
2127 value_ptr = &ep[0].me_value;
2128 offset = sizeof(PyDictKeyEntry);
2129 }
2130 for (i = 0, j = 0; i < size; i++) {
2131 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 PyObject *key = ep[i].me_key;
2133 Py_INCREF(key);
2134 PyList_SET_ITEM(v, j, key);
2135 j++;
2136 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002137 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 }
2139 assert(j == n);
2140 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002141}
2142
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002143static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002144dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002145{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002146 PyObject *v;
2147 Py_ssize_t i, j;
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002148 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002149 Py_ssize_t size, n, offset;
2150 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002151
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002152 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 n = mp->ma_used;
2154 v = PyList_New(n);
2155 if (v == NULL)
2156 return NULL;
2157 if (n != mp->ma_used) {
2158 /* Durnit. The allocations caused the dict to resize.
2159 * Just start over, this shouldn't normally happen.
2160 */
2161 Py_DECREF(v);
2162 goto again;
2163 }
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002164 ep = DK_ENTRIES(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002165 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002166 if (mp->ma_values) {
2167 value_ptr = mp->ma_values;
2168 offset = sizeof(PyObject *);
2169 }
2170 else {
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002171 value_ptr = &ep[0].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002172 offset = sizeof(PyDictKeyEntry);
2173 }
2174 for (i = 0, j = 0; i < size; i++) {
2175 PyObject *value = *value_ptr;
2176 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2177 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 Py_INCREF(value);
2179 PyList_SET_ITEM(v, j, value);
2180 j++;
2181 }
2182 }
2183 assert(j == n);
2184 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002185}
2186
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002187static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002188dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002189{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002190 PyObject *v;
2191 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002192 Py_ssize_t size, offset;
2193 PyObject *item, *key;
2194 PyDictKeyEntry *ep;
2195 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 /* Preallocate the list of tuples, to avoid allocations during
2198 * the loop over the items, which could trigger GC, which
2199 * could resize the dict. :-(
2200 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002201 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 n = mp->ma_used;
2203 v = PyList_New(n);
2204 if (v == NULL)
2205 return NULL;
2206 for (i = 0; i < n; i++) {
2207 item = PyTuple_New(2);
2208 if (item == NULL) {
2209 Py_DECREF(v);
2210 return NULL;
2211 }
2212 PyList_SET_ITEM(v, i, item);
2213 }
2214 if (n != mp->ma_used) {
2215 /* Durnit. The allocations caused the dict to resize.
2216 * Just start over, this shouldn't normally happen.
2217 */
2218 Py_DECREF(v);
2219 goto again;
2220 }
2221 /* Nothing we do below makes any function calls. */
Victor Stinner742da042016-09-07 17:40:12 -07002222 ep = DK_ENTRIES(mp->ma_keys);
2223 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002224 if (mp->ma_values) {
2225 value_ptr = mp->ma_values;
2226 offset = sizeof(PyObject *);
2227 }
2228 else {
2229 value_ptr = &ep[0].me_value;
2230 offset = sizeof(PyDictKeyEntry);
2231 }
2232 for (i = 0, j = 0; i < size; i++) {
2233 PyObject *value = *value_ptr;
2234 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2235 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 key = ep[i].me_key;
2237 item = PyList_GET_ITEM(v, j);
2238 Py_INCREF(key);
2239 PyTuple_SET_ITEM(item, 0, key);
2240 Py_INCREF(value);
2241 PyTuple_SET_ITEM(item, 1, value);
2242 j++;
2243 }
2244 }
2245 assert(j == n);
2246 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002247}
2248
Larry Hastings5c661892014-01-24 06:17:25 -08002249/*[clinic input]
2250@classmethod
2251dict.fromkeys
Larry Hastings5c661892014-01-24 06:17:25 -08002252 iterable: object
2253 value: object=None
2254 /
2255
2256Returns a new dict with keys from iterable and values equal to value.
2257[clinic start generated code]*/
2258
Larry Hastings5c661892014-01-24 06:17:25 -08002259static PyObject *
2260dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002261/*[clinic end generated code: output=8fb98e4b10384999 input=b85a667f9bf4669d]*/
Larry Hastings5c661892014-01-24 06:17:25 -08002262{
Eric Snow96c6af92015-05-29 22:21:39 -06002263 return _PyDict_FromKeys((PyObject *)type, iterable, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002264}
2265
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002266static int
Victor Stinner742da042016-09-07 17:40:12 -07002267dict_update_common(PyObject *self, PyObject *args, PyObject *kwds,
2268 const char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 PyObject *arg = NULL;
2271 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
2274 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002277 _Py_IDENTIFIER(keys);
2278 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 result = PyDict_Merge(self, arg, 1);
2280 else
2281 result = PyDict_MergeFromSeq2(self, arg, 1);
2282 }
2283 if (result == 0 && kwds != NULL) {
2284 if (PyArg_ValidateKeywordArguments(kwds))
2285 result = PyDict_Merge(self, kwds, 1);
2286 else
2287 result = -1;
2288 }
2289 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002290}
2291
2292static PyObject *
2293dict_update(PyObject *self, PyObject *args, PyObject *kwds)
2294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 if (dict_update_common(self, args, kwds, "update") != -1)
2296 Py_RETURN_NONE;
2297 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002298}
2299
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002300/* Update unconditionally replaces existing items.
2301 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00002302 otherwise it leaves existing items unchanged.
2303
2304 PyDict_{Update,Merge} update/merge from a mapping object.
2305
Tim Petersf582b822001-12-11 18:51:08 +00002306 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00002307 producing iterable objects of length 2.
2308*/
2309
Tim Petersf582b822001-12-11 18:51:08 +00002310int
Tim Peters1fc240e2001-10-26 05:06:50 +00002311PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
2312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002313 PyObject *it; /* iter(seq2) */
2314 Py_ssize_t i; /* index into seq2 of current element */
2315 PyObject *item; /* seq2[i] */
2316 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00002317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 assert(d != NULL);
2319 assert(PyDict_Check(d));
2320 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00002321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 it = PyObject_GetIter(seq2);
2323 if (it == NULL)
2324 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 for (i = 0; ; ++i) {
2327 PyObject *key, *value;
2328 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00002329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 fast = NULL;
2331 item = PyIter_Next(it);
2332 if (item == NULL) {
2333 if (PyErr_Occurred())
2334 goto Fail;
2335 break;
2336 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 /* Convert item to sequence, and verify length 2. */
2339 fast = PySequence_Fast(item, "");
2340 if (fast == NULL) {
2341 if (PyErr_ExceptionMatches(PyExc_TypeError))
2342 PyErr_Format(PyExc_TypeError,
2343 "cannot convert dictionary update "
2344 "sequence element #%zd to a sequence",
2345 i);
2346 goto Fail;
2347 }
2348 n = PySequence_Fast_GET_SIZE(fast);
2349 if (n != 2) {
2350 PyErr_Format(PyExc_ValueError,
2351 "dictionary update sequence element #%zd "
2352 "has length %zd; 2 is required",
2353 i, n);
2354 goto Fail;
2355 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 /* Update/merge with this (key, value) pair. */
2358 key = PySequence_Fast_GET_ITEM(fast, 0);
2359 value = PySequence_Fast_GET_ITEM(fast, 1);
2360 if (override || PyDict_GetItem(d, key) == NULL) {
2361 int status = PyDict_SetItem(d, key, value);
2362 if (status < 0)
2363 goto Fail;
2364 }
2365 Py_DECREF(fast);
2366 Py_DECREF(item);
2367 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 i = 0;
Victor Stinner611b0fa2016-09-14 15:02:01 +02002370 assert(_PyDict_CheckConsistency((PyDictObject *)d));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00002372Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 Py_XDECREF(item);
2374 Py_XDECREF(fast);
2375 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002376Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 Py_DECREF(it);
2378 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00002379}
2380
doko@ubuntu.comde69ee72016-10-11 08:04:02 +02002381static int
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002382dict_merge(PyObject *a, PyObject *b, int override)
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002383{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002384 PyDictObject *mp, *other;
2385 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -07002386 PyDictKeyEntry *entry, *ep0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002387
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002388 assert(0 <= override && override <= 2);
2389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 /* We accept for the argument either a concrete dictionary object,
2391 * or an abstract "mapping" object. For the former, we can do
2392 * things quite efficiently. For the latter, we only require that
2393 * PyMapping_Keys() and PyObject_GetItem() be supported.
2394 */
2395 if (a == NULL || !PyDict_Check(a) || b == NULL) {
2396 PyErr_BadInternalCall();
2397 return -1;
2398 }
2399 mp = (PyDictObject*)a;
2400 if (PyDict_Check(b)) {
2401 other = (PyDictObject*)b;
2402 if (other == mp || other->ma_used == 0)
2403 /* a.update(a) or a.update({}); nothing to do */
2404 return 0;
2405 if (mp->ma_used == 0)
2406 /* Since the target dict is empty, PyDict_GetItem()
2407 * always returns NULL. Setting override to 1
2408 * skips the unnecessary test.
2409 */
2410 override = 1;
2411 /* Do one big resize at the start, rather than
2412 * incrementally resizing as we insert new items. Expect
2413 * that there will be no (or few) overlapping keys.
2414 */
INADA Naokib1152be2016-10-27 19:26:50 +09002415 if (USABLE_FRACTION(mp->ma_keys->dk_size) < other->ma_used) {
2416 if (dictresize(mp, ESTIMATE_SIZE(mp->ma_used + other->ma_used))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 return -1;
INADA Naokib1152be2016-10-27 19:26:50 +09002418 }
2419 }
Victor Stinner742da042016-09-07 17:40:12 -07002420 ep0 = DK_ENTRIES(other->ma_keys);
2421 for (i = 0, n = other->ma_keys->dk_nentries; i < n; i++) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002422 PyObject *key, *value;
2423 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002424 entry = &ep0[i];
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002425 key = entry->me_key;
2426 hash = entry->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002427 if (other->ma_values)
2428 value = other->ma_values[i];
2429 else
2430 value = entry->me_value;
2431
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002432 if (value != NULL) {
2433 int err = 0;
2434 Py_INCREF(key);
2435 Py_INCREF(value);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002436 if (override == 1)
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002437 err = insertdict(mp, key, hash, value);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002438 else if (_PyDict_GetItem_KnownHash(a, key, hash) == NULL) {
2439 if (PyErr_Occurred()) {
2440 Py_DECREF(value);
2441 Py_DECREF(key);
2442 return -1;
2443 }
2444 err = insertdict(mp, key, hash, value);
2445 }
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002446 else if (override != 0) {
2447 _PyErr_SetKeyError(key);
2448 Py_DECREF(value);
2449 Py_DECREF(key);
2450 return -1;
2451 }
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002452 Py_DECREF(value);
2453 Py_DECREF(key);
2454 if (err != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 return -1;
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002456
Victor Stinner742da042016-09-07 17:40:12 -07002457 if (n != other->ma_keys->dk_nentries) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002458 PyErr_SetString(PyExc_RuntimeError,
2459 "dict mutated during update");
2460 return -1;
2461 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 }
2463 }
2464 }
2465 else {
2466 /* Do it the generic, slower way */
2467 PyObject *keys = PyMapping_Keys(b);
2468 PyObject *iter;
2469 PyObject *key, *value;
2470 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 if (keys == NULL)
2473 /* Docstring says this is equivalent to E.keys() so
2474 * if E doesn't have a .keys() method we want
2475 * AttributeError to percolate up. Might as well
2476 * do the same for any other error.
2477 */
2478 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 iter = PyObject_GetIter(keys);
2481 Py_DECREF(keys);
2482 if (iter == NULL)
2483 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002486 if (override != 1 && PyDict_GetItem(a, key) != NULL) {
2487 if (override != 0) {
2488 _PyErr_SetKeyError(key);
2489 Py_DECREF(key);
2490 Py_DECREF(iter);
2491 return -1;
2492 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 Py_DECREF(key);
2494 continue;
2495 }
2496 value = PyObject_GetItem(b, key);
2497 if (value == NULL) {
2498 Py_DECREF(iter);
2499 Py_DECREF(key);
2500 return -1;
2501 }
2502 status = PyDict_SetItem(a, key, value);
2503 Py_DECREF(key);
2504 Py_DECREF(value);
2505 if (status < 0) {
2506 Py_DECREF(iter);
2507 return -1;
2508 }
2509 }
2510 Py_DECREF(iter);
2511 if (PyErr_Occurred())
2512 /* Iterator completed, via error */
2513 return -1;
2514 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02002515 assert(_PyDict_CheckConsistency((PyDictObject *)a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002517}
2518
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002519int
2520PyDict_Update(PyObject *a, PyObject *b)
2521{
2522 return dict_merge(a, b, 1);
2523}
2524
2525int
2526PyDict_Merge(PyObject *a, PyObject *b, int override)
2527{
2528 /* XXX Deprecate override not in (0, 1). */
2529 return dict_merge(a, b, override != 0);
2530}
2531
2532int
2533_PyDict_MergeEx(PyObject *a, PyObject *b, int override)
2534{
2535 return dict_merge(a, b, override);
2536}
2537
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002538static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002539dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002542}
2543
2544PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002545PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002547 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002548 PyDictObject *mp;
2549 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 if (o == NULL || !PyDict_Check(o)) {
2552 PyErr_BadInternalCall();
2553 return NULL;
2554 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002555 mp = (PyDictObject *)o;
2556 if (_PyDict_HasSplitTable(mp)) {
2557 PyDictObject *split_copy;
Victor Stinner742da042016-09-07 17:40:12 -07002558 Py_ssize_t size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
2559 PyObject **newvalues;
2560 newvalues = new_values(size);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002561 if (newvalues == NULL)
2562 return PyErr_NoMemory();
2563 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2564 if (split_copy == NULL) {
2565 free_values(newvalues);
2566 return NULL;
2567 }
2568 split_copy->ma_values = newvalues;
2569 split_copy->ma_keys = mp->ma_keys;
2570 split_copy->ma_used = mp->ma_used;
2571 DK_INCREF(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002572 for (i = 0, n = size; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002573 PyObject *value = mp->ma_values[i];
2574 Py_XINCREF(value);
2575 split_copy->ma_values[i] = value;
2576 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002577 if (_PyObject_GC_IS_TRACKED(mp))
2578 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002579 return (PyObject *)split_copy;
2580 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 copy = PyDict_New();
2582 if (copy == NULL)
2583 return NULL;
2584 if (PyDict_Merge(copy, o, 1) == 0)
2585 return copy;
2586 Py_DECREF(copy);
2587 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002588}
2589
Martin v. Löwis18e16552006-02-15 17:27:45 +00002590Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002591PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 if (mp == NULL || !PyDict_Check(mp)) {
2594 PyErr_BadInternalCall();
2595 return -1;
2596 }
2597 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002598}
2599
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002600PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002601PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 if (mp == NULL || !PyDict_Check(mp)) {
2604 PyErr_BadInternalCall();
2605 return NULL;
2606 }
2607 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002608}
2609
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002610PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002611PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 if (mp == NULL || !PyDict_Check(mp)) {
2614 PyErr_BadInternalCall();
2615 return NULL;
2616 }
2617 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002618}
2619
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002620PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002621PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002622{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 if (mp == NULL || !PyDict_Check(mp)) {
2624 PyErr_BadInternalCall();
2625 return NULL;
2626 }
2627 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002628}
2629
Tim Peterse63415e2001-05-08 04:38:29 +00002630/* Return 1 if dicts equal, 0 if not, -1 if error.
2631 * Gets out as soon as any difference is detected.
2632 * Uses only Py_EQ comparison.
2633 */
2634static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002635dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002637 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 if (a->ma_used != b->ma_used)
2640 /* can't be equal if # of entries differ */
2641 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Victor Stinner742da042016-09-07 17:40:12 -07002643 for (i = 0; i < a->ma_keys->dk_nentries; i++) {
2644 PyDictKeyEntry *ep = &DK_ENTRIES(a->ma_keys)[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002645 PyObject *aval;
2646 if (a->ma_values)
2647 aval = a->ma_values[i];
2648 else
2649 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 if (aval != NULL) {
2651 int cmp;
2652 PyObject *bval;
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002653 PyObject **vaddr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002654 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 /* temporarily bump aval's refcount to ensure it stays
2656 alive until we're done with it */
2657 Py_INCREF(aval);
2658 /* ditto for key */
2659 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002660 /* reuse the known hash value */
Victor Stinner742da042016-09-07 17:40:12 -07002661 if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr, NULL) < 0)
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002662 bval = NULL;
2663 else
2664 bval = *vaddr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 Py_DECREF(key);
2666 if (bval == NULL) {
2667 Py_DECREF(aval);
2668 if (PyErr_Occurred())
2669 return -1;
2670 return 0;
2671 }
2672 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2673 Py_DECREF(aval);
2674 if (cmp <= 0) /* error or not equal */
2675 return cmp;
2676 }
2677 }
2678 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002679}
Tim Peterse63415e2001-05-08 04:38:29 +00002680
2681static PyObject *
2682dict_richcompare(PyObject *v, PyObject *w, int op)
2683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 int cmp;
2685 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2688 res = Py_NotImplemented;
2689 }
2690 else if (op == Py_EQ || op == Py_NE) {
2691 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2692 if (cmp < 0)
2693 return NULL;
2694 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2695 }
2696 else
2697 res = Py_NotImplemented;
2698 Py_INCREF(res);
2699 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002700}
Tim Peterse63415e2001-05-08 04:38:29 +00002701
Larry Hastings61272b72014-01-07 12:41:53 -08002702/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07002703
2704@coexist
2705dict.__contains__
2706
2707 key: object
2708 /
2709
Meador Ingee02de8c2014-01-14 16:48:31 -06002710True if D has a key k, else False.
Larry Hastings61272b72014-01-07 12:41:53 -08002711[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07002712
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002713static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08002714dict___contains__(PyDictObject *self, PyObject *key)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002715/*[clinic end generated code: output=a3d03db709ed6e6b input=b852b2a19b51ab24]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002716{
Larry Hastingsc2047262014-01-25 20:43:29 -08002717 register PyDictObject *mp = self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002718 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002719 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002720 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002723 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 hash = PyObject_Hash(key);
2725 if (hash == -1)
2726 return NULL;
2727 }
Victor Stinner742da042016-09-07 17:40:12 -07002728 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2729 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002731 if (ix == DKIX_EMPTY || *value_addr == NULL)
2732 Py_RETURN_FALSE;
2733 Py_RETURN_TRUE;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002734}
2735
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002736static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002737dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002738{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 PyObject *key;
2740 PyObject *failobj = Py_None;
2741 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002742 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002743 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002744 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2747 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002750 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 hash = PyObject_Hash(key);
2752 if (hash == -1)
2753 return NULL;
2754 }
Victor Stinner742da042016-09-07 17:40:12 -07002755 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2756 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002758 if (ix == DKIX_EMPTY || *value_addr == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 val = failobj;
Victor Stinner742da042016-09-07 17:40:12 -07002760 else
2761 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 Py_INCREF(val);
2763 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002764}
2765
Benjamin Peterson00e98862013-03-07 22:16:29 -05002766PyObject *
2767PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002768{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002769 PyDictObject *mp = (PyDictObject *)d;
INADA Naoki93f26f72016-11-02 18:45:16 +09002770 PyObject *value;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002771 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002772 Py_ssize_t hashpos, ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002773 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002774
Benjamin Peterson00e98862013-03-07 22:16:29 -05002775 if (!PyDict_Check(d)) {
2776 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002778 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002781 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 hash = PyObject_Hash(key);
2783 if (hash == -1)
2784 return NULL;
2785 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002786
2787 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
2788 if (insertion_resize(mp) < 0)
2789 return NULL;
2790 }
2791
Victor Stinner742da042016-09-07 17:40:12 -07002792 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
2793 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 return NULL;
INADA Naoki93f26f72016-11-02 18:45:16 +09002795
2796 if (_PyDict_HasSplitTable(mp) &&
2797 ((ix >= 0 && *value_addr == NULL && mp->ma_used != ix) ||
2798 (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {
2799 if (insertion_resize(mp) < 0) {
2800 return NULL;
2801 }
2802 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
2803 ix = DKIX_EMPTY;
2804 }
2805
2806 if (ix == DKIX_EMPTY) {
2807 PyDictKeyEntry *ep, *ep0;
2808 value = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002809 if (mp->ma_keys->dk_usable <= 0) {
Victor Stinner3c336c52016-09-12 14:17:40 +02002810 if (insertion_resize(mp) < 0) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002811 return NULL;
Victor Stinner3c336c52016-09-12 14:17:40 +02002812 }
Victor Stinner742da042016-09-07 17:40:12 -07002813 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002814 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002815 ep0 = DK_ENTRIES(mp->ma_keys);
2816 ep = &ep0[mp->ma_keys->dk_nentries];
2817 dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002818 Py_INCREF(key);
INADA Naoki93f26f72016-11-02 18:45:16 +09002819 Py_INCREF(value);
2820 MAINTAIN_TRACKING(mp, key, value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002821 ep->me_key = key;
2822 ep->me_hash = hash;
Victor Stinner742da042016-09-07 17:40:12 -07002823 if (mp->ma_values) {
INADA Naoki93f26f72016-11-02 18:45:16 +09002824 assert(mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
2825 mp->ma_values[mp->ma_keys->dk_nentries] = value;
Victor Stinner742da042016-09-07 17:40:12 -07002826 }
2827 else {
INADA Naoki93f26f72016-11-02 18:45:16 +09002828 ep->me_value = value;
Victor Stinner742da042016-09-07 17:40:12 -07002829 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002830 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002831 mp->ma_version_tag = DICT_NEXT_VERSION();
INADA Naoki93f26f72016-11-02 18:45:16 +09002832 mp->ma_keys->dk_usable--;
2833 mp->ma_keys->dk_nentries++;
2834 assert(mp->ma_keys->dk_usable >= 0);
2835 }
2836 else if (*value_addr == NULL) {
2837 value = defaultobj;
2838 assert(_PyDict_HasSplitTable(mp));
2839 assert(ix == mp->ma_used);
2840 Py_INCREF(value);
2841 MAINTAIN_TRACKING(mp, key, value);
2842 *value_addr = value;
2843 mp->ma_used++;
2844 mp->ma_version_tag = DICT_NEXT_VERSION();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02002846 else {
INADA Naoki93f26f72016-11-02 18:45:16 +09002847 value = *value_addr;
Victor Stinner611b0fa2016-09-14 15:02:01 +02002848 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002849
2850 assert(_PyDict_CheckConsistency(mp));
2851 return value;
Guido van Rossum164452c2000-08-08 16:12:54 +00002852}
2853
Benjamin Peterson00e98862013-03-07 22:16:29 -05002854static PyObject *
2855dict_setdefault(PyDictObject *mp, PyObject *args)
2856{
2857 PyObject *key, *val;
2858 PyObject *defaultobj = Py_None;
2859
2860 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2861 return NULL;
2862
Benjamin Peterson55898502013-03-08 08:36:49 -05002863 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002864 Py_XINCREF(val);
2865 return val;
2866}
Guido van Rossum164452c2000-08-08 16:12:54 +00002867
2868static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002869dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002870{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002871 PyDict_Clear((PyObject *)mp);
2872 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002873}
2874
Guido van Rossumba6ab842000-12-12 22:02:18 +00002875static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002876dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002877{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00002879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2881 return NULL;
Eric Snow96c6af92015-05-29 22:21:39 -06002882
Yury Selivanov684ef2c2016-10-28 19:01:21 -04002883 return _PyDict_Pop((PyObject*)mp, key, deflt);
Guido van Rossume027d982002-04-12 15:11:59 +00002884}
2885
2886static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002887dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002888{
Victor Stinner742da042016-09-07 17:40:12 -07002889 Py_ssize_t i, j;
2890 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 /* Allocate the result tuple before checking the size. Believe it
2894 * or not, this allocation could trigger a garbage collection which
2895 * could empty the dict, so if we checked the size first and that
2896 * happened, the result would be an infinite loop (searching for an
2897 * entry that no longer exists). Note that the usual popitem()
2898 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2899 * tuple away if the dict *is* empty isn't a significant
2900 * inefficiency -- possible, but unlikely in practice.
2901 */
2902 res = PyTuple_New(2);
2903 if (res == NULL)
2904 return NULL;
2905 if (mp->ma_used == 0) {
2906 Py_DECREF(res);
2907 PyErr_SetString(PyExc_KeyError,
2908 "popitem(): dictionary is empty");
2909 return NULL;
2910 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002911 /* Convert split table to combined table */
2912 if (mp->ma_keys->dk_lookup == lookdict_split) {
2913 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2914 Py_DECREF(res);
2915 return NULL;
2916 }
2917 }
2918 ENSURE_ALLOWS_DELETIONS(mp);
Victor Stinner742da042016-09-07 17:40:12 -07002919
2920 /* Pop last item */
2921 ep0 = DK_ENTRIES(mp->ma_keys);
2922 i = mp->ma_keys->dk_nentries - 1;
2923 while (i >= 0 && ep0[i].me_value == NULL) {
2924 i--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925 }
Victor Stinner742da042016-09-07 17:40:12 -07002926 assert(i >= 0);
2927
2928 ep = &ep0[i];
2929 j = lookdict_index(mp->ma_keys, ep->me_hash, i);
2930 assert(j >= 0);
2931 assert(dk_get_index(mp->ma_keys, j) == i);
2932 dk_set_index(mp->ma_keys, j, DKIX_DUMMY);
2933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 PyTuple_SET_ITEM(res, 0, ep->me_key);
2935 PyTuple_SET_ITEM(res, 1, ep->me_value);
Victor Stinner742da042016-09-07 17:40:12 -07002936 ep->me_key = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937 ep->me_value = NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002938 /* We can't dk_usable++ since there is DKIX_DUMMY in indices */
2939 mp->ma_keys->dk_nentries = i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002940 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002941 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02002942 assert(_PyDict_CheckConsistency(mp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002944}
2945
Jeremy Hylton8caad492000-06-23 14:18:11 +00002946static int
2947dict_traverse(PyObject *op, visitproc visit, void *arg)
2948{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002949 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson55f44522016-09-05 12:12:59 -07002950 PyDictKeysObject *keys = mp->ma_keys;
Serhiy Storchaka46825d22016-09-26 21:29:34 +03002951 PyDictKeyEntry *entries = DK_ENTRIES(keys);
Victor Stinner742da042016-09-07 17:40:12 -07002952 Py_ssize_t i, n = keys->dk_nentries;
2953
Benjamin Peterson55f44522016-09-05 12:12:59 -07002954 if (keys->dk_lookup == lookdict) {
2955 for (i = 0; i < n; i++) {
2956 if (entries[i].me_value != NULL) {
2957 Py_VISIT(entries[i].me_value);
2958 Py_VISIT(entries[i].me_key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002959 }
2960 }
Victor Stinner742da042016-09-07 17:40:12 -07002961 }
2962 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002963 if (mp->ma_values != NULL) {
Benjamin Peterson55f44522016-09-05 12:12:59 -07002964 for (i = 0; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002965 Py_VISIT(mp->ma_values[i]);
2966 }
2967 }
2968 else {
Benjamin Peterson55f44522016-09-05 12:12:59 -07002969 for (i = 0; i < n; i++) {
2970 Py_VISIT(entries[i].me_value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002971 }
2972 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002973 }
2974 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002975}
2976
2977static int
2978dict_tp_clear(PyObject *op)
2979{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002980 PyDict_Clear(op);
2981 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002982}
2983
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002984static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002985
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002986Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06002987_PyDict_SizeOf(PyDictObject *mp)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002988{
Victor Stinner742da042016-09-07 17:40:12 -07002989 Py_ssize_t size, usable, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002990
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002991 size = DK_SIZE(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002992 usable = USABLE_FRACTION(size);
2993
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002994 res = _PyObject_SIZE(Py_TYPE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002995 if (mp->ma_values)
Victor Stinner742da042016-09-07 17:40:12 -07002996 res += usable * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002997 /* If the dictionary is split, the keys portion is accounted-for
2998 in the type object. */
2999 if (mp->ma_keys->dk_refcnt == 1)
Victor Stinner98ee9d52016-09-08 09:33:56 -07003000 res += (sizeof(PyDictKeysObject)
3001 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
3002 + DK_IXSIZE(mp->ma_keys) * size
3003 + sizeof(PyDictKeyEntry) * usable);
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003004 return res;
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02003005}
3006
3007Py_ssize_t
3008_PyDict_KeysSize(PyDictKeysObject *keys)
3009{
Victor Stinner98ee9d52016-09-08 09:33:56 -07003010 return (sizeof(PyDictKeysObject)
3011 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
3012 + DK_IXSIZE(keys) * DK_SIZE(keys)
3013 + USABLE_FRACTION(DK_SIZE(keys)) * sizeof(PyDictKeyEntry));
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003014}
3015
doko@ubuntu.com17210f52016-01-14 14:04:59 +01003016static PyObject *
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003017dict_sizeof(PyDictObject *mp)
3018{
3019 return PyLong_FromSsize_t(_PyDict_SizeOf(mp));
3020}
3021
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00003022PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
3023
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003024PyDoc_STRVAR(sizeof__doc__,
3025"D.__sizeof__() -> size of D in memory, in bytes");
3026
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003027PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00003028"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003030PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00003031"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 +00003032
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003033PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00003034"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00003035If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00003036
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003037PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00003038"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000030392-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003040
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003041PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04003042"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
3043If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
3044If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
3045In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00003046
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003047PyDoc_STRVAR(clear__doc__,
3048"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003049
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003050PyDoc_STRVAR(copy__doc__,
3051"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00003052
Guido van Rossumb90c8482007-02-10 01:11:45 +00003053/* Forward */
3054static PyObject *dictkeys_new(PyObject *);
3055static PyObject *dictitems_new(PyObject *);
3056static PyObject *dictvalues_new(PyObject *);
3057
Guido van Rossum45c85d12007-07-27 16:31:40 +00003058PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003059 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00003060PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00003062PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00003064
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003065static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07003066 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
3068 getitem__doc__},
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003069 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 sizeof__doc__},
3071 {"get", (PyCFunction)dict_get, METH_VARARGS,
3072 get__doc__},
3073 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
3074 setdefault_doc__},
3075 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
3076 pop__doc__},
3077 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
3078 popitem__doc__},
3079 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
3080 keys__doc__},
3081 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
3082 items__doc__},
3083 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
3084 values__doc__},
3085 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
3086 update__doc__},
Larry Hastings5c661892014-01-24 06:17:25 -08003087 DICT_FROMKEYS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003088 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
3089 clear__doc__},
3090 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
3091 copy__doc__},
3092 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003093};
3094
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003095/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00003096int
3097PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003098{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00003099 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07003100 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003101 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003102 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003105 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 hash = PyObject_Hash(key);
3107 if (hash == -1)
3108 return -1;
3109 }
Victor Stinner742da042016-09-07 17:40:12 -07003110 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
3111 if (ix == DKIX_ERROR)
3112 return -1;
3113 return (ix != DKIX_EMPTY && *value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003114}
3115
Thomas Wouterscf297e42007-02-23 15:07:44 +00003116/* Internal version of PyDict_Contains used when the hash value is already known */
3117int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00003118_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00003119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003121 PyObject **value_addr;
Victor Stinner742da042016-09-07 17:40:12 -07003122 Py_ssize_t ix;
Thomas Wouterscf297e42007-02-23 15:07:44 +00003123
Victor Stinner742da042016-09-07 17:40:12 -07003124 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
3125 if (ix == DKIX_ERROR)
3126 return -1;
3127 return (ix != DKIX_EMPTY && *value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00003128}
3129
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003130/* Hack to implement "key in dict" */
3131static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 0, /* sq_length */
3133 0, /* sq_concat */
3134 0, /* sq_repeat */
3135 0, /* sq_item */
3136 0, /* sq_slice */
3137 0, /* sq_ass_item */
3138 0, /* sq_ass_slice */
3139 PyDict_Contains, /* sq_contains */
3140 0, /* sq_inplace_concat */
3141 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003142};
3143
Guido van Rossum09e563a2001-05-01 12:10:21 +00003144static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003145dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003148 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003150 assert(type != NULL && type->tp_alloc != NULL);
3151 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02003152 if (self == NULL)
3153 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003154 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003155
Victor Stinnera9f61a52013-07-16 22:17:26 +02003156 /* The object has been implicitly tracked by tp_alloc */
3157 if (type == &PyDict_Type)
3158 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003159
3160 d->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07003161 d->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07003162 d->ma_keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003163 if (d->ma_keys == NULL) {
3164 Py_DECREF(self);
3165 return NULL;
3166 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02003167 assert(_PyDict_CheckConsistency(d));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003169}
3170
Tim Peters25786c02001-09-02 08:22:48 +00003171static int
3172dict_init(PyObject *self, PyObject *args, PyObject *kwds)
3173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00003175}
3176
Tim Peters6d6c1a32001-08-02 04:15:00 +00003177static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003178dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00003179{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00003181}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003182
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003183PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00003184"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00003185"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003186" (key, value) pairs\n"
3187"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00003188" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003189" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00003190" d[k] = v\n"
3191"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
3192" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00003193
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003194PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3196 "dict",
3197 sizeof(PyDictObject),
3198 0,
3199 (destructor)dict_dealloc, /* tp_dealloc */
3200 0, /* tp_print */
3201 0, /* tp_getattr */
3202 0, /* tp_setattr */
3203 0, /* tp_reserved */
3204 (reprfunc)dict_repr, /* tp_repr */
3205 0, /* tp_as_number */
3206 &dict_as_sequence, /* tp_as_sequence */
3207 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00003208 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 0, /* tp_call */
3210 0, /* tp_str */
3211 PyObject_GenericGetAttr, /* tp_getattro */
3212 0, /* tp_setattro */
3213 0, /* tp_as_buffer */
3214 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3215 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
3216 dictionary_doc, /* tp_doc */
3217 dict_traverse, /* tp_traverse */
3218 dict_tp_clear, /* tp_clear */
3219 dict_richcompare, /* tp_richcompare */
3220 0, /* tp_weaklistoffset */
3221 (getiterfunc)dict_iter, /* tp_iter */
3222 0, /* tp_iternext */
3223 mapp_methods, /* tp_methods */
3224 0, /* tp_members */
3225 0, /* tp_getset */
3226 0, /* tp_base */
3227 0, /* tp_dict */
3228 0, /* tp_descr_get */
3229 0, /* tp_descr_set */
3230 0, /* tp_dictoffset */
3231 dict_init, /* tp_init */
3232 PyType_GenericAlloc, /* tp_alloc */
3233 dict_new, /* tp_new */
3234 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003235};
3236
Victor Stinner3c1e4812012-03-26 22:10:51 +02003237PyObject *
3238_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
3239{
3240 PyObject *kv;
3241 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02003242 if (kv == NULL) {
3243 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003244 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02003245 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02003246 return PyDict_GetItem(dp, kv);
3247}
3248
Guido van Rossum3cca2451997-05-16 14:23:33 +00003249/* For backward compatibility with old dictionary interface */
3250
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003251PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003252PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 PyObject *kv, *rv;
3255 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003256 if (kv == NULL) {
3257 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003258 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003259 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 rv = PyDict_GetItem(v, kv);
3261 Py_DECREF(kv);
3262 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003263}
3264
3265int
Victor Stinner3c1e4812012-03-26 22:10:51 +02003266_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
3267{
3268 PyObject *kv;
3269 kv = _PyUnicode_FromId(key); /* borrowed */
3270 if (kv == NULL)
3271 return -1;
3272 return PyDict_SetItem(v, kv, item);
3273}
3274
3275int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003276PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 PyObject *kv;
3279 int err;
3280 kv = PyUnicode_FromString(key);
3281 if (kv == NULL)
3282 return -1;
3283 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
3284 err = PyDict_SetItem(v, kv, item);
3285 Py_DECREF(kv);
3286 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003287}
3288
3289int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01003290_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
3291{
3292 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
3293 if (kv == NULL)
3294 return -1;
3295 return PyDict_DelItem(v, kv);
3296}
3297
3298int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003299PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 PyObject *kv;
3302 int err;
3303 kv = PyUnicode_FromString(key);
3304 if (kv == NULL)
3305 return -1;
3306 err = PyDict_DelItem(v, kv);
3307 Py_DECREF(kv);
3308 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003309}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003310
Raymond Hettinger019a1482004-03-18 02:41:19 +00003311/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003312
3313typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 PyObject_HEAD
3315 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
3316 Py_ssize_t di_used;
3317 Py_ssize_t di_pos;
3318 PyObject* di_result; /* reusable result tuple for iteritems */
3319 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003320} dictiterobject;
3321
3322static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003323dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 dictiterobject *di;
3326 di = PyObject_GC_New(dictiterobject, itertype);
3327 if (di == NULL)
3328 return NULL;
3329 Py_INCREF(dict);
3330 di->di_dict = dict;
3331 di->di_used = dict->ma_used;
3332 di->di_pos = 0;
3333 di->len = dict->ma_used;
3334 if (itertype == &PyDictIterItem_Type) {
3335 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
3336 if (di->di_result == NULL) {
3337 Py_DECREF(di);
3338 return NULL;
3339 }
3340 }
3341 else
3342 di->di_result = NULL;
3343 _PyObject_GC_TRACK(di);
3344 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003345}
3346
3347static void
3348dictiter_dealloc(dictiterobject *di)
3349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 Py_XDECREF(di->di_dict);
3351 Py_XDECREF(di->di_result);
3352 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003353}
3354
3355static int
3356dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
3357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 Py_VISIT(di->di_dict);
3359 Py_VISIT(di->di_result);
3360 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003361}
3362
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003363static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003364dictiter_len(dictiterobject *di)
3365{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003366 Py_ssize_t len = 0;
3367 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
3368 len = di->len;
3369 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003370}
3371
Guido van Rossumb90c8482007-02-10 01:11:45 +00003372PyDoc_STRVAR(length_hint_doc,
3373 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003374
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003375static PyObject *
3376dictiter_reduce(dictiterobject *di);
3377
3378PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3379
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003380static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003381 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
3382 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003383 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
3384 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003385 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003386};
3387
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003388static PyObject*
3389dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00003390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 PyObject *key;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003392 Py_ssize_t i, n;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003393 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00003395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 if (d == NULL)
3397 return NULL;
3398 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00003399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 if (di->di_used != d->ma_used) {
3401 PyErr_SetString(PyExc_RuntimeError,
3402 "dictionary changed size during iteration");
3403 di->di_used = -1; /* Make this state sticky */
3404 return NULL;
3405 }
Guido van Rossum2147df72002-07-16 20:30:22 +00003406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003407 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003408 k = d->ma_keys;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003409 n = k->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003410 if (d->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003411 PyObject **value_ptr = &d->ma_values[i];
3412 while (i < n && *value_ptr == NULL) {
3413 value_ptr++;
3414 i++;
3415 }
3416 if (i >= n)
3417 goto fail;
3418 key = DK_ENTRIES(k)[i].me_key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003419 }
3420 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003421 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(k)[i];
3422 while (i < n && entry_ptr->me_value == NULL) {
3423 entry_ptr++;
3424 i++;
3425 }
3426 if (i >= n)
3427 goto fail;
3428 key = entry_ptr->me_key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003429 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 di->di_pos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003431 di->len--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003432 Py_INCREF(key);
3433 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003434
3435fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003436 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003437 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003439}
3440
Raymond Hettinger019a1482004-03-18 02:41:19 +00003441PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003442 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3443 "dict_keyiterator", /* tp_name */
3444 sizeof(dictiterobject), /* tp_basicsize */
3445 0, /* tp_itemsize */
3446 /* methods */
3447 (destructor)dictiter_dealloc, /* tp_dealloc */
3448 0, /* tp_print */
3449 0, /* tp_getattr */
3450 0, /* tp_setattr */
3451 0, /* tp_reserved */
3452 0, /* tp_repr */
3453 0, /* tp_as_number */
3454 0, /* tp_as_sequence */
3455 0, /* tp_as_mapping */
3456 0, /* tp_hash */
3457 0, /* tp_call */
3458 0, /* tp_str */
3459 PyObject_GenericGetAttr, /* tp_getattro */
3460 0, /* tp_setattro */
3461 0, /* tp_as_buffer */
3462 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3463 0, /* tp_doc */
3464 (traverseproc)dictiter_traverse, /* tp_traverse */
3465 0, /* tp_clear */
3466 0, /* tp_richcompare */
3467 0, /* tp_weaklistoffset */
3468 PyObject_SelfIter, /* tp_iter */
3469 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
3470 dictiter_methods, /* tp_methods */
3471 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003472};
3473
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003474static PyObject *
3475dictiter_iternextvalue(dictiterobject *di)
Raymond Hettinger019a1482004-03-18 02:41:19 +00003476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003477 PyObject *value;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003478 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003479 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003481 if (d == NULL)
3482 return NULL;
3483 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003485 if (di->di_used != d->ma_used) {
3486 PyErr_SetString(PyExc_RuntimeError,
3487 "dictionary changed size during iteration");
3488 di->di_used = -1; /* Make this state sticky */
3489 return NULL;
3490 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003492 i = di->di_pos;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003493 n = d->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003494 if (d->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003495 PyObject **value_ptr = &d->ma_values[i];
3496 while (i < n && *value_ptr == NULL) {
3497 value_ptr++;
3498 i++;
3499 }
3500 if (i >= n)
3501 goto fail;
3502 value = *value_ptr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003503 }
3504 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003505 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(d->ma_keys)[i];
3506 while (i < n && entry_ptr->me_value == NULL) {
3507 entry_ptr++;
3508 i++;
3509 }
3510 if (i >= n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003511 goto fail;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003512 value = entry_ptr->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003513 }
3514 di->di_pos = i+1;
3515 di->len--;
3516 Py_INCREF(value);
3517 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003518
3519fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003520 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003521 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003523}
3524
3525PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003526 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3527 "dict_valueiterator", /* tp_name */
3528 sizeof(dictiterobject), /* tp_basicsize */
3529 0, /* tp_itemsize */
3530 /* methods */
3531 (destructor)dictiter_dealloc, /* tp_dealloc */
3532 0, /* tp_print */
3533 0, /* tp_getattr */
3534 0, /* tp_setattr */
3535 0, /* tp_reserved */
3536 0, /* tp_repr */
3537 0, /* tp_as_number */
3538 0, /* tp_as_sequence */
3539 0, /* tp_as_mapping */
3540 0, /* tp_hash */
3541 0, /* tp_call */
3542 0, /* tp_str */
3543 PyObject_GenericGetAttr, /* tp_getattro */
3544 0, /* tp_setattro */
3545 0, /* tp_as_buffer */
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003546 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003547 0, /* tp_doc */
3548 (traverseproc)dictiter_traverse, /* tp_traverse */
3549 0, /* tp_clear */
3550 0, /* tp_richcompare */
3551 0, /* tp_weaklistoffset */
3552 PyObject_SelfIter, /* tp_iter */
3553 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
3554 dictiter_methods, /* tp_methods */
3555 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003556};
3557
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003558static PyObject *
3559dictiter_iternextitem(dictiterobject *di)
Raymond Hettinger019a1482004-03-18 02:41:19 +00003560{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003561 PyObject *key, *value, *result = di->di_result;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003562 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003563 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003565 if (d == NULL)
3566 return NULL;
3567 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 if (di->di_used != d->ma_used) {
3570 PyErr_SetString(PyExc_RuntimeError,
3571 "dictionary changed size during iteration");
3572 di->di_used = -1; /* Make this state sticky */
3573 return NULL;
3574 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003576 i = di->di_pos;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003577 n = d->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003578 if (d->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003579 PyObject **value_ptr = &d->ma_values[i];
3580 while (i < n && *value_ptr == NULL) {
3581 value_ptr++;
3582 i++;
3583 }
3584 if (i >= n)
3585 goto fail;
3586 key = DK_ENTRIES(d->ma_keys)[i].me_key;
3587 value = *value_ptr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003588 }
3589 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003590 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(d->ma_keys)[i];
3591 while (i < n && entry_ptr->me_value == NULL) {
3592 entry_ptr++;
3593 i++;
3594 }
3595 if (i >= n)
3596 goto fail;
3597 key = entry_ptr->me_key;
3598 value = entry_ptr->me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003599 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003600 di->di_pos = i+1;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003601 di->len--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 if (result->ob_refcnt == 1) {
3603 Py_INCREF(result);
3604 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3605 Py_DECREF(PyTuple_GET_ITEM(result, 1));
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003606 }
3607 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003608 result = PyTuple_New(2);
3609 if (result == NULL)
3610 return NULL;
3611 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003612 Py_INCREF(key);
3613 Py_INCREF(value);
Eric Snow96c6af92015-05-29 22:21:39 -06003614 PyTuple_SET_ITEM(result, 0, key); /* steals reference */
3615 PyTuple_SET_ITEM(result, 1, value); /* steals reference */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003616 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003617
3618fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003619 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003620 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003621 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003622}
3623
3624PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003625 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3626 "dict_itemiterator", /* tp_name */
3627 sizeof(dictiterobject), /* tp_basicsize */
3628 0, /* tp_itemsize */
3629 /* methods */
3630 (destructor)dictiter_dealloc, /* tp_dealloc */
3631 0, /* tp_print */
3632 0, /* tp_getattr */
3633 0, /* tp_setattr */
3634 0, /* tp_reserved */
3635 0, /* tp_repr */
3636 0, /* tp_as_number */
3637 0, /* tp_as_sequence */
3638 0, /* tp_as_mapping */
3639 0, /* tp_hash */
3640 0, /* tp_call */
3641 0, /* tp_str */
3642 PyObject_GenericGetAttr, /* tp_getattro */
3643 0, /* tp_setattro */
3644 0, /* tp_as_buffer */
3645 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3646 0, /* tp_doc */
3647 (traverseproc)dictiter_traverse, /* tp_traverse */
3648 0, /* tp_clear */
3649 0, /* tp_richcompare */
3650 0, /* tp_weaklistoffset */
3651 PyObject_SelfIter, /* tp_iter */
3652 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3653 dictiter_methods, /* tp_methods */
3654 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003655};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003656
3657
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003658static PyObject *
3659dictiter_reduce(dictiterobject *di)
3660{
3661 PyObject *list;
3662 dictiterobject tmp;
3663
3664 list = PyList_New(0);
3665 if (!list)
3666 return NULL;
3667
3668 /* copy the itertor state */
3669 tmp = *di;
3670 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003671
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003672 /* iterate the temporary into a list */
3673 for(;;) {
3674 PyObject *element = 0;
3675 if (Py_TYPE(di) == &PyDictIterItem_Type)
3676 element = dictiter_iternextitem(&tmp);
3677 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3678 element = dictiter_iternextkey(&tmp);
3679 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3680 element = dictiter_iternextvalue(&tmp);
3681 else
3682 assert(0);
3683 if (element) {
3684 if (PyList_Append(list, element)) {
3685 Py_DECREF(element);
3686 Py_DECREF(list);
3687 Py_XDECREF(tmp.di_dict);
3688 return NULL;
3689 }
3690 Py_DECREF(element);
3691 } else
3692 break;
3693 }
3694 Py_XDECREF(tmp.di_dict);
3695 /* check for error */
3696 if (tmp.di_dict != NULL) {
3697 /* we have an error */
3698 Py_DECREF(list);
3699 return NULL;
3700 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003701 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003702}
3703
Guido van Rossum3ac67412007-02-10 18:55:06 +00003704/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003705/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003706/***********************************************/
3707
Guido van Rossumb90c8482007-02-10 01:11:45 +00003708/* The instance lay-out is the same for all three; but the type differs. */
3709
Guido van Rossumb90c8482007-02-10 01:11:45 +00003710static void
Eric Snow96c6af92015-05-29 22:21:39 -06003711dictview_dealloc(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003713 Py_XDECREF(dv->dv_dict);
3714 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003715}
3716
3717static int
Eric Snow96c6af92015-05-29 22:21:39 -06003718dictview_traverse(_PyDictViewObject *dv, visitproc visit, void *arg)
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003720 Py_VISIT(dv->dv_dict);
3721 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003722}
3723
Guido van Rossum83825ac2007-02-10 04:54:19 +00003724static Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06003725dictview_len(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003726{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003727 Py_ssize_t len = 0;
3728 if (dv->dv_dict != NULL)
3729 len = dv->dv_dict->ma_used;
3730 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003731}
3732
Eric Snow96c6af92015-05-29 22:21:39 -06003733PyObject *
3734_PyDictView_New(PyObject *dict, PyTypeObject *type)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003735{
Eric Snow96c6af92015-05-29 22:21:39 -06003736 _PyDictViewObject *dv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 if (dict == NULL) {
3738 PyErr_BadInternalCall();
3739 return NULL;
3740 }
3741 if (!PyDict_Check(dict)) {
3742 /* XXX Get rid of this restriction later */
3743 PyErr_Format(PyExc_TypeError,
3744 "%s() requires a dict argument, not '%s'",
3745 type->tp_name, dict->ob_type->tp_name);
3746 return NULL;
3747 }
Eric Snow96c6af92015-05-29 22:21:39 -06003748 dv = PyObject_GC_New(_PyDictViewObject, type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 if (dv == NULL)
3750 return NULL;
3751 Py_INCREF(dict);
3752 dv->dv_dict = (PyDictObject *)dict;
3753 _PyObject_GC_TRACK(dv);
3754 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003755}
3756
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003757/* TODO(guido): The views objects are not complete:
3758
3759 * support more set operations
3760 * support arbitrary mappings?
3761 - either these should be static or exported in dictobject.h
3762 - if public then they should probably be in builtins
3763*/
3764
Guido van Rossumaac530c2007-08-24 22:33:45 +00003765/* Return 1 if self is a subset of other, iterating over self;
3766 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003767static int
3768all_contained_in(PyObject *self, PyObject *other)
3769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003770 PyObject *iter = PyObject_GetIter(self);
3771 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003773 if (iter == NULL)
3774 return -1;
3775 for (;;) {
3776 PyObject *next = PyIter_Next(iter);
3777 if (next == NULL) {
3778 if (PyErr_Occurred())
3779 ok = -1;
3780 break;
3781 }
3782 ok = PySequence_Contains(other, next);
3783 Py_DECREF(next);
3784 if (ok <= 0)
3785 break;
3786 }
3787 Py_DECREF(iter);
3788 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003789}
3790
3791static PyObject *
3792dictview_richcompare(PyObject *self, PyObject *other, int op)
3793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003794 Py_ssize_t len_self, len_other;
3795 int ok;
3796 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003798 assert(self != NULL);
3799 assert(PyDictViewSet_Check(self));
3800 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003801
Brian Curtindfc80e32011-08-10 20:28:54 -05003802 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3803 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 len_self = PyObject_Size(self);
3806 if (len_self < 0)
3807 return NULL;
3808 len_other = PyObject_Size(other);
3809 if (len_other < 0)
3810 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003812 ok = 0;
3813 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003815 case Py_NE:
3816 case Py_EQ:
3817 if (len_self == len_other)
3818 ok = all_contained_in(self, other);
3819 if (op == Py_NE && ok >= 0)
3820 ok = !ok;
3821 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 case Py_LT:
3824 if (len_self < len_other)
3825 ok = all_contained_in(self, other);
3826 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003828 case Py_LE:
3829 if (len_self <= len_other)
3830 ok = all_contained_in(self, other);
3831 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003833 case Py_GT:
3834 if (len_self > len_other)
3835 ok = all_contained_in(other, self);
3836 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003838 case Py_GE:
3839 if (len_self >= len_other)
3840 ok = all_contained_in(other, self);
3841 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003843 }
3844 if (ok < 0)
3845 return NULL;
3846 result = ok ? Py_True : Py_False;
3847 Py_INCREF(result);
3848 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003849}
3850
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003851static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003852dictview_repr(_PyDictViewObject *dv)
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003853{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003854 PyObject *seq;
3855 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003857 seq = PySequence_List((PyObject *)dv);
3858 if (seq == NULL)
3859 return NULL;
3860
3861 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3862 Py_DECREF(seq);
3863 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003864}
3865
Guido van Rossum3ac67412007-02-10 18:55:06 +00003866/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003867
3868static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003869dictkeys_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003870{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 if (dv->dv_dict == NULL) {
3872 Py_RETURN_NONE;
3873 }
3874 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003875}
3876
3877static int
Eric Snow96c6af92015-05-29 22:21:39 -06003878dictkeys_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003879{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003880 if (dv->dv_dict == NULL)
3881 return 0;
3882 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003883}
3884
Guido van Rossum83825ac2007-02-10 04:54:19 +00003885static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003886 (lenfunc)dictview_len, /* sq_length */
3887 0, /* sq_concat */
3888 0, /* sq_repeat */
3889 0, /* sq_item */
3890 0, /* sq_slice */
3891 0, /* sq_ass_item */
3892 0, /* sq_ass_slice */
3893 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003894};
3895
Guido van Rossum523259b2007-08-24 23:41:22 +00003896static PyObject*
3897dictviews_sub(PyObject* self, PyObject *other)
3898{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003899 PyObject *result = PySet_New(self);
3900 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003901 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 if (result == NULL)
3904 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003905
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003906 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003907 if (tmp == NULL) {
3908 Py_DECREF(result);
3909 return NULL;
3910 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003912 Py_DECREF(tmp);
3913 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003914}
3915
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003916PyObject*
3917_PyDictView_Intersect(PyObject* self, PyObject *other)
Guido van Rossum523259b2007-08-24 23:41:22 +00003918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003919 PyObject *result = PySet_New(self);
3920 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003921 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003923 if (result == NULL)
3924 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003925
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003926 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 if (tmp == NULL) {
3928 Py_DECREF(result);
3929 return NULL;
3930 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003932 Py_DECREF(tmp);
3933 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003934}
3935
3936static PyObject*
3937dictviews_or(PyObject* self, PyObject *other)
3938{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003939 PyObject *result = PySet_New(self);
3940 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003941 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003943 if (result == NULL)
3944 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003945
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003946 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003947 if (tmp == NULL) {
3948 Py_DECREF(result);
3949 return NULL;
3950 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003952 Py_DECREF(tmp);
3953 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003954}
3955
3956static PyObject*
3957dictviews_xor(PyObject* self, PyObject *other)
3958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003959 PyObject *result = PySet_New(self);
3960 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003961 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003963 if (result == NULL)
3964 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003965
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003966 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003967 if (tmp == NULL) {
3968 Py_DECREF(result);
3969 return NULL;
3970 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003972 Py_DECREF(tmp);
3973 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003974}
3975
3976static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003977 0, /*nb_add*/
3978 (binaryfunc)dictviews_sub, /*nb_subtract*/
3979 0, /*nb_multiply*/
3980 0, /*nb_remainder*/
3981 0, /*nb_divmod*/
3982 0, /*nb_power*/
3983 0, /*nb_negative*/
3984 0, /*nb_positive*/
3985 0, /*nb_absolute*/
3986 0, /*nb_bool*/
3987 0, /*nb_invert*/
3988 0, /*nb_lshift*/
3989 0, /*nb_rshift*/
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003990 (binaryfunc)_PyDictView_Intersect, /*nb_and*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003991 (binaryfunc)dictviews_xor, /*nb_xor*/
3992 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003993};
3994
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003995static PyObject*
3996dictviews_isdisjoint(PyObject *self, PyObject *other)
3997{
3998 PyObject *it;
3999 PyObject *item = NULL;
4000
4001 if (self == other) {
Eric Snow96c6af92015-05-29 22:21:39 -06004002 if (dictview_len((_PyDictViewObject *)self) == 0)
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004003 Py_RETURN_TRUE;
4004 else
4005 Py_RETURN_FALSE;
4006 }
4007
4008 /* Iterate over the shorter object (only if other is a set,
4009 * because PySequence_Contains may be expensive otherwise): */
4010 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
Eric Snow96c6af92015-05-29 22:21:39 -06004011 Py_ssize_t len_self = dictview_len((_PyDictViewObject *)self);
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004012 Py_ssize_t len_other = PyObject_Size(other);
4013 if (len_other == -1)
4014 return NULL;
4015
4016 if ((len_other > len_self)) {
4017 PyObject *tmp = other;
4018 other = self;
4019 self = tmp;
4020 }
4021 }
4022
4023 it = PyObject_GetIter(other);
4024 if (it == NULL)
4025 return NULL;
4026
4027 while ((item = PyIter_Next(it)) != NULL) {
4028 int contains = PySequence_Contains(self, item);
4029 Py_DECREF(item);
4030 if (contains == -1) {
4031 Py_DECREF(it);
4032 return NULL;
4033 }
4034
4035 if (contains) {
4036 Py_DECREF(it);
4037 Py_RETURN_FALSE;
4038 }
4039 }
4040 Py_DECREF(it);
4041 if (PyErr_Occurred())
4042 return NULL; /* PyIter_Next raised an exception. */
4043 Py_RETURN_TRUE;
4044}
4045
4046PyDoc_STRVAR(isdisjoint_doc,
4047"Return True if the view and the given iterable have a null intersection.");
4048
Guido van Rossumb90c8482007-02-10 01:11:45 +00004049static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004050 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
4051 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004052 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004053};
4054
4055PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004056 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4057 "dict_keys", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004058 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004059 0, /* tp_itemsize */
4060 /* methods */
4061 (destructor)dictview_dealloc, /* tp_dealloc */
4062 0, /* tp_print */
4063 0, /* tp_getattr */
4064 0, /* tp_setattr */
4065 0, /* tp_reserved */
4066 (reprfunc)dictview_repr, /* tp_repr */
4067 &dictviews_as_number, /* tp_as_number */
4068 &dictkeys_as_sequence, /* tp_as_sequence */
4069 0, /* tp_as_mapping */
4070 0, /* tp_hash */
4071 0, /* tp_call */
4072 0, /* tp_str */
4073 PyObject_GenericGetAttr, /* tp_getattro */
4074 0, /* tp_setattro */
4075 0, /* tp_as_buffer */
4076 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4077 0, /* tp_doc */
4078 (traverseproc)dictview_traverse, /* tp_traverse */
4079 0, /* tp_clear */
4080 dictview_richcompare, /* tp_richcompare */
4081 0, /* tp_weaklistoffset */
4082 (getiterfunc)dictkeys_iter, /* tp_iter */
4083 0, /* tp_iternext */
4084 dictkeys_methods, /* tp_methods */
4085 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004086};
4087
4088static PyObject *
4089dictkeys_new(PyObject *dict)
4090{
Eric Snow96c6af92015-05-29 22:21:39 -06004091 return _PyDictView_New(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004092}
4093
Guido van Rossum3ac67412007-02-10 18:55:06 +00004094/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004095
4096static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004097dictitems_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004099 if (dv->dv_dict == NULL) {
4100 Py_RETURN_NONE;
4101 }
4102 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00004103}
4104
4105static int
Eric Snow96c6af92015-05-29 22:21:39 -06004106dictitems_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00004107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004108 PyObject *key, *value, *found;
4109 if (dv->dv_dict == NULL)
4110 return 0;
4111 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
4112 return 0;
4113 key = PyTuple_GET_ITEM(obj, 0);
4114 value = PyTuple_GET_ITEM(obj, 1);
Raymond Hettinger6692f012016-09-18 21:46:08 -07004115 found = PyDict_GetItemWithError((PyObject *)dv->dv_dict, key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004116 if (found == NULL) {
4117 if (PyErr_Occurred())
4118 return -1;
4119 return 0;
4120 }
4121 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004122}
4123
Guido van Rossum83825ac2007-02-10 04:54:19 +00004124static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 (lenfunc)dictview_len, /* sq_length */
4126 0, /* sq_concat */
4127 0, /* sq_repeat */
4128 0, /* sq_item */
4129 0, /* sq_slice */
4130 0, /* sq_ass_item */
4131 0, /* sq_ass_slice */
4132 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004133};
4134
Guido van Rossumb90c8482007-02-10 01:11:45 +00004135static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004136 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
4137 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004138 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004139};
4140
4141PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004142 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4143 "dict_items", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004144 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004145 0, /* tp_itemsize */
4146 /* methods */
4147 (destructor)dictview_dealloc, /* tp_dealloc */
4148 0, /* tp_print */
4149 0, /* tp_getattr */
4150 0, /* tp_setattr */
4151 0, /* tp_reserved */
4152 (reprfunc)dictview_repr, /* tp_repr */
4153 &dictviews_as_number, /* tp_as_number */
4154 &dictitems_as_sequence, /* tp_as_sequence */
4155 0, /* tp_as_mapping */
4156 0, /* tp_hash */
4157 0, /* tp_call */
4158 0, /* tp_str */
4159 PyObject_GenericGetAttr, /* tp_getattro */
4160 0, /* tp_setattro */
4161 0, /* tp_as_buffer */
4162 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4163 0, /* tp_doc */
4164 (traverseproc)dictview_traverse, /* tp_traverse */
4165 0, /* tp_clear */
4166 dictview_richcompare, /* tp_richcompare */
4167 0, /* tp_weaklistoffset */
4168 (getiterfunc)dictitems_iter, /* tp_iter */
4169 0, /* tp_iternext */
4170 dictitems_methods, /* tp_methods */
4171 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004172};
4173
4174static PyObject *
4175dictitems_new(PyObject *dict)
4176{
Eric Snow96c6af92015-05-29 22:21:39 -06004177 return _PyDictView_New(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004178}
4179
Guido van Rossum3ac67412007-02-10 18:55:06 +00004180/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004181
4182static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004183dictvalues_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 if (dv->dv_dict == NULL) {
4186 Py_RETURN_NONE;
4187 }
4188 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004189}
4190
Guido van Rossum83825ac2007-02-10 04:54:19 +00004191static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004192 (lenfunc)dictview_len, /* sq_length */
4193 0, /* sq_concat */
4194 0, /* sq_repeat */
4195 0, /* sq_item */
4196 0, /* sq_slice */
4197 0, /* sq_ass_item */
4198 0, /* sq_ass_slice */
4199 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004200};
4201
Guido van Rossumb90c8482007-02-10 01:11:45 +00004202static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004203 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004204};
4205
4206PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004207 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4208 "dict_values", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004209 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004210 0, /* tp_itemsize */
4211 /* methods */
4212 (destructor)dictview_dealloc, /* tp_dealloc */
4213 0, /* tp_print */
4214 0, /* tp_getattr */
4215 0, /* tp_setattr */
4216 0, /* tp_reserved */
4217 (reprfunc)dictview_repr, /* tp_repr */
4218 0, /* tp_as_number */
4219 &dictvalues_as_sequence, /* tp_as_sequence */
4220 0, /* tp_as_mapping */
4221 0, /* tp_hash */
4222 0, /* tp_call */
4223 0, /* tp_str */
4224 PyObject_GenericGetAttr, /* tp_getattro */
4225 0, /* tp_setattro */
4226 0, /* tp_as_buffer */
4227 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4228 0, /* tp_doc */
4229 (traverseproc)dictview_traverse, /* tp_traverse */
4230 0, /* tp_clear */
4231 0, /* tp_richcompare */
4232 0, /* tp_weaklistoffset */
4233 (getiterfunc)dictvalues_iter, /* tp_iter */
4234 0, /* tp_iternext */
4235 dictvalues_methods, /* tp_methods */
4236 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004237};
4238
4239static PyObject *
4240dictvalues_new(PyObject *dict)
4241{
Eric Snow96c6af92015-05-29 22:21:39 -06004242 return _PyDictView_New(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004243}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004244
4245/* Returns NULL if cannot allocate a new PyDictKeysObject,
4246 but does not set an error */
4247PyDictKeysObject *
4248_PyDict_NewKeysForClass(void)
4249{
Victor Stinner742da042016-09-07 17:40:12 -07004250 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004251 if (keys == NULL)
4252 PyErr_Clear();
4253 else
4254 keys->dk_lookup = lookdict_split;
4255 return keys;
4256}
4257
4258#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
4259
4260PyObject *
4261PyObject_GenericGetDict(PyObject *obj, void *context)
4262{
4263 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
4264 if (dictptr == NULL) {
4265 PyErr_SetString(PyExc_AttributeError,
4266 "This object has no __dict__");
4267 return NULL;
4268 }
4269 dict = *dictptr;
4270 if (dict == NULL) {
4271 PyTypeObject *tp = Py_TYPE(obj);
4272 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
4273 DK_INCREF(CACHED_KEYS(tp));
4274 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
4275 }
4276 else {
4277 *dictptr = dict = PyDict_New();
4278 }
4279 }
4280 Py_XINCREF(dict);
4281 return dict;
4282}
4283
4284int
4285_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
Victor Stinner742da042016-09-07 17:40:12 -07004286 PyObject *key, PyObject *value)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004287{
4288 PyObject *dict;
4289 int res;
4290 PyDictKeysObject *cached;
4291
4292 assert(dictptr != NULL);
4293 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
4294 assert(dictptr != NULL);
4295 dict = *dictptr;
4296 if (dict == NULL) {
4297 DK_INCREF(cached);
4298 dict = new_dict_with_shared_keys(cached);
4299 if (dict == NULL)
4300 return -1;
4301 *dictptr = dict;
4302 }
4303 if (value == NULL) {
4304 res = PyDict_DelItem(dict, key);
4305 if (cached != ((PyDictObject *)dict)->ma_keys) {
4306 CACHED_KEYS(tp) = NULL;
4307 DK_DECREF(cached);
4308 }
4309 } else {
4310 res = PyDict_SetItem(dict, key, value);
4311 if (cached != ((PyDictObject *)dict)->ma_keys) {
4312 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004313 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004314 CACHED_KEYS(tp) = make_keys_shared(dict);
Victor Stinner742da042016-09-07 17:40:12 -07004315 }
4316 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004317 CACHED_KEYS(tp) = NULL;
4318 }
4319 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004320 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
4321 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004322 }
4323 }
4324 } else {
4325 dict = *dictptr;
4326 if (dict == NULL) {
4327 dict = PyDict_New();
4328 if (dict == NULL)
4329 return -1;
4330 *dictptr = dict;
4331 }
4332 if (value == NULL) {
4333 res = PyDict_DelItem(dict, key);
4334 } else {
4335 res = PyDict_SetItem(dict, key, value);
4336 }
4337 }
4338 return res;
4339}
4340
4341void
4342_PyDictKeys_DecRef(PyDictKeysObject *keys)
4343{
4344 DK_DECREF(keys);
4345}