blob: b63b78a337225acc043db8a660033212006fe024 [file] [log] [blame]
Guido van Rossum2bc13791999-03-24 19:06:42 +00001/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002
Raymond Hettinger930427b2003-05-03 06:51:59 +00003/* The distribution includes a separate file, Objects/dictnotes.txt,
Tim Peters60b29962006-01-01 01:19:23 +00004 describing explorations into dictionary design and optimization.
Raymond Hettinger930427b2003-05-03 06:51:59 +00005 It covers typical dictionary use patterns, the parameters for
6 tuning dictionaries, and several ideas for possible optimizations.
7*/
8
Victor Stinner742da042016-09-07 17:40:12 -07009/* PyDictKeysObject
10
11This implements the dictionary's hashtable.
12
Berker Peksag71c01d42016-09-09 03:57:23 +030013As of Python 3.6, this is compact and ordered. Basic idea is described here.
Benjamin Peterson003f0592016-09-08 10:14:31 -070014https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html
Victor Stinner742da042016-09-07 17:40:12 -070015
16layout:
17
18+---------------+
19| dk_refcnt |
20| dk_size |
21| dk_lookup |
22| dk_usable |
23| dk_nentries |
24+---------------+
25| dk_indices |
26| |
27+---------------+
28| dk_entries |
29| |
30+---------------+
31
32dk_indices is actual hashtable. It holds index in entries, or DKIX_EMPTY(-1)
33or DKIX_DUMMY(-2).
34Size of indices is dk_size. Type of each index in indices is vary on dk_size:
35
36* int8 for dk_size <= 128
37* int16 for 256 <= dk_size <= 2**15
38* int32 for 2**16 <= dk_size <= 2**31
39* int64 for 2**32 <= dk_size
40
41dk_entries is array of PyDictKeyEntry. It's size is USABLE_FRACTION(dk_size).
42DK_ENTRIES(dk) can be used to get pointer to entries.
43
44NOTE: Since negative value is used for DKIX_EMPTY and DKIX_DUMMY, type of
45dk_indices entry is signed integer and int16 is used for table which
46dk_size == 256.
47*/
48
Benjamin Peterson7d95e402012-04-23 11:24:50 -040049
50/*
Benjamin Peterson7d95e402012-04-23 11:24:50 -040051The DictObject can be in one of two forms.
Victor Stinner742da042016-09-07 17:40:12 -070052
Benjamin Peterson7d95e402012-04-23 11:24:50 -040053Either:
54 A combined table:
55 ma_values == NULL, dk_refcnt == 1.
56 Values are stored in the me_value field of the PyDictKeysObject.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040057Or:
58 A split table:
59 ma_values != NULL, dk_refcnt >= 1
60 Values are stored in the ma_values array.
Victor Stinner742da042016-09-07 17:40:12 -070061 Only string (unicode) keys are allowed.
62 All dicts sharing same key must have same insertion order.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040063
Victor Stinner742da042016-09-07 17:40:12 -070064There are four kinds of slots in the table (slot is index, and
65DK_ENTRIES(keys)[index] if index >= 0):
66
671. Unused. index == DKIX_EMPTY
68 Does not hold an active (key, value) pair now and never did. Unused can
69 transition to Active upon key insertion. This is each slot's initial state.
70
712. Active. index >= 0, me_key != NULL and me_value != NULL
72 Holds an active (key, value) pair. Active can transition to Dummy or
73 Pending upon key deletion (for combined and split tables respectively).
74 This is the only case in which me_value != NULL.
75
763. Dummy. index == DKIX_DUMMY (combined only)
77 Previously held an active (key, value) pair, but that was deleted and an
78 active pair has not yet overwritten the slot. Dummy can transition to
79 Active upon key insertion. Dummy slots cannot be made Unused again
80 else the probe sequence in case of collision would have no way to know
81 they were once active.
82
834. Pending. index >= 0, key != NULL, and value == NULL (split only)
84 Not yet inserted in split-table.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040085*/
86
Victor Stinner742da042016-09-07 17:40:12 -070087/*
88Preserving insertion order
Benjamin Peterson7d95e402012-04-23 11:24:50 -040089
Victor Stinner742da042016-09-07 17:40:12 -070090It's simple for combined table. Since dk_entries is mostly append only, we can
91get insertion order by just iterating dk_entries.
92
93One exception is .popitem(). It removes last item in dk_entries and decrement
94dk_nentries to achieve amortized O(1). Since there are DKIX_DUMMY remains in
95dk_indices, we can't increment dk_usable even though dk_nentries is
96decremented.
97
98In split table, inserting into pending entry is allowed only for dk_entries[ix]
99where ix == mp->ma_used. Inserting into other index and deleting item cause
100converting the dict to the combined table.
101*/
102
103/* PyDict_MINSIZE is the starting size for any new dict.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400104 * 8 allows dicts with no more than 5 active entries; experiments suggested
105 * this suffices for the majority of dicts (consisting mostly of usually-small
106 * dicts created to pass keyword arguments).
107 * Making this 8, rather than 4 reduces the number of resizes for most
108 * dictionaries, without any significant extra memory use.
109 */
Victor Stinner742da042016-09-07 17:40:12 -0700110#define PyDict_MINSIZE 8
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400111
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112#include "Python.h"
Eric Snow96c6af92015-05-29 22:21:39 -0600113#include "dict-common.h"
Victor Stinner990397e2016-09-09 20:22:59 -0700114#include "stringlib/eq.h" /* to get unicode_eq() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000115
Larry Hastings61272b72014-01-07 12:41:53 -0800116/*[clinic input]
Larry Hastingsc2047262014-01-25 20:43:29 -0800117class dict "PyDictObject *" "&PyDict_Type"
Larry Hastings61272b72014-01-07 12:41:53 -0800118[clinic start generated code]*/
Larry Hastings581ee362014-01-28 05:00:08 -0800119/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f157a5a0ce9589d6]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800120
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400121
122/*
123To ensure the lookup algorithm terminates, there must be at least one Unused
124slot (NULL key) in the table.
125To avoid slowing down lookups on a near-full table, we resize the table when
126it's USABLE_FRACTION (currently two-thirds) full.
127*/
Guido van Rossum16e93a81997-01-28 00:00:11 +0000128
Tim Peterseb28ef22001-06-02 05:27:19 +0000129#define PERTURB_SHIFT 5
130
Guido van Rossum16e93a81997-01-28 00:00:11 +0000131/*
Tim Peterseb28ef22001-06-02 05:27:19 +0000132Major subtleties ahead: Most hash schemes depend on having a "good" hash
133function, in the sense of simulating randomness. Python doesn't: its most
R David Murray537ad7a2016-07-10 12:33:18 -0400134important hash functions (for ints) are very regular in common
Tim Peterseb28ef22001-06-02 05:27:19 +0000135cases:
Tim Peters15d49292001-05-27 07:39:22 +0000136
R David Murray537ad7a2016-07-10 12:33:18 -0400137 >>>[hash(i) for i in range(4)]
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000138 [0, 1, 2, 3]
Tim Peters15d49292001-05-27 07:39:22 +0000139
Tim Peterseb28ef22001-06-02 05:27:19 +0000140This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
141the low-order i bits as the initial table index is extremely fast, and there
R David Murray537ad7a2016-07-10 12:33:18 -0400142are no collisions at all for dicts indexed by a contiguous range of ints. So
143this gives better-than-random behavior in common cases, and that's very
144desirable.
Tim Peters15d49292001-05-27 07:39:22 +0000145
Tim Peterseb28ef22001-06-02 05:27:19 +0000146OTOH, when collisions occur, the tendency to fill contiguous slices of the
147hash table makes a good collision resolution strategy crucial. Taking only
148the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000150their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
151 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +0000152
Tim Peterseb28ef22001-06-02 05:27:19 +0000153But catering to unusual cases should not slow the usual ones, so we just take
154the last i bits anyway. It's up to collision resolution to do the rest. If
155we *usually* find the key we're looking for on the first try (and, it turns
156out, we usually do -- the table load factor is kept under 2/3, so the odds
157are solidly in our favor), then it makes best sense to keep the initial index
158computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +0000159
Tim Peterseb28ef22001-06-02 05:27:19 +0000160The first half of collision resolution is to visit table indices via this
161recurrence:
Tim Peters15d49292001-05-27 07:39:22 +0000162
Tim Peterseb28ef22001-06-02 05:27:19 +0000163 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +0000164
Tim Peterseb28ef22001-06-02 05:27:19 +0000165For any initial j in range(2**i), repeating that 2**i times generates each
166int in range(2**i) exactly once (see any text on random-number generation for
167proof). By itself, this doesn't help much: like linear probing (setting
168j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
169order. This would be bad, except that's not the only thing we do, and it's
170actually *good* in the common cases where hash keys are consecutive. In an
171example that's really too small to make this entirely clear, for a table of
172size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +0000173
Tim Peterseb28ef22001-06-02 05:27:19 +0000174 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
175
176If two things come in at index 5, the first place we look after is index 2,
177not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
178Linear probing is deadly in this case because there the fixed probe order
179is the *same* as the order consecutive keys are likely to arrive. But it's
180extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
181and certain that consecutive hash codes do not.
182
183The other half of the strategy is to get the other bits of the hash code
184into play. This is done by initializing a (unsigned) vrbl "perturb" to the
185full hash code, and changing the recurrence to:
186
Tim Peterseb28ef22001-06-02 05:27:19 +0000187 perturb >>= PERTURB_SHIFT;
INADA Naoki267941c2016-10-06 15:19:07 +0900188 j = (5*j) + 1 + perturb;
Tim Peterseb28ef22001-06-02 05:27:19 +0000189 use j % 2**i as the next table index;
190
191Now the probe sequence depends (eventually) on every bit in the hash code,
192and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
193because it quickly magnifies small differences in the bits that didn't affect
194the initial index. Note that because perturb is unsigned, if the recurrence
195is executed often enough perturb eventually becomes and remains 0. At that
196point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
197that's certain to find an empty slot eventually (since it generates every int
198in range(2**i), and we make sure there's always at least one empty slot).
199
200Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
201small so that the high bits of the hash code continue to affect the probe
202sequence across iterations; but you want it large so that in really bad cases
203the high-order hash bits have an effect on early iterations. 5 was "the
204best" in minimizing total collisions across experiments Tim Peters ran (on
205both normal and pathological cases), but 4 and 6 weren't significantly worse.
206
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000207Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000208approach, using repeated multiplication by x in GF(2**n) where an irreducible
209polynomial for each table size was chosen such that x was a primitive root.
210Christian Tismer later extended that to use division by x instead, as an
211efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000212also gave excellent collision statistics, but was more expensive: two
213if-tests were required inside the loop; computing "the next" index took about
214the same number of operations but without as much potential parallelism
215(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
216above, and then shifting perturb can be done while the table index is being
217masked); and the PyDictObject struct required a member to hold the table's
218polynomial. In Tim's experiments the current scheme ran faster, produced
219equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000220
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000221*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000222
Fred Drake1bff34a2000-08-31 19:31:38 +0000223/* forward declarations */
Victor Stinner742da042016-09-07 17:40:12 -0700224static Py_ssize_t lookdict(PyDictObject *mp, PyObject *key,
225 Py_hash_t hash, PyObject ***value_addr,
226 Py_ssize_t *hashpos);
227static Py_ssize_t lookdict_unicode(PyDictObject *mp, PyObject *key,
228 Py_hash_t hash, PyObject ***value_addr,
229 Py_ssize_t *hashpos);
230static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400231lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700232 Py_hash_t hash, PyObject ***value_addr,
233 Py_ssize_t *hashpos);
234static Py_ssize_t lookdict_split(PyDictObject *mp, PyObject *key,
235 Py_hash_t hash, PyObject ***value_addr,
236 Py_ssize_t *hashpos);
Fred Drake1bff34a2000-08-31 19:31:38 +0000237
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400238static int dictresize(PyDictObject *mp, Py_ssize_t minused);
Tim Petersdea48ec2001-05-22 20:40:22 +0000239
Benjamin Peterson3c569292016-09-08 13:16:41 -0700240/*Global counter used to set ma_version_tag field of dictionary.
Victor Stinner3b6a6b42016-09-08 12:51:24 -0700241 * It is incremented each time that a dictionary is created and each
242 * time that a dictionary is modified. */
243static uint64_t pydict_global_version = 0;
244
245#define DICT_NEXT_VERSION() (++pydict_global_version)
246
Victor Stinner742da042016-09-07 17:40:12 -0700247/* Dictionary reuse scheme to save calls to malloc and free */
Christian Heimes2202f872008-02-06 14:31:34 +0000248#ifndef PyDict_MAXFREELIST
249#define PyDict_MAXFREELIST 80
250#endif
251static PyDictObject *free_list[PyDict_MAXFREELIST];
252static int numfree = 0;
Victor Stinner742da042016-09-07 17:40:12 -0700253static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST];
254static int numfreekeys = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000255
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300256#include "clinic/dictobject.c.h"
257
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100258int
259PyDict_ClearFreeList(void)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000260{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 PyDictObject *op;
Victor Stinner742da042016-09-07 17:40:12 -0700262 int ret = numfree + numfreekeys;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 while (numfree) {
264 op = free_list[--numfree];
265 assert(PyDict_CheckExact(op));
266 PyObject_GC_Del(op);
267 }
Victor Stinner742da042016-09-07 17:40:12 -0700268 while (numfreekeys) {
269 PyObject_FREE(keys_free_list[--numfreekeys]);
270 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100271 return ret;
272}
273
David Malcolm49526f42012-06-22 14:55:41 -0400274/* Print summary info about the state of the optimized allocator */
275void
276_PyDict_DebugMallocStats(FILE *out)
277{
278 _PyDebugAllocatorStats(out,
279 "free PyDictObject", numfree, sizeof(PyDictObject));
280}
281
282
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100283void
284PyDict_Fini(void)
285{
286 PyDict_ClearFreeList();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000287}
288
Victor Stinner742da042016-09-07 17:40:12 -0700289#define DK_SIZE(dk) ((dk)->dk_size)
290#if SIZEOF_VOID_P > 4
Victor Stinner58f7c5a2016-09-08 11:37:36 -0700291#define DK_IXSIZE(dk) \
292 (DK_SIZE(dk) <= 0xff ? \
293 1 : DK_SIZE(dk) <= 0xffff ? \
294 2 : DK_SIZE(dk) <= 0xffffffff ? \
Benjamin Peterson3c569292016-09-08 13:16:41 -0700295 4 : sizeof(int64_t))
Victor Stinner742da042016-09-07 17:40:12 -0700296#else
Victor Stinner58f7c5a2016-09-08 11:37:36 -0700297#define DK_IXSIZE(dk) \
298 (DK_SIZE(dk) <= 0xff ? \
299 1 : DK_SIZE(dk) <= 0xffff ? \
Benjamin Peterson3c569292016-09-08 13:16:41 -0700300 2 : sizeof(int32_t))
Victor Stinner742da042016-09-07 17:40:12 -0700301#endif
Victor Stinner58f7c5a2016-09-08 11:37:36 -0700302#define DK_ENTRIES(dk) \
Benjamin Peterson186122e2016-09-08 12:20:12 -0700303 ((PyDictKeyEntry*)(&(dk)->dk_indices.as_1[DK_SIZE(dk) * DK_IXSIZE(dk)]))
Victor Stinner742da042016-09-07 17:40:12 -0700304
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200305#define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
306#define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
307
308#define DK_INCREF(dk) (DK_DEBUG_INCREF ++(dk)->dk_refcnt)
309#define DK_DECREF(dk) if (DK_DEBUG_DECREF (--(dk)->dk_refcnt) == 0) free_keys_object(dk)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400310#define DK_MASK(dk) (((dk)->dk_size)-1)
311#define IS_POWER_OF_2(x) (((x) & (x-1)) == 0)
312
Victor Stinner742da042016-09-07 17:40:12 -0700313/* lookup indices. returns DKIX_EMPTY, DKIX_DUMMY, or ix >=0 */
Benjamin Peterson73222252016-09-08 09:58:47 -0700314static inline Py_ssize_t
Victor Stinner742da042016-09-07 17:40:12 -0700315dk_get_index(PyDictKeysObject *keys, Py_ssize_t i)
316{
317 Py_ssize_t s = DK_SIZE(keys);
Victor Stinner71211e32016-09-08 10:52:46 -0700318 Py_ssize_t ix;
319
Victor Stinner742da042016-09-07 17:40:12 -0700320 if (s <= 0xff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700321 int8_t *indices = keys->dk_indices.as_1;
Victor Stinner208857e2016-09-08 11:35:46 -0700322 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700323 }
324 else if (s <= 0xffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700325 int16_t *indices = keys->dk_indices.as_2;
Victor Stinner208857e2016-09-08 11:35:46 -0700326 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700327 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700328#if SIZEOF_VOID_P > 4
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300329 else if (s > 0xffffffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700330 int64_t *indices = keys->dk_indices.as_8;
Victor Stinner208857e2016-09-08 11:35:46 -0700331 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700332 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700333#endif
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300334 else {
335 int32_t *indices = keys->dk_indices.as_4;
336 ix = indices[i];
337 }
Victor Stinner71211e32016-09-08 10:52:46 -0700338 assert(ix >= DKIX_DUMMY);
339 return ix;
Victor Stinner742da042016-09-07 17:40:12 -0700340}
341
342/* write to indices. */
Benjamin Peterson73222252016-09-08 09:58:47 -0700343static inline void
Victor Stinner742da042016-09-07 17:40:12 -0700344dk_set_index(PyDictKeysObject *keys, Py_ssize_t i, Py_ssize_t ix)
345{
346 Py_ssize_t s = DK_SIZE(keys);
Victor Stinner71211e32016-09-08 10:52:46 -0700347
348 assert(ix >= DKIX_DUMMY);
349
Victor Stinner742da042016-09-07 17:40:12 -0700350 if (s <= 0xff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700351 int8_t *indices = keys->dk_indices.as_1;
Victor Stinner71211e32016-09-08 10:52:46 -0700352 assert(ix <= 0x7f);
Victor Stinner208857e2016-09-08 11:35:46 -0700353 indices[i] = (char)ix;
Victor Stinner742da042016-09-07 17:40:12 -0700354 }
355 else if (s <= 0xffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700356 int16_t *indices = keys->dk_indices.as_2;
Victor Stinner71211e32016-09-08 10:52:46 -0700357 assert(ix <= 0x7fff);
Victor Stinner208857e2016-09-08 11:35:46 -0700358 indices[i] = (int16_t)ix;
Victor Stinner742da042016-09-07 17:40:12 -0700359 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700360#if SIZEOF_VOID_P > 4
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300361 else if (s > 0xffffffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700362 int64_t *indices = keys->dk_indices.as_8;
Victor Stinner208857e2016-09-08 11:35:46 -0700363 indices[i] = ix;
Victor Stinner742da042016-09-07 17:40:12 -0700364 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700365#endif
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300366 else {
367 int32_t *indices = keys->dk_indices.as_4;
368 assert(ix <= 0x7fffffff);
369 indices[i] = (int32_t)ix;
370 }
Victor Stinner742da042016-09-07 17:40:12 -0700371}
372
373
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200374/* USABLE_FRACTION is the maximum dictionary load.
Victor Stinner742da042016-09-07 17:40:12 -0700375 * Increasing this ratio makes dictionaries more dense resulting in more
376 * collisions. Decreasing it improves sparseness at the expense of spreading
377 * indices over more cache lines and at the cost of total memory consumed.
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200378 *
379 * USABLE_FRACTION must obey the following:
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400380 * (0 < USABLE_FRACTION(n) < n) for all n >= 2
381 *
Victor Stinner742da042016-09-07 17:40:12 -0700382 * USABLE_FRACTION should be quick to calculate.
383 * Fractions around 1/2 to 2/3 seem to work well in practice.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400384 */
Victor Stinner742da042016-09-07 17:40:12 -0700385#define USABLE_FRACTION(n) (((n) << 1)/3)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400386
Victor Stinner742da042016-09-07 17:40:12 -0700387/* ESTIMATE_SIZE is reverse function of USABLE_FRACTION.
388 * This can be used to reserve enough size to insert n entries without
389 * resizing.
390 */
INADA Naoki2c5a8302016-12-07 18:34:44 +0900391#define ESTIMATE_SIZE(n) (((n)*3+1) >> 1)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400392
Victor Stinner742da042016-09-07 17:40:12 -0700393/* Alternative fraction that is otherwise close enough to 2n/3 to make
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400394 * little difference. 8 * 2/3 == 8 * 5/8 == 5. 16 * 2/3 == 16 * 5/8 == 10.
395 * 32 * 2/3 = 21, 32 * 5/8 = 20.
396 * Its advantage is that it is faster to compute on machines with slow division.
397 * #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
Victor Stinner742da042016-09-07 17:40:12 -0700398 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400399
Victor Stinnera9f61a52013-07-16 22:17:26 +0200400/* GROWTH_RATE. Growth rate upon hitting maximum load.
401 * Currently set to used*2 + capacity/2.
402 * This means that dicts double in size when growing without deletions,
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700403 * but have more head room when the number of deletions is on a par with the
404 * number of insertions.
405 * Raising this to used*4 doubles memory consumption depending on the size of
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200406 * the dictionary, but results in half the number of resizes, less effort to
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700407 * resize.
408 * GROWTH_RATE was set to used*4 up to version 3.2.
409 * GROWTH_RATE was set to used*2 in version 3.3.0
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200410 */
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700411#define GROWTH_RATE(d) (((d)->ma_used*2)+((d)->ma_keys->dk_size>>1))
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400412
413#define ENSURE_ALLOWS_DELETIONS(d) \
414 if ((d)->ma_keys->dk_lookup == lookdict_unicode_nodummy) { \
415 (d)->ma_keys->dk_lookup = lookdict_unicode; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400417
418/* This immutable, empty PyDictKeysObject is used for PyDict_Clear()
419 * (which cannot fail and thus can do no allocation).
420 */
421static PyDictKeysObject empty_keys_struct = {
Serhiy Storchaka97932e42016-09-26 23:01:23 +0300422 1, /* dk_refcnt */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400423 1, /* dk_size */
424 lookdict_split, /* dk_lookup */
425 0, /* dk_usable (immutable) */
Victor Stinner742da042016-09-07 17:40:12 -0700426 0, /* dk_nentries */
Benjamin Peterson186122e2016-09-08 12:20:12 -0700427 .dk_indices = { .as_1 = {DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY,
428 DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY}},
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400429};
430
431static PyObject *empty_values[1] = { NULL };
432
433#define Py_EMPTY_KEYS &empty_keys_struct
434
Victor Stinner611b0fa2016-09-14 15:02:01 +0200435/* Uncomment to check the dict content in _PyDict_CheckConsistency() */
436/* #define DEBUG_PYDICT */
437
438
439#ifdef Py_DEBUG
440static int
441_PyDict_CheckConsistency(PyDictObject *mp)
442{
443 PyDictKeysObject *keys = mp->ma_keys;
444 int splitted = _PyDict_HasSplitTable(mp);
445 Py_ssize_t usable = USABLE_FRACTION(keys->dk_size);
446#ifdef DEBUG_PYDICT
447 PyDictKeyEntry *entries = DK_ENTRIES(keys);
448 Py_ssize_t i;
449#endif
450
451 assert(0 <= mp->ma_used && mp->ma_used <= usable);
452 assert(IS_POWER_OF_2(keys->dk_size));
453 assert(0 <= keys->dk_usable
454 && keys->dk_usable <= usable);
455 assert(0 <= keys->dk_nentries
456 && keys->dk_nentries <= usable);
457 assert(keys->dk_usable + keys->dk_nentries <= usable);
458
459 if (!splitted) {
460 /* combined table */
461 assert(keys->dk_refcnt == 1);
462 }
463
464#ifdef DEBUG_PYDICT
465 for (i=0; i < keys->dk_size; i++) {
466 Py_ssize_t ix = dk_get_index(keys, i);
467 assert(DKIX_DUMMY <= ix && ix <= usable);
468 }
469
470 for (i=0; i < usable; i++) {
471 PyDictKeyEntry *entry = &entries[i];
472 PyObject *key = entry->me_key;
473
474 if (key != NULL) {
475 if (PyUnicode_CheckExact(key)) {
476 Py_hash_t hash = ((PyASCIIObject *)key)->hash;
477 assert(hash != -1);
478 assert(entry->me_hash == hash);
479 }
480 else {
481 /* test_dict fails if PyObject_Hash() is called again */
482 assert(entry->me_hash != -1);
483 }
484 if (!splitted) {
485 assert(entry->me_value != NULL);
486 }
487 }
488
489 if (splitted) {
490 assert(entry->me_value == NULL);
491 }
492 }
493
494 if (splitted) {
495 /* splitted table */
496 for (i=0; i < mp->ma_used; i++) {
497 assert(mp->ma_values[i] != NULL);
498 }
499 }
500#endif
501
502 return 1;
503}
504#endif
505
506
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400507static PyDictKeysObject *new_keys_object(Py_ssize_t size)
508{
509 PyDictKeysObject *dk;
Victor Stinner742da042016-09-07 17:40:12 -0700510 Py_ssize_t es, usable;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400511
Victor Stinner742da042016-09-07 17:40:12 -0700512 assert(size >= PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400513 assert(IS_POWER_OF_2(size));
Victor Stinner742da042016-09-07 17:40:12 -0700514
515 usable = USABLE_FRACTION(size);
516 if (size <= 0xff) {
517 es = 1;
518 }
519 else if (size <= 0xffff) {
520 es = 2;
521 }
522#if SIZEOF_VOID_P > 4
523 else if (size <= 0xffffffff) {
524 es = 4;
525 }
526#endif
527 else {
528 es = sizeof(Py_ssize_t);
529 }
530
531 if (size == PyDict_MINSIZE && numfreekeys > 0) {
532 dk = keys_free_list[--numfreekeys];
533 }
534 else {
Victor Stinner98ee9d52016-09-08 09:33:56 -0700535 dk = PyObject_MALLOC(sizeof(PyDictKeysObject)
536 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
537 + es * size
538 + sizeof(PyDictKeyEntry) * usable);
Victor Stinner742da042016-09-07 17:40:12 -0700539 if (dk == NULL) {
540 PyErr_NoMemory();
541 return NULL;
542 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400543 }
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200544 DK_DEBUG_INCREF dk->dk_refcnt = 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400545 dk->dk_size = size;
Victor Stinner742da042016-09-07 17:40:12 -0700546 dk->dk_usable = usable;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400547 dk->dk_lookup = lookdict_unicode_nodummy;
Victor Stinner742da042016-09-07 17:40:12 -0700548 dk->dk_nentries = 0;
Benjamin Peterson186122e2016-09-08 12:20:12 -0700549 memset(&dk->dk_indices.as_1[0], 0xff, es * size);
Victor Stinner742da042016-09-07 17:40:12 -0700550 memset(DK_ENTRIES(dk), 0, sizeof(PyDictKeyEntry) * usable);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400551 return dk;
552}
553
554static void
555free_keys_object(PyDictKeysObject *keys)
556{
Victor Stinner742da042016-09-07 17:40:12 -0700557 PyDictKeyEntry *entries = DK_ENTRIES(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400558 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -0700559 for (i = 0, n = keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400560 Py_XDECREF(entries[i].me_key);
561 Py_XDECREF(entries[i].me_value);
562 }
Victor Stinner742da042016-09-07 17:40:12 -0700563 if (keys->dk_size == PyDict_MINSIZE && numfreekeys < PyDict_MAXFREELIST) {
564 keys_free_list[numfreekeys++] = keys;
565 return;
566 }
Raymond Hettingerce5179f2016-01-31 08:56:21 -0800567 PyObject_FREE(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400568}
569
570#define new_values(size) PyMem_NEW(PyObject *, size)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400571#define free_values(values) PyMem_FREE(values)
572
573/* Consumes a reference to the keys object */
574static PyObject *
575new_dict(PyDictKeysObject *keys, PyObject **values)
576{
577 PyDictObject *mp;
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200578 assert(keys != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 if (numfree) {
580 mp = free_list[--numfree];
581 assert (mp != NULL);
582 assert (Py_TYPE(mp) == &PyDict_Type);
583 _Py_NewReference((PyObject *)mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400585 else {
586 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
587 if (mp == NULL) {
588 DK_DECREF(keys);
589 free_values(values);
590 return NULL;
591 }
592 }
593 mp->ma_keys = keys;
594 mp->ma_values = values;
595 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -0700596 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +0200597 assert(_PyDict_CheckConsistency(mp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000599}
600
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400601/* Consumes a reference to the keys object */
602static PyObject *
603new_dict_with_shared_keys(PyDictKeysObject *keys)
604{
605 PyObject **values;
606 Py_ssize_t i, size;
607
Victor Stinner742da042016-09-07 17:40:12 -0700608 size = USABLE_FRACTION(DK_SIZE(keys));
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400609 values = new_values(size);
610 if (values == NULL) {
611 DK_DECREF(keys);
612 return PyErr_NoMemory();
613 }
614 for (i = 0; i < size; i++) {
615 values[i] = NULL;
616 }
617 return new_dict(keys, values);
618}
619
620PyObject *
621PyDict_New(void)
622{
Victor Stinner742da042016-09-07 17:40:12 -0700623 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200624 if (keys == NULL)
625 return NULL;
626 return new_dict(keys, NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400627}
628
Victor Stinner742da042016-09-07 17:40:12 -0700629/* Search index of hash table from offset of entry table */
630static Py_ssize_t
631lookdict_index(PyDictKeysObject *k, Py_hash_t hash, Py_ssize_t index)
632{
INADA Naoki267941c2016-10-06 15:19:07 +0900633 size_t i;
Victor Stinner742da042016-09-07 17:40:12 -0700634 size_t mask = DK_MASK(k);
635 Py_ssize_t ix;
636
637 i = (size_t)hash & mask;
638 ix = dk_get_index(k, i);
639 if (ix == index) {
640 return i;
641 }
642 if (ix == DKIX_EMPTY) {
643 return DKIX_EMPTY;
644 }
645
INADA Naoki267941c2016-10-06 15:19:07 +0900646 for (size_t perturb = hash;;) {
647 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700648 i = mask & ((i << 2) + i + perturb + 1);
649 ix = dk_get_index(k, i);
650 if (ix == index) {
651 return i;
652 }
653 if (ix == DKIX_EMPTY) {
654 return DKIX_EMPTY;
655 }
656 }
657 assert(0); /* NOT REACHED */
658 return DKIX_ERROR;
659}
660
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000661/*
662The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000663This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000664Open addressing is preferred over chaining since the link overhead for
665chaining would be substantial (100% with typical malloc overhead).
666
Tim Peterseb28ef22001-06-02 05:27:19 +0000667The initial probe index is computed as hash mod the table size. Subsequent
668probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000669
670All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000671
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000672The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000673contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000674Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000675
Victor Stinner742da042016-09-07 17:40:12 -0700676lookdict() is general-purpose, and may return DKIX_ERROR if (and only if) a
Victor Stinnera4348cc2016-09-08 12:01:25 -0700677comparison raises an exception.
Guido van Rossum89d8c602007-09-18 17:26:56 +0000678lookdict_unicode() below is specialized to string keys, comparison of which can
Victor Stinner742da042016-09-07 17:40:12 -0700679never raise an exception; that function can never return DKIX_ERROR.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400680lookdict_unicode_nodummy is further specialized for string keys that cannot be
681the <dummy> value.
Victor Stinner742da042016-09-07 17:40:12 -0700682For both, when the key isn't found a DKIX_EMPTY is returned. hashpos returns
683where the key index should be inserted.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000684*/
Victor Stinner742da042016-09-07 17:40:12 -0700685static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400686lookdict(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700687 Py_hash_t hash, PyObject ***value_addr, Py_ssize_t *hashpos)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000688{
INADA Naoki267941c2016-10-06 15:19:07 +0900689 size_t i, mask;
Victor Stinner742da042016-09-07 17:40:12 -0700690 Py_ssize_t ix, freeslot;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200691 int cmp;
Victor Stinner742da042016-09-07 17:40:12 -0700692 PyDictKeysObject *dk;
693 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000695
Antoine Pitrou9a234902012-05-13 20:48:01 +0200696top:
Victor Stinner742da042016-09-07 17:40:12 -0700697 dk = mp->ma_keys;
698 mask = DK_MASK(dk);
699 ep0 = DK_ENTRIES(dk);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700701
702 ix = dk_get_index(dk, i);
703 if (ix == DKIX_EMPTY) {
704 if (hashpos != NULL)
705 *hashpos = i;
706 *value_addr = NULL;
707 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400708 }
Victor Stinner742da042016-09-07 17:40:12 -0700709 if (ix == DKIX_DUMMY) {
710 freeslot = i;
711 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 else {
Victor Stinner742da042016-09-07 17:40:12 -0700713 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300714 assert(ep->me_key != NULL);
Victor Stinner742da042016-09-07 17:40:12 -0700715 if (ep->me_key == key) {
716 *value_addr = &ep->me_value;
717 if (hashpos != NULL)
718 *hashpos = i;
719 return ix;
720 }
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300721 if (ep->me_hash == hash) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 startkey = ep->me_key;
723 Py_INCREF(startkey);
724 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
725 Py_DECREF(startkey);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200726 if (cmp < 0) {
727 *value_addr = NULL;
Victor Stinner742da042016-09-07 17:40:12 -0700728 return DKIX_ERROR;
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200729 }
Victor Stinner742da042016-09-07 17:40:12 -0700730 if (dk == mp->ma_keys && ep->me_key == startkey) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400731 if (cmp > 0) {
732 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700733 if (hashpos != NULL)
734 *hashpos = i;
735 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400736 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 }
738 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200739 /* The dict was mutated, restart */
740 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 }
742 }
Victor Stinner742da042016-09-07 17:40:12 -0700743 freeslot = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 }
Tim Peters15d49292001-05-27 07:39:22 +0000745
INADA Naoki267941c2016-10-06 15:19:07 +0900746 for (size_t perturb = hash;;) {
747 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700748 i = ((i << 2) + i + perturb + 1) & mask;
749 ix = dk_get_index(dk, i);
750 if (ix == DKIX_EMPTY) {
751 if (hashpos != NULL) {
752 *hashpos = (freeslot == -1) ? (Py_ssize_t)i : freeslot;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400753 }
Victor Stinner742da042016-09-07 17:40:12 -0700754 *value_addr = NULL;
755 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400756 }
Victor Stinner742da042016-09-07 17:40:12 -0700757 if (ix == DKIX_DUMMY) {
758 if (freeslot == -1)
759 freeslot = i;
760 continue;
761 }
762 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300763 assert(ep->me_key != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400764 if (ep->me_key == key) {
Victor Stinner742da042016-09-07 17:40:12 -0700765 if (hashpos != NULL) {
766 *hashpos = i;
767 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400768 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700769 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400770 }
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300771 if (ep->me_hash == hash) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 startkey = ep->me_key;
773 Py_INCREF(startkey);
774 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
775 Py_DECREF(startkey);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400776 if (cmp < 0) {
777 *value_addr = NULL;
Victor Stinner742da042016-09-07 17:40:12 -0700778 return DKIX_ERROR;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400779 }
Victor Stinner742da042016-09-07 17:40:12 -0700780 if (dk == mp->ma_keys && ep->me_key == startkey) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400781 if (cmp > 0) {
Victor Stinner742da042016-09-07 17:40:12 -0700782 if (hashpos != NULL) {
783 *hashpos = i;
784 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400785 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700786 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400787 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 }
789 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200790 /* The dict was mutated, restart */
791 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 }
793 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 }
795 assert(0); /* NOT REACHED */
796 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000797}
798
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400799/* Specialized version for string-only keys */
Victor Stinner742da042016-09-07 17:40:12 -0700800static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400801lookdict_unicode(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700802 Py_hash_t hash, PyObject ***value_addr, Py_ssize_t *hashpos)
Fred Drake1bff34a2000-08-31 19:31:38 +0000803{
INADA Naoki267941c2016-10-06 15:19:07 +0900804 size_t i;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200805 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700806 Py_ssize_t ix, freeslot;
807 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Fred Drake1bff34a2000-08-31 19:31:38 +0000808
Victor Stinner742da042016-09-07 17:40:12 -0700809 assert(mp->ma_values == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 /* Make sure this function doesn't have to handle non-unicode keys,
811 including subclasses of str; e.g., one reason to subclass
812 unicodes is to override __eq__, and for speed we don't cater to
813 that here. */
814 if (!PyUnicode_CheckExact(key)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400815 mp->ma_keys->dk_lookup = lookdict;
Victor Stinner742da042016-09-07 17:40:12 -0700816 return lookdict(mp, key, hash, value_addr, hashpos);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100818 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700819 ix = dk_get_index(mp->ma_keys, i);
820 if (ix == DKIX_EMPTY) {
821 if (hashpos != NULL)
822 *hashpos = i;
823 *value_addr = NULL;
824 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400825 }
Victor Stinner742da042016-09-07 17:40:12 -0700826 if (ix == DKIX_DUMMY) {
827 freeslot = i;
828 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 else {
Victor Stinner742da042016-09-07 17:40:12 -0700830 ep = &ep0[ix];
Victor Stinner742da042016-09-07 17:40:12 -0700831 assert(ep->me_key != NULL);
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300832 if (ep->me_key == key
833 || (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700834 if (hashpos != NULL)
835 *hashpos = i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400836 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700837 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400838 }
Victor Stinner742da042016-09-07 17:40:12 -0700839 freeslot = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 }
Tim Peters15d49292001-05-27 07:39:22 +0000841
INADA Naoki267941c2016-10-06 15:19:07 +0900842 for (size_t perturb = hash;;) {
843 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700844 i = mask & ((i << 2) + i + perturb + 1);
845 ix = dk_get_index(mp->ma_keys, i);
846 if (ix == DKIX_EMPTY) {
847 if (hashpos != NULL) {
848 *hashpos = (freeslot == -1) ? (Py_ssize_t)i : freeslot;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400849 }
Victor Stinner742da042016-09-07 17:40:12 -0700850 *value_addr = NULL;
851 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400852 }
Victor Stinner742da042016-09-07 17:40:12 -0700853 if (ix == DKIX_DUMMY) {
854 if (freeslot == -1)
855 freeslot = i;
856 continue;
857 }
858 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300859 assert(ep->me_key != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 if (ep->me_key == key
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300861 || (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400862 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700863 if (hashpos != NULL) {
864 *hashpos = i;
865 }
866 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 }
869 assert(0); /* NOT REACHED */
870 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000871}
872
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400873/* Faster version of lookdict_unicode when it is known that no <dummy> keys
874 * will be present. */
Victor Stinner742da042016-09-07 17:40:12 -0700875static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400876lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700877 Py_hash_t hash, PyObject ***value_addr,
878 Py_ssize_t *hashpos)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400879{
INADA Naoki267941c2016-10-06 15:19:07 +0900880 size_t i;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200881 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700882 Py_ssize_t ix;
883 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400884
Victor Stinner742da042016-09-07 17:40:12 -0700885 assert(mp->ma_values == NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400886 /* Make sure this function doesn't have to handle non-unicode keys,
887 including subclasses of str; e.g., one reason to subclass
888 unicodes is to override __eq__, and for speed we don't cater to
889 that here. */
890 if (!PyUnicode_CheckExact(key)) {
891 mp->ma_keys->dk_lookup = lookdict;
Victor Stinner742da042016-09-07 17:40:12 -0700892 return lookdict(mp, key, hash, value_addr, hashpos);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400893 }
894 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700895 ix = dk_get_index(mp->ma_keys, i);
896 assert (ix != DKIX_DUMMY);
897 if (ix == DKIX_EMPTY) {
898 if (hashpos != NULL)
899 *hashpos = i;
900 *value_addr = NULL;
901 return DKIX_EMPTY;
902 }
903 ep = &ep0[ix];
Victor Stinnerdee6e252016-09-08 11:16:07 -0700904 assert(ep->me_key != NULL);
905 assert(PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700906 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400907 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700908 if (hashpos != NULL)
909 *hashpos = i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400910 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700911 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400912 }
INADA Naoki267941c2016-10-06 15:19:07 +0900913 for (size_t perturb = hash;;) {
914 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700915 i = mask & ((i << 2) + i + perturb + 1);
916 ix = dk_get_index(mp->ma_keys, i);
917 assert (ix != DKIX_DUMMY);
918 if (ix == DKIX_EMPTY) {
919 if (hashpos != NULL)
920 *hashpos = i;
921 *value_addr = NULL;
922 return DKIX_EMPTY;
923 }
924 ep = &ep0[ix];
925 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
926 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400927 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700928 if (hashpos != NULL)
929 *hashpos = i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400930 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700931 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400932 }
933 }
934 assert(0); /* NOT REACHED */
935 return 0;
936}
937
938/* Version of lookdict for split tables.
939 * All split tables and only split tables use this lookup function.
940 * Split tables only contain unicode keys and no dummy keys,
941 * so algorithm is the same as lookdict_unicode_nodummy.
942 */
Victor Stinner742da042016-09-07 17:40:12 -0700943static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400944lookdict_split(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700945 Py_hash_t hash, PyObject ***value_addr, Py_ssize_t *hashpos)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400946{
INADA Naoki267941c2016-10-06 15:19:07 +0900947 size_t i;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200948 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700949 Py_ssize_t ix;
950 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400951
Victor Stinner742da042016-09-07 17:40:12 -0700952 /* mp must split table */
953 assert(mp->ma_values != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400954 if (!PyUnicode_CheckExact(key)) {
Victor Stinner742da042016-09-07 17:40:12 -0700955 ix = lookdict(mp, key, hash, value_addr, hashpos);
956 if (ix >= 0) {
957 *value_addr = &mp->ma_values[ix];
958 }
959 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400960 }
Victor Stinner742da042016-09-07 17:40:12 -0700961
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400962 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700963 ix = dk_get_index(mp->ma_keys, i);
964 if (ix == DKIX_EMPTY) {
965 if (hashpos != NULL)
966 *hashpos = i;
967 *value_addr = NULL;
968 return DKIX_EMPTY;
969 }
970 assert(ix >= 0);
971 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300972 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700973 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400974 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700975 if (hashpos != NULL)
976 *hashpos = i;
977 *value_addr = &mp->ma_values[ix];
978 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400979 }
INADA Naoki267941c2016-10-06 15:19:07 +0900980 for (size_t perturb = hash;;) {
981 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700982 i = mask & ((i << 2) + i + perturb + 1);
983 ix = dk_get_index(mp->ma_keys, i);
984 if (ix == DKIX_EMPTY) {
985 if (hashpos != NULL)
986 *hashpos = i;
987 *value_addr = NULL;
988 return DKIX_EMPTY;
989 }
990 assert(ix >= 0);
991 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300992 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700993 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400994 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700995 if (hashpos != NULL)
996 *hashpos = i;
997 *value_addr = &mp->ma_values[ix];
998 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400999 }
1000 }
1001 assert(0); /* NOT REACHED */
1002 return 0;
1003}
1004
Benjamin Petersonfb886362010-04-24 18:21:17 +00001005int
1006_PyDict_HasOnlyStringKeys(PyObject *dict)
1007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 Py_ssize_t pos = 0;
1009 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +00001010 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 /* Shortcut */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001012 if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 return 1;
1014 while (PyDict_Next(dict, &pos, &key, &value))
1015 if (!PyUnicode_Check(key))
1016 return 0;
1017 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +00001018}
1019
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001020#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 do { \
1022 if (!_PyObject_GC_IS_TRACKED(mp)) { \
1023 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
1024 _PyObject_GC_MAY_BE_TRACKED(value)) { \
1025 _PyObject_GC_TRACK(mp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 } \
1027 } \
1028 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001029
1030void
1031_PyDict_MaybeUntrack(PyObject *op)
1032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 PyDictObject *mp;
1034 PyObject *value;
Victor Stinner742da042016-09-07 17:40:12 -07001035 Py_ssize_t i, numentries;
1036 PyDictKeyEntry *ep0;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
1039 return;
1040
1041 mp = (PyDictObject *) op;
Victor Stinner742da042016-09-07 17:40:12 -07001042 ep0 = DK_ENTRIES(mp->ma_keys);
1043 numentries = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001044 if (_PyDict_HasSplitTable(mp)) {
Victor Stinner742da042016-09-07 17:40:12 -07001045 for (i = 0; i < numentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001046 if ((value = mp->ma_values[i]) == NULL)
1047 continue;
1048 if (_PyObject_GC_MAY_BE_TRACKED(value)) {
Victor Stinner742da042016-09-07 17:40:12 -07001049 assert(!_PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001050 return;
1051 }
1052 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001054 else {
Victor Stinner742da042016-09-07 17:40:12 -07001055 for (i = 0; i < numentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001056 if ((value = ep0[i].me_value) == NULL)
1057 continue;
1058 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
1059 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
1060 return;
1061 }
1062 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001064}
1065
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001066/* Internal function to find slot for an item from its hash
Victor Stinner3c336c52016-09-12 14:17:40 +02001067 when it is known that the key is not present in the dict.
1068
1069 The dict must be combined. */
Victor Stinner99264802016-09-13 09:38:29 +02001070static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001071find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Victor Stinner742da042016-09-07 17:40:12 -07001072 PyObject ***value_addr, Py_ssize_t *hashpos)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001073{
INADA Naoki267941c2016-10-06 15:19:07 +09001074 size_t i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001075 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07001076 Py_ssize_t ix;
1077 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001078
Victor Stinner3c336c52016-09-12 14:17:40 +02001079 assert(!_PyDict_HasSplitTable(mp));
Victor Stinner742da042016-09-07 17:40:12 -07001080 assert(hashpos != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001081 assert(key != NULL);
Victor Stinner3c336c52016-09-12 14:17:40 +02001082
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001083 if (!PyUnicode_CheckExact(key))
1084 mp->ma_keys->dk_lookup = lookdict;
1085 i = hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -07001086 ix = dk_get_index(mp->ma_keys, i);
INADA Naoki267941c2016-10-06 15:19:07 +09001087 for (size_t perturb = hash; ix != DKIX_EMPTY;) {
1088 perturb >>= PERTURB_SHIFT;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001089 i = (i << 2) + i + perturb + 1;
Victor Stinner742da042016-09-07 17:40:12 -07001090 ix = dk_get_index(mp->ma_keys, i & mask);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 }
Victor Stinner742da042016-09-07 17:40:12 -07001092 ep = &ep0[mp->ma_keys->dk_nentries];
1093 *hashpos = i & mask;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001094 assert(ep->me_value == NULL);
Victor Stinner99264802016-09-13 09:38:29 +02001095 *value_addr = &ep->me_value;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001096}
1097
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001098static int
1099insertion_resize(PyDictObject *mp)
1100{
Raymond Hettinger36f74aa2013-05-17 03:01:13 -07001101 return dictresize(mp, GROWTH_RATE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001102}
Antoine Pitroue965d972012-02-27 00:45:12 +01001103
1104/*
1105Internal routine to insert a new item into the table.
1106Used both by the internal resize routine and by the public insert routine.
Antoine Pitroue965d972012-02-27 00:45:12 +01001107Returns -1 if an error occurred, or 0 on success.
1108*/
1109static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001110insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001111{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001112 PyObject *old_value;
1113 PyObject **value_addr;
Victor Stinner742da042016-09-07 17:40:12 -07001114 PyDictKeyEntry *ep, *ep0;
1115 Py_ssize_t hashpos, ix;
Antoine Pitroue965d972012-02-27 00:45:12 +01001116
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001117 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
1118 if (insertion_resize(mp) < 0)
1119 return -1;
1120 }
1121
Victor Stinner742da042016-09-07 17:40:12 -07001122 ix = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr, &hashpos);
1123 if (ix == DKIX_ERROR) {
Antoine Pitroue965d972012-02-27 00:45:12 +01001124 return -1;
1125 }
Victor Stinner742da042016-09-07 17:40:12 -07001126
Antoine Pitroud6967322014-10-18 00:35:00 +02001127 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
Benjamin Petersona6f195e2012-04-30 10:23:40 -04001128 Py_INCREF(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001129 MAINTAIN_TRACKING(mp, key, value);
Victor Stinner742da042016-09-07 17:40:12 -07001130
1131 /* When insertion order is different from shared key, we can't share
1132 * the key anymore. Convert this instance to combine table.
1133 */
1134 if (_PyDict_HasSplitTable(mp) &&
1135 ((ix >= 0 && *value_addr == NULL && mp->ma_used != ix) ||
1136 (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {
1137 if (insertion_resize(mp) < 0) {
1138 Py_DECREF(value);
1139 return -1;
1140 }
1141 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
1142 ix = DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001143 }
Victor Stinner742da042016-09-07 17:40:12 -07001144
1145 if (ix == DKIX_EMPTY) {
1146 /* Insert into new slot. */
1147 if (mp->ma_keys->dk_usable <= 0) {
1148 /* Need to resize. */
1149 if (insertion_resize(mp) < 0) {
1150 Py_DECREF(value);
1151 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001152 }
Victor Stinner742da042016-09-07 17:40:12 -07001153 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
1154 }
1155 ep0 = DK_ENTRIES(mp->ma_keys);
1156 ep = &ep0[mp->ma_keys->dk_nentries];
1157 dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
1158 Py_INCREF(key);
1159 ep->me_key = key;
1160 ep->me_hash = hash;
1161 if (mp->ma_values) {
1162 assert (mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
1163 mp->ma_values[mp->ma_keys->dk_nentries] = value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001164 }
1165 else {
Victor Stinner742da042016-09-07 17:40:12 -07001166 ep->me_value = value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001167 }
1168 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001169 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07001170 mp->ma_keys->dk_usable--;
1171 mp->ma_keys->dk_nentries++;
1172 assert(mp->ma_keys->dk_usable >= 0);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001173 assert(_PyDict_CheckConsistency(mp));
Victor Stinner742da042016-09-07 17:40:12 -07001174 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001175 }
Victor Stinner742da042016-09-07 17:40:12 -07001176
1177 assert(value_addr != NULL);
1178
1179 old_value = *value_addr;
1180 if (old_value != NULL) {
1181 *value_addr = value;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001182 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02001183 assert(_PyDict_CheckConsistency(mp));
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001184
Victor Stinner742da042016-09-07 17:40:12 -07001185 Py_DECREF(old_value); /* which **CAN** re-enter (see issue #22653) */
1186 return 0;
1187 }
1188
1189 /* pending state */
1190 assert(_PyDict_HasSplitTable(mp));
1191 assert(ix == mp->ma_used);
1192 *value_addr = value;
1193 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001194 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02001195 assert(_PyDict_CheckConsistency(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001196 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +01001197}
1198
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001199/*
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001200Internal routine used by dictresize() to insert an item which is
1201known to be absent from the dict. This routine also assumes that
1202the dict contains no deleted entries. Besides the performance benefit,
1203using insertdict() in dictresize() is dangerous (SF bug #1456209).
1204Note that no refcounts are changed by this routine; if needed, the caller
1205is responsible for incref'ing `key` and `value`.
1206Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
1207must set them correctly
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001208*/
1209static void
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001210insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
1211 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001212{
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001213 size_t i;
1214 PyDictKeysObject *k = mp->ma_keys;
1215 size_t mask = (size_t)DK_SIZE(k)-1;
1216 PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys);
1217 PyDictKeyEntry *ep;
1218
1219 assert(k->dk_lookup != NULL);
1220 assert(value != NULL);
1221 assert(key != NULL);
1222 assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
1223 i = hash & mask;
1224 for (size_t perturb = hash; dk_get_index(k, i) != DKIX_EMPTY;) {
1225 perturb >>= PERTURB_SHIFT;
1226 i = mask & ((i << 2) + i + perturb + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 }
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001228 ep = &ep0[k->dk_nentries];
1229 assert(ep->me_value == NULL);
1230 dk_set_index(k, i, k->dk_nentries);
1231 k->dk_nentries++;
1232 ep->me_key = key;
1233 ep->me_hash = hash;
1234 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001235}
1236
1237/*
1238Restructure the table by allocating a new table and reinserting all
1239items again. When entries have been deleted, the new table may
1240actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001241If a table is split (its keys and hashes are shared, its values are not),
1242then the values are temporarily copied into the table, it is resized as
1243a combined table, then the me_value slots in the old table are NULLed out.
1244After resizing a table is always combined,
1245but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001246*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001247static int
Victor Stinner3d3f2642016-12-15 17:21:23 +01001248dictresize(PyDictObject *mp, Py_ssize_t minsize)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001249{
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001250 Py_ssize_t i, newsize;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001251 PyDictKeysObject *oldkeys;
1252 PyObject **oldvalues;
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001253 PyDictKeyEntry *ep0;
Tim Peters91a364d2001-05-19 07:04:38 +00001254
Victor Stinner742da042016-09-07 17:40:12 -07001255 /* Find the smallest table size > minused. */
1256 for (newsize = PyDict_MINSIZE;
Victor Stinner3d3f2642016-12-15 17:21:23 +01001257 newsize < minsize && newsize > 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 newsize <<= 1)
1259 ;
1260 if (newsize <= 0) {
1261 PyErr_NoMemory();
1262 return -1;
1263 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001264 oldkeys = mp->ma_keys;
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001265 oldvalues = mp->ma_values;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001266 /* Allocate a new table. */
1267 mp->ma_keys = new_keys_object(newsize);
1268 if (mp->ma_keys == NULL) {
1269 mp->ma_keys = oldkeys;
1270 return -1;
1271 }
Victor Stinner3d3f2642016-12-15 17:21:23 +01001272 // New table must be large enough.
1273 assert(mp->ma_keys->dk_usable >= mp->ma_used);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001274 if (oldkeys->dk_lookup == lookdict)
1275 mp->ma_keys->dk_lookup = lookdict;
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001276 mp->ma_values = NULL;
1277 ep0 = DK_ENTRIES(oldkeys);
1278 /* Main loop below assumes we can transfer refcount to new keys
1279 * and that value is stored in me_value.
1280 * Increment ref-counts and copy values here to compensate
1281 * This (resizing a split table) should be relatively rare */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001282 if (oldvalues != NULL) {
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001283 for (i = 0; i < oldkeys->dk_nentries; i++) {
1284 if (oldvalues[i] != NULL) {
1285 Py_INCREF(ep0[i].me_key);
1286 ep0[i].me_value = oldvalues[i];
1287 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 }
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001289 }
1290 /* Main loop */
1291 for (i = 0; i < oldkeys->dk_nentries; i++) {
1292 PyDictKeyEntry *ep = &ep0[i];
1293 if (ep->me_value != NULL) {
1294 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
1295 }
1296 }
1297 mp->ma_keys->dk_usable -= mp->ma_used;
1298 if (oldvalues != NULL) {
1299 /* NULL out me_value slot in oldkeys, in case it was shared */
1300 for (i = 0; i < oldkeys->dk_nentries; i++)
1301 ep0[i].me_value = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001302 DK_DECREF(oldkeys);
Victor Stinner742da042016-09-07 17:40:12 -07001303 if (oldvalues != empty_values) {
1304 free_values(oldvalues);
1305 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001306 }
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001307 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001308 assert(oldkeys->dk_lookup != lookdict_split);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001309 assert(oldkeys->dk_refcnt == 1);
Serhiy Storchaka7f0514a2016-10-31 20:14:05 +02001310 DK_DEBUG_DECREF PyObject_FREE(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001311 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001313}
1314
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001315/* Returns NULL if unable to split table.
1316 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001317static PyDictKeysObject *
1318make_keys_shared(PyObject *op)
1319{
1320 Py_ssize_t i;
1321 Py_ssize_t size;
1322 PyDictObject *mp = (PyDictObject *)op;
1323
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001324 if (!PyDict_CheckExact(op))
1325 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001326 if (!_PyDict_HasSplitTable(mp)) {
1327 PyDictKeyEntry *ep0;
1328 PyObject **values;
1329 assert(mp->ma_keys->dk_refcnt == 1);
1330 if (mp->ma_keys->dk_lookup == lookdict) {
1331 return NULL;
1332 }
1333 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
1334 /* Remove dummy keys */
1335 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
1336 return NULL;
1337 }
1338 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
1339 /* Copy values into a new array */
Victor Stinner742da042016-09-07 17:40:12 -07001340 ep0 = DK_ENTRIES(mp->ma_keys);
1341 size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001342 values = new_values(size);
1343 if (values == NULL) {
1344 PyErr_SetString(PyExc_MemoryError,
1345 "Not enough memory to allocate new values array");
1346 return NULL;
1347 }
1348 for (i = 0; i < size; i++) {
1349 values[i] = ep0[i].me_value;
1350 ep0[i].me_value = NULL;
1351 }
1352 mp->ma_keys->dk_lookup = lookdict_split;
1353 mp->ma_values = values;
1354 }
1355 DK_INCREF(mp->ma_keys);
1356 return mp->ma_keys;
1357}
Christian Heimes99170a52007-12-19 02:07:34 +00001358
1359PyObject *
1360_PyDict_NewPresized(Py_ssize_t minused)
1361{
INADA Naoki2c5a8302016-12-07 18:34:44 +09001362 const Py_ssize_t max_presize = 128 * 1024;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001363 Py_ssize_t newsize;
1364 PyDictKeysObject *new_keys;
INADA Naoki2c5a8302016-12-07 18:34:44 +09001365
1366 /* There are no strict guarantee that returned dict can contain minused
1367 * items without resize. So we create medium size dict instead of very
1368 * large dict or MemoryError.
1369 */
1370 if (minused > USABLE_FRACTION(max_presize)) {
1371 newsize = max_presize;
1372 }
1373 else {
1374 Py_ssize_t minsize = ESTIMATE_SIZE(minused);
1375 newsize = PyDict_MINSIZE;
1376 while (newsize < minsize) {
1377 newsize <<= 1;
1378 }
1379 }
1380 assert(IS_POWER_OF_2(newsize));
1381
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001382 new_keys = new_keys_object(newsize);
1383 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001385 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001386}
1387
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001388/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1389 * that may occur (originally dicts supported only string keys, and exceptions
1390 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001391 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001392 * (suppressed) occurred while computing the key's hash, or that some error
1393 * (suppressed) occurred when comparing keys in the dict's internal probe
1394 * sequence. A nasty example of the latter is when a Python-coded comparison
1395 * function hits a stack-depth error, which can cause this to return NULL
1396 * even if the key is present.
1397 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001399PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001400{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001401 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001402 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 PyDictObject *mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001405 PyObject **value_addr;
1406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 if (!PyDict_Check(op))
1408 return NULL;
1409 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001410 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 {
1412 hash = PyObject_Hash(key);
1413 if (hash == -1) {
1414 PyErr_Clear();
1415 return NULL;
1416 }
1417 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 /* We can arrive here with a NULL tstate during initialization: try
1420 running "python -Wi" for an example related to string interning.
1421 Let's just hope that no exception occurs then... This must be
1422 _PyThreadState_Current and not PyThreadState_GET() because in debug
1423 mode, the latter complains if tstate is NULL. */
Victor Stinnerbfd316e2016-01-20 11:12:38 +01001424 tstate = _PyThreadState_UncheckedGet();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 if (tstate != NULL && tstate->curexc_type != NULL) {
1426 /* preserve the existing exception */
1427 PyObject *err_type, *err_value, *err_tb;
1428 PyErr_Fetch(&err_type, &err_value, &err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001429 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 /* ignore errors */
1431 PyErr_Restore(err_type, err_value, err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001432 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 return NULL;
1434 }
1435 else {
Victor Stinner742da042016-09-07 17:40:12 -07001436 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1437 if (ix < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 PyErr_Clear();
1439 return NULL;
1440 }
1441 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001442 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001443}
1444
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001445/* Same as PyDict_GetItemWithError() but with hash supplied by caller.
1446 This returns NULL *with* an exception set if an exception occurred.
1447 It returns NULL *without* an exception set if the key wasn't present.
1448*/
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001449PyObject *
1450_PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1451{
Victor Stinner742da042016-09-07 17:40:12 -07001452 Py_ssize_t ix;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001453 PyDictObject *mp = (PyDictObject *)op;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001454 PyObject **value_addr;
1455
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001456 if (!PyDict_Check(op)) {
1457 PyErr_BadInternalCall();
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001458 return NULL;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001459 }
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001460
1461 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1462 if (ix < 0) {
1463 return NULL;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001464 }
1465 return *value_addr;
1466}
1467
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001468/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1469 This returns NULL *with* an exception set if an exception occurred.
1470 It returns NULL *without* an exception set if the key wasn't present.
1471*/
1472PyObject *
1473PyDict_GetItemWithError(PyObject *op, PyObject *key)
1474{
Victor Stinner742da042016-09-07 17:40:12 -07001475 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001476 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001478 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 if (!PyDict_Check(op)) {
1481 PyErr_BadInternalCall();
1482 return NULL;
1483 }
1484 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001485 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 {
1487 hash = PyObject_Hash(key);
1488 if (hash == -1) {
1489 return NULL;
1490 }
1491 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001492
Victor Stinner742da042016-09-07 17:40:12 -07001493 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1494 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001496 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001497}
1498
Brett Cannonfd074152012-04-14 14:10:13 -04001499PyObject *
1500_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1501{
1502 PyObject *kv;
1503 kv = _PyUnicode_FromId(key); /* borrowed */
1504 if (kv == NULL)
1505 return NULL;
1506 return PyDict_GetItemWithError(dp, kv);
1507}
1508
Victor Stinnerb4efc962015-11-20 09:24:02 +01001509/* Fast version of global value lookup (LOAD_GLOBAL).
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001510 * Lookup in globals, then builtins.
Victor Stinnerb4efc962015-11-20 09:24:02 +01001511 *
1512 * Raise an exception and return NULL if an error occurred (ex: computing the
1513 * key hash failed, key comparison failed, ...). Return NULL if the key doesn't
1514 * exist. Return the value if the key exists.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001515 */
1516PyObject *
1517_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001518{
Victor Stinner742da042016-09-07 17:40:12 -07001519 Py_ssize_t ix;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001520 Py_hash_t hash;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001521 PyObject **value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001522
1523 if (!PyUnicode_CheckExact(key) ||
1524 (hash = ((PyASCIIObject *) key)->hash) == -1)
1525 {
1526 hash = PyObject_Hash(key);
1527 if (hash == -1)
1528 return NULL;
Antoine Pitroue965d972012-02-27 00:45:12 +01001529 }
Victor Stinnerb4efc962015-11-20 09:24:02 +01001530
1531 /* namespace 1: globals */
Victor Stinner742da042016-09-07 17:40:12 -07001532 ix = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr, NULL);
1533 if (ix == DKIX_ERROR)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001534 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001535 if (ix != DKIX_EMPTY && *value_addr != NULL)
1536 return *value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001537
1538 /* namespace 2: builtins */
Victor Stinner742da042016-09-07 17:40:12 -07001539 ix = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr, NULL);
1540 if (ix < 0)
Victor Stinnerb4efc962015-11-20 09:24:02 +01001541 return NULL;
1542 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001543}
1544
Antoine Pitroue965d972012-02-27 00:45:12 +01001545/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1546 * dictionary if it's merely replacing the value for an existing key.
1547 * This means that it's safe to loop over a dictionary with PyDict_Next()
1548 * and occasionally replace a value -- but you can't insert new keys or
1549 * remove them.
1550 */
1551int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001552PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001553{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001554 PyDictObject *mp;
1555 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001556 if (!PyDict_Check(op)) {
1557 PyErr_BadInternalCall();
1558 return -1;
1559 }
1560 assert(key);
1561 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001562 mp = (PyDictObject *)op;
1563 if (!PyUnicode_CheckExact(key) ||
1564 (hash = ((PyASCIIObject *) key)->hash) == -1)
1565 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001566 hash = PyObject_Hash(key);
1567 if (hash == -1)
1568 return -1;
1569 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001570
1571 /* insertdict() handles any resizing that might be necessary */
1572 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001573}
1574
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001575int
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001576_PyDict_SetItem_KnownHash(PyObject *op, PyObject *key, PyObject *value,
1577 Py_hash_t hash)
1578{
1579 PyDictObject *mp;
1580
1581 if (!PyDict_Check(op)) {
1582 PyErr_BadInternalCall();
1583 return -1;
1584 }
1585 assert(key);
1586 assert(value);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001587 assert(hash != -1);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001588 mp = (PyDictObject *)op;
1589
1590 /* insertdict() handles any resizing that might be necessary */
1591 return insertdict(mp, key, hash, value);
1592}
1593
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001594static int
Antoine Pitroud741ed42016-12-27 14:23:43 +01001595delitem_common(PyDictObject *mp, Py_ssize_t hashpos, Py_ssize_t ix,
1596 PyObject **value_addr)
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001597{
1598 PyObject *old_key, *old_value;
Antoine Pitroud741ed42016-12-27 14:23:43 +01001599 PyDictKeyEntry *ep;
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001600
1601 old_value = *value_addr;
Antoine Pitroud741ed42016-12-27 14:23:43 +01001602 assert(old_value != NULL);
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001603 *value_addr = NULL;
1604 mp->ma_used--;
Antoine Pitroud741ed42016-12-27 14:23:43 +01001605 mp->ma_version_tag = DICT_NEXT_VERSION();
1606 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1607 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1608 ENSURE_ALLOWS_DELETIONS(mp);
1609 old_key = ep->me_key;
1610 ep->me_key = NULL;
1611 Py_DECREF(old_key);
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001612 Py_DECREF(old_value);
Antoine Pitroud741ed42016-12-27 14:23:43 +01001613
1614 assert(_PyDict_CheckConsistency(mp));
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001615 return 0;
1616}
1617
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001618int
Tim Peters1f5871e2000-07-04 17:44:48 +00001619PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001620{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001621 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 assert(key);
1623 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001624 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 hash = PyObject_Hash(key);
1626 if (hash == -1)
1627 return -1;
1628 }
Victor Stinner742da042016-09-07 17:40:12 -07001629
1630 return _PyDict_DelItem_KnownHash(op, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001631}
1632
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001633int
1634_PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1635{
Victor Stinner742da042016-09-07 17:40:12 -07001636 Py_ssize_t hashpos, ix;
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001637 PyDictObject *mp;
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001638 PyObject **value_addr;
1639
1640 if (!PyDict_Check(op)) {
1641 PyErr_BadInternalCall();
1642 return -1;
1643 }
1644 assert(key);
1645 assert(hash != -1);
1646 mp = (PyDictObject *)op;
Victor Stinner742da042016-09-07 17:40:12 -07001647 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1648 if (ix == DKIX_ERROR)
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001649 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07001650 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001651 _PyErr_SetKeyError(key);
1652 return -1;
1653 }
Victor Stinner742da042016-09-07 17:40:12 -07001654 assert(dk_get_index(mp->ma_keys, hashpos) == ix);
Victor Stinner78601a32016-09-09 19:28:36 -07001655
1656 // Split table doesn't allow deletion. Combine it.
1657 if (_PyDict_HasSplitTable(mp)) {
1658 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1659 return -1;
1660 }
1661 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1662 assert(ix >= 0);
1663 }
Antoine Pitroud741ed42016-12-27 14:23:43 +01001664 return delitem_common(mp, hashpos, ix, value_addr);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001665}
1666
Antoine Pitroud741ed42016-12-27 14:23:43 +01001667/* This function promises that the predicate -> deletion sequence is atomic
1668 * (i.e. protected by the GIL), assuming the predicate itself doesn't
1669 * release the GIL.
1670 */
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001671int
1672_PyDict_DelItemIf(PyObject *op, PyObject *key,
1673 int (*predicate)(PyObject *value))
1674{
Antoine Pitroud741ed42016-12-27 14:23:43 +01001675 Py_ssize_t hashpos, ix;
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001676 PyDictObject *mp;
1677 Py_hash_t hash;
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001678 PyObject **value_addr;
1679 int res;
1680
1681 if (!PyDict_Check(op)) {
1682 PyErr_BadInternalCall();
1683 return -1;
1684 }
1685 assert(key);
1686 hash = PyObject_Hash(key);
1687 if (hash == -1)
1688 return -1;
1689 mp = (PyDictObject *)op;
Antoine Pitroud741ed42016-12-27 14:23:43 +01001690 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1691 if (ix == DKIX_ERROR)
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001692 return -1;
Antoine Pitroud741ed42016-12-27 14:23:43 +01001693 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001694 _PyErr_SetKeyError(key);
1695 return -1;
1696 }
Antoine Pitroud741ed42016-12-27 14:23:43 +01001697 assert(dk_get_index(mp->ma_keys, hashpos) == ix);
1698
1699 // Split table doesn't allow deletion. Combine it.
1700 if (_PyDict_HasSplitTable(mp)) {
1701 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1702 return -1;
1703 }
1704 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1705 assert(ix >= 0);
1706 }
1707
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001708 res = predicate(*value_addr);
1709 if (res == -1)
1710 return -1;
1711 if (res > 0)
Antoine Pitroud741ed42016-12-27 14:23:43 +01001712 return delitem_common(mp, hashpos, ix, value_addr);
Antoine Pitroue10ca3a2016-12-27 14:19:20 +01001713 else
1714 return 0;
1715}
1716
1717
Guido van Rossum25831651993-05-19 14:50:45 +00001718void
Tim Peters1f5871e2000-07-04 17:44:48 +00001719PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001722 PyDictKeysObject *oldkeys;
1723 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 if (!PyDict_Check(op))
1727 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001728 mp = ((PyDictObject *)op);
1729 oldkeys = mp->ma_keys;
1730 oldvalues = mp->ma_values;
1731 if (oldvalues == empty_values)
1732 return;
1733 /* Empty the dict... */
1734 DK_INCREF(Py_EMPTY_KEYS);
1735 mp->ma_keys = Py_EMPTY_KEYS;
1736 mp->ma_values = empty_values;
1737 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001738 mp->ma_version_tag = DICT_NEXT_VERSION();
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001739 /* ...then clear the keys and values */
1740 if (oldvalues != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001741 n = oldkeys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001742 for (i = 0; i < n; i++)
1743 Py_CLEAR(oldvalues[i]);
1744 free_values(oldvalues);
1745 DK_DECREF(oldkeys);
1746 }
1747 else {
1748 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001749 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001750 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02001751 assert(_PyDict_CheckConsistency(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001752}
1753
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001754/* Internal version of PyDict_Next that returns a hash value in addition
1755 * to the key and value.
1756 * Return 1 on success, return 0 when the reached the end of the dictionary
1757 * (or if op is not a dictionary)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001758 */
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001759int
1760_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1761 PyObject **pvalue, Py_hash_t *phash)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001762{
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001763 Py_ssize_t i, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001764 PyDictObject *mp;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001765 PyDictKeyEntry *entry_ptr;
1766 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001767
1768 if (!PyDict_Check(op))
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001769 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 mp = (PyDictObject *)op;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001771 i = *ppos;
Victor Stinner742da042016-09-07 17:40:12 -07001772 n = mp->ma_keys->dk_nentries;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001773 if ((size_t)i >= (size_t)n)
1774 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001775 if (mp->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001776 PyObject **value_ptr = &mp->ma_values[i];
1777 while (i < n && *value_ptr == NULL) {
1778 value_ptr++;
1779 i++;
Victor Stinner742da042016-09-07 17:40:12 -07001780 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001781 if (i >= n)
1782 return 0;
1783 entry_ptr = &DK_ENTRIES(mp->ma_keys)[i];
1784 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001786 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001787 entry_ptr = &DK_ENTRIES(mp->ma_keys)[i];
1788 while (i < n && entry_ptr->me_value == NULL) {
1789 entry_ptr++;
1790 i++;
Victor Stinner742da042016-09-07 17:40:12 -07001791 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001792 if (i >= n)
1793 return 0;
1794 value = entry_ptr->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001796 *ppos = i+1;
1797 if (pkey)
1798 *pkey = entry_ptr->me_key;
1799 if (phash)
1800 *phash = entry_ptr->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001801 if (pvalue)
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001802 *pvalue = value;
1803 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001804}
1805
Tim Peters080c88b2003-02-15 03:01:11 +00001806/*
1807 * Iterate over a dict. Use like so:
1808 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001809 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001810 * PyObject *key, *value;
1811 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001812 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001813 * Refer to borrowed references in key and value.
Tim Peters080c88b2003-02-15 03:01:11 +00001814 * }
1815 *
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001816 * Return 1 on success, return 0 when the reached the end of the dictionary
1817 * (or if op is not a dictionary)
1818 *
Tim Peters080c88b2003-02-15 03:01:11 +00001819 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001820 * mutates the dict. One exception: it is safe if the loop merely changes
1821 * the values associated with the keys (but doesn't insert new keys or
1822 * delete keys), via PyDict_SetItem().
1823 */
Guido van Rossum25831651993-05-19 14:50:45 +00001824int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001825PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001826{
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001827 return _PyDict_Next(op, ppos, pkey, pvalue, NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00001828}
1829
Eric Snow96c6af92015-05-29 22:21:39 -06001830/* Internal version of dict.pop(). */
1831PyObject *
Serhiy Storchaka42e1ea92017-01-12 19:12:21 +02001832_PyDict_Pop_KnownHash(PyObject *dict, PyObject *key, Py_hash_t hash, PyObject *deflt)
Eric Snow96c6af92015-05-29 22:21:39 -06001833{
Victor Stinner742da042016-09-07 17:40:12 -07001834 Py_ssize_t ix, hashpos;
Eric Snow96c6af92015-05-29 22:21:39 -06001835 PyObject *old_value, *old_key;
1836 PyDictKeyEntry *ep;
1837 PyObject **value_addr;
Yury Selivanov684ef2c2016-10-28 19:01:21 -04001838 PyDictObject *mp;
1839
1840 assert(PyDict_Check(dict));
1841 mp = (PyDictObject *)dict;
Eric Snow96c6af92015-05-29 22:21:39 -06001842
1843 if (mp->ma_used == 0) {
1844 if (deflt) {
1845 Py_INCREF(deflt);
1846 return deflt;
1847 }
1848 _PyErr_SetKeyError(key);
1849 return NULL;
1850 }
Victor Stinner742da042016-09-07 17:40:12 -07001851 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1852 if (ix == DKIX_ERROR)
Eric Snow96c6af92015-05-29 22:21:39 -06001853 return NULL;
Victor Stinnerd0ad11f2016-09-13 16:56:38 +02001854 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Eric Snow96c6af92015-05-29 22:21:39 -06001855 if (deflt) {
1856 Py_INCREF(deflt);
1857 return deflt;
1858 }
1859 _PyErr_SetKeyError(key);
1860 return NULL;
1861 }
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001862
Victor Stinner78601a32016-09-09 19:28:36 -07001863 // Split table doesn't allow deletion. Combine it.
1864 if (_PyDict_HasSplitTable(mp)) {
1865 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1866 return NULL;
1867 }
1868 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1869 assert(ix >= 0);
1870 }
1871
Victor Stinner742da042016-09-07 17:40:12 -07001872 old_value = *value_addr;
Victor Stinner78601a32016-09-09 19:28:36 -07001873 assert(old_value != NULL);
Eric Snow96c6af92015-05-29 22:21:39 -06001874 *value_addr = NULL;
1875 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001876 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner78601a32016-09-09 19:28:36 -07001877 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1878 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1879 ENSURE_ALLOWS_DELETIONS(mp);
1880 old_key = ep->me_key;
1881 ep->me_key = NULL;
1882 Py_DECREF(old_key);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001883
1884 assert(_PyDict_CheckConsistency(mp));
Eric Snow96c6af92015-05-29 22:21:39 -06001885 return old_value;
1886}
1887
Serhiy Storchaka67796522017-01-12 18:34:33 +02001888PyObject *
Serhiy Storchaka42e1ea92017-01-12 19:12:21 +02001889_PyDict_Pop(PyObject *dict, PyObject *key, PyObject *deflt)
Serhiy Storchaka67796522017-01-12 18:34:33 +02001890{
1891 Py_hash_t hash;
1892
Serhiy Storchaka42e1ea92017-01-12 19:12:21 +02001893 if (((PyDictObject *)dict)->ma_used == 0) {
Serhiy Storchaka67796522017-01-12 18:34:33 +02001894 if (deflt) {
1895 Py_INCREF(deflt);
1896 return deflt;
1897 }
1898 _PyErr_SetKeyError(key);
1899 return NULL;
1900 }
1901 if (!PyUnicode_CheckExact(key) ||
1902 (hash = ((PyASCIIObject *) key)->hash) == -1) {
1903 hash = PyObject_Hash(key);
1904 if (hash == -1)
1905 return NULL;
1906 }
Serhiy Storchaka42e1ea92017-01-12 19:12:21 +02001907 return _PyDict_Pop_KnownHash(dict, key, hash, deflt);
Serhiy Storchaka67796522017-01-12 18:34:33 +02001908}
1909
Eric Snow96c6af92015-05-29 22:21:39 -06001910/* Internal version of dict.from_keys(). It is subclass-friendly. */
1911PyObject *
1912_PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
1913{
1914 PyObject *it; /* iter(iterable) */
1915 PyObject *key;
1916 PyObject *d;
1917 int status;
1918
1919 d = PyObject_CallObject(cls, NULL);
1920 if (d == NULL)
1921 return NULL;
1922
1923 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
1924 if (PyDict_CheckExact(iterable)) {
1925 PyDictObject *mp = (PyDictObject *)d;
1926 PyObject *oldvalue;
1927 Py_ssize_t pos = 0;
1928 PyObject *key;
1929 Py_hash_t hash;
1930
Victor Stinner742da042016-09-07 17:40:12 -07001931 if (dictresize(mp, ESTIMATE_SIZE(Py_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001932 Py_DECREF(d);
1933 return NULL;
1934 }
1935
1936 while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) {
1937 if (insertdict(mp, key, hash, value)) {
1938 Py_DECREF(d);
1939 return NULL;
1940 }
1941 }
1942 return d;
1943 }
1944 if (PyAnySet_CheckExact(iterable)) {
1945 PyDictObject *mp = (PyDictObject *)d;
1946 Py_ssize_t pos = 0;
1947 PyObject *key;
1948 Py_hash_t hash;
1949
Victor Stinner742da042016-09-07 17:40:12 -07001950 if (dictresize(mp, ESTIMATE_SIZE(PySet_GET_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001951 Py_DECREF(d);
1952 return NULL;
1953 }
1954
1955 while (_PySet_NextEntry(iterable, &pos, &key, &hash)) {
1956 if (insertdict(mp, key, hash, value)) {
1957 Py_DECREF(d);
1958 return NULL;
1959 }
1960 }
1961 return d;
1962 }
1963 }
1964
1965 it = PyObject_GetIter(iterable);
1966 if (it == NULL){
1967 Py_DECREF(d);
1968 return NULL;
1969 }
1970
1971 if (PyDict_CheckExact(d)) {
1972 while ((key = PyIter_Next(it)) != NULL) {
1973 status = PyDict_SetItem(d, key, value);
1974 Py_DECREF(key);
1975 if (status < 0)
1976 goto Fail;
1977 }
1978 } else {
1979 while ((key = PyIter_Next(it)) != NULL) {
1980 status = PyObject_SetItem(d, key, value);
1981 Py_DECREF(key);
1982 if (status < 0)
1983 goto Fail;
1984 }
1985 }
1986
1987 if (PyErr_Occurred())
1988 goto Fail;
1989 Py_DECREF(it);
1990 return d;
1991
1992Fail:
1993 Py_DECREF(it);
1994 Py_DECREF(d);
1995 return NULL;
1996}
1997
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001998/* Methods */
1999
2000static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002001dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002002{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002003 PyObject **values = mp->ma_values;
2004 PyDictKeysObject *keys = mp->ma_keys;
2005 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 PyObject_GC_UnTrack(mp);
2007 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002008 if (values != NULL) {
2009 if (values != empty_values) {
Victor Stinner742da042016-09-07 17:40:12 -07002010 for (i = 0, n = mp->ma_keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002011 Py_XDECREF(values[i]);
2012 }
2013 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002015 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002017 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02002018 assert(keys->dk_refcnt == 1);
2019 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002020 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
2022 free_list[numfree++] = mp;
2023 else
2024 Py_TYPE(mp)->tp_free((PyObject *)mp);
2025 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002026}
2027
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002028
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002029static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002030dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01002033 PyObject *key = NULL, *value = NULL;
2034 _PyUnicodeWriter writer;
2035 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00002036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 i = Py_ReprEnter((PyObject *)mp);
2038 if (i != 0) {
2039 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
2040 }
Guido van Rossum255443b1998-04-10 22:47:14 +00002041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01002043 Py_ReprLeave((PyObject *)mp);
2044 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 }
Tim Petersa7259592001-06-16 05:11:17 +00002046
Victor Stinnerf91929b2013-11-19 13:07:38 +01002047 _PyUnicodeWriter_Init(&writer);
2048 writer.overallocate = 1;
2049 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
2050 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00002051
Victor Stinnerf91929b2013-11-19 13:07:38 +01002052 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
2053 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00002054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 /* Do repr() on each key+value pair, and insert ": " between them.
2056 Note that repr may mutate the dict. */
2057 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01002058 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01002060 PyObject *s;
2061 int res;
2062
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002063 /* Prevent repr from deleting key or value during key format. */
2064 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02002066
Victor Stinnerf91929b2013-11-19 13:07:38 +01002067 if (!first) {
2068 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
2069 goto error;
2070 }
2071 first = 0;
2072
2073 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01002075 goto error;
2076 res = _PyUnicodeWriter_WriteStr(&writer, s);
2077 Py_DECREF(s);
2078 if (res < 0)
2079 goto error;
2080
2081 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
2082 goto error;
2083
2084 s = PyObject_Repr(value);
2085 if (s == NULL)
2086 goto error;
2087 res = _PyUnicodeWriter_WriteStr(&writer, s);
2088 Py_DECREF(s);
2089 if (res < 0)
2090 goto error;
2091
2092 Py_CLEAR(key);
2093 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 }
Tim Petersa7259592001-06-16 05:11:17 +00002095
Victor Stinnerf91929b2013-11-19 13:07:38 +01002096 writer.overallocate = 0;
2097 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
2098 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00002099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01002101
2102 return _PyUnicodeWriter_Finish(&writer);
2103
2104error:
2105 Py_ReprLeave((PyObject *)mp);
2106 _PyUnicodeWriter_Dealloc(&writer);
2107 Py_XDECREF(key);
2108 Py_XDECREF(value);
2109 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002110}
2111
Martin v. Löwis18e16552006-02-15 17:27:45 +00002112static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002113dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002116}
2117
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002118static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002119dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 PyObject *v;
Victor Stinner742da042016-09-07 17:40:12 -07002122 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002123 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002124 PyObject **value_addr;
2125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002127 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 hash = PyObject_Hash(key);
2129 if (hash == -1)
2130 return NULL;
2131 }
Victor Stinner742da042016-09-07 17:40:12 -07002132 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2133 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002135 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 if (!PyDict_CheckExact(mp)) {
2137 /* Look up __missing__ method if we're a subclass. */
2138 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05002139 _Py_IDENTIFIER(__missing__);
2140 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002141 if (missing != NULL) {
2142 res = PyObject_CallFunctionObjArgs(missing,
2143 key, NULL);
2144 Py_DECREF(missing);
2145 return res;
2146 }
2147 else if (PyErr_Occurred())
2148 return NULL;
2149 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07002150 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 return NULL;
2152 }
Victor Stinner742da042016-09-07 17:40:12 -07002153 v = *value_addr;
2154 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002155 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002156}
2157
2158static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002159dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 if (w == NULL)
2162 return PyDict_DelItem((PyObject *)mp, v);
2163 else
2164 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002165}
2166
Guido van Rossuma9e7a811997-05-13 21:02:11 +00002167static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 (lenfunc)dict_length, /*mp_length*/
2169 (binaryfunc)dict_subscript, /*mp_subscript*/
2170 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002171};
2172
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002173static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002174dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002175{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002176 PyObject *v;
2177 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002178 PyDictKeyEntry *ep;
2179 Py_ssize_t size, n, offset;
2180 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002181
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002182 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 n = mp->ma_used;
2184 v = PyList_New(n);
2185 if (v == NULL)
2186 return NULL;
2187 if (n != mp->ma_used) {
2188 /* Durnit. The allocations caused the dict to resize.
2189 * Just start over, this shouldn't normally happen.
2190 */
2191 Py_DECREF(v);
2192 goto again;
2193 }
Victor Stinner742da042016-09-07 17:40:12 -07002194 ep = DK_ENTRIES(mp->ma_keys);
2195 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002196 if (mp->ma_values) {
2197 value_ptr = mp->ma_values;
2198 offset = sizeof(PyObject *);
2199 }
2200 else {
2201 value_ptr = &ep[0].me_value;
2202 offset = sizeof(PyDictKeyEntry);
2203 }
2204 for (i = 0, j = 0; i < size; i++) {
2205 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 PyObject *key = ep[i].me_key;
2207 Py_INCREF(key);
2208 PyList_SET_ITEM(v, j, key);
2209 j++;
2210 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002211 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 }
2213 assert(j == n);
2214 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002215}
2216
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002217static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002218dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002219{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002220 PyObject *v;
2221 Py_ssize_t i, j;
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002222 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002223 Py_ssize_t size, n, offset;
2224 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002225
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002226 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 n = mp->ma_used;
2228 v = PyList_New(n);
2229 if (v == NULL)
2230 return NULL;
2231 if (n != mp->ma_used) {
2232 /* Durnit. The allocations caused the dict to resize.
2233 * Just start over, this shouldn't normally happen.
2234 */
2235 Py_DECREF(v);
2236 goto again;
2237 }
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002238 ep = DK_ENTRIES(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002239 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002240 if (mp->ma_values) {
2241 value_ptr = mp->ma_values;
2242 offset = sizeof(PyObject *);
2243 }
2244 else {
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002245 value_ptr = &ep[0].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002246 offset = sizeof(PyDictKeyEntry);
2247 }
2248 for (i = 0, j = 0; i < size; i++) {
2249 PyObject *value = *value_ptr;
2250 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2251 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 Py_INCREF(value);
2253 PyList_SET_ITEM(v, j, value);
2254 j++;
2255 }
2256 }
2257 assert(j == n);
2258 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002259}
2260
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002261static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002262dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002263{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002264 PyObject *v;
2265 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002266 Py_ssize_t size, offset;
2267 PyObject *item, *key;
2268 PyDictKeyEntry *ep;
2269 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 /* Preallocate the list of tuples, to avoid allocations during
2272 * the loop over the items, which could trigger GC, which
2273 * could resize the dict. :-(
2274 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002275 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 n = mp->ma_used;
2277 v = PyList_New(n);
2278 if (v == NULL)
2279 return NULL;
2280 for (i = 0; i < n; i++) {
2281 item = PyTuple_New(2);
2282 if (item == NULL) {
2283 Py_DECREF(v);
2284 return NULL;
2285 }
2286 PyList_SET_ITEM(v, i, item);
2287 }
2288 if (n != mp->ma_used) {
2289 /* Durnit. The allocations caused the dict to resize.
2290 * Just start over, this shouldn't normally happen.
2291 */
2292 Py_DECREF(v);
2293 goto again;
2294 }
2295 /* Nothing we do below makes any function calls. */
Victor Stinner742da042016-09-07 17:40:12 -07002296 ep = DK_ENTRIES(mp->ma_keys);
2297 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002298 if (mp->ma_values) {
2299 value_ptr = mp->ma_values;
2300 offset = sizeof(PyObject *);
2301 }
2302 else {
2303 value_ptr = &ep[0].me_value;
2304 offset = sizeof(PyDictKeyEntry);
2305 }
2306 for (i = 0, j = 0; i < size; i++) {
2307 PyObject *value = *value_ptr;
2308 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2309 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 key = ep[i].me_key;
2311 item = PyList_GET_ITEM(v, j);
2312 Py_INCREF(key);
2313 PyTuple_SET_ITEM(item, 0, key);
2314 Py_INCREF(value);
2315 PyTuple_SET_ITEM(item, 1, value);
2316 j++;
2317 }
2318 }
2319 assert(j == n);
2320 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002321}
2322
Larry Hastings5c661892014-01-24 06:17:25 -08002323/*[clinic input]
2324@classmethod
2325dict.fromkeys
Larry Hastings5c661892014-01-24 06:17:25 -08002326 iterable: object
2327 value: object=None
2328 /
2329
2330Returns a new dict with keys from iterable and values equal to value.
2331[clinic start generated code]*/
2332
Larry Hastings5c661892014-01-24 06:17:25 -08002333static PyObject *
2334dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002335/*[clinic end generated code: output=8fb98e4b10384999 input=b85a667f9bf4669d]*/
Larry Hastings5c661892014-01-24 06:17:25 -08002336{
Eric Snow96c6af92015-05-29 22:21:39 -06002337 return _PyDict_FromKeys((PyObject *)type, iterable, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002338}
2339
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002340static int
Victor Stinner742da042016-09-07 17:40:12 -07002341dict_update_common(PyObject *self, PyObject *args, PyObject *kwds,
2342 const char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 PyObject *arg = NULL;
2345 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
2348 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002351 _Py_IDENTIFIER(keys);
2352 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 result = PyDict_Merge(self, arg, 1);
2354 else
2355 result = PyDict_MergeFromSeq2(self, arg, 1);
2356 }
2357 if (result == 0 && kwds != NULL) {
2358 if (PyArg_ValidateKeywordArguments(kwds))
2359 result = PyDict_Merge(self, kwds, 1);
2360 else
2361 result = -1;
2362 }
2363 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002364}
2365
2366static PyObject *
2367dict_update(PyObject *self, PyObject *args, PyObject *kwds)
2368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 if (dict_update_common(self, args, kwds, "update") != -1)
2370 Py_RETURN_NONE;
2371 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002372}
2373
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002374/* Update unconditionally replaces existing items.
2375 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00002376 otherwise it leaves existing items unchanged.
2377
2378 PyDict_{Update,Merge} update/merge from a mapping object.
2379
Tim Petersf582b822001-12-11 18:51:08 +00002380 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00002381 producing iterable objects of length 2.
2382*/
2383
Tim Petersf582b822001-12-11 18:51:08 +00002384int
Tim Peters1fc240e2001-10-26 05:06:50 +00002385PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
2386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 PyObject *it; /* iter(seq2) */
2388 Py_ssize_t i; /* index into seq2 of current element */
2389 PyObject *item; /* seq2[i] */
2390 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00002391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 assert(d != NULL);
2393 assert(PyDict_Check(d));
2394 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00002395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 it = PyObject_GetIter(seq2);
2397 if (it == NULL)
2398 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 for (i = 0; ; ++i) {
2401 PyObject *key, *value;
2402 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00002403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 fast = NULL;
2405 item = PyIter_Next(it);
2406 if (item == NULL) {
2407 if (PyErr_Occurred())
2408 goto Fail;
2409 break;
2410 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 /* Convert item to sequence, and verify length 2. */
2413 fast = PySequence_Fast(item, "");
2414 if (fast == NULL) {
2415 if (PyErr_ExceptionMatches(PyExc_TypeError))
2416 PyErr_Format(PyExc_TypeError,
2417 "cannot convert dictionary update "
2418 "sequence element #%zd to a sequence",
2419 i);
2420 goto Fail;
2421 }
2422 n = PySequence_Fast_GET_SIZE(fast);
2423 if (n != 2) {
2424 PyErr_Format(PyExc_ValueError,
2425 "dictionary update sequence element #%zd "
2426 "has length %zd; 2 is required",
2427 i, n);
2428 goto Fail;
2429 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 /* Update/merge with this (key, value) pair. */
2432 key = PySequence_Fast_GET_ITEM(fast, 0);
2433 value = PySequence_Fast_GET_ITEM(fast, 1);
2434 if (override || PyDict_GetItem(d, key) == NULL) {
2435 int status = PyDict_SetItem(d, key, value);
2436 if (status < 0)
2437 goto Fail;
2438 }
2439 Py_DECREF(fast);
2440 Py_DECREF(item);
2441 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 i = 0;
Victor Stinner611b0fa2016-09-14 15:02:01 +02002444 assert(_PyDict_CheckConsistency((PyDictObject *)d));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00002446Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 Py_XDECREF(item);
2448 Py_XDECREF(fast);
2449 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002450Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 Py_DECREF(it);
2452 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00002453}
2454
doko@ubuntu.comde69ee72016-10-11 08:04:02 +02002455static int
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002456dict_merge(PyObject *a, PyObject *b, int override)
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002457{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002458 PyDictObject *mp, *other;
2459 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -07002460 PyDictKeyEntry *entry, *ep0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002461
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002462 assert(0 <= override && override <= 2);
2463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 /* We accept for the argument either a concrete dictionary object,
2465 * or an abstract "mapping" object. For the former, we can do
2466 * things quite efficiently. For the latter, we only require that
2467 * PyMapping_Keys() and PyObject_GetItem() be supported.
2468 */
2469 if (a == NULL || !PyDict_Check(a) || b == NULL) {
2470 PyErr_BadInternalCall();
2471 return -1;
2472 }
2473 mp = (PyDictObject*)a;
2474 if (PyDict_Check(b)) {
2475 other = (PyDictObject*)b;
2476 if (other == mp || other->ma_used == 0)
2477 /* a.update(a) or a.update({}); nothing to do */
2478 return 0;
2479 if (mp->ma_used == 0)
2480 /* Since the target dict is empty, PyDict_GetItem()
2481 * always returns NULL. Setting override to 1
2482 * skips the unnecessary test.
2483 */
2484 override = 1;
2485 /* Do one big resize at the start, rather than
2486 * incrementally resizing as we insert new items. Expect
2487 * that there will be no (or few) overlapping keys.
2488 */
INADA Naokib1152be2016-10-27 19:26:50 +09002489 if (USABLE_FRACTION(mp->ma_keys->dk_size) < other->ma_used) {
2490 if (dictresize(mp, ESTIMATE_SIZE(mp->ma_used + other->ma_used))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 return -1;
INADA Naokib1152be2016-10-27 19:26:50 +09002492 }
2493 }
Victor Stinner742da042016-09-07 17:40:12 -07002494 ep0 = DK_ENTRIES(other->ma_keys);
2495 for (i = 0, n = other->ma_keys->dk_nentries; i < n; i++) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002496 PyObject *key, *value;
2497 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002498 entry = &ep0[i];
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002499 key = entry->me_key;
2500 hash = entry->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002501 if (other->ma_values)
2502 value = other->ma_values[i];
2503 else
2504 value = entry->me_value;
2505
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002506 if (value != NULL) {
2507 int err = 0;
2508 Py_INCREF(key);
2509 Py_INCREF(value);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002510 if (override == 1)
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002511 err = insertdict(mp, key, hash, value);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002512 else if (_PyDict_GetItem_KnownHash(a, key, hash) == NULL) {
2513 if (PyErr_Occurred()) {
2514 Py_DECREF(value);
2515 Py_DECREF(key);
2516 return -1;
2517 }
2518 err = insertdict(mp, key, hash, value);
2519 }
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002520 else if (override != 0) {
2521 _PyErr_SetKeyError(key);
2522 Py_DECREF(value);
2523 Py_DECREF(key);
2524 return -1;
2525 }
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002526 Py_DECREF(value);
2527 Py_DECREF(key);
2528 if (err != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 return -1;
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002530
Victor Stinner742da042016-09-07 17:40:12 -07002531 if (n != other->ma_keys->dk_nentries) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002532 PyErr_SetString(PyExc_RuntimeError,
2533 "dict mutated during update");
2534 return -1;
2535 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 }
2537 }
2538 }
2539 else {
2540 /* Do it the generic, slower way */
2541 PyObject *keys = PyMapping_Keys(b);
2542 PyObject *iter;
2543 PyObject *key, *value;
2544 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 if (keys == NULL)
2547 /* Docstring says this is equivalent to E.keys() so
2548 * if E doesn't have a .keys() method we want
2549 * AttributeError to percolate up. Might as well
2550 * do the same for any other error.
2551 */
2552 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 iter = PyObject_GetIter(keys);
2555 Py_DECREF(keys);
2556 if (iter == NULL)
2557 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002560 if (override != 1 && PyDict_GetItem(a, key) != NULL) {
2561 if (override != 0) {
2562 _PyErr_SetKeyError(key);
2563 Py_DECREF(key);
2564 Py_DECREF(iter);
2565 return -1;
2566 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 Py_DECREF(key);
2568 continue;
2569 }
2570 value = PyObject_GetItem(b, key);
2571 if (value == NULL) {
2572 Py_DECREF(iter);
2573 Py_DECREF(key);
2574 return -1;
2575 }
2576 status = PyDict_SetItem(a, key, value);
2577 Py_DECREF(key);
2578 Py_DECREF(value);
2579 if (status < 0) {
2580 Py_DECREF(iter);
2581 return -1;
2582 }
2583 }
2584 Py_DECREF(iter);
2585 if (PyErr_Occurred())
2586 /* Iterator completed, via error */
2587 return -1;
2588 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02002589 assert(_PyDict_CheckConsistency((PyDictObject *)a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002591}
2592
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002593int
2594PyDict_Update(PyObject *a, PyObject *b)
2595{
2596 return dict_merge(a, b, 1);
2597}
2598
2599int
2600PyDict_Merge(PyObject *a, PyObject *b, int override)
2601{
2602 /* XXX Deprecate override not in (0, 1). */
2603 return dict_merge(a, b, override != 0);
2604}
2605
2606int
2607_PyDict_MergeEx(PyObject *a, PyObject *b, int override)
2608{
2609 return dict_merge(a, b, override);
2610}
2611
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002612static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002613dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002616}
2617
2618PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002619PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002622 PyDictObject *mp;
2623 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 if (o == NULL || !PyDict_Check(o)) {
2626 PyErr_BadInternalCall();
2627 return NULL;
2628 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002629 mp = (PyDictObject *)o;
2630 if (_PyDict_HasSplitTable(mp)) {
2631 PyDictObject *split_copy;
Victor Stinner742da042016-09-07 17:40:12 -07002632 Py_ssize_t size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
2633 PyObject **newvalues;
2634 newvalues = new_values(size);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002635 if (newvalues == NULL)
2636 return PyErr_NoMemory();
2637 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2638 if (split_copy == NULL) {
2639 free_values(newvalues);
2640 return NULL;
2641 }
2642 split_copy->ma_values = newvalues;
2643 split_copy->ma_keys = mp->ma_keys;
2644 split_copy->ma_used = mp->ma_used;
2645 DK_INCREF(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002646 for (i = 0, n = size; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002647 PyObject *value = mp->ma_values[i];
2648 Py_XINCREF(value);
2649 split_copy->ma_values[i] = value;
2650 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002651 if (_PyObject_GC_IS_TRACKED(mp))
2652 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002653 return (PyObject *)split_copy;
2654 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 copy = PyDict_New();
2656 if (copy == NULL)
2657 return NULL;
2658 if (PyDict_Merge(copy, o, 1) == 0)
2659 return copy;
2660 Py_DECREF(copy);
2661 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002662}
2663
Martin v. Löwis18e16552006-02-15 17:27:45 +00002664Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002665PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 if (mp == NULL || !PyDict_Check(mp)) {
2668 PyErr_BadInternalCall();
2669 return -1;
2670 }
2671 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002672}
2673
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002674PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002675PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 if (mp == NULL || !PyDict_Check(mp)) {
2678 PyErr_BadInternalCall();
2679 return NULL;
2680 }
2681 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002682}
2683
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002684PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002685PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 if (mp == NULL || !PyDict_Check(mp)) {
2688 PyErr_BadInternalCall();
2689 return NULL;
2690 }
2691 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002692}
2693
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002694PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002695PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 if (mp == NULL || !PyDict_Check(mp)) {
2698 PyErr_BadInternalCall();
2699 return NULL;
2700 }
2701 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002702}
2703
Tim Peterse63415e2001-05-08 04:38:29 +00002704/* Return 1 if dicts equal, 0 if not, -1 if error.
2705 * Gets out as soon as any difference is detected.
2706 * Uses only Py_EQ comparison.
2707 */
2708static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002709dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 if (a->ma_used != b->ma_used)
2714 /* can't be equal if # of entries differ */
2715 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Victor Stinner742da042016-09-07 17:40:12 -07002717 for (i = 0; i < a->ma_keys->dk_nentries; i++) {
2718 PyDictKeyEntry *ep = &DK_ENTRIES(a->ma_keys)[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002719 PyObject *aval;
2720 if (a->ma_values)
2721 aval = a->ma_values[i];
2722 else
2723 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 if (aval != NULL) {
2725 int cmp;
2726 PyObject *bval;
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002727 PyObject **vaddr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002728 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 /* temporarily bump aval's refcount to ensure it stays
2730 alive until we're done with it */
2731 Py_INCREF(aval);
2732 /* ditto for key */
2733 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002734 /* reuse the known hash value */
Victor Stinner742da042016-09-07 17:40:12 -07002735 if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr, NULL) < 0)
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002736 bval = NULL;
2737 else
2738 bval = *vaddr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 Py_DECREF(key);
2740 if (bval == NULL) {
2741 Py_DECREF(aval);
2742 if (PyErr_Occurred())
2743 return -1;
2744 return 0;
2745 }
2746 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2747 Py_DECREF(aval);
2748 if (cmp <= 0) /* error or not equal */
2749 return cmp;
2750 }
2751 }
2752 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002753}
Tim Peterse63415e2001-05-08 04:38:29 +00002754
2755static PyObject *
2756dict_richcompare(PyObject *v, PyObject *w, int op)
2757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 int cmp;
2759 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2762 res = Py_NotImplemented;
2763 }
2764 else if (op == Py_EQ || op == Py_NE) {
2765 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2766 if (cmp < 0)
2767 return NULL;
2768 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2769 }
2770 else
2771 res = Py_NotImplemented;
2772 Py_INCREF(res);
2773 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002774}
Tim Peterse63415e2001-05-08 04:38:29 +00002775
Larry Hastings61272b72014-01-07 12:41:53 -08002776/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07002777
2778@coexist
2779dict.__contains__
2780
2781 key: object
2782 /
2783
Meador Ingee02de8c2014-01-14 16:48:31 -06002784True if D has a key k, else False.
Larry Hastings61272b72014-01-07 12:41:53 -08002785[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07002786
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002787static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08002788dict___contains__(PyDictObject *self, PyObject *key)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002789/*[clinic end generated code: output=a3d03db709ed6e6b input=b852b2a19b51ab24]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002790{
Larry Hastingsc2047262014-01-25 20:43:29 -08002791 register PyDictObject *mp = self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002792 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002793 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002794 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002797 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 hash = PyObject_Hash(key);
2799 if (hash == -1)
2800 return NULL;
2801 }
Victor Stinner742da042016-09-07 17:40:12 -07002802 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2803 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002805 if (ix == DKIX_EMPTY || *value_addr == NULL)
2806 Py_RETURN_FALSE;
2807 Py_RETURN_TRUE;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002808}
2809
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002810static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002811dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 PyObject *key;
2814 PyObject *failobj = Py_None;
2815 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002816 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002817 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002818 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2821 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002824 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 hash = PyObject_Hash(key);
2826 if (hash == -1)
2827 return NULL;
2828 }
Victor Stinner742da042016-09-07 17:40:12 -07002829 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2830 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002832 if (ix == DKIX_EMPTY || *value_addr == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 val = failobj;
Victor Stinner742da042016-09-07 17:40:12 -07002834 else
2835 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 Py_INCREF(val);
2837 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002838}
2839
Benjamin Peterson00e98862013-03-07 22:16:29 -05002840PyObject *
2841PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002842{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002843 PyDictObject *mp = (PyDictObject *)d;
INADA Naoki93f26f72016-11-02 18:45:16 +09002844 PyObject *value;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002845 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002846 Py_ssize_t hashpos, ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002847 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002848
Benjamin Peterson00e98862013-03-07 22:16:29 -05002849 if (!PyDict_Check(d)) {
2850 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002852 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002854 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002855 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002856 hash = PyObject_Hash(key);
2857 if (hash == -1)
2858 return NULL;
2859 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002860
2861 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
2862 if (insertion_resize(mp) < 0)
2863 return NULL;
2864 }
2865
Victor Stinner742da042016-09-07 17:40:12 -07002866 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
2867 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 return NULL;
INADA Naoki93f26f72016-11-02 18:45:16 +09002869
2870 if (_PyDict_HasSplitTable(mp) &&
2871 ((ix >= 0 && *value_addr == NULL && mp->ma_used != ix) ||
2872 (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {
2873 if (insertion_resize(mp) < 0) {
2874 return NULL;
2875 }
2876 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
2877 ix = DKIX_EMPTY;
2878 }
2879
2880 if (ix == DKIX_EMPTY) {
2881 PyDictKeyEntry *ep, *ep0;
2882 value = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002883 if (mp->ma_keys->dk_usable <= 0) {
Victor Stinner3c336c52016-09-12 14:17:40 +02002884 if (insertion_resize(mp) < 0) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002885 return NULL;
Victor Stinner3c336c52016-09-12 14:17:40 +02002886 }
Victor Stinner742da042016-09-07 17:40:12 -07002887 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002888 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002889 ep0 = DK_ENTRIES(mp->ma_keys);
2890 ep = &ep0[mp->ma_keys->dk_nentries];
2891 dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002892 Py_INCREF(key);
INADA Naoki93f26f72016-11-02 18:45:16 +09002893 Py_INCREF(value);
2894 MAINTAIN_TRACKING(mp, key, value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002895 ep->me_key = key;
2896 ep->me_hash = hash;
Victor Stinner742da042016-09-07 17:40:12 -07002897 if (mp->ma_values) {
INADA Naoki93f26f72016-11-02 18:45:16 +09002898 assert(mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
2899 mp->ma_values[mp->ma_keys->dk_nentries] = value;
Victor Stinner742da042016-09-07 17:40:12 -07002900 }
2901 else {
INADA Naoki93f26f72016-11-02 18:45:16 +09002902 ep->me_value = value;
Victor Stinner742da042016-09-07 17:40:12 -07002903 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002904 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002905 mp->ma_version_tag = DICT_NEXT_VERSION();
INADA Naoki93f26f72016-11-02 18:45:16 +09002906 mp->ma_keys->dk_usable--;
2907 mp->ma_keys->dk_nentries++;
2908 assert(mp->ma_keys->dk_usable >= 0);
2909 }
2910 else if (*value_addr == NULL) {
2911 value = defaultobj;
2912 assert(_PyDict_HasSplitTable(mp));
2913 assert(ix == mp->ma_used);
2914 Py_INCREF(value);
2915 MAINTAIN_TRACKING(mp, key, value);
2916 *value_addr = value;
2917 mp->ma_used++;
2918 mp->ma_version_tag = DICT_NEXT_VERSION();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02002920 else {
INADA Naoki93f26f72016-11-02 18:45:16 +09002921 value = *value_addr;
Victor Stinner611b0fa2016-09-14 15:02:01 +02002922 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002923
2924 assert(_PyDict_CheckConsistency(mp));
2925 return value;
Guido van Rossum164452c2000-08-08 16:12:54 +00002926}
2927
Benjamin Peterson00e98862013-03-07 22:16:29 -05002928static PyObject *
2929dict_setdefault(PyDictObject *mp, PyObject *args)
2930{
2931 PyObject *key, *val;
2932 PyObject *defaultobj = Py_None;
2933
2934 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2935 return NULL;
2936
Benjamin Peterson55898502013-03-08 08:36:49 -05002937 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002938 Py_XINCREF(val);
2939 return val;
2940}
Guido van Rossum164452c2000-08-08 16:12:54 +00002941
2942static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002943dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 PyDict_Clear((PyObject *)mp);
2946 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002947}
2948
Guido van Rossumba6ab842000-12-12 22:02:18 +00002949static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002950dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00002953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2955 return NULL;
Eric Snow96c6af92015-05-29 22:21:39 -06002956
Yury Selivanov684ef2c2016-10-28 19:01:21 -04002957 return _PyDict_Pop((PyObject*)mp, key, deflt);
Guido van Rossume027d982002-04-12 15:11:59 +00002958}
2959
2960static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002961dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002962{
Victor Stinner742da042016-09-07 17:40:12 -07002963 Py_ssize_t i, j;
2964 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002965 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 /* Allocate the result tuple before checking the size. Believe it
2968 * or not, this allocation could trigger a garbage collection which
2969 * could empty the dict, so if we checked the size first and that
2970 * happened, the result would be an infinite loop (searching for an
2971 * entry that no longer exists). Note that the usual popitem()
2972 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2973 * tuple away if the dict *is* empty isn't a significant
2974 * inefficiency -- possible, but unlikely in practice.
2975 */
2976 res = PyTuple_New(2);
2977 if (res == NULL)
2978 return NULL;
2979 if (mp->ma_used == 0) {
2980 Py_DECREF(res);
2981 PyErr_SetString(PyExc_KeyError,
2982 "popitem(): dictionary is empty");
2983 return NULL;
2984 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002985 /* Convert split table to combined table */
2986 if (mp->ma_keys->dk_lookup == lookdict_split) {
2987 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2988 Py_DECREF(res);
2989 return NULL;
2990 }
2991 }
2992 ENSURE_ALLOWS_DELETIONS(mp);
Victor Stinner742da042016-09-07 17:40:12 -07002993
2994 /* Pop last item */
2995 ep0 = DK_ENTRIES(mp->ma_keys);
2996 i = mp->ma_keys->dk_nentries - 1;
2997 while (i >= 0 && ep0[i].me_value == NULL) {
2998 i--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002999 }
Victor Stinner742da042016-09-07 17:40:12 -07003000 assert(i >= 0);
3001
3002 ep = &ep0[i];
3003 j = lookdict_index(mp->ma_keys, ep->me_hash, i);
3004 assert(j >= 0);
3005 assert(dk_get_index(mp->ma_keys, j) == i);
3006 dk_set_index(mp->ma_keys, j, DKIX_DUMMY);
3007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003008 PyTuple_SET_ITEM(res, 0, ep->me_key);
3009 PyTuple_SET_ITEM(res, 1, ep->me_value);
Victor Stinner742da042016-09-07 17:40:12 -07003010 ep->me_key = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 ep->me_value = NULL;
Victor Stinner742da042016-09-07 17:40:12 -07003012 /* We can't dk_usable++ since there is DKIX_DUMMY in indices */
3013 mp->ma_keys->dk_nentries = i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07003015 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02003016 assert(_PyDict_CheckConsistency(mp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00003018}
3019
Jeremy Hylton8caad492000-06-23 14:18:11 +00003020static int
3021dict_traverse(PyObject *op, visitproc visit, void *arg)
3022{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003023 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson55f44522016-09-05 12:12:59 -07003024 PyDictKeysObject *keys = mp->ma_keys;
Serhiy Storchaka46825d22016-09-26 21:29:34 +03003025 PyDictKeyEntry *entries = DK_ENTRIES(keys);
Victor Stinner742da042016-09-07 17:40:12 -07003026 Py_ssize_t i, n = keys->dk_nentries;
3027
Benjamin Peterson55f44522016-09-05 12:12:59 -07003028 if (keys->dk_lookup == lookdict) {
3029 for (i = 0; i < n; i++) {
3030 if (entries[i].me_value != NULL) {
3031 Py_VISIT(entries[i].me_value);
3032 Py_VISIT(entries[i].me_key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003033 }
3034 }
Victor Stinner742da042016-09-07 17:40:12 -07003035 }
3036 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003037 if (mp->ma_values != NULL) {
Benjamin Peterson55f44522016-09-05 12:12:59 -07003038 for (i = 0; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003039 Py_VISIT(mp->ma_values[i]);
3040 }
3041 }
3042 else {
Benjamin Peterson55f44522016-09-05 12:12:59 -07003043 for (i = 0; i < n; i++) {
3044 Py_VISIT(entries[i].me_value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003045 }
3046 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 }
3048 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00003049}
3050
3051static int
3052dict_tp_clear(PyObject *op)
3053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054 PyDict_Clear(op);
3055 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00003056}
3057
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003058static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00003059
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003060Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06003061_PyDict_SizeOf(PyDictObject *mp)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003062{
Victor Stinner742da042016-09-07 17:40:12 -07003063 Py_ssize_t size, usable, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003064
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003065 size = DK_SIZE(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07003066 usable = USABLE_FRACTION(size);
3067
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02003068 res = _PyObject_SIZE(Py_TYPE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003069 if (mp->ma_values)
Victor Stinner742da042016-09-07 17:40:12 -07003070 res += usable * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02003071 /* If the dictionary is split, the keys portion is accounted-for
3072 in the type object. */
3073 if (mp->ma_keys->dk_refcnt == 1)
Victor Stinner98ee9d52016-09-08 09:33:56 -07003074 res += (sizeof(PyDictKeysObject)
3075 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
3076 + DK_IXSIZE(mp->ma_keys) * size
3077 + sizeof(PyDictKeyEntry) * usable);
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003078 return res;
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02003079}
3080
3081Py_ssize_t
3082_PyDict_KeysSize(PyDictKeysObject *keys)
3083{
Victor Stinner98ee9d52016-09-08 09:33:56 -07003084 return (sizeof(PyDictKeysObject)
3085 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
3086 + DK_IXSIZE(keys) * DK_SIZE(keys)
3087 + USABLE_FRACTION(DK_SIZE(keys)) * sizeof(PyDictKeyEntry));
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003088}
3089
doko@ubuntu.com17210f52016-01-14 14:04:59 +01003090static PyObject *
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003091dict_sizeof(PyDictObject *mp)
3092{
3093 return PyLong_FromSsize_t(_PyDict_SizeOf(mp));
3094}
3095
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00003096PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
3097
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003098PyDoc_STRVAR(sizeof__doc__,
3099"D.__sizeof__() -> size of D in memory, in bytes");
3100
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003101PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00003102"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003103
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003104PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00003105"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 +00003106
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003107PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00003108"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00003109If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00003110
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003111PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00003112"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000031132-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003114
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003115PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04003116"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
3117If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
3118If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
3119In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00003120
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003121PyDoc_STRVAR(clear__doc__,
3122"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003123
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003124PyDoc_STRVAR(copy__doc__,
3125"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00003126
Guido van Rossumb90c8482007-02-10 01:11:45 +00003127/* Forward */
3128static PyObject *dictkeys_new(PyObject *);
3129static PyObject *dictitems_new(PyObject *);
3130static PyObject *dictvalues_new(PyObject *);
3131
Guido van Rossum45c85d12007-07-27 16:31:40 +00003132PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003133 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00003134PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00003136PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00003138
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003139static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07003140 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
3142 getitem__doc__},
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003143 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 sizeof__doc__},
3145 {"get", (PyCFunction)dict_get, METH_VARARGS,
3146 get__doc__},
3147 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
3148 setdefault_doc__},
3149 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
3150 pop__doc__},
3151 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
3152 popitem__doc__},
3153 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
3154 keys__doc__},
3155 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
3156 items__doc__},
3157 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
3158 values__doc__},
3159 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
3160 update__doc__},
Larry Hastings5c661892014-01-24 06:17:25 -08003161 DICT_FROMKEYS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
3163 clear__doc__},
3164 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
3165 copy__doc__},
3166 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003167};
3168
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003169/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00003170int
3171PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003172{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00003173 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07003174 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003175 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003176 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003179 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 hash = PyObject_Hash(key);
3181 if (hash == -1)
3182 return -1;
3183 }
Victor Stinner742da042016-09-07 17:40:12 -07003184 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
3185 if (ix == DKIX_ERROR)
3186 return -1;
3187 return (ix != DKIX_EMPTY && *value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003188}
3189
Thomas Wouterscf297e42007-02-23 15:07:44 +00003190/* Internal version of PyDict_Contains used when the hash value is already known */
3191int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00003192_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00003193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003195 PyObject **value_addr;
Victor Stinner742da042016-09-07 17:40:12 -07003196 Py_ssize_t ix;
Thomas Wouterscf297e42007-02-23 15:07:44 +00003197
Victor Stinner742da042016-09-07 17:40:12 -07003198 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
3199 if (ix == DKIX_ERROR)
3200 return -1;
3201 return (ix != DKIX_EMPTY && *value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00003202}
3203
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003204/* Hack to implement "key in dict" */
3205static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 0, /* sq_length */
3207 0, /* sq_concat */
3208 0, /* sq_repeat */
3209 0, /* sq_item */
3210 0, /* sq_slice */
3211 0, /* sq_ass_item */
3212 0, /* sq_ass_slice */
3213 PyDict_Contains, /* sq_contains */
3214 0, /* sq_inplace_concat */
3215 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003216};
3217
Guido van Rossum09e563a2001-05-01 12:10:21 +00003218static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003219dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003222 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003224 assert(type != NULL && type->tp_alloc != NULL);
3225 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02003226 if (self == NULL)
3227 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003228 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003229
Victor Stinnera9f61a52013-07-16 22:17:26 +02003230 /* The object has been implicitly tracked by tp_alloc */
3231 if (type == &PyDict_Type)
3232 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003233
3234 d->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07003235 d->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07003236 d->ma_keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003237 if (d->ma_keys == NULL) {
3238 Py_DECREF(self);
3239 return NULL;
3240 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02003241 assert(_PyDict_CheckConsistency(d));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003243}
3244
Tim Peters25786c02001-09-02 08:22:48 +00003245static int
3246dict_init(PyObject *self, PyObject *args, PyObject *kwds)
3247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003248 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00003249}
3250
Tim Peters6d6c1a32001-08-02 04:15:00 +00003251static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003252dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00003253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00003255}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003256
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003257PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00003258"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00003259"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003260" (key, value) pairs\n"
3261"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00003262" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003263" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00003264" d[k] = v\n"
3265"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
3266" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00003267
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003268PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3270 "dict",
3271 sizeof(PyDictObject),
3272 0,
3273 (destructor)dict_dealloc, /* tp_dealloc */
3274 0, /* tp_print */
3275 0, /* tp_getattr */
3276 0, /* tp_setattr */
3277 0, /* tp_reserved */
3278 (reprfunc)dict_repr, /* tp_repr */
3279 0, /* tp_as_number */
3280 &dict_as_sequence, /* tp_as_sequence */
3281 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00003282 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 0, /* tp_call */
3284 0, /* tp_str */
3285 PyObject_GenericGetAttr, /* tp_getattro */
3286 0, /* tp_setattro */
3287 0, /* tp_as_buffer */
3288 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3289 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
3290 dictionary_doc, /* tp_doc */
3291 dict_traverse, /* tp_traverse */
3292 dict_tp_clear, /* tp_clear */
3293 dict_richcompare, /* tp_richcompare */
3294 0, /* tp_weaklistoffset */
3295 (getiterfunc)dict_iter, /* tp_iter */
3296 0, /* tp_iternext */
3297 mapp_methods, /* tp_methods */
3298 0, /* tp_members */
3299 0, /* tp_getset */
3300 0, /* tp_base */
3301 0, /* tp_dict */
3302 0, /* tp_descr_get */
3303 0, /* tp_descr_set */
3304 0, /* tp_dictoffset */
3305 dict_init, /* tp_init */
3306 PyType_GenericAlloc, /* tp_alloc */
3307 dict_new, /* tp_new */
3308 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003309};
3310
Victor Stinner3c1e4812012-03-26 22:10:51 +02003311PyObject *
3312_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
3313{
3314 PyObject *kv;
3315 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02003316 if (kv == NULL) {
3317 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003318 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02003319 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02003320 return PyDict_GetItem(dp, kv);
3321}
3322
Guido van Rossum3cca2451997-05-16 14:23:33 +00003323/* For backward compatibility with old dictionary interface */
3324
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003325PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003326PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003327{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 PyObject *kv, *rv;
3329 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003330 if (kv == NULL) {
3331 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003333 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 rv = PyDict_GetItem(v, kv);
3335 Py_DECREF(kv);
3336 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003337}
3338
3339int
Victor Stinner3c1e4812012-03-26 22:10:51 +02003340_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
3341{
3342 PyObject *kv;
3343 kv = _PyUnicode_FromId(key); /* borrowed */
3344 if (kv == NULL)
3345 return -1;
3346 return PyDict_SetItem(v, kv, item);
3347}
3348
3349int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003350PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003351{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003352 PyObject *kv;
3353 int err;
3354 kv = PyUnicode_FromString(key);
3355 if (kv == NULL)
3356 return -1;
3357 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
3358 err = PyDict_SetItem(v, kv, item);
3359 Py_DECREF(kv);
3360 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003361}
3362
3363int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01003364_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
3365{
3366 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
3367 if (kv == NULL)
3368 return -1;
3369 return PyDict_DelItem(v, kv);
3370}
3371
3372int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003373PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003374{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 PyObject *kv;
3376 int err;
3377 kv = PyUnicode_FromString(key);
3378 if (kv == NULL)
3379 return -1;
3380 err = PyDict_DelItem(v, kv);
3381 Py_DECREF(kv);
3382 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003383}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003384
Raymond Hettinger019a1482004-03-18 02:41:19 +00003385/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003386
3387typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003388 PyObject_HEAD
3389 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
3390 Py_ssize_t di_used;
3391 Py_ssize_t di_pos;
3392 PyObject* di_result; /* reusable result tuple for iteritems */
3393 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003394} dictiterobject;
3395
3396static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003397dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 dictiterobject *di;
3400 di = PyObject_GC_New(dictiterobject, itertype);
3401 if (di == NULL)
3402 return NULL;
3403 Py_INCREF(dict);
3404 di->di_dict = dict;
3405 di->di_used = dict->ma_used;
3406 di->di_pos = 0;
3407 di->len = dict->ma_used;
3408 if (itertype == &PyDictIterItem_Type) {
3409 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
3410 if (di->di_result == NULL) {
3411 Py_DECREF(di);
3412 return NULL;
3413 }
3414 }
3415 else
3416 di->di_result = NULL;
3417 _PyObject_GC_TRACK(di);
3418 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003419}
3420
3421static void
3422dictiter_dealloc(dictiterobject *di)
3423{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 Py_XDECREF(di->di_dict);
3425 Py_XDECREF(di->di_result);
3426 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003427}
3428
3429static int
3430dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
3431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003432 Py_VISIT(di->di_dict);
3433 Py_VISIT(di->di_result);
3434 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003435}
3436
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003437static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003438dictiter_len(dictiterobject *di)
3439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440 Py_ssize_t len = 0;
3441 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
3442 len = di->len;
3443 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003444}
3445
Guido van Rossumb90c8482007-02-10 01:11:45 +00003446PyDoc_STRVAR(length_hint_doc,
3447 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003448
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003449static PyObject *
3450dictiter_reduce(dictiterobject *di);
3451
3452PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3453
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003454static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003455 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
3456 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003457 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
3458 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003460};
3461
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003462static PyObject*
3463dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00003464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003465 PyObject *key;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003466 Py_ssize_t i, n;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003467 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003468 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00003469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003470 if (d == NULL)
3471 return NULL;
3472 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00003473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003474 if (di->di_used != d->ma_used) {
3475 PyErr_SetString(PyExc_RuntimeError,
3476 "dictionary changed size during iteration");
3477 di->di_used = -1; /* Make this state sticky */
3478 return NULL;
3479 }
Guido van Rossum2147df72002-07-16 20:30:22 +00003480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003481 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003482 k = d->ma_keys;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003483 n = k->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003484 if (d->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003485 PyObject **value_ptr = &d->ma_values[i];
3486 while (i < n && *value_ptr == NULL) {
3487 value_ptr++;
3488 i++;
3489 }
3490 if (i >= n)
3491 goto fail;
3492 key = DK_ENTRIES(k)[i].me_key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003493 }
3494 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003495 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(k)[i];
3496 while (i < n && entry_ptr->me_value == NULL) {
3497 entry_ptr++;
3498 i++;
3499 }
3500 if (i >= n)
3501 goto fail;
3502 key = entry_ptr->me_key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003503 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 di->di_pos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003505 di->len--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003506 Py_INCREF(key);
3507 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003508
3509fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003510 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003511 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003512 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003513}
3514
Raymond Hettinger019a1482004-03-18 02:41:19 +00003515PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3517 "dict_keyiterator", /* tp_name */
3518 sizeof(dictiterobject), /* tp_basicsize */
3519 0, /* tp_itemsize */
3520 /* methods */
3521 (destructor)dictiter_dealloc, /* tp_dealloc */
3522 0, /* tp_print */
3523 0, /* tp_getattr */
3524 0, /* tp_setattr */
3525 0, /* tp_reserved */
3526 0, /* tp_repr */
3527 0, /* tp_as_number */
3528 0, /* tp_as_sequence */
3529 0, /* tp_as_mapping */
3530 0, /* tp_hash */
3531 0, /* tp_call */
3532 0, /* tp_str */
3533 PyObject_GenericGetAttr, /* tp_getattro */
3534 0, /* tp_setattro */
3535 0, /* tp_as_buffer */
3536 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3537 0, /* tp_doc */
3538 (traverseproc)dictiter_traverse, /* tp_traverse */
3539 0, /* tp_clear */
3540 0, /* tp_richcompare */
3541 0, /* tp_weaklistoffset */
3542 PyObject_SelfIter, /* tp_iter */
3543 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
3544 dictiter_methods, /* tp_methods */
3545 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003546};
3547
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003548static PyObject *
3549dictiter_iternextvalue(dictiterobject *di)
Raymond Hettinger019a1482004-03-18 02:41:19 +00003550{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 PyObject *value;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003552 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003555 if (d == NULL)
3556 return NULL;
3557 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003559 if (di->di_used != d->ma_used) {
3560 PyErr_SetString(PyExc_RuntimeError,
3561 "dictionary changed size during iteration");
3562 di->di_used = -1; /* Make this state sticky */
3563 return NULL;
3564 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003566 i = di->di_pos;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003567 n = d->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003568 if (d->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003569 PyObject **value_ptr = &d->ma_values[i];
3570 while (i < n && *value_ptr == NULL) {
3571 value_ptr++;
3572 i++;
3573 }
3574 if (i >= n)
3575 goto fail;
3576 value = *value_ptr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003577 }
3578 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003579 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(d->ma_keys)[i];
3580 while (i < n && entry_ptr->me_value == NULL) {
3581 entry_ptr++;
3582 i++;
3583 }
3584 if (i >= n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003585 goto fail;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003586 value = entry_ptr->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003587 }
3588 di->di_pos = i+1;
3589 di->len--;
3590 Py_INCREF(value);
3591 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003592
3593fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003594 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003595 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003596 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003597}
3598
3599PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003600 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3601 "dict_valueiterator", /* tp_name */
3602 sizeof(dictiterobject), /* tp_basicsize */
3603 0, /* tp_itemsize */
3604 /* methods */
3605 (destructor)dictiter_dealloc, /* tp_dealloc */
3606 0, /* tp_print */
3607 0, /* tp_getattr */
3608 0, /* tp_setattr */
3609 0, /* tp_reserved */
3610 0, /* tp_repr */
3611 0, /* tp_as_number */
3612 0, /* tp_as_sequence */
3613 0, /* tp_as_mapping */
3614 0, /* tp_hash */
3615 0, /* tp_call */
3616 0, /* tp_str */
3617 PyObject_GenericGetAttr, /* tp_getattro */
3618 0, /* tp_setattro */
3619 0, /* tp_as_buffer */
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003620 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003621 0, /* tp_doc */
3622 (traverseproc)dictiter_traverse, /* tp_traverse */
3623 0, /* tp_clear */
3624 0, /* tp_richcompare */
3625 0, /* tp_weaklistoffset */
3626 PyObject_SelfIter, /* tp_iter */
3627 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
3628 dictiter_methods, /* tp_methods */
3629 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003630};
3631
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003632static PyObject *
3633dictiter_iternextitem(dictiterobject *di)
Raymond Hettinger019a1482004-03-18 02:41:19 +00003634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 PyObject *key, *value, *result = di->di_result;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003636 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003637 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003639 if (d == NULL)
3640 return NULL;
3641 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003643 if (di->di_used != d->ma_used) {
3644 PyErr_SetString(PyExc_RuntimeError,
3645 "dictionary changed size during iteration");
3646 di->di_used = -1; /* Make this state sticky */
3647 return NULL;
3648 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003650 i = di->di_pos;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003651 n = d->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003652 if (d->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003653 PyObject **value_ptr = &d->ma_values[i];
3654 while (i < n && *value_ptr == NULL) {
3655 value_ptr++;
3656 i++;
3657 }
3658 if (i >= n)
3659 goto fail;
3660 key = DK_ENTRIES(d->ma_keys)[i].me_key;
3661 value = *value_ptr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003662 }
3663 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003664 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(d->ma_keys)[i];
3665 while (i < n && entry_ptr->me_value == NULL) {
3666 entry_ptr++;
3667 i++;
3668 }
3669 if (i >= n)
3670 goto fail;
3671 key = entry_ptr->me_key;
3672 value = entry_ptr->me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003673 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003674 di->di_pos = i+1;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003675 di->len--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676 if (result->ob_refcnt == 1) {
3677 Py_INCREF(result);
3678 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3679 Py_DECREF(PyTuple_GET_ITEM(result, 1));
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003680 }
3681 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003682 result = PyTuple_New(2);
3683 if (result == NULL)
3684 return NULL;
3685 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003686 Py_INCREF(key);
3687 Py_INCREF(value);
Eric Snow96c6af92015-05-29 22:21:39 -06003688 PyTuple_SET_ITEM(result, 0, key); /* steals reference */
3689 PyTuple_SET_ITEM(result, 1, value); /* steals reference */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003690 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003691
3692fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003693 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003694 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003695 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003696}
3697
3698PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003699 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3700 "dict_itemiterator", /* tp_name */
3701 sizeof(dictiterobject), /* tp_basicsize */
3702 0, /* tp_itemsize */
3703 /* methods */
3704 (destructor)dictiter_dealloc, /* tp_dealloc */
3705 0, /* tp_print */
3706 0, /* tp_getattr */
3707 0, /* tp_setattr */
3708 0, /* tp_reserved */
3709 0, /* tp_repr */
3710 0, /* tp_as_number */
3711 0, /* tp_as_sequence */
3712 0, /* tp_as_mapping */
3713 0, /* tp_hash */
3714 0, /* tp_call */
3715 0, /* tp_str */
3716 PyObject_GenericGetAttr, /* tp_getattro */
3717 0, /* tp_setattro */
3718 0, /* tp_as_buffer */
3719 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3720 0, /* tp_doc */
3721 (traverseproc)dictiter_traverse, /* tp_traverse */
3722 0, /* tp_clear */
3723 0, /* tp_richcompare */
3724 0, /* tp_weaklistoffset */
3725 PyObject_SelfIter, /* tp_iter */
3726 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3727 dictiter_methods, /* tp_methods */
3728 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003729};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003730
3731
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003732static PyObject *
3733dictiter_reduce(dictiterobject *di)
3734{
3735 PyObject *list;
3736 dictiterobject tmp;
3737
3738 list = PyList_New(0);
3739 if (!list)
3740 return NULL;
3741
3742 /* copy the itertor state */
3743 tmp = *di;
3744 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003745
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003746 /* iterate the temporary into a list */
3747 for(;;) {
3748 PyObject *element = 0;
3749 if (Py_TYPE(di) == &PyDictIterItem_Type)
3750 element = dictiter_iternextitem(&tmp);
3751 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3752 element = dictiter_iternextkey(&tmp);
3753 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3754 element = dictiter_iternextvalue(&tmp);
3755 else
3756 assert(0);
3757 if (element) {
3758 if (PyList_Append(list, element)) {
3759 Py_DECREF(element);
3760 Py_DECREF(list);
3761 Py_XDECREF(tmp.di_dict);
3762 return NULL;
3763 }
3764 Py_DECREF(element);
3765 } else
3766 break;
3767 }
3768 Py_XDECREF(tmp.di_dict);
3769 /* check for error */
3770 if (tmp.di_dict != NULL) {
3771 /* we have an error */
3772 Py_DECREF(list);
3773 return NULL;
3774 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003775 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003776}
3777
Guido van Rossum3ac67412007-02-10 18:55:06 +00003778/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003779/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003780/***********************************************/
3781
Guido van Rossumb90c8482007-02-10 01:11:45 +00003782/* The instance lay-out is the same for all three; but the type differs. */
3783
Guido van Rossumb90c8482007-02-10 01:11:45 +00003784static void
Eric Snow96c6af92015-05-29 22:21:39 -06003785dictview_dealloc(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003787 Py_XDECREF(dv->dv_dict);
3788 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003789}
3790
3791static int
Eric Snow96c6af92015-05-29 22:21:39 -06003792dictview_traverse(_PyDictViewObject *dv, visitproc visit, void *arg)
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003794 Py_VISIT(dv->dv_dict);
3795 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003796}
3797
Guido van Rossum83825ac2007-02-10 04:54:19 +00003798static Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06003799dictview_len(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003800{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003801 Py_ssize_t len = 0;
3802 if (dv->dv_dict != NULL)
3803 len = dv->dv_dict->ma_used;
3804 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003805}
3806
Eric Snow96c6af92015-05-29 22:21:39 -06003807PyObject *
3808_PyDictView_New(PyObject *dict, PyTypeObject *type)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003809{
Eric Snow96c6af92015-05-29 22:21:39 -06003810 _PyDictViewObject *dv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003811 if (dict == NULL) {
3812 PyErr_BadInternalCall();
3813 return NULL;
3814 }
3815 if (!PyDict_Check(dict)) {
3816 /* XXX Get rid of this restriction later */
3817 PyErr_Format(PyExc_TypeError,
3818 "%s() requires a dict argument, not '%s'",
3819 type->tp_name, dict->ob_type->tp_name);
3820 return NULL;
3821 }
Eric Snow96c6af92015-05-29 22:21:39 -06003822 dv = PyObject_GC_New(_PyDictViewObject, type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 if (dv == NULL)
3824 return NULL;
3825 Py_INCREF(dict);
3826 dv->dv_dict = (PyDictObject *)dict;
3827 _PyObject_GC_TRACK(dv);
3828 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003829}
3830
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003831/* TODO(guido): The views objects are not complete:
3832
3833 * support more set operations
3834 * support arbitrary mappings?
3835 - either these should be static or exported in dictobject.h
3836 - if public then they should probably be in builtins
3837*/
3838
Guido van Rossumaac530c2007-08-24 22:33:45 +00003839/* Return 1 if self is a subset of other, iterating over self;
3840 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003841static int
3842all_contained_in(PyObject *self, PyObject *other)
3843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003844 PyObject *iter = PyObject_GetIter(self);
3845 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003847 if (iter == NULL)
3848 return -1;
3849 for (;;) {
3850 PyObject *next = PyIter_Next(iter);
3851 if (next == NULL) {
3852 if (PyErr_Occurred())
3853 ok = -1;
3854 break;
3855 }
3856 ok = PySequence_Contains(other, next);
3857 Py_DECREF(next);
3858 if (ok <= 0)
3859 break;
3860 }
3861 Py_DECREF(iter);
3862 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003863}
3864
3865static PyObject *
3866dictview_richcompare(PyObject *self, PyObject *other, int op)
3867{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 Py_ssize_t len_self, len_other;
3869 int ok;
3870 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872 assert(self != NULL);
3873 assert(PyDictViewSet_Check(self));
3874 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003875
Brian Curtindfc80e32011-08-10 20:28:54 -05003876 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3877 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003879 len_self = PyObject_Size(self);
3880 if (len_self < 0)
3881 return NULL;
3882 len_other = PyObject_Size(other);
3883 if (len_other < 0)
3884 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003886 ok = 0;
3887 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003889 case Py_NE:
3890 case Py_EQ:
3891 if (len_self == len_other)
3892 ok = all_contained_in(self, other);
3893 if (op == Py_NE && ok >= 0)
3894 ok = !ok;
3895 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003897 case Py_LT:
3898 if (len_self < len_other)
3899 ok = all_contained_in(self, other);
3900 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003902 case Py_LE:
3903 if (len_self <= len_other)
3904 ok = all_contained_in(self, other);
3905 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003907 case Py_GT:
3908 if (len_self > len_other)
3909 ok = all_contained_in(other, self);
3910 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003912 case Py_GE:
3913 if (len_self >= len_other)
3914 ok = all_contained_in(other, self);
3915 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003917 }
3918 if (ok < 0)
3919 return NULL;
3920 result = ok ? Py_True : Py_False;
3921 Py_INCREF(result);
3922 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003923}
3924
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003925static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003926dictview_repr(_PyDictViewObject *dv)
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003928 PyObject *seq;
3929 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003931 seq = PySequence_List((PyObject *)dv);
3932 if (seq == NULL)
3933 return NULL;
3934
3935 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3936 Py_DECREF(seq);
3937 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003938}
3939
Guido van Rossum3ac67412007-02-10 18:55:06 +00003940/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003941
3942static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003943dictkeys_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003945 if (dv->dv_dict == NULL) {
3946 Py_RETURN_NONE;
3947 }
3948 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003949}
3950
3951static int
Eric Snow96c6af92015-05-29 22:21:39 -06003952dictkeys_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 if (dv->dv_dict == NULL)
3955 return 0;
3956 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003957}
3958
Guido van Rossum83825ac2007-02-10 04:54:19 +00003959static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003960 (lenfunc)dictview_len, /* sq_length */
3961 0, /* sq_concat */
3962 0, /* sq_repeat */
3963 0, /* sq_item */
3964 0, /* sq_slice */
3965 0, /* sq_ass_item */
3966 0, /* sq_ass_slice */
3967 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003968};
3969
Guido van Rossum523259b2007-08-24 23:41:22 +00003970static PyObject*
3971dictviews_sub(PyObject* self, PyObject *other)
3972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003973 PyObject *result = PySet_New(self);
3974 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003975 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003977 if (result == NULL)
3978 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003979
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003980 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003981 if (tmp == NULL) {
3982 Py_DECREF(result);
3983 return NULL;
3984 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003986 Py_DECREF(tmp);
3987 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003988}
3989
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003990PyObject*
3991_PyDictView_Intersect(PyObject* self, PyObject *other)
Guido van Rossum523259b2007-08-24 23:41:22 +00003992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003993 PyObject *result = PySet_New(self);
3994 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003995 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003997 if (result == NULL)
3998 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003999
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08004000 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004001 if (tmp == NULL) {
4002 Py_DECREF(result);
4003 return NULL;
4004 }
Guido van Rossum523259b2007-08-24 23:41:22 +00004005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004006 Py_DECREF(tmp);
4007 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00004008}
4009
4010static PyObject*
4011dictviews_or(PyObject* self, PyObject *other)
4012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004013 PyObject *result = PySet_New(self);
4014 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02004015 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02004016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004017 if (result == NULL)
4018 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00004019
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08004020 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004021 if (tmp == NULL) {
4022 Py_DECREF(result);
4023 return NULL;
4024 }
Guido van Rossum523259b2007-08-24 23:41:22 +00004025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004026 Py_DECREF(tmp);
4027 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00004028}
4029
4030static PyObject*
4031dictviews_xor(PyObject* self, PyObject *other)
4032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004033 PyObject *result = PySet_New(self);
4034 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004035 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004037 if (result == NULL)
4038 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00004039
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08004040 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004041 if (tmp == NULL) {
4042 Py_DECREF(result);
4043 return NULL;
4044 }
Guido van Rossum523259b2007-08-24 23:41:22 +00004045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004046 Py_DECREF(tmp);
4047 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00004048}
4049
4050static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004051 0, /*nb_add*/
4052 (binaryfunc)dictviews_sub, /*nb_subtract*/
4053 0, /*nb_multiply*/
4054 0, /*nb_remainder*/
4055 0, /*nb_divmod*/
4056 0, /*nb_power*/
4057 0, /*nb_negative*/
4058 0, /*nb_positive*/
4059 0, /*nb_absolute*/
4060 0, /*nb_bool*/
4061 0, /*nb_invert*/
4062 0, /*nb_lshift*/
4063 0, /*nb_rshift*/
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004064 (binaryfunc)_PyDictView_Intersect, /*nb_and*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004065 (binaryfunc)dictviews_xor, /*nb_xor*/
4066 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00004067};
4068
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004069static PyObject*
4070dictviews_isdisjoint(PyObject *self, PyObject *other)
4071{
4072 PyObject *it;
4073 PyObject *item = NULL;
4074
4075 if (self == other) {
Eric Snow96c6af92015-05-29 22:21:39 -06004076 if (dictview_len((_PyDictViewObject *)self) == 0)
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004077 Py_RETURN_TRUE;
4078 else
4079 Py_RETURN_FALSE;
4080 }
4081
4082 /* Iterate over the shorter object (only if other is a set,
4083 * because PySequence_Contains may be expensive otherwise): */
4084 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
Eric Snow96c6af92015-05-29 22:21:39 -06004085 Py_ssize_t len_self = dictview_len((_PyDictViewObject *)self);
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004086 Py_ssize_t len_other = PyObject_Size(other);
4087 if (len_other == -1)
4088 return NULL;
4089
4090 if ((len_other > len_self)) {
4091 PyObject *tmp = other;
4092 other = self;
4093 self = tmp;
4094 }
4095 }
4096
4097 it = PyObject_GetIter(other);
4098 if (it == NULL)
4099 return NULL;
4100
4101 while ((item = PyIter_Next(it)) != NULL) {
4102 int contains = PySequence_Contains(self, item);
4103 Py_DECREF(item);
4104 if (contains == -1) {
4105 Py_DECREF(it);
4106 return NULL;
4107 }
4108
4109 if (contains) {
4110 Py_DECREF(it);
4111 Py_RETURN_FALSE;
4112 }
4113 }
4114 Py_DECREF(it);
4115 if (PyErr_Occurred())
4116 return NULL; /* PyIter_Next raised an exception. */
4117 Py_RETURN_TRUE;
4118}
4119
4120PyDoc_STRVAR(isdisjoint_doc,
4121"Return True if the view and the given iterable have a null intersection.");
4122
Guido van Rossumb90c8482007-02-10 01:11:45 +00004123static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004124 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
4125 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004126 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004127};
4128
4129PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004130 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4131 "dict_keys", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004132 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004133 0, /* tp_itemsize */
4134 /* methods */
4135 (destructor)dictview_dealloc, /* tp_dealloc */
4136 0, /* tp_print */
4137 0, /* tp_getattr */
4138 0, /* tp_setattr */
4139 0, /* tp_reserved */
4140 (reprfunc)dictview_repr, /* tp_repr */
4141 &dictviews_as_number, /* tp_as_number */
4142 &dictkeys_as_sequence, /* tp_as_sequence */
4143 0, /* tp_as_mapping */
4144 0, /* tp_hash */
4145 0, /* tp_call */
4146 0, /* tp_str */
4147 PyObject_GenericGetAttr, /* tp_getattro */
4148 0, /* tp_setattro */
4149 0, /* tp_as_buffer */
4150 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4151 0, /* tp_doc */
4152 (traverseproc)dictview_traverse, /* tp_traverse */
4153 0, /* tp_clear */
4154 dictview_richcompare, /* tp_richcompare */
4155 0, /* tp_weaklistoffset */
4156 (getiterfunc)dictkeys_iter, /* tp_iter */
4157 0, /* tp_iternext */
4158 dictkeys_methods, /* tp_methods */
4159 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004160};
4161
4162static PyObject *
4163dictkeys_new(PyObject *dict)
4164{
Eric Snow96c6af92015-05-29 22:21:39 -06004165 return _PyDictView_New(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004166}
4167
Guido van Rossum3ac67412007-02-10 18:55:06 +00004168/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004169
4170static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004171dictitems_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173 if (dv->dv_dict == NULL) {
4174 Py_RETURN_NONE;
4175 }
4176 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00004177}
4178
4179static int
Eric Snow96c6af92015-05-29 22:21:39 -06004180dictitems_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00004181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004182 PyObject *key, *value, *found;
4183 if (dv->dv_dict == NULL)
4184 return 0;
4185 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
4186 return 0;
4187 key = PyTuple_GET_ITEM(obj, 0);
4188 value = PyTuple_GET_ITEM(obj, 1);
Raymond Hettinger6692f012016-09-18 21:46:08 -07004189 found = PyDict_GetItemWithError((PyObject *)dv->dv_dict, key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004190 if (found == NULL) {
4191 if (PyErr_Occurred())
4192 return -1;
4193 return 0;
4194 }
4195 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004196}
4197
Guido van Rossum83825ac2007-02-10 04:54:19 +00004198static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004199 (lenfunc)dictview_len, /* sq_length */
4200 0, /* sq_concat */
4201 0, /* sq_repeat */
4202 0, /* sq_item */
4203 0, /* sq_slice */
4204 0, /* sq_ass_item */
4205 0, /* sq_ass_slice */
4206 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004207};
4208
Guido van Rossumb90c8482007-02-10 01:11:45 +00004209static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004210 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
4211 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004212 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004213};
4214
4215PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004216 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4217 "dict_items", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004218 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004219 0, /* tp_itemsize */
4220 /* methods */
4221 (destructor)dictview_dealloc, /* tp_dealloc */
4222 0, /* tp_print */
4223 0, /* tp_getattr */
4224 0, /* tp_setattr */
4225 0, /* tp_reserved */
4226 (reprfunc)dictview_repr, /* tp_repr */
4227 &dictviews_as_number, /* tp_as_number */
4228 &dictitems_as_sequence, /* tp_as_sequence */
4229 0, /* tp_as_mapping */
4230 0, /* tp_hash */
4231 0, /* tp_call */
4232 0, /* tp_str */
4233 PyObject_GenericGetAttr, /* tp_getattro */
4234 0, /* tp_setattro */
4235 0, /* tp_as_buffer */
4236 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4237 0, /* tp_doc */
4238 (traverseproc)dictview_traverse, /* tp_traverse */
4239 0, /* tp_clear */
4240 dictview_richcompare, /* tp_richcompare */
4241 0, /* tp_weaklistoffset */
4242 (getiterfunc)dictitems_iter, /* tp_iter */
4243 0, /* tp_iternext */
4244 dictitems_methods, /* tp_methods */
4245 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004246};
4247
4248static PyObject *
4249dictitems_new(PyObject *dict)
4250{
Eric Snow96c6af92015-05-29 22:21:39 -06004251 return _PyDictView_New(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004252}
4253
Guido van Rossum3ac67412007-02-10 18:55:06 +00004254/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004255
4256static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004257dictvalues_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004259 if (dv->dv_dict == NULL) {
4260 Py_RETURN_NONE;
4261 }
4262 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004263}
4264
Guido van Rossum83825ac2007-02-10 04:54:19 +00004265static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004266 (lenfunc)dictview_len, /* sq_length */
4267 0, /* sq_concat */
4268 0, /* sq_repeat */
4269 0, /* sq_item */
4270 0, /* sq_slice */
4271 0, /* sq_ass_item */
4272 0, /* sq_ass_slice */
4273 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004274};
4275
Guido van Rossumb90c8482007-02-10 01:11:45 +00004276static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004277 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004278};
4279
4280PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4282 "dict_values", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004283 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004284 0, /* tp_itemsize */
4285 /* methods */
4286 (destructor)dictview_dealloc, /* tp_dealloc */
4287 0, /* tp_print */
4288 0, /* tp_getattr */
4289 0, /* tp_setattr */
4290 0, /* tp_reserved */
4291 (reprfunc)dictview_repr, /* tp_repr */
4292 0, /* tp_as_number */
4293 &dictvalues_as_sequence, /* tp_as_sequence */
4294 0, /* tp_as_mapping */
4295 0, /* tp_hash */
4296 0, /* tp_call */
4297 0, /* tp_str */
4298 PyObject_GenericGetAttr, /* tp_getattro */
4299 0, /* tp_setattro */
4300 0, /* tp_as_buffer */
4301 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4302 0, /* tp_doc */
4303 (traverseproc)dictview_traverse, /* tp_traverse */
4304 0, /* tp_clear */
4305 0, /* tp_richcompare */
4306 0, /* tp_weaklistoffset */
4307 (getiterfunc)dictvalues_iter, /* tp_iter */
4308 0, /* tp_iternext */
4309 dictvalues_methods, /* tp_methods */
4310 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004311};
4312
4313static PyObject *
4314dictvalues_new(PyObject *dict)
4315{
Eric Snow96c6af92015-05-29 22:21:39 -06004316 return _PyDictView_New(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004317}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004318
4319/* Returns NULL if cannot allocate a new PyDictKeysObject,
4320 but does not set an error */
4321PyDictKeysObject *
4322_PyDict_NewKeysForClass(void)
4323{
Victor Stinner742da042016-09-07 17:40:12 -07004324 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004325 if (keys == NULL)
4326 PyErr_Clear();
4327 else
4328 keys->dk_lookup = lookdict_split;
4329 return keys;
4330}
4331
4332#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
4333
4334PyObject *
4335PyObject_GenericGetDict(PyObject *obj, void *context)
4336{
4337 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
4338 if (dictptr == NULL) {
4339 PyErr_SetString(PyExc_AttributeError,
4340 "This object has no __dict__");
4341 return NULL;
4342 }
4343 dict = *dictptr;
4344 if (dict == NULL) {
4345 PyTypeObject *tp = Py_TYPE(obj);
4346 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
4347 DK_INCREF(CACHED_KEYS(tp));
4348 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
4349 }
4350 else {
4351 *dictptr = dict = PyDict_New();
4352 }
4353 }
4354 Py_XINCREF(dict);
4355 return dict;
4356}
4357
4358int
4359_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
Victor Stinner742da042016-09-07 17:40:12 -07004360 PyObject *key, PyObject *value)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004361{
4362 PyObject *dict;
4363 int res;
4364 PyDictKeysObject *cached;
4365
4366 assert(dictptr != NULL);
4367 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
4368 assert(dictptr != NULL);
4369 dict = *dictptr;
4370 if (dict == NULL) {
4371 DK_INCREF(cached);
4372 dict = new_dict_with_shared_keys(cached);
4373 if (dict == NULL)
4374 return -1;
4375 *dictptr = dict;
4376 }
4377 if (value == NULL) {
4378 res = PyDict_DelItem(dict, key);
INADA Naoki89ddffb2017-02-13 09:19:05 +09004379 // Since key sharing dict doesn't allow deletion, PyDict_DelItem()
4380 // always converts dict to combined form.
4381 if ((cached = CACHED_KEYS(tp)) != NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004382 CACHED_KEYS(tp) = NULL;
4383 DK_DECREF(cached);
4384 }
Victor Stinner3d3f2642016-12-15 17:21:23 +01004385 }
4386 else {
INADA Naoki89ddffb2017-02-13 09:19:05 +09004387 int was_shared = (cached == ((PyDictObject *)dict)->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004388 res = PyDict_SetItem(dict, key, value);
INADA Naoki89ddffb2017-02-13 09:19:05 +09004389 if (was_shared &&
4390 (cached = CACHED_KEYS(tp)) != NULL &&
4391 cached != ((PyDictObject *)dict)->ma_keys) {
Victor Stinner3d3f2642016-12-15 17:21:23 +01004392 /* PyDict_SetItem() may call dictresize and convert split table
4393 * into combined table. In such case, convert it to split
4394 * table again and update type's shared key only when this is
4395 * the only dict sharing key with the type.
4396 *
4397 * This is to allow using shared key in class like this:
4398 *
4399 * class C:
4400 * def __init__(self):
4401 * # one dict resize happens
4402 * self.a, self.b, self.c = 1, 2, 3
4403 * self.d, self.e, self.f = 4, 5, 6
4404 * a = C()
4405 */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004406 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004407 CACHED_KEYS(tp) = make_keys_shared(dict);
Victor Stinner742da042016-09-07 17:40:12 -07004408 }
4409 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004410 CACHED_KEYS(tp) = NULL;
4411 }
4412 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004413 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
4414 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004415 }
4416 }
4417 } else {
4418 dict = *dictptr;
4419 if (dict == NULL) {
4420 dict = PyDict_New();
4421 if (dict == NULL)
4422 return -1;
4423 *dictptr = dict;
4424 }
4425 if (value == NULL) {
4426 res = PyDict_DelItem(dict, key);
4427 } else {
4428 res = PyDict_SetItem(dict, key, value);
4429 }
4430 }
4431 return res;
4432}
4433
4434void
4435_PyDictKeys_DecRef(PyDictKeysObject *keys)
4436{
4437 DK_DECREF(keys);
4438}