blob: 20b6f2f52e4ff6ba28bc8ecf15f7c70cdfb57f5b [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 */
391#define ESTIMATE_SIZE(n) (((n)*3) >> 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 Stinnerccda5c42016-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 Stinnerccda5c42016-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 Stinnerccda5c42016-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{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001362 Py_ssize_t newsize;
1363 PyDictKeysObject *new_keys;
Victor Stinner742da042016-09-07 17:40:12 -07001364 for (newsize = PyDict_MINSIZE;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001365 newsize <= minused && newsize > 0;
1366 newsize <<= 1)
1367 ;
1368 new_keys = new_keys_object(newsize);
1369 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001371 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001372}
1373
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001374/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1375 * that may occur (originally dicts supported only string keys, and exceptions
1376 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001377 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001378 * (suppressed) occurred while computing the key's hash, or that some error
1379 * (suppressed) occurred when comparing keys in the dict's internal probe
1380 * sequence. A nasty example of the latter is when a Python-coded comparison
1381 * function hits a stack-depth error, which can cause this to return NULL
1382 * even if the key is present.
1383 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001384PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001385PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001386{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001387 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001388 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 PyDictObject *mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001391 PyObject **value_addr;
1392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 if (!PyDict_Check(op))
1394 return NULL;
1395 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001396 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 {
1398 hash = PyObject_Hash(key);
1399 if (hash == -1) {
1400 PyErr_Clear();
1401 return NULL;
1402 }
1403 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 /* We can arrive here with a NULL tstate during initialization: try
1406 running "python -Wi" for an example related to string interning.
1407 Let's just hope that no exception occurs then... This must be
1408 _PyThreadState_Current and not PyThreadState_GET() because in debug
1409 mode, the latter complains if tstate is NULL. */
Victor Stinnerbfd316e2016-01-20 11:12:38 +01001410 tstate = _PyThreadState_UncheckedGet();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 if (tstate != NULL && tstate->curexc_type != NULL) {
1412 /* preserve the existing exception */
1413 PyObject *err_type, *err_value, *err_tb;
1414 PyErr_Fetch(&err_type, &err_value, &err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001415 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 /* ignore errors */
1417 PyErr_Restore(err_type, err_value, err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001418 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 return NULL;
1420 }
1421 else {
Victor Stinner742da042016-09-07 17:40:12 -07001422 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1423 if (ix < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 PyErr_Clear();
1425 return NULL;
1426 }
1427 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001428 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001429}
1430
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001431/* Same as PyDict_GetItemWithError() but with hash supplied by caller.
1432 This returns NULL *with* an exception set if an exception occurred.
1433 It returns NULL *without* an exception set if the key wasn't present.
1434*/
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001435PyObject *
1436_PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1437{
Victor Stinner742da042016-09-07 17:40:12 -07001438 Py_ssize_t ix;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001439 PyDictObject *mp = (PyDictObject *)op;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001440 PyObject **value_addr;
1441
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001442 if (!PyDict_Check(op)) {
1443 PyErr_BadInternalCall();
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001444 return NULL;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001445 }
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001446
1447 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1448 if (ix < 0) {
1449 return NULL;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001450 }
1451 return *value_addr;
1452}
1453
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001454/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1455 This returns NULL *with* an exception set if an exception occurred.
1456 It returns NULL *without* an exception set if the key wasn't present.
1457*/
1458PyObject *
1459PyDict_GetItemWithError(PyObject *op, PyObject *key)
1460{
Victor Stinner742da042016-09-07 17:40:12 -07001461 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001462 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001464 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 if (!PyDict_Check(op)) {
1467 PyErr_BadInternalCall();
1468 return NULL;
1469 }
1470 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001471 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 {
1473 hash = PyObject_Hash(key);
1474 if (hash == -1) {
1475 return NULL;
1476 }
1477 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001478
Victor Stinner742da042016-09-07 17:40:12 -07001479 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1480 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001482 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001483}
1484
Brett Cannonfd074152012-04-14 14:10:13 -04001485PyObject *
1486_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1487{
1488 PyObject *kv;
1489 kv = _PyUnicode_FromId(key); /* borrowed */
1490 if (kv == NULL)
1491 return NULL;
1492 return PyDict_GetItemWithError(dp, kv);
1493}
1494
Victor Stinnerb4efc962015-11-20 09:24:02 +01001495/* Fast version of global value lookup (LOAD_GLOBAL).
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001496 * Lookup in globals, then builtins.
Victor Stinnerb4efc962015-11-20 09:24:02 +01001497 *
1498 * Raise an exception and return NULL if an error occurred (ex: computing the
1499 * key hash failed, key comparison failed, ...). Return NULL if the key doesn't
1500 * exist. Return the value if the key exists.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001501 */
1502PyObject *
1503_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001504{
Victor Stinner742da042016-09-07 17:40:12 -07001505 Py_ssize_t ix;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001506 Py_hash_t hash;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001507 PyObject **value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001508
1509 if (!PyUnicode_CheckExact(key) ||
1510 (hash = ((PyASCIIObject *) key)->hash) == -1)
1511 {
1512 hash = PyObject_Hash(key);
1513 if (hash == -1)
1514 return NULL;
Antoine Pitroue965d972012-02-27 00:45:12 +01001515 }
Victor Stinnerb4efc962015-11-20 09:24:02 +01001516
1517 /* namespace 1: globals */
Victor Stinner742da042016-09-07 17:40:12 -07001518 ix = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr, NULL);
1519 if (ix == DKIX_ERROR)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001520 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001521 if (ix != DKIX_EMPTY && *value_addr != NULL)
1522 return *value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001523
1524 /* namespace 2: builtins */
Victor Stinner742da042016-09-07 17:40:12 -07001525 ix = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr, NULL);
1526 if (ix < 0)
Victor Stinnerb4efc962015-11-20 09:24:02 +01001527 return NULL;
1528 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001529}
1530
Antoine Pitroue965d972012-02-27 00:45:12 +01001531/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1532 * dictionary if it's merely replacing the value for an existing key.
1533 * This means that it's safe to loop over a dictionary with PyDict_Next()
1534 * and occasionally replace a value -- but you can't insert new keys or
1535 * remove them.
1536 */
1537int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001538PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001539{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001540 PyDictObject *mp;
1541 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001542 if (!PyDict_Check(op)) {
1543 PyErr_BadInternalCall();
1544 return -1;
1545 }
1546 assert(key);
1547 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001548 mp = (PyDictObject *)op;
1549 if (!PyUnicode_CheckExact(key) ||
1550 (hash = ((PyASCIIObject *) key)->hash) == -1)
1551 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001552 hash = PyObject_Hash(key);
1553 if (hash == -1)
1554 return -1;
1555 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001556
1557 /* insertdict() handles any resizing that might be necessary */
1558 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001559}
1560
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001561int
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001562_PyDict_SetItem_KnownHash(PyObject *op, PyObject *key, PyObject *value,
1563 Py_hash_t hash)
1564{
1565 PyDictObject *mp;
1566
1567 if (!PyDict_Check(op)) {
1568 PyErr_BadInternalCall();
1569 return -1;
1570 }
1571 assert(key);
1572 assert(value);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001573 assert(hash != -1);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001574 mp = (PyDictObject *)op;
1575
1576 /* insertdict() handles any resizing that might be necessary */
1577 return insertdict(mp, key, hash, value);
1578}
1579
1580int
Tim Peters1f5871e2000-07-04 17:44:48 +00001581PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001582{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001583 Py_hash_t hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 assert(key);
1586 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001587 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 hash = PyObject_Hash(key);
1589 if (hash == -1)
1590 return -1;
1591 }
Victor Stinner742da042016-09-07 17:40:12 -07001592
1593 return _PyDict_DelItem_KnownHash(op, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001594}
1595
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001596int
1597_PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1598{
Victor Stinner742da042016-09-07 17:40:12 -07001599 Py_ssize_t hashpos, ix;
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001600 PyDictObject *mp;
1601 PyDictKeyEntry *ep;
1602 PyObject *old_key, *old_value;
1603 PyObject **value_addr;
1604
1605 if (!PyDict_Check(op)) {
1606 PyErr_BadInternalCall();
1607 return -1;
1608 }
1609 assert(key);
1610 assert(hash != -1);
1611 mp = (PyDictObject *)op;
Victor Stinner742da042016-09-07 17:40:12 -07001612 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1613 if (ix == DKIX_ERROR)
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001614 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07001615 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001616 _PyErr_SetKeyError(key);
1617 return -1;
1618 }
Victor Stinner742da042016-09-07 17:40:12 -07001619 assert(dk_get_index(mp->ma_keys, hashpos) == ix);
Victor Stinner78601a32016-09-09 19:28:36 -07001620
1621 // Split table doesn't allow deletion. Combine it.
1622 if (_PyDict_HasSplitTable(mp)) {
1623 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1624 return -1;
1625 }
1626 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1627 assert(ix >= 0);
1628 }
1629
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001630 old_value = *value_addr;
Victor Stinner78601a32016-09-09 19:28:36 -07001631 assert(old_value != NULL);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001632 *value_addr = NULL;
1633 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001634 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner78601a32016-09-09 19:28:36 -07001635 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1636 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1637 ENSURE_ALLOWS_DELETIONS(mp);
1638 old_key = ep->me_key;
1639 ep->me_key = NULL;
1640 Py_DECREF(old_key);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001641 Py_DECREF(old_value);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001642
1643 assert(_PyDict_CheckConsistency(mp));
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001644 return 0;
1645}
1646
Guido van Rossum25831651993-05-19 14:50:45 +00001647void
Tim Peters1f5871e2000-07-04 17:44:48 +00001648PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001651 PyDictKeysObject *oldkeys;
1652 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 if (!PyDict_Check(op))
1656 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001657 mp = ((PyDictObject *)op);
1658 oldkeys = mp->ma_keys;
1659 oldvalues = mp->ma_values;
1660 if (oldvalues == empty_values)
1661 return;
1662 /* Empty the dict... */
1663 DK_INCREF(Py_EMPTY_KEYS);
1664 mp->ma_keys = Py_EMPTY_KEYS;
1665 mp->ma_values = empty_values;
1666 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001667 mp->ma_version_tag = DICT_NEXT_VERSION();
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001668 /* ...then clear the keys and values */
1669 if (oldvalues != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001670 n = oldkeys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001671 for (i = 0; i < n; i++)
1672 Py_CLEAR(oldvalues[i]);
1673 free_values(oldvalues);
1674 DK_DECREF(oldkeys);
1675 }
1676 else {
1677 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001678 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001679 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02001680 assert(_PyDict_CheckConsistency(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001681}
1682
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001683/* Internal version of PyDict_Next that returns a hash value in addition
1684 * to the key and value.
1685 * Return 1 on success, return 0 when the reached the end of the dictionary
1686 * (or if op is not a dictionary)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001687 */
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001688int
1689_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1690 PyObject **pvalue, Py_hash_t *phash)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001691{
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001692 Py_ssize_t i, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001693 PyDictObject *mp;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001694 PyDictKeyEntry *entry_ptr;
1695 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001696
1697 if (!PyDict_Check(op))
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001698 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 mp = (PyDictObject *)op;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001700 i = *ppos;
Victor Stinner742da042016-09-07 17:40:12 -07001701 n = mp->ma_keys->dk_nentries;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001702 if ((size_t)i >= (size_t)n)
1703 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001704 if (mp->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001705 PyObject **value_ptr = &mp->ma_values[i];
1706 while (i < n && *value_ptr == NULL) {
1707 value_ptr++;
1708 i++;
Victor Stinner742da042016-09-07 17:40:12 -07001709 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001710 if (i >= n)
1711 return 0;
1712 entry_ptr = &DK_ENTRIES(mp->ma_keys)[i];
1713 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001715 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001716 entry_ptr = &DK_ENTRIES(mp->ma_keys)[i];
1717 while (i < n && entry_ptr->me_value == NULL) {
1718 entry_ptr++;
1719 i++;
Victor Stinner742da042016-09-07 17:40:12 -07001720 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001721 if (i >= n)
1722 return 0;
1723 value = entry_ptr->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001725 *ppos = i+1;
1726 if (pkey)
1727 *pkey = entry_ptr->me_key;
1728 if (phash)
1729 *phash = entry_ptr->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001730 if (pvalue)
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001731 *pvalue = value;
1732 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001733}
1734
Tim Peters080c88b2003-02-15 03:01:11 +00001735/*
1736 * Iterate over a dict. Use like so:
1737 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001738 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001739 * PyObject *key, *value;
1740 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001741 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001742 * Refer to borrowed references in key and value.
Tim Peters080c88b2003-02-15 03:01:11 +00001743 * }
1744 *
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001745 * Return 1 on success, return 0 when the reached the end of the dictionary
1746 * (or if op is not a dictionary)
1747 *
Tim Peters080c88b2003-02-15 03:01:11 +00001748 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001749 * mutates the dict. One exception: it is safe if the loop merely changes
1750 * the values associated with the keys (but doesn't insert new keys or
1751 * delete keys), via PyDict_SetItem().
1752 */
Guido van Rossum25831651993-05-19 14:50:45 +00001753int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001754PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001755{
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001756 return _PyDict_Next(op, ppos, pkey, pvalue, NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00001757}
1758
Eric Snow96c6af92015-05-29 22:21:39 -06001759/* Internal version of dict.pop(). */
1760PyObject *
Yury Selivanov684ef2c2016-10-28 19:01:21 -04001761_PyDict_Pop(PyObject *dict, PyObject *key, PyObject *deflt)
Eric Snow96c6af92015-05-29 22:21:39 -06001762{
1763 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001764 Py_ssize_t ix, hashpos;
Eric Snow96c6af92015-05-29 22:21:39 -06001765 PyObject *old_value, *old_key;
1766 PyDictKeyEntry *ep;
1767 PyObject **value_addr;
Yury Selivanov684ef2c2016-10-28 19:01:21 -04001768 PyDictObject *mp;
1769
1770 assert(PyDict_Check(dict));
1771 mp = (PyDictObject *)dict;
Eric Snow96c6af92015-05-29 22:21:39 -06001772
1773 if (mp->ma_used == 0) {
1774 if (deflt) {
1775 Py_INCREF(deflt);
1776 return deflt;
1777 }
1778 _PyErr_SetKeyError(key);
1779 return NULL;
1780 }
1781 if (!PyUnicode_CheckExact(key) ||
1782 (hash = ((PyASCIIObject *) key)->hash) == -1) {
1783 hash = PyObject_Hash(key);
1784 if (hash == -1)
1785 return NULL;
1786 }
Victor Stinner742da042016-09-07 17:40:12 -07001787 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1788 if (ix == DKIX_ERROR)
Eric Snow96c6af92015-05-29 22:21:39 -06001789 return NULL;
Victor Stinnerd0ad11f2016-09-13 16:56:38 +02001790 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Eric Snow96c6af92015-05-29 22:21:39 -06001791 if (deflt) {
1792 Py_INCREF(deflt);
1793 return deflt;
1794 }
1795 _PyErr_SetKeyError(key);
1796 return NULL;
1797 }
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001798
Victor Stinner78601a32016-09-09 19:28:36 -07001799 // Split table doesn't allow deletion. Combine it.
1800 if (_PyDict_HasSplitTable(mp)) {
1801 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1802 return NULL;
1803 }
1804 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1805 assert(ix >= 0);
1806 }
1807
Victor Stinner742da042016-09-07 17:40:12 -07001808 old_value = *value_addr;
Victor Stinner78601a32016-09-09 19:28:36 -07001809 assert(old_value != NULL);
Eric Snow96c6af92015-05-29 22:21:39 -06001810 *value_addr = NULL;
1811 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001812 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner78601a32016-09-09 19:28:36 -07001813 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1814 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1815 ENSURE_ALLOWS_DELETIONS(mp);
1816 old_key = ep->me_key;
1817 ep->me_key = NULL;
1818 Py_DECREF(old_key);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001819
1820 assert(_PyDict_CheckConsistency(mp));
Eric Snow96c6af92015-05-29 22:21:39 -06001821 return old_value;
1822}
1823
1824/* Internal version of dict.from_keys(). It is subclass-friendly. */
1825PyObject *
1826_PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
1827{
1828 PyObject *it; /* iter(iterable) */
1829 PyObject *key;
1830 PyObject *d;
1831 int status;
1832
1833 d = PyObject_CallObject(cls, NULL);
1834 if (d == NULL)
1835 return NULL;
1836
1837 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
1838 if (PyDict_CheckExact(iterable)) {
1839 PyDictObject *mp = (PyDictObject *)d;
1840 PyObject *oldvalue;
1841 Py_ssize_t pos = 0;
1842 PyObject *key;
1843 Py_hash_t hash;
1844
Victor Stinner742da042016-09-07 17:40:12 -07001845 if (dictresize(mp, ESTIMATE_SIZE(Py_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001846 Py_DECREF(d);
1847 return NULL;
1848 }
1849
1850 while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) {
1851 if (insertdict(mp, key, hash, value)) {
1852 Py_DECREF(d);
1853 return NULL;
1854 }
1855 }
1856 return d;
1857 }
1858 if (PyAnySet_CheckExact(iterable)) {
1859 PyDictObject *mp = (PyDictObject *)d;
1860 Py_ssize_t pos = 0;
1861 PyObject *key;
1862 Py_hash_t hash;
1863
Victor Stinner742da042016-09-07 17:40:12 -07001864 if (dictresize(mp, ESTIMATE_SIZE(PySet_GET_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001865 Py_DECREF(d);
1866 return NULL;
1867 }
1868
1869 while (_PySet_NextEntry(iterable, &pos, &key, &hash)) {
1870 if (insertdict(mp, key, hash, value)) {
1871 Py_DECREF(d);
1872 return NULL;
1873 }
1874 }
1875 return d;
1876 }
1877 }
1878
1879 it = PyObject_GetIter(iterable);
1880 if (it == NULL){
1881 Py_DECREF(d);
1882 return NULL;
1883 }
1884
1885 if (PyDict_CheckExact(d)) {
1886 while ((key = PyIter_Next(it)) != NULL) {
1887 status = PyDict_SetItem(d, key, value);
1888 Py_DECREF(key);
1889 if (status < 0)
1890 goto Fail;
1891 }
1892 } else {
1893 while ((key = PyIter_Next(it)) != NULL) {
1894 status = PyObject_SetItem(d, key, value);
1895 Py_DECREF(key);
1896 if (status < 0)
1897 goto Fail;
1898 }
1899 }
1900
1901 if (PyErr_Occurred())
1902 goto Fail;
1903 Py_DECREF(it);
1904 return d;
1905
1906Fail:
1907 Py_DECREF(it);
1908 Py_DECREF(d);
1909 return NULL;
1910}
1911
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001912/* Methods */
1913
1914static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001915dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001916{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001917 PyObject **values = mp->ma_values;
1918 PyDictKeysObject *keys = mp->ma_keys;
1919 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 PyObject_GC_UnTrack(mp);
1921 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001922 if (values != NULL) {
1923 if (values != empty_values) {
Victor Stinner742da042016-09-07 17:40:12 -07001924 for (i = 0, n = mp->ma_keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001925 Py_XDECREF(values[i]);
1926 }
1927 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001929 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02001931 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001932 assert(keys->dk_refcnt == 1);
1933 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001934 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1936 free_list[numfree++] = mp;
1937 else
1938 Py_TYPE(mp)->tp_free((PyObject *)mp);
1939 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001940}
1941
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001942
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001943static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001944dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001947 PyObject *key = NULL, *value = NULL;
1948 _PyUnicodeWriter writer;
1949 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00001950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 i = Py_ReprEnter((PyObject *)mp);
1952 if (i != 0) {
1953 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1954 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001957 Py_ReprLeave((PyObject *)mp);
1958 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 }
Tim Petersa7259592001-06-16 05:11:17 +00001960
Victor Stinnerf91929b2013-11-19 13:07:38 +01001961 _PyUnicodeWriter_Init(&writer);
1962 writer.overallocate = 1;
1963 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
1964 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00001965
Victor Stinnerf91929b2013-11-19 13:07:38 +01001966 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
1967 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 /* Do repr() on each key+value pair, and insert ": " between them.
1970 Note that repr may mutate the dict. */
1971 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001972 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001974 PyObject *s;
1975 int res;
1976
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001977 /* Prevent repr from deleting key or value during key format. */
1978 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02001980
Victor Stinnerf91929b2013-11-19 13:07:38 +01001981 if (!first) {
1982 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
1983 goto error;
1984 }
1985 first = 0;
1986
1987 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01001989 goto error;
1990 res = _PyUnicodeWriter_WriteStr(&writer, s);
1991 Py_DECREF(s);
1992 if (res < 0)
1993 goto error;
1994
1995 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
1996 goto error;
1997
1998 s = PyObject_Repr(value);
1999 if (s == NULL)
2000 goto error;
2001 res = _PyUnicodeWriter_WriteStr(&writer, s);
2002 Py_DECREF(s);
2003 if (res < 0)
2004 goto error;
2005
2006 Py_CLEAR(key);
2007 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 }
Tim Petersa7259592001-06-16 05:11:17 +00002009
Victor Stinnerf91929b2013-11-19 13:07:38 +01002010 writer.overallocate = 0;
2011 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
2012 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00002013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01002015
2016 return _PyUnicodeWriter_Finish(&writer);
2017
2018error:
2019 Py_ReprLeave((PyObject *)mp);
2020 _PyUnicodeWriter_Dealloc(&writer);
2021 Py_XDECREF(key);
2022 Py_XDECREF(value);
2023 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002024}
2025
Martin v. Löwis18e16552006-02-15 17:27:45 +00002026static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002027dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002028{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002030}
2031
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002032static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002033dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 PyObject *v;
Victor Stinner742da042016-09-07 17:40:12 -07002036 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002037 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002038 PyObject **value_addr;
2039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002041 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 hash = PyObject_Hash(key);
2043 if (hash == -1)
2044 return NULL;
2045 }
Victor Stinner742da042016-09-07 17:40:12 -07002046 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2047 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002049 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 if (!PyDict_CheckExact(mp)) {
2051 /* Look up __missing__ method if we're a subclass. */
2052 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05002053 _Py_IDENTIFIER(__missing__);
2054 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 if (missing != NULL) {
2056 res = PyObject_CallFunctionObjArgs(missing,
2057 key, NULL);
2058 Py_DECREF(missing);
2059 return res;
2060 }
2061 else if (PyErr_Occurred())
2062 return NULL;
2063 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07002064 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 return NULL;
2066 }
Victor Stinner742da042016-09-07 17:40:12 -07002067 v = *value_addr;
2068 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002070}
2071
2072static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002073dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 if (w == NULL)
2076 return PyDict_DelItem((PyObject *)mp, v);
2077 else
2078 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002079}
2080
Guido van Rossuma9e7a811997-05-13 21:02:11 +00002081static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 (lenfunc)dict_length, /*mp_length*/
2083 (binaryfunc)dict_subscript, /*mp_subscript*/
2084 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002085};
2086
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002087static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002088dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002089{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002090 PyObject *v;
2091 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002092 PyDictKeyEntry *ep;
2093 Py_ssize_t size, n, offset;
2094 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002095
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002096 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 n = mp->ma_used;
2098 v = PyList_New(n);
2099 if (v == NULL)
2100 return NULL;
2101 if (n != mp->ma_used) {
2102 /* Durnit. The allocations caused the dict to resize.
2103 * Just start over, this shouldn't normally happen.
2104 */
2105 Py_DECREF(v);
2106 goto again;
2107 }
Victor Stinner742da042016-09-07 17:40:12 -07002108 ep = DK_ENTRIES(mp->ma_keys);
2109 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002110 if (mp->ma_values) {
2111 value_ptr = mp->ma_values;
2112 offset = sizeof(PyObject *);
2113 }
2114 else {
2115 value_ptr = &ep[0].me_value;
2116 offset = sizeof(PyDictKeyEntry);
2117 }
2118 for (i = 0, j = 0; i < size; i++) {
2119 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 PyObject *key = ep[i].me_key;
2121 Py_INCREF(key);
2122 PyList_SET_ITEM(v, j, key);
2123 j++;
2124 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002125 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 }
2127 assert(j == n);
2128 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002129}
2130
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002131static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002132dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002133{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002134 PyObject *v;
2135 Py_ssize_t i, j;
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002136 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002137 Py_ssize_t size, n, offset;
2138 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002139
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002140 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002141 n = mp->ma_used;
2142 v = PyList_New(n);
2143 if (v == NULL)
2144 return NULL;
2145 if (n != mp->ma_used) {
2146 /* Durnit. The allocations caused the dict to resize.
2147 * Just start over, this shouldn't normally happen.
2148 */
2149 Py_DECREF(v);
2150 goto again;
2151 }
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002152 ep = DK_ENTRIES(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002153 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002154 if (mp->ma_values) {
2155 value_ptr = mp->ma_values;
2156 offset = sizeof(PyObject *);
2157 }
2158 else {
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002159 value_ptr = &ep[0].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002160 offset = sizeof(PyDictKeyEntry);
2161 }
2162 for (i = 0, j = 0; i < size; i++) {
2163 PyObject *value = *value_ptr;
2164 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2165 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 Py_INCREF(value);
2167 PyList_SET_ITEM(v, j, value);
2168 j++;
2169 }
2170 }
2171 assert(j == n);
2172 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002173}
2174
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002175static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002176dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002177{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002178 PyObject *v;
2179 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002180 Py_ssize_t size, offset;
2181 PyObject *item, *key;
2182 PyDictKeyEntry *ep;
2183 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 /* Preallocate the list of tuples, to avoid allocations during
2186 * the loop over the items, which could trigger GC, which
2187 * could resize the dict. :-(
2188 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002189 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 n = mp->ma_used;
2191 v = PyList_New(n);
2192 if (v == NULL)
2193 return NULL;
2194 for (i = 0; i < n; i++) {
2195 item = PyTuple_New(2);
2196 if (item == NULL) {
2197 Py_DECREF(v);
2198 return NULL;
2199 }
2200 PyList_SET_ITEM(v, i, item);
2201 }
2202 if (n != mp->ma_used) {
2203 /* Durnit. The allocations caused the dict to resize.
2204 * Just start over, this shouldn't normally happen.
2205 */
2206 Py_DECREF(v);
2207 goto again;
2208 }
2209 /* Nothing we do below makes any function calls. */
Victor Stinner742da042016-09-07 17:40:12 -07002210 ep = DK_ENTRIES(mp->ma_keys);
2211 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002212 if (mp->ma_values) {
2213 value_ptr = mp->ma_values;
2214 offset = sizeof(PyObject *);
2215 }
2216 else {
2217 value_ptr = &ep[0].me_value;
2218 offset = sizeof(PyDictKeyEntry);
2219 }
2220 for (i = 0, j = 0; i < size; i++) {
2221 PyObject *value = *value_ptr;
2222 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2223 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 key = ep[i].me_key;
2225 item = PyList_GET_ITEM(v, j);
2226 Py_INCREF(key);
2227 PyTuple_SET_ITEM(item, 0, key);
2228 Py_INCREF(value);
2229 PyTuple_SET_ITEM(item, 1, value);
2230 j++;
2231 }
2232 }
2233 assert(j == n);
2234 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002235}
2236
Larry Hastings5c661892014-01-24 06:17:25 -08002237/*[clinic input]
2238@classmethod
2239dict.fromkeys
Larry Hastings5c661892014-01-24 06:17:25 -08002240 iterable: object
2241 value: object=None
2242 /
2243
2244Returns a new dict with keys from iterable and values equal to value.
2245[clinic start generated code]*/
2246
Larry Hastings5c661892014-01-24 06:17:25 -08002247static PyObject *
2248dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002249/*[clinic end generated code: output=8fb98e4b10384999 input=b85a667f9bf4669d]*/
Larry Hastings5c661892014-01-24 06:17:25 -08002250{
Eric Snow96c6af92015-05-29 22:21:39 -06002251 return _PyDict_FromKeys((PyObject *)type, iterable, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002252}
2253
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002254static int
Victor Stinner742da042016-09-07 17:40:12 -07002255dict_update_common(PyObject *self, PyObject *args, PyObject *kwds,
2256 const char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002257{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 PyObject *arg = NULL;
2259 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
2262 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002265 _Py_IDENTIFIER(keys);
2266 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 result = PyDict_Merge(self, arg, 1);
2268 else
2269 result = PyDict_MergeFromSeq2(self, arg, 1);
2270 }
2271 if (result == 0 && kwds != NULL) {
2272 if (PyArg_ValidateKeywordArguments(kwds))
2273 result = PyDict_Merge(self, kwds, 1);
2274 else
2275 result = -1;
2276 }
2277 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002278}
2279
2280static PyObject *
2281dict_update(PyObject *self, PyObject *args, PyObject *kwds)
2282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 if (dict_update_common(self, args, kwds, "update") != -1)
2284 Py_RETURN_NONE;
2285 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002286}
2287
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002288/* Update unconditionally replaces existing items.
2289 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00002290 otherwise it leaves existing items unchanged.
2291
2292 PyDict_{Update,Merge} update/merge from a mapping object.
2293
Tim Petersf582b822001-12-11 18:51:08 +00002294 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00002295 producing iterable objects of length 2.
2296*/
2297
Tim Petersf582b822001-12-11 18:51:08 +00002298int
Tim Peters1fc240e2001-10-26 05:06:50 +00002299PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
2300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 PyObject *it; /* iter(seq2) */
2302 Py_ssize_t i; /* index into seq2 of current element */
2303 PyObject *item; /* seq2[i] */
2304 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00002305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 assert(d != NULL);
2307 assert(PyDict_Check(d));
2308 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00002309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 it = PyObject_GetIter(seq2);
2311 if (it == NULL)
2312 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 for (i = 0; ; ++i) {
2315 PyObject *key, *value;
2316 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00002317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 fast = NULL;
2319 item = PyIter_Next(it);
2320 if (item == NULL) {
2321 if (PyErr_Occurred())
2322 goto Fail;
2323 break;
2324 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 /* Convert item to sequence, and verify length 2. */
2327 fast = PySequence_Fast(item, "");
2328 if (fast == NULL) {
2329 if (PyErr_ExceptionMatches(PyExc_TypeError))
2330 PyErr_Format(PyExc_TypeError,
2331 "cannot convert dictionary update "
2332 "sequence element #%zd to a sequence",
2333 i);
2334 goto Fail;
2335 }
2336 n = PySequence_Fast_GET_SIZE(fast);
2337 if (n != 2) {
2338 PyErr_Format(PyExc_ValueError,
2339 "dictionary update sequence element #%zd "
2340 "has length %zd; 2 is required",
2341 i, n);
2342 goto Fail;
2343 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 /* Update/merge with this (key, value) pair. */
2346 key = PySequence_Fast_GET_ITEM(fast, 0);
2347 value = PySequence_Fast_GET_ITEM(fast, 1);
2348 if (override || PyDict_GetItem(d, key) == NULL) {
2349 int status = PyDict_SetItem(d, key, value);
2350 if (status < 0)
2351 goto Fail;
2352 }
2353 Py_DECREF(fast);
2354 Py_DECREF(item);
2355 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 i = 0;
Victor Stinner611b0fa2016-09-14 15:02:01 +02002358 assert(_PyDict_CheckConsistency((PyDictObject *)d));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00002360Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 Py_XDECREF(item);
2362 Py_XDECREF(fast);
2363 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002364Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 Py_DECREF(it);
2366 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00002367}
2368
doko@ubuntu.comde69ee72016-10-11 08:04:02 +02002369static int
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002370dict_merge(PyObject *a, PyObject *b, int override)
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002371{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002372 PyDictObject *mp, *other;
2373 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -07002374 PyDictKeyEntry *entry, *ep0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002375
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002376 assert(0 <= override && override <= 2);
2377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 /* We accept for the argument either a concrete dictionary object,
2379 * or an abstract "mapping" object. For the former, we can do
2380 * things quite efficiently. For the latter, we only require that
2381 * PyMapping_Keys() and PyObject_GetItem() be supported.
2382 */
2383 if (a == NULL || !PyDict_Check(a) || b == NULL) {
2384 PyErr_BadInternalCall();
2385 return -1;
2386 }
2387 mp = (PyDictObject*)a;
2388 if (PyDict_Check(b)) {
2389 other = (PyDictObject*)b;
2390 if (other == mp || other->ma_used == 0)
2391 /* a.update(a) or a.update({}); nothing to do */
2392 return 0;
2393 if (mp->ma_used == 0)
2394 /* Since the target dict is empty, PyDict_GetItem()
2395 * always returns NULL. Setting override to 1
2396 * skips the unnecessary test.
2397 */
2398 override = 1;
2399 /* Do one big resize at the start, rather than
2400 * incrementally resizing as we insert new items. Expect
2401 * that there will be no (or few) overlapping keys.
2402 */
INADA Naokib1152be2016-10-27 19:26:50 +09002403 if (USABLE_FRACTION(mp->ma_keys->dk_size) < other->ma_used) {
2404 if (dictresize(mp, ESTIMATE_SIZE(mp->ma_used + other->ma_used))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 return -1;
INADA Naokib1152be2016-10-27 19:26:50 +09002406 }
2407 }
Victor Stinner742da042016-09-07 17:40:12 -07002408 ep0 = DK_ENTRIES(other->ma_keys);
2409 for (i = 0, n = other->ma_keys->dk_nentries; i < n; i++) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002410 PyObject *key, *value;
2411 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002412 entry = &ep0[i];
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002413 key = entry->me_key;
2414 hash = entry->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002415 if (other->ma_values)
2416 value = other->ma_values[i];
2417 else
2418 value = entry->me_value;
2419
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002420 if (value != NULL) {
2421 int err = 0;
2422 Py_INCREF(key);
2423 Py_INCREF(value);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002424 if (override == 1)
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002425 err = insertdict(mp, key, hash, value);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002426 else if (_PyDict_GetItem_KnownHash(a, key, hash) == NULL) {
2427 if (PyErr_Occurred()) {
2428 Py_DECREF(value);
2429 Py_DECREF(key);
2430 return -1;
2431 }
2432 err = insertdict(mp, key, hash, value);
2433 }
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002434 else if (override != 0) {
2435 _PyErr_SetKeyError(key);
2436 Py_DECREF(value);
2437 Py_DECREF(key);
2438 return -1;
2439 }
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002440 Py_DECREF(value);
2441 Py_DECREF(key);
2442 if (err != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 return -1;
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002444
Victor Stinner742da042016-09-07 17:40:12 -07002445 if (n != other->ma_keys->dk_nentries) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002446 PyErr_SetString(PyExc_RuntimeError,
2447 "dict mutated during update");
2448 return -1;
2449 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 }
2451 }
2452 }
2453 else {
2454 /* Do it the generic, slower way */
2455 PyObject *keys = PyMapping_Keys(b);
2456 PyObject *iter;
2457 PyObject *key, *value;
2458 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 if (keys == NULL)
2461 /* Docstring says this is equivalent to E.keys() so
2462 * if E doesn't have a .keys() method we want
2463 * AttributeError to percolate up. Might as well
2464 * do the same for any other error.
2465 */
2466 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 iter = PyObject_GetIter(keys);
2469 Py_DECREF(keys);
2470 if (iter == NULL)
2471 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002474 if (override != 1 && PyDict_GetItem(a, key) != NULL) {
2475 if (override != 0) {
2476 _PyErr_SetKeyError(key);
2477 Py_DECREF(key);
2478 Py_DECREF(iter);
2479 return -1;
2480 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 Py_DECREF(key);
2482 continue;
2483 }
2484 value = PyObject_GetItem(b, key);
2485 if (value == NULL) {
2486 Py_DECREF(iter);
2487 Py_DECREF(key);
2488 return -1;
2489 }
2490 status = PyDict_SetItem(a, key, value);
2491 Py_DECREF(key);
2492 Py_DECREF(value);
2493 if (status < 0) {
2494 Py_DECREF(iter);
2495 return -1;
2496 }
2497 }
2498 Py_DECREF(iter);
2499 if (PyErr_Occurred())
2500 /* Iterator completed, via error */
2501 return -1;
2502 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02002503 assert(_PyDict_CheckConsistency((PyDictObject *)a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002505}
2506
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002507int
2508PyDict_Update(PyObject *a, PyObject *b)
2509{
2510 return dict_merge(a, b, 1);
2511}
2512
2513int
2514PyDict_Merge(PyObject *a, PyObject *b, int override)
2515{
2516 /* XXX Deprecate override not in (0, 1). */
2517 return dict_merge(a, b, override != 0);
2518}
2519
2520int
2521_PyDict_MergeEx(PyObject *a, PyObject *b, int override)
2522{
2523 return dict_merge(a, b, override);
2524}
2525
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002526static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002527dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002530}
2531
2532PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002533PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002536 PyDictObject *mp;
2537 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 if (o == NULL || !PyDict_Check(o)) {
2540 PyErr_BadInternalCall();
2541 return NULL;
2542 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002543 mp = (PyDictObject *)o;
2544 if (_PyDict_HasSplitTable(mp)) {
2545 PyDictObject *split_copy;
Victor Stinner742da042016-09-07 17:40:12 -07002546 Py_ssize_t size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
2547 PyObject **newvalues;
2548 newvalues = new_values(size);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002549 if (newvalues == NULL)
2550 return PyErr_NoMemory();
2551 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2552 if (split_copy == NULL) {
2553 free_values(newvalues);
2554 return NULL;
2555 }
2556 split_copy->ma_values = newvalues;
2557 split_copy->ma_keys = mp->ma_keys;
2558 split_copy->ma_used = mp->ma_used;
2559 DK_INCREF(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002560 for (i = 0, n = size; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002561 PyObject *value = mp->ma_values[i];
2562 Py_XINCREF(value);
2563 split_copy->ma_values[i] = value;
2564 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002565 if (_PyObject_GC_IS_TRACKED(mp))
2566 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002567 return (PyObject *)split_copy;
2568 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 copy = PyDict_New();
2570 if (copy == NULL)
2571 return NULL;
2572 if (PyDict_Merge(copy, o, 1) == 0)
2573 return copy;
2574 Py_DECREF(copy);
2575 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002576}
2577
Martin v. Löwis18e16552006-02-15 17:27:45 +00002578Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002579PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 if (mp == NULL || !PyDict_Check(mp)) {
2582 PyErr_BadInternalCall();
2583 return -1;
2584 }
2585 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002586}
2587
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002588PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002589PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 if (mp == NULL || !PyDict_Check(mp)) {
2592 PyErr_BadInternalCall();
2593 return NULL;
2594 }
2595 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002596}
2597
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002598PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002599PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002600{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002601 if (mp == NULL || !PyDict_Check(mp)) {
2602 PyErr_BadInternalCall();
2603 return NULL;
2604 }
2605 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002606}
2607
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002608PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002609PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 if (mp == NULL || !PyDict_Check(mp)) {
2612 PyErr_BadInternalCall();
2613 return NULL;
2614 }
2615 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002616}
2617
Tim Peterse63415e2001-05-08 04:38:29 +00002618/* Return 1 if dicts equal, 0 if not, -1 if error.
2619 * Gets out as soon as any difference is detected.
2620 * Uses only Py_EQ comparison.
2621 */
2622static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002623dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 if (a->ma_used != b->ma_used)
2628 /* can't be equal if # of entries differ */
2629 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Victor Stinner742da042016-09-07 17:40:12 -07002631 for (i = 0; i < a->ma_keys->dk_nentries; i++) {
2632 PyDictKeyEntry *ep = &DK_ENTRIES(a->ma_keys)[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002633 PyObject *aval;
2634 if (a->ma_values)
2635 aval = a->ma_values[i];
2636 else
2637 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 if (aval != NULL) {
2639 int cmp;
2640 PyObject *bval;
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002641 PyObject **vaddr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002642 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 /* temporarily bump aval's refcount to ensure it stays
2644 alive until we're done with it */
2645 Py_INCREF(aval);
2646 /* ditto for key */
2647 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002648 /* reuse the known hash value */
Victor Stinner742da042016-09-07 17:40:12 -07002649 if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr, NULL) < 0)
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002650 bval = NULL;
2651 else
2652 bval = *vaddr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 Py_DECREF(key);
2654 if (bval == NULL) {
2655 Py_DECREF(aval);
2656 if (PyErr_Occurred())
2657 return -1;
2658 return 0;
2659 }
2660 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2661 Py_DECREF(aval);
2662 if (cmp <= 0) /* error or not equal */
2663 return cmp;
2664 }
2665 }
2666 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002667}
Tim Peterse63415e2001-05-08 04:38:29 +00002668
2669static PyObject *
2670dict_richcompare(PyObject *v, PyObject *w, int op)
2671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 int cmp;
2673 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2676 res = Py_NotImplemented;
2677 }
2678 else if (op == Py_EQ || op == Py_NE) {
2679 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2680 if (cmp < 0)
2681 return NULL;
2682 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2683 }
2684 else
2685 res = Py_NotImplemented;
2686 Py_INCREF(res);
2687 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002688}
Tim Peterse63415e2001-05-08 04:38:29 +00002689
Larry Hastings61272b72014-01-07 12:41:53 -08002690/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07002691
2692@coexist
2693dict.__contains__
2694
2695 key: object
2696 /
2697
Meador Ingee02de8c2014-01-14 16:48:31 -06002698True if D has a key k, else False.
Larry Hastings61272b72014-01-07 12:41:53 -08002699[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07002700
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002701static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08002702dict___contains__(PyDictObject *self, PyObject *key)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002703/*[clinic end generated code: output=a3d03db709ed6e6b input=b852b2a19b51ab24]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002704{
Larry Hastingsc2047262014-01-25 20:43:29 -08002705 register PyDictObject *mp = self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002706 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002707 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002708 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002711 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 hash = PyObject_Hash(key);
2713 if (hash == -1)
2714 return NULL;
2715 }
Victor Stinner742da042016-09-07 17:40:12 -07002716 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2717 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002719 if (ix == DKIX_EMPTY || *value_addr == NULL)
2720 Py_RETURN_FALSE;
2721 Py_RETURN_TRUE;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002722}
2723
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002724static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002725dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002726{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 PyObject *key;
2728 PyObject *failobj = Py_None;
2729 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002730 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002731 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002732 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2735 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002738 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 hash = PyObject_Hash(key);
2740 if (hash == -1)
2741 return NULL;
2742 }
Victor Stinner742da042016-09-07 17:40:12 -07002743 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2744 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002746 if (ix == DKIX_EMPTY || *value_addr == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 val = failobj;
Victor Stinner742da042016-09-07 17:40:12 -07002748 else
2749 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 Py_INCREF(val);
2751 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002752}
2753
Benjamin Peterson00e98862013-03-07 22:16:29 -05002754PyObject *
2755PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002756{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002757 PyDictObject *mp = (PyDictObject *)d;
INADA Naoki93f26f72016-11-02 18:45:16 +09002758 PyObject *value;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002759 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002760 Py_ssize_t hashpos, ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002761 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002762
Benjamin Peterson00e98862013-03-07 22:16:29 -05002763 if (!PyDict_Check(d)) {
2764 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002766 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002769 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 hash = PyObject_Hash(key);
2771 if (hash == -1)
2772 return NULL;
2773 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002774
2775 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
2776 if (insertion_resize(mp) < 0)
2777 return NULL;
2778 }
2779
Victor Stinner742da042016-09-07 17:40:12 -07002780 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
2781 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 return NULL;
INADA Naoki93f26f72016-11-02 18:45:16 +09002783
2784 if (_PyDict_HasSplitTable(mp) &&
2785 ((ix >= 0 && *value_addr == NULL && mp->ma_used != ix) ||
2786 (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {
2787 if (insertion_resize(mp) < 0) {
2788 return NULL;
2789 }
2790 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
2791 ix = DKIX_EMPTY;
2792 }
2793
2794 if (ix == DKIX_EMPTY) {
2795 PyDictKeyEntry *ep, *ep0;
2796 value = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002797 if (mp->ma_keys->dk_usable <= 0) {
Victor Stinner3c336c52016-09-12 14:17:40 +02002798 if (insertion_resize(mp) < 0) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002799 return NULL;
Victor Stinner3c336c52016-09-12 14:17:40 +02002800 }
Victor Stinner742da042016-09-07 17:40:12 -07002801 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002802 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002803 ep0 = DK_ENTRIES(mp->ma_keys);
2804 ep = &ep0[mp->ma_keys->dk_nentries];
2805 dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002806 Py_INCREF(key);
INADA Naoki93f26f72016-11-02 18:45:16 +09002807 Py_INCREF(value);
2808 MAINTAIN_TRACKING(mp, key, value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002809 ep->me_key = key;
2810 ep->me_hash = hash;
Victor Stinner742da042016-09-07 17:40:12 -07002811 if (mp->ma_values) {
INADA Naoki93f26f72016-11-02 18:45:16 +09002812 assert(mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
2813 mp->ma_values[mp->ma_keys->dk_nentries] = value;
Victor Stinner742da042016-09-07 17:40:12 -07002814 }
2815 else {
INADA Naoki93f26f72016-11-02 18:45:16 +09002816 ep->me_value = value;
Victor Stinner742da042016-09-07 17:40:12 -07002817 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002818 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002819 mp->ma_version_tag = DICT_NEXT_VERSION();
INADA Naoki93f26f72016-11-02 18:45:16 +09002820 mp->ma_keys->dk_usable--;
2821 mp->ma_keys->dk_nentries++;
2822 assert(mp->ma_keys->dk_usable >= 0);
2823 }
2824 else if (*value_addr == NULL) {
2825 value = defaultobj;
2826 assert(_PyDict_HasSplitTable(mp));
2827 assert(ix == mp->ma_used);
2828 Py_INCREF(value);
2829 MAINTAIN_TRACKING(mp, key, value);
2830 *value_addr = value;
2831 mp->ma_used++;
2832 mp->ma_version_tag = DICT_NEXT_VERSION();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02002834 else {
INADA Naoki93f26f72016-11-02 18:45:16 +09002835 value = *value_addr;
Victor Stinner611b0fa2016-09-14 15:02:01 +02002836 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002837
2838 assert(_PyDict_CheckConsistency(mp));
2839 return value;
Guido van Rossum164452c2000-08-08 16:12:54 +00002840}
2841
Benjamin Peterson00e98862013-03-07 22:16:29 -05002842static PyObject *
2843dict_setdefault(PyDictObject *mp, PyObject *args)
2844{
2845 PyObject *key, *val;
2846 PyObject *defaultobj = Py_None;
2847
2848 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2849 return NULL;
2850
Benjamin Peterson55898502013-03-08 08:36:49 -05002851 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002852 Py_XINCREF(val);
2853 return val;
2854}
Guido van Rossum164452c2000-08-08 16:12:54 +00002855
2856static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002857dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 PyDict_Clear((PyObject *)mp);
2860 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002861}
2862
Guido van Rossumba6ab842000-12-12 22:02:18 +00002863static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002864dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00002867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2869 return NULL;
Eric Snow96c6af92015-05-29 22:21:39 -06002870
Yury Selivanov684ef2c2016-10-28 19:01:21 -04002871 return _PyDict_Pop((PyObject*)mp, key, deflt);
Guido van Rossume027d982002-04-12 15:11:59 +00002872}
2873
2874static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002875dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002876{
Victor Stinner742da042016-09-07 17:40:12 -07002877 Py_ssize_t i, j;
2878 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002879 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 /* Allocate the result tuple before checking the size. Believe it
2882 * or not, this allocation could trigger a garbage collection which
2883 * could empty the dict, so if we checked the size first and that
2884 * happened, the result would be an infinite loop (searching for an
2885 * entry that no longer exists). Note that the usual popitem()
2886 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2887 * tuple away if the dict *is* empty isn't a significant
2888 * inefficiency -- possible, but unlikely in practice.
2889 */
2890 res = PyTuple_New(2);
2891 if (res == NULL)
2892 return NULL;
2893 if (mp->ma_used == 0) {
2894 Py_DECREF(res);
2895 PyErr_SetString(PyExc_KeyError,
2896 "popitem(): dictionary is empty");
2897 return NULL;
2898 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002899 /* Convert split table to combined table */
2900 if (mp->ma_keys->dk_lookup == lookdict_split) {
2901 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2902 Py_DECREF(res);
2903 return NULL;
2904 }
2905 }
2906 ENSURE_ALLOWS_DELETIONS(mp);
Victor Stinner742da042016-09-07 17:40:12 -07002907
2908 /* Pop last item */
2909 ep0 = DK_ENTRIES(mp->ma_keys);
2910 i = mp->ma_keys->dk_nentries - 1;
2911 while (i >= 0 && ep0[i].me_value == NULL) {
2912 i--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 }
Victor Stinner742da042016-09-07 17:40:12 -07002914 assert(i >= 0);
2915
2916 ep = &ep0[i];
2917 j = lookdict_index(mp->ma_keys, ep->me_hash, i);
2918 assert(j >= 0);
2919 assert(dk_get_index(mp->ma_keys, j) == i);
2920 dk_set_index(mp->ma_keys, j, DKIX_DUMMY);
2921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 PyTuple_SET_ITEM(res, 0, ep->me_key);
2923 PyTuple_SET_ITEM(res, 1, ep->me_value);
Victor Stinner742da042016-09-07 17:40:12 -07002924 ep->me_key = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925 ep->me_value = NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002926 /* We can't dk_usable++ since there is DKIX_DUMMY in indices */
2927 mp->ma_keys->dk_nentries = i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002928 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002929 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02002930 assert(_PyDict_CheckConsistency(mp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002932}
2933
Jeremy Hylton8caad492000-06-23 14:18:11 +00002934static int
2935dict_traverse(PyObject *op, visitproc visit, void *arg)
2936{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002937 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson55f44522016-09-05 12:12:59 -07002938 PyDictKeysObject *keys = mp->ma_keys;
Serhiy Storchaka46825d22016-09-26 21:29:34 +03002939 PyDictKeyEntry *entries = DK_ENTRIES(keys);
Victor Stinner742da042016-09-07 17:40:12 -07002940 Py_ssize_t i, n = keys->dk_nentries;
2941
Benjamin Peterson55f44522016-09-05 12:12:59 -07002942 if (keys->dk_lookup == lookdict) {
2943 for (i = 0; i < n; i++) {
2944 if (entries[i].me_value != NULL) {
2945 Py_VISIT(entries[i].me_value);
2946 Py_VISIT(entries[i].me_key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002947 }
2948 }
Victor Stinner742da042016-09-07 17:40:12 -07002949 }
2950 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002951 if (mp->ma_values != NULL) {
Benjamin Peterson55f44522016-09-05 12:12:59 -07002952 for (i = 0; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002953 Py_VISIT(mp->ma_values[i]);
2954 }
2955 }
2956 else {
Benjamin Peterson55f44522016-09-05 12:12:59 -07002957 for (i = 0; i < n; i++) {
2958 Py_VISIT(entries[i].me_value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002959 }
2960 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961 }
2962 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002963}
2964
2965static int
2966dict_tp_clear(PyObject *op)
2967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968 PyDict_Clear(op);
2969 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002970}
2971
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002972static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002973
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002974Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06002975_PyDict_SizeOf(PyDictObject *mp)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002976{
Victor Stinner742da042016-09-07 17:40:12 -07002977 Py_ssize_t size, usable, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002978
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002979 size = DK_SIZE(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002980 usable = USABLE_FRACTION(size);
2981
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002982 res = _PyObject_SIZE(Py_TYPE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002983 if (mp->ma_values)
Victor Stinner742da042016-09-07 17:40:12 -07002984 res += usable * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002985 /* If the dictionary is split, the keys portion is accounted-for
2986 in the type object. */
2987 if (mp->ma_keys->dk_refcnt == 1)
Victor Stinner98ee9d52016-09-08 09:33:56 -07002988 res += (sizeof(PyDictKeysObject)
2989 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
2990 + DK_IXSIZE(mp->ma_keys) * size
2991 + sizeof(PyDictKeyEntry) * usable);
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002992 return res;
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002993}
2994
2995Py_ssize_t
2996_PyDict_KeysSize(PyDictKeysObject *keys)
2997{
Victor Stinner98ee9d52016-09-08 09:33:56 -07002998 return (sizeof(PyDictKeysObject)
2999 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
3000 + DK_IXSIZE(keys) * DK_SIZE(keys)
3001 + USABLE_FRACTION(DK_SIZE(keys)) * sizeof(PyDictKeyEntry));
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003002}
3003
doko@ubuntu.com17210f52016-01-14 14:04:59 +01003004static PyObject *
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003005dict_sizeof(PyDictObject *mp)
3006{
3007 return PyLong_FromSsize_t(_PyDict_SizeOf(mp));
3008}
3009
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00003010PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
3011
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003012PyDoc_STRVAR(sizeof__doc__,
3013"D.__sizeof__() -> size of D in memory, in bytes");
3014
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003015PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00003016"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003017
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003018PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00003019"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 +00003020
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003021PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00003022"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00003023If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00003024
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003025PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00003026"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000030272-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003028
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003029PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04003030"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
3031If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
3032If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
3033In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00003034
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003035PyDoc_STRVAR(clear__doc__,
3036"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003037
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003038PyDoc_STRVAR(copy__doc__,
3039"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00003040
Guido van Rossumb90c8482007-02-10 01:11:45 +00003041/* Forward */
3042static PyObject *dictkeys_new(PyObject *);
3043static PyObject *dictitems_new(PyObject *);
3044static PyObject *dictvalues_new(PyObject *);
3045
Guido van Rossum45c85d12007-07-27 16:31:40 +00003046PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00003048PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003049 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00003050PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00003052
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003053static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07003054 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
3056 getitem__doc__},
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003057 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058 sizeof__doc__},
3059 {"get", (PyCFunction)dict_get, METH_VARARGS,
3060 get__doc__},
3061 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
3062 setdefault_doc__},
3063 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
3064 pop__doc__},
3065 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
3066 popitem__doc__},
3067 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
3068 keys__doc__},
3069 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
3070 items__doc__},
3071 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
3072 values__doc__},
3073 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
3074 update__doc__},
Larry Hastings5c661892014-01-24 06:17:25 -08003075 DICT_FROMKEYS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
3077 clear__doc__},
3078 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
3079 copy__doc__},
3080 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003081};
3082
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003083/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00003084int
3085PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003086{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00003087 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07003088 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003090 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003092 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003093 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003094 hash = PyObject_Hash(key);
3095 if (hash == -1)
3096 return -1;
3097 }
Victor Stinner742da042016-09-07 17:40:12 -07003098 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
3099 if (ix == DKIX_ERROR)
3100 return -1;
3101 return (ix != DKIX_EMPTY && *value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003102}
3103
Thomas Wouterscf297e42007-02-23 15:07:44 +00003104/* Internal version of PyDict_Contains used when the hash value is already known */
3105int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00003106_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00003107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003108 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003109 PyObject **value_addr;
Victor Stinner742da042016-09-07 17:40:12 -07003110 Py_ssize_t ix;
Thomas Wouterscf297e42007-02-23 15:07:44 +00003111
Victor Stinner742da042016-09-07 17:40:12 -07003112 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
3113 if (ix == DKIX_ERROR)
3114 return -1;
3115 return (ix != DKIX_EMPTY && *value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00003116}
3117
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003118/* Hack to implement "key in dict" */
3119static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 0, /* sq_length */
3121 0, /* sq_concat */
3122 0, /* sq_repeat */
3123 0, /* sq_item */
3124 0, /* sq_slice */
3125 0, /* sq_ass_item */
3126 0, /* sq_ass_slice */
3127 PyDict_Contains, /* sq_contains */
3128 0, /* sq_inplace_concat */
3129 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003130};
3131
Guido van Rossum09e563a2001-05-01 12:10:21 +00003132static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003133dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003136 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 assert(type != NULL && type->tp_alloc != NULL);
3139 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02003140 if (self == NULL)
3141 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003142 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003143
Victor Stinnera9f61a52013-07-16 22:17:26 +02003144 /* The object has been implicitly tracked by tp_alloc */
3145 if (type == &PyDict_Type)
3146 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003147
3148 d->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07003149 d->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07003150 d->ma_keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003151 if (d->ma_keys == NULL) {
3152 Py_DECREF(self);
3153 return NULL;
3154 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02003155 assert(_PyDict_CheckConsistency(d));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003156 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003157}
3158
Tim Peters25786c02001-09-02 08:22:48 +00003159static int
3160dict_init(PyObject *self, PyObject *args, PyObject *kwds)
3161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00003163}
3164
Tim Peters6d6c1a32001-08-02 04:15:00 +00003165static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003166dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00003167{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00003169}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003170
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003171PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00003172"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00003173"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003174" (key, value) pairs\n"
3175"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00003176" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003177" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00003178" d[k] = v\n"
3179"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
3180" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00003181
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003182PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3184 "dict",
3185 sizeof(PyDictObject),
3186 0,
3187 (destructor)dict_dealloc, /* tp_dealloc */
3188 0, /* tp_print */
3189 0, /* tp_getattr */
3190 0, /* tp_setattr */
3191 0, /* tp_reserved */
3192 (reprfunc)dict_repr, /* tp_repr */
3193 0, /* tp_as_number */
3194 &dict_as_sequence, /* tp_as_sequence */
3195 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00003196 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 0, /* tp_call */
3198 0, /* tp_str */
3199 PyObject_GenericGetAttr, /* tp_getattro */
3200 0, /* tp_setattro */
3201 0, /* tp_as_buffer */
3202 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3203 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
3204 dictionary_doc, /* tp_doc */
3205 dict_traverse, /* tp_traverse */
3206 dict_tp_clear, /* tp_clear */
3207 dict_richcompare, /* tp_richcompare */
3208 0, /* tp_weaklistoffset */
3209 (getiterfunc)dict_iter, /* tp_iter */
3210 0, /* tp_iternext */
3211 mapp_methods, /* tp_methods */
3212 0, /* tp_members */
3213 0, /* tp_getset */
3214 0, /* tp_base */
3215 0, /* tp_dict */
3216 0, /* tp_descr_get */
3217 0, /* tp_descr_set */
3218 0, /* tp_dictoffset */
3219 dict_init, /* tp_init */
3220 PyType_GenericAlloc, /* tp_alloc */
3221 dict_new, /* tp_new */
3222 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003223};
3224
Victor Stinner3c1e4812012-03-26 22:10:51 +02003225PyObject *
3226_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
3227{
3228 PyObject *kv;
3229 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02003230 if (kv == NULL) {
3231 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003232 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02003233 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02003234 return PyDict_GetItem(dp, kv);
3235}
3236
Guido van Rossum3cca2451997-05-16 14:23:33 +00003237/* For backward compatibility with old dictionary interface */
3238
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003239PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003240PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 PyObject *kv, *rv;
3243 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003244 if (kv == NULL) {
3245 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003247 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003248 rv = PyDict_GetItem(v, kv);
3249 Py_DECREF(kv);
3250 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003251}
3252
3253int
Victor Stinner3c1e4812012-03-26 22:10:51 +02003254_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
3255{
3256 PyObject *kv;
3257 kv = _PyUnicode_FromId(key); /* borrowed */
3258 if (kv == NULL)
3259 return -1;
3260 return PyDict_SetItem(v, kv, item);
3261}
3262
3263int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003264PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003265{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 PyObject *kv;
3267 int err;
3268 kv = PyUnicode_FromString(key);
3269 if (kv == NULL)
3270 return -1;
3271 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
3272 err = PyDict_SetItem(v, kv, item);
3273 Py_DECREF(kv);
3274 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003275}
3276
3277int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01003278_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
3279{
3280 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
3281 if (kv == NULL)
3282 return -1;
3283 return PyDict_DelItem(v, kv);
3284}
3285
3286int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003287PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 PyObject *kv;
3290 int err;
3291 kv = PyUnicode_FromString(key);
3292 if (kv == NULL)
3293 return -1;
3294 err = PyDict_DelItem(v, kv);
3295 Py_DECREF(kv);
3296 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003297}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003298
Raymond Hettinger019a1482004-03-18 02:41:19 +00003299/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003300
3301typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 PyObject_HEAD
3303 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
3304 Py_ssize_t di_used;
3305 Py_ssize_t di_pos;
3306 PyObject* di_result; /* reusable result tuple for iteritems */
3307 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003308} dictiterobject;
3309
3310static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003311dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 dictiterobject *di;
3314 di = PyObject_GC_New(dictiterobject, itertype);
3315 if (di == NULL)
3316 return NULL;
3317 Py_INCREF(dict);
3318 di->di_dict = dict;
3319 di->di_used = dict->ma_used;
3320 di->di_pos = 0;
3321 di->len = dict->ma_used;
3322 if (itertype == &PyDictIterItem_Type) {
3323 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
3324 if (di->di_result == NULL) {
3325 Py_DECREF(di);
3326 return NULL;
3327 }
3328 }
3329 else
3330 di->di_result = NULL;
3331 _PyObject_GC_TRACK(di);
3332 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003333}
3334
3335static void
3336dictiter_dealloc(dictiterobject *di)
3337{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 Py_XDECREF(di->di_dict);
3339 Py_XDECREF(di->di_result);
3340 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003341}
3342
3343static int
3344dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
3345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 Py_VISIT(di->di_dict);
3347 Py_VISIT(di->di_result);
3348 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003349}
3350
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003351static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003352dictiter_len(dictiterobject *di)
3353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003354 Py_ssize_t len = 0;
3355 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
3356 len = di->len;
3357 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003358}
3359
Guido van Rossumb90c8482007-02-10 01:11:45 +00003360PyDoc_STRVAR(length_hint_doc,
3361 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003362
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003363static PyObject *
3364dictiter_reduce(dictiterobject *di);
3365
3366PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3367
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003368static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
3370 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003371 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
3372 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003374};
3375
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003376static PyObject*
3377dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00003378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 PyObject *key;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003380 Py_ssize_t i, n;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003381 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003382 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00003383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 if (d == NULL)
3385 return NULL;
3386 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00003387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003388 if (di->di_used != d->ma_used) {
3389 PyErr_SetString(PyExc_RuntimeError,
3390 "dictionary changed size during iteration");
3391 di->di_used = -1; /* Make this state sticky */
3392 return NULL;
3393 }
Guido van Rossum2147df72002-07-16 20:30:22 +00003394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003395 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003396 k = d->ma_keys;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003397 n = k->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003398 if (d->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003399 PyObject **value_ptr = &d->ma_values[i];
3400 while (i < n && *value_ptr == NULL) {
3401 value_ptr++;
3402 i++;
3403 }
3404 if (i >= n)
3405 goto fail;
3406 key = DK_ENTRIES(k)[i].me_key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003407 }
3408 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003409 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(k)[i];
3410 while (i < n && entry_ptr->me_value == NULL) {
3411 entry_ptr++;
3412 i++;
3413 }
3414 if (i >= n)
3415 goto fail;
3416 key = entry_ptr->me_key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003417 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003418 di->di_pos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 di->len--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003420 Py_INCREF(key);
3421 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003422
3423fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003425 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003427}
3428
Raymond Hettinger019a1482004-03-18 02:41:19 +00003429PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3431 "dict_keyiterator", /* tp_name */
3432 sizeof(dictiterobject), /* tp_basicsize */
3433 0, /* tp_itemsize */
3434 /* methods */
3435 (destructor)dictiter_dealloc, /* tp_dealloc */
3436 0, /* tp_print */
3437 0, /* tp_getattr */
3438 0, /* tp_setattr */
3439 0, /* tp_reserved */
3440 0, /* tp_repr */
3441 0, /* tp_as_number */
3442 0, /* tp_as_sequence */
3443 0, /* tp_as_mapping */
3444 0, /* tp_hash */
3445 0, /* tp_call */
3446 0, /* tp_str */
3447 PyObject_GenericGetAttr, /* tp_getattro */
3448 0, /* tp_setattro */
3449 0, /* tp_as_buffer */
3450 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3451 0, /* tp_doc */
3452 (traverseproc)dictiter_traverse, /* tp_traverse */
3453 0, /* tp_clear */
3454 0, /* tp_richcompare */
3455 0, /* tp_weaklistoffset */
3456 PyObject_SelfIter, /* tp_iter */
3457 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
3458 dictiter_methods, /* tp_methods */
3459 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003460};
3461
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003462static PyObject *
3463dictiter_iternextvalue(dictiterobject *di)
Raymond Hettinger019a1482004-03-18 02:41:19 +00003464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003465 PyObject *value;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003466 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003467 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003469 if (d == NULL)
3470 return NULL;
3471 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003473 if (di->di_used != d->ma_used) {
3474 PyErr_SetString(PyExc_RuntimeError,
3475 "dictionary changed size during iteration");
3476 di->di_used = -1; /* Make this state sticky */
3477 return NULL;
3478 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003480 i = di->di_pos;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003481 n = d->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003482 if (d->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003483 PyObject **value_ptr = &d->ma_values[i];
3484 while (i < n && *value_ptr == NULL) {
3485 value_ptr++;
3486 i++;
3487 }
3488 if (i >= n)
3489 goto fail;
3490 value = *value_ptr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003491 }
3492 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003493 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(d->ma_keys)[i];
3494 while (i < n && entry_ptr->me_value == NULL) {
3495 entry_ptr++;
3496 i++;
3497 }
3498 if (i >= n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 goto fail;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003500 value = entry_ptr->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 }
3502 di->di_pos = i+1;
3503 di->len--;
3504 Py_INCREF(value);
3505 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003506
3507fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003509 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003510 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003511}
3512
3513PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003514 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3515 "dict_valueiterator", /* tp_name */
3516 sizeof(dictiterobject), /* tp_basicsize */
3517 0, /* tp_itemsize */
3518 /* methods */
3519 (destructor)dictiter_dealloc, /* tp_dealloc */
3520 0, /* tp_print */
3521 0, /* tp_getattr */
3522 0, /* tp_setattr */
3523 0, /* tp_reserved */
3524 0, /* tp_repr */
3525 0, /* tp_as_number */
3526 0, /* tp_as_sequence */
3527 0, /* tp_as_mapping */
3528 0, /* tp_hash */
3529 0, /* tp_call */
3530 0, /* tp_str */
3531 PyObject_GenericGetAttr, /* tp_getattro */
3532 0, /* tp_setattro */
3533 0, /* tp_as_buffer */
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003534 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003535 0, /* tp_doc */
3536 (traverseproc)dictiter_traverse, /* tp_traverse */
3537 0, /* tp_clear */
3538 0, /* tp_richcompare */
3539 0, /* tp_weaklistoffset */
3540 PyObject_SelfIter, /* tp_iter */
3541 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
3542 dictiter_methods, /* tp_methods */
3543 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003544};
3545
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003546static PyObject *
3547dictiter_iternextitem(dictiterobject *di)
Raymond Hettinger019a1482004-03-18 02:41:19 +00003548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003549 PyObject *key, *value, *result = di->di_result;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003550 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 if (d == NULL)
3554 return NULL;
3555 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003557 if (di->di_used != d->ma_used) {
3558 PyErr_SetString(PyExc_RuntimeError,
3559 "dictionary changed size during iteration");
3560 di->di_used = -1; /* Make this state sticky */
3561 return NULL;
3562 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003564 i = di->di_pos;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003565 n = d->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003566 if (d->ma_values) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003567 PyObject **value_ptr = &d->ma_values[i];
3568 while (i < n && *value_ptr == NULL) {
3569 value_ptr++;
3570 i++;
3571 }
3572 if (i >= n)
3573 goto fail;
3574 key = DK_ENTRIES(d->ma_keys)[i].me_key;
3575 value = *value_ptr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003576 }
3577 else {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003578 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(d->ma_keys)[i];
3579 while (i < n && entry_ptr->me_value == NULL) {
3580 entry_ptr++;
3581 i++;
3582 }
3583 if (i >= n)
3584 goto fail;
3585 key = entry_ptr->me_key;
3586 value = entry_ptr->me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003587 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003588 di->di_pos = i+1;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003589 di->len--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003590 if (result->ob_refcnt == 1) {
3591 Py_INCREF(result);
3592 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3593 Py_DECREF(PyTuple_GET_ITEM(result, 1));
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003594 }
3595 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003596 result = PyTuple_New(2);
3597 if (result == NULL)
3598 return NULL;
3599 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003600 Py_INCREF(key);
3601 Py_INCREF(value);
Eric Snow96c6af92015-05-29 22:21:39 -06003602 PyTuple_SET_ITEM(result, 0, key); /* steals reference */
3603 PyTuple_SET_ITEM(result, 1, value); /* steals reference */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003604 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003605
3606fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003607 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003608 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003609 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003610}
3611
3612PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003613 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3614 "dict_itemiterator", /* tp_name */
3615 sizeof(dictiterobject), /* tp_basicsize */
3616 0, /* tp_itemsize */
3617 /* methods */
3618 (destructor)dictiter_dealloc, /* tp_dealloc */
3619 0, /* tp_print */
3620 0, /* tp_getattr */
3621 0, /* tp_setattr */
3622 0, /* tp_reserved */
3623 0, /* tp_repr */
3624 0, /* tp_as_number */
3625 0, /* tp_as_sequence */
3626 0, /* tp_as_mapping */
3627 0, /* tp_hash */
3628 0, /* tp_call */
3629 0, /* tp_str */
3630 PyObject_GenericGetAttr, /* tp_getattro */
3631 0, /* tp_setattro */
3632 0, /* tp_as_buffer */
3633 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3634 0, /* tp_doc */
3635 (traverseproc)dictiter_traverse, /* tp_traverse */
3636 0, /* tp_clear */
3637 0, /* tp_richcompare */
3638 0, /* tp_weaklistoffset */
3639 PyObject_SelfIter, /* tp_iter */
3640 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3641 dictiter_methods, /* tp_methods */
3642 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003643};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003644
3645
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003646static PyObject *
3647dictiter_reduce(dictiterobject *di)
3648{
3649 PyObject *list;
3650 dictiterobject tmp;
3651
3652 list = PyList_New(0);
3653 if (!list)
3654 return NULL;
3655
3656 /* copy the itertor state */
3657 tmp = *di;
3658 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003659
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003660 /* iterate the temporary into a list */
3661 for(;;) {
3662 PyObject *element = 0;
3663 if (Py_TYPE(di) == &PyDictIterItem_Type)
3664 element = dictiter_iternextitem(&tmp);
3665 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3666 element = dictiter_iternextkey(&tmp);
3667 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3668 element = dictiter_iternextvalue(&tmp);
3669 else
3670 assert(0);
3671 if (element) {
3672 if (PyList_Append(list, element)) {
3673 Py_DECREF(element);
3674 Py_DECREF(list);
3675 Py_XDECREF(tmp.di_dict);
3676 return NULL;
3677 }
3678 Py_DECREF(element);
3679 } else
3680 break;
3681 }
3682 Py_XDECREF(tmp.di_dict);
3683 /* check for error */
3684 if (tmp.di_dict != NULL) {
3685 /* we have an error */
3686 Py_DECREF(list);
3687 return NULL;
3688 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003689 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003690}
3691
Guido van Rossum3ac67412007-02-10 18:55:06 +00003692/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003693/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003694/***********************************************/
3695
Guido van Rossumb90c8482007-02-10 01:11:45 +00003696/* The instance lay-out is the same for all three; but the type differs. */
3697
Guido van Rossumb90c8482007-02-10 01:11:45 +00003698static void
Eric Snow96c6af92015-05-29 22:21:39 -06003699dictview_dealloc(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003701 Py_XDECREF(dv->dv_dict);
3702 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003703}
3704
3705static int
Eric Snow96c6af92015-05-29 22:21:39 -06003706dictview_traverse(_PyDictViewObject *dv, visitproc visit, void *arg)
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003708 Py_VISIT(dv->dv_dict);
3709 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003710}
3711
Guido van Rossum83825ac2007-02-10 04:54:19 +00003712static Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06003713dictview_len(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003715 Py_ssize_t len = 0;
3716 if (dv->dv_dict != NULL)
3717 len = dv->dv_dict->ma_used;
3718 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003719}
3720
Eric Snow96c6af92015-05-29 22:21:39 -06003721PyObject *
3722_PyDictView_New(PyObject *dict, PyTypeObject *type)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003723{
Eric Snow96c6af92015-05-29 22:21:39 -06003724 _PyDictViewObject *dv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003725 if (dict == NULL) {
3726 PyErr_BadInternalCall();
3727 return NULL;
3728 }
3729 if (!PyDict_Check(dict)) {
3730 /* XXX Get rid of this restriction later */
3731 PyErr_Format(PyExc_TypeError,
3732 "%s() requires a dict argument, not '%s'",
3733 type->tp_name, dict->ob_type->tp_name);
3734 return NULL;
3735 }
Eric Snow96c6af92015-05-29 22:21:39 -06003736 dv = PyObject_GC_New(_PyDictViewObject, type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 if (dv == NULL)
3738 return NULL;
3739 Py_INCREF(dict);
3740 dv->dv_dict = (PyDictObject *)dict;
3741 _PyObject_GC_TRACK(dv);
3742 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003743}
3744
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003745/* TODO(guido): The views objects are not complete:
3746
3747 * support more set operations
3748 * support arbitrary mappings?
3749 - either these should be static or exported in dictobject.h
3750 - if public then they should probably be in builtins
3751*/
3752
Guido van Rossumaac530c2007-08-24 22:33:45 +00003753/* Return 1 if self is a subset of other, iterating over self;
3754 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003755static int
3756all_contained_in(PyObject *self, PyObject *other)
3757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003758 PyObject *iter = PyObject_GetIter(self);
3759 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003761 if (iter == NULL)
3762 return -1;
3763 for (;;) {
3764 PyObject *next = PyIter_Next(iter);
3765 if (next == NULL) {
3766 if (PyErr_Occurred())
3767 ok = -1;
3768 break;
3769 }
3770 ok = PySequence_Contains(other, next);
3771 Py_DECREF(next);
3772 if (ok <= 0)
3773 break;
3774 }
3775 Py_DECREF(iter);
3776 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003777}
3778
3779static PyObject *
3780dictview_richcompare(PyObject *self, PyObject *other, int op)
3781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003782 Py_ssize_t len_self, len_other;
3783 int ok;
3784 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 assert(self != NULL);
3787 assert(PyDictViewSet_Check(self));
3788 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003789
Brian Curtindfc80e32011-08-10 20:28:54 -05003790 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3791 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003793 len_self = PyObject_Size(self);
3794 if (len_self < 0)
3795 return NULL;
3796 len_other = PyObject_Size(other);
3797 if (len_other < 0)
3798 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003800 ok = 0;
3801 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003803 case Py_NE:
3804 case Py_EQ:
3805 if (len_self == len_other)
3806 ok = all_contained_in(self, other);
3807 if (op == Py_NE && ok >= 0)
3808 ok = !ok;
3809 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003811 case Py_LT:
3812 if (len_self < len_other)
3813 ok = all_contained_in(self, other);
3814 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003816 case Py_LE:
3817 if (len_self <= len_other)
3818 ok = all_contained_in(self, other);
3819 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003821 case Py_GT:
3822 if (len_self > len_other)
3823 ok = all_contained_in(other, self);
3824 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003826 case Py_GE:
3827 if (len_self >= len_other)
3828 ok = all_contained_in(other, self);
3829 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003831 }
3832 if (ok < 0)
3833 return NULL;
3834 result = ok ? Py_True : Py_False;
3835 Py_INCREF(result);
3836 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003837}
3838
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003839static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003840dictview_repr(_PyDictViewObject *dv)
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003842 PyObject *seq;
3843 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003845 seq = PySequence_List((PyObject *)dv);
3846 if (seq == NULL)
3847 return NULL;
3848
3849 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3850 Py_DECREF(seq);
3851 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003852}
3853
Guido van Rossum3ac67412007-02-10 18:55:06 +00003854/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003855
3856static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003857dictkeys_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003859 if (dv->dv_dict == NULL) {
3860 Py_RETURN_NONE;
3861 }
3862 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003863}
3864
3865static int
Eric Snow96c6af92015-05-29 22:21:39 -06003866dictkeys_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003867{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 if (dv->dv_dict == NULL)
3869 return 0;
3870 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003871}
3872
Guido van Rossum83825ac2007-02-10 04:54:19 +00003873static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003874 (lenfunc)dictview_len, /* sq_length */
3875 0, /* sq_concat */
3876 0, /* sq_repeat */
3877 0, /* sq_item */
3878 0, /* sq_slice */
3879 0, /* sq_ass_item */
3880 0, /* sq_ass_slice */
3881 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003882};
3883
Guido van Rossum523259b2007-08-24 23:41:22 +00003884static PyObject*
3885dictviews_sub(PyObject* self, PyObject *other)
3886{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003887 PyObject *result = PySet_New(self);
3888 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003889 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003891 if (result == NULL)
3892 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003893
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003894 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003895 if (tmp == NULL) {
3896 Py_DECREF(result);
3897 return NULL;
3898 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003900 Py_DECREF(tmp);
3901 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003902}
3903
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003904PyObject*
3905_PyDictView_Intersect(PyObject* self, PyObject *other)
Guido van Rossum523259b2007-08-24 23:41:22 +00003906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003907 PyObject *result = PySet_New(self);
3908 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003909 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003911 if (result == NULL)
3912 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003913
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003914 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003915 if (tmp == NULL) {
3916 Py_DECREF(result);
3917 return NULL;
3918 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003920 Py_DECREF(tmp);
3921 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003922}
3923
3924static PyObject*
3925dictviews_or(PyObject* self, PyObject *other)
3926{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 PyObject *result = PySet_New(self);
3928 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003929 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003931 if (result == NULL)
3932 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003933
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003934 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003935 if (tmp == NULL) {
3936 Py_DECREF(result);
3937 return NULL;
3938 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003940 Py_DECREF(tmp);
3941 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003942}
3943
3944static PyObject*
3945dictviews_xor(PyObject* self, PyObject *other)
3946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003947 PyObject *result = PySet_New(self);
3948 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003949 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003951 if (result == NULL)
3952 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003953
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003954 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003955 if (tmp == NULL) {
3956 Py_DECREF(result);
3957 return NULL;
3958 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003960 Py_DECREF(tmp);
3961 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003962}
3963
3964static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 0, /*nb_add*/
3966 (binaryfunc)dictviews_sub, /*nb_subtract*/
3967 0, /*nb_multiply*/
3968 0, /*nb_remainder*/
3969 0, /*nb_divmod*/
3970 0, /*nb_power*/
3971 0, /*nb_negative*/
3972 0, /*nb_positive*/
3973 0, /*nb_absolute*/
3974 0, /*nb_bool*/
3975 0, /*nb_invert*/
3976 0, /*nb_lshift*/
3977 0, /*nb_rshift*/
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003978 (binaryfunc)_PyDictView_Intersect, /*nb_and*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003979 (binaryfunc)dictviews_xor, /*nb_xor*/
3980 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003981};
3982
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003983static PyObject*
3984dictviews_isdisjoint(PyObject *self, PyObject *other)
3985{
3986 PyObject *it;
3987 PyObject *item = NULL;
3988
3989 if (self == other) {
Eric Snow96c6af92015-05-29 22:21:39 -06003990 if (dictview_len((_PyDictViewObject *)self) == 0)
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003991 Py_RETURN_TRUE;
3992 else
3993 Py_RETURN_FALSE;
3994 }
3995
3996 /* Iterate over the shorter object (only if other is a set,
3997 * because PySequence_Contains may be expensive otherwise): */
3998 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
Eric Snow96c6af92015-05-29 22:21:39 -06003999 Py_ssize_t len_self = dictview_len((_PyDictViewObject *)self);
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004000 Py_ssize_t len_other = PyObject_Size(other);
4001 if (len_other == -1)
4002 return NULL;
4003
4004 if ((len_other > len_self)) {
4005 PyObject *tmp = other;
4006 other = self;
4007 self = tmp;
4008 }
4009 }
4010
4011 it = PyObject_GetIter(other);
4012 if (it == NULL)
4013 return NULL;
4014
4015 while ((item = PyIter_Next(it)) != NULL) {
4016 int contains = PySequence_Contains(self, item);
4017 Py_DECREF(item);
4018 if (contains == -1) {
4019 Py_DECREF(it);
4020 return NULL;
4021 }
4022
4023 if (contains) {
4024 Py_DECREF(it);
4025 Py_RETURN_FALSE;
4026 }
4027 }
4028 Py_DECREF(it);
4029 if (PyErr_Occurred())
4030 return NULL; /* PyIter_Next raised an exception. */
4031 Py_RETURN_TRUE;
4032}
4033
4034PyDoc_STRVAR(isdisjoint_doc,
4035"Return True if the view and the given iterable have a null intersection.");
4036
Guido van Rossumb90c8482007-02-10 01:11:45 +00004037static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004038 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
4039 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004040 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004041};
4042
4043PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4045 "dict_keys", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004046 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004047 0, /* tp_itemsize */
4048 /* methods */
4049 (destructor)dictview_dealloc, /* tp_dealloc */
4050 0, /* tp_print */
4051 0, /* tp_getattr */
4052 0, /* tp_setattr */
4053 0, /* tp_reserved */
4054 (reprfunc)dictview_repr, /* tp_repr */
4055 &dictviews_as_number, /* tp_as_number */
4056 &dictkeys_as_sequence, /* tp_as_sequence */
4057 0, /* tp_as_mapping */
4058 0, /* tp_hash */
4059 0, /* tp_call */
4060 0, /* tp_str */
4061 PyObject_GenericGetAttr, /* tp_getattro */
4062 0, /* tp_setattro */
4063 0, /* tp_as_buffer */
4064 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4065 0, /* tp_doc */
4066 (traverseproc)dictview_traverse, /* tp_traverse */
4067 0, /* tp_clear */
4068 dictview_richcompare, /* tp_richcompare */
4069 0, /* tp_weaklistoffset */
4070 (getiterfunc)dictkeys_iter, /* tp_iter */
4071 0, /* tp_iternext */
4072 dictkeys_methods, /* tp_methods */
4073 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004074};
4075
4076static PyObject *
4077dictkeys_new(PyObject *dict)
4078{
Eric Snow96c6af92015-05-29 22:21:39 -06004079 return _PyDictView_New(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004080}
4081
Guido van Rossum3ac67412007-02-10 18:55:06 +00004082/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004083
4084static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004085dictitems_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004087 if (dv->dv_dict == NULL) {
4088 Py_RETURN_NONE;
4089 }
4090 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00004091}
4092
4093static int
Eric Snow96c6af92015-05-29 22:21:39 -06004094dictitems_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00004095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004096 PyObject *key, *value, *found;
4097 if (dv->dv_dict == NULL)
4098 return 0;
4099 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
4100 return 0;
4101 key = PyTuple_GET_ITEM(obj, 0);
4102 value = PyTuple_GET_ITEM(obj, 1);
Raymond Hettinger6692f012016-09-18 21:46:08 -07004103 found = PyDict_GetItemWithError((PyObject *)dv->dv_dict, key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004104 if (found == NULL) {
4105 if (PyErr_Occurred())
4106 return -1;
4107 return 0;
4108 }
4109 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004110}
4111
Guido van Rossum83825ac2007-02-10 04:54:19 +00004112static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004113 (lenfunc)dictview_len, /* sq_length */
4114 0, /* sq_concat */
4115 0, /* sq_repeat */
4116 0, /* sq_item */
4117 0, /* sq_slice */
4118 0, /* sq_ass_item */
4119 0, /* sq_ass_slice */
4120 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004121};
4122
Guido van Rossumb90c8482007-02-10 01:11:45 +00004123static PyMethodDef dictitems_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 PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004130 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4131 "dict_items", /* 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 &dictitems_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)dictitems_iter, /* tp_iter */
4157 0, /* tp_iternext */
4158 dictitems_methods, /* tp_methods */
4159 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004160};
4161
4162static PyObject *
4163dictitems_new(PyObject *dict)
4164{
Eric Snow96c6af92015-05-29 22:21:39 -06004165 return _PyDictView_New(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004166}
4167
Guido van Rossum3ac67412007-02-10 18:55:06 +00004168/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004169
4170static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004171dictvalues_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, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004177}
4178
Guido van Rossum83825ac2007-02-10 04:54:19 +00004179static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004180 (lenfunc)dictview_len, /* sq_length */
4181 0, /* sq_concat */
4182 0, /* sq_repeat */
4183 0, /* sq_item */
4184 0, /* sq_slice */
4185 0, /* sq_ass_item */
4186 0, /* sq_ass_slice */
4187 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004188};
4189
Guido van Rossumb90c8482007-02-10 01:11:45 +00004190static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004191 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004192};
4193
4194PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004195 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4196 "dict_values", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004197 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004198 0, /* tp_itemsize */
4199 /* methods */
4200 (destructor)dictview_dealloc, /* tp_dealloc */
4201 0, /* tp_print */
4202 0, /* tp_getattr */
4203 0, /* tp_setattr */
4204 0, /* tp_reserved */
4205 (reprfunc)dictview_repr, /* tp_repr */
4206 0, /* tp_as_number */
4207 &dictvalues_as_sequence, /* tp_as_sequence */
4208 0, /* tp_as_mapping */
4209 0, /* tp_hash */
4210 0, /* tp_call */
4211 0, /* tp_str */
4212 PyObject_GenericGetAttr, /* tp_getattro */
4213 0, /* tp_setattro */
4214 0, /* tp_as_buffer */
4215 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4216 0, /* tp_doc */
4217 (traverseproc)dictview_traverse, /* tp_traverse */
4218 0, /* tp_clear */
4219 0, /* tp_richcompare */
4220 0, /* tp_weaklistoffset */
4221 (getiterfunc)dictvalues_iter, /* tp_iter */
4222 0, /* tp_iternext */
4223 dictvalues_methods, /* tp_methods */
4224 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004225};
4226
4227static PyObject *
4228dictvalues_new(PyObject *dict)
4229{
Eric Snow96c6af92015-05-29 22:21:39 -06004230 return _PyDictView_New(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004231}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004232
4233/* Returns NULL if cannot allocate a new PyDictKeysObject,
4234 but does not set an error */
4235PyDictKeysObject *
4236_PyDict_NewKeysForClass(void)
4237{
Victor Stinner742da042016-09-07 17:40:12 -07004238 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004239 if (keys == NULL)
4240 PyErr_Clear();
4241 else
4242 keys->dk_lookup = lookdict_split;
4243 return keys;
4244}
4245
4246#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
4247
4248PyObject *
4249PyObject_GenericGetDict(PyObject *obj, void *context)
4250{
4251 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
4252 if (dictptr == NULL) {
4253 PyErr_SetString(PyExc_AttributeError,
4254 "This object has no __dict__");
4255 return NULL;
4256 }
4257 dict = *dictptr;
4258 if (dict == NULL) {
4259 PyTypeObject *tp = Py_TYPE(obj);
4260 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
4261 DK_INCREF(CACHED_KEYS(tp));
4262 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
4263 }
4264 else {
4265 *dictptr = dict = PyDict_New();
4266 }
4267 }
4268 Py_XINCREF(dict);
4269 return dict;
4270}
4271
4272int
4273_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
Victor Stinner742da042016-09-07 17:40:12 -07004274 PyObject *key, PyObject *value)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004275{
4276 PyObject *dict;
4277 int res;
4278 PyDictKeysObject *cached;
4279
4280 assert(dictptr != NULL);
4281 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
4282 assert(dictptr != NULL);
4283 dict = *dictptr;
4284 if (dict == NULL) {
4285 DK_INCREF(cached);
4286 dict = new_dict_with_shared_keys(cached);
4287 if (dict == NULL)
4288 return -1;
4289 *dictptr = dict;
4290 }
4291 if (value == NULL) {
4292 res = PyDict_DelItem(dict, key);
4293 if (cached != ((PyDictObject *)dict)->ma_keys) {
4294 CACHED_KEYS(tp) = NULL;
4295 DK_DECREF(cached);
4296 }
Victor Stinnerccda5c42016-12-15 17:21:23 +01004297 }
4298 else {
4299 int was_shared = cached == ((PyDictObject *)dict)->ma_keys;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004300 res = PyDict_SetItem(dict, key, value);
Victor Stinnerccda5c42016-12-15 17:21:23 +01004301 if (was_shared && cached != ((PyDictObject *)dict)->ma_keys) {
4302 /* PyDict_SetItem() may call dictresize and convert split table
4303 * into combined table. In such case, convert it to split
4304 * table again and update type's shared key only when this is
4305 * the only dict sharing key with the type.
4306 *
4307 * This is to allow using shared key in class like this:
4308 *
4309 * class C:
4310 * def __init__(self):
4311 * # one dict resize happens
4312 * self.a, self.b, self.c = 1, 2, 3
4313 * self.d, self.e, self.f = 4, 5, 6
4314 * a = C()
4315 */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004316 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004317 CACHED_KEYS(tp) = make_keys_shared(dict);
Victor Stinner742da042016-09-07 17:40:12 -07004318 }
4319 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004320 CACHED_KEYS(tp) = NULL;
4321 }
4322 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004323 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
4324 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004325 }
4326 }
4327 } else {
4328 dict = *dictptr;
4329 if (dict == NULL) {
4330 dict = PyDict_New();
4331 if (dict == NULL)
4332 return -1;
4333 *dictptr = dict;
4334 }
4335 if (value == NULL) {
4336 res = PyDict_DelItem(dict, key);
4337 } else {
4338 res = PyDict_SetItem(dict, key, value);
4339 }
4340 }
4341 return res;
4342}
4343
4344void
4345_PyDictKeys_DecRef(PyDictKeysObject *keys)
4346{
4347 DK_DECREF(keys);
4348}