blob: e7c0db1882ce84e539e7c9f47dcb40719001ecf2 [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
Raymond Hettingerb12785d2016-10-22 09:58:14 -070013As of Python 3.6, this is compact and ordered. Basic idea is described here:
14* https://mail.python.org/pipermail/python-dev/2012-December/123028.html
15* https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html
Victor Stinner742da042016-09-07 17:40:12 -070016
17layout:
18
19+---------------+
20| dk_refcnt |
21| dk_size |
22| dk_lookup |
23| dk_usable |
24| dk_nentries |
25+---------------+
26| dk_indices |
27| |
28+---------------+
29| dk_entries |
30| |
31+---------------+
32
33dk_indices is actual hashtable. It holds index in entries, or DKIX_EMPTY(-1)
34or DKIX_DUMMY(-2).
35Size of indices is dk_size. Type of each index in indices is vary on dk_size:
36
37* int8 for dk_size <= 128
38* int16 for 256 <= dk_size <= 2**15
39* int32 for 2**16 <= dk_size <= 2**31
40* int64 for 2**32 <= dk_size
41
42dk_entries is array of PyDictKeyEntry. It's size is USABLE_FRACTION(dk_size).
43DK_ENTRIES(dk) can be used to get pointer to entries.
44
45NOTE: Since negative value is used for DKIX_EMPTY and DKIX_DUMMY, type of
46dk_indices entry is signed integer and int16 is used for table which
47dk_size == 256.
48*/
49
Benjamin Peterson7d95e402012-04-23 11:24:50 -040050
51/*
Benjamin Peterson7d95e402012-04-23 11:24:50 -040052The DictObject can be in one of two forms.
Victor Stinner742da042016-09-07 17:40:12 -070053
Benjamin Peterson7d95e402012-04-23 11:24:50 -040054Either:
55 A combined table:
56 ma_values == NULL, dk_refcnt == 1.
57 Values are stored in the me_value field of the PyDictKeysObject.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040058Or:
59 A split table:
60 ma_values != NULL, dk_refcnt >= 1
61 Values are stored in the ma_values array.
Victor Stinner742da042016-09-07 17:40:12 -070062 Only string (unicode) keys are allowed.
63 All dicts sharing same key must have same insertion order.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040064
Victor Stinner742da042016-09-07 17:40:12 -070065There are four kinds of slots in the table (slot is index, and
66DK_ENTRIES(keys)[index] if index >= 0):
67
681. Unused. index == DKIX_EMPTY
69 Does not hold an active (key, value) pair now and never did. Unused can
70 transition to Active upon key insertion. This is each slot's initial state.
71
722. Active. index >= 0, me_key != NULL and me_value != NULL
73 Holds an active (key, value) pair. Active can transition to Dummy or
74 Pending upon key deletion (for combined and split tables respectively).
75 This is the only case in which me_value != NULL.
76
773. Dummy. index == DKIX_DUMMY (combined only)
78 Previously held an active (key, value) pair, but that was deleted and an
79 active pair has not yet overwritten the slot. Dummy can transition to
80 Active upon key insertion. Dummy slots cannot be made Unused again
81 else the probe sequence in case of collision would have no way to know
82 they were once active.
83
844. Pending. index >= 0, key != NULL, and value == NULL (split only)
85 Not yet inserted in split-table.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040086*/
87
Victor Stinner742da042016-09-07 17:40:12 -070088/*
89Preserving insertion order
Benjamin Peterson7d95e402012-04-23 11:24:50 -040090
Victor Stinner742da042016-09-07 17:40:12 -070091It's simple for combined table. Since dk_entries is mostly append only, we can
92get insertion order by just iterating dk_entries.
93
94One exception is .popitem(). It removes last item in dk_entries and decrement
95dk_nentries to achieve amortized O(1). Since there are DKIX_DUMMY remains in
96dk_indices, we can't increment dk_usable even though dk_nentries is
97decremented.
98
99In split table, inserting into pending entry is allowed only for dk_entries[ix]
100where ix == mp->ma_used. Inserting into other index and deleting item cause
101converting the dict to the combined table.
102*/
103
104/* PyDict_MINSIZE is the starting size for any new dict.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400105 * 8 allows dicts with no more than 5 active entries; experiments suggested
106 * this suffices for the majority of dicts (consisting mostly of usually-small
107 * dicts created to pass keyword arguments).
108 * Making this 8, rather than 4 reduces the number of resizes for most
109 * dictionaries, without any significant extra memory use.
110 */
Victor Stinner742da042016-09-07 17:40:12 -0700111#define PyDict_MINSIZE 8
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400112
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113#include "Python.h"
Eric Snow96c6af92015-05-29 22:21:39 -0600114#include "dict-common.h"
Victor Stinner990397e2016-09-09 20:22:59 -0700115#include "stringlib/eq.h" /* to get unicode_eq() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000116
Larry Hastings61272b72014-01-07 12:41:53 -0800117/*[clinic input]
Larry Hastingsc2047262014-01-25 20:43:29 -0800118class dict "PyDictObject *" "&PyDict_Type"
Larry Hastings61272b72014-01-07 12:41:53 -0800119[clinic start generated code]*/
Larry Hastings581ee362014-01-28 05:00:08 -0800120/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f157a5a0ce9589d6]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800121
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400122
123/*
124To ensure the lookup algorithm terminates, there must be at least one Unused
125slot (NULL key) in the table.
126To avoid slowing down lookups on a near-full table, we resize the table when
127it's USABLE_FRACTION (currently two-thirds) full.
128*/
Guido van Rossum16e93a81997-01-28 00:00:11 +0000129
Tim Peterseb28ef22001-06-02 05:27:19 +0000130#define PERTURB_SHIFT 5
131
Guido van Rossum16e93a81997-01-28 00:00:11 +0000132/*
Tim Peterseb28ef22001-06-02 05:27:19 +0000133Major subtleties ahead: Most hash schemes depend on having a "good" hash
134function, in the sense of simulating randomness. Python doesn't: its most
R David Murray537ad7a2016-07-10 12:33:18 -0400135important hash functions (for ints) are very regular in common
Tim Peterseb28ef22001-06-02 05:27:19 +0000136cases:
Tim Peters15d49292001-05-27 07:39:22 +0000137
R David Murray537ad7a2016-07-10 12:33:18 -0400138 >>>[hash(i) for i in range(4)]
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000139 [0, 1, 2, 3]
Tim Peters15d49292001-05-27 07:39:22 +0000140
Tim Peterseb28ef22001-06-02 05:27:19 +0000141This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
142the low-order i bits as the initial table index is extremely fast, and there
R David Murray537ad7a2016-07-10 12:33:18 -0400143are no collisions at all for dicts indexed by a contiguous range of ints. So
144this gives better-than-random behavior in common cases, and that's very
145desirable.
Tim Peters15d49292001-05-27 07:39:22 +0000146
Tim Peterseb28ef22001-06-02 05:27:19 +0000147OTOH, when collisions occur, the tendency to fill contiguous slices of the
148hash table makes a good collision resolution strategy crucial. Taking only
149the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000151their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
152 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +0000153
Tim Peterseb28ef22001-06-02 05:27:19 +0000154But catering to unusual cases should not slow the usual ones, so we just take
155the last i bits anyway. It's up to collision resolution to do the rest. If
156we *usually* find the key we're looking for on the first try (and, it turns
157out, we usually do -- the table load factor is kept under 2/3, so the odds
158are solidly in our favor), then it makes best sense to keep the initial index
159computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +0000160
Tim Peterseb28ef22001-06-02 05:27:19 +0000161The first half of collision resolution is to visit table indices via this
162recurrence:
Tim Peters15d49292001-05-27 07:39:22 +0000163
Tim Peterseb28ef22001-06-02 05:27:19 +0000164 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +0000165
Tim Peterseb28ef22001-06-02 05:27:19 +0000166For any initial j in range(2**i), repeating that 2**i times generates each
167int in range(2**i) exactly once (see any text on random-number generation for
168proof). By itself, this doesn't help much: like linear probing (setting
169j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
170order. This would be bad, except that's not the only thing we do, and it's
171actually *good* in the common cases where hash keys are consecutive. In an
172example that's really too small to make this entirely clear, for a table of
173size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +0000174
Tim Peterseb28ef22001-06-02 05:27:19 +0000175 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
176
177If two things come in at index 5, the first place we look after is index 2,
178not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
179Linear probing is deadly in this case because there the fixed probe order
180is the *same* as the order consecutive keys are likely to arrive. But it's
181extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
182and certain that consecutive hash codes do not.
183
184The other half of the strategy is to get the other bits of the hash code
185into play. This is done by initializing a (unsigned) vrbl "perturb" to the
186full hash code, and changing the recurrence to:
187
Tim Peterseb28ef22001-06-02 05:27:19 +0000188 perturb >>= PERTURB_SHIFT;
INADA Naoki267941c2016-10-06 15:19:07 +0900189 j = (5*j) + 1 + perturb;
Tim Peterseb28ef22001-06-02 05:27:19 +0000190 use j % 2**i as the next table index;
191
192Now the probe sequence depends (eventually) on every bit in the hash code,
193and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
194because it quickly magnifies small differences in the bits that didn't affect
195the initial index. Note that because perturb is unsigned, if the recurrence
196is executed often enough perturb eventually becomes and remains 0. At that
197point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
198that's certain to find an empty slot eventually (since it generates every int
199in range(2**i), and we make sure there's always at least one empty slot).
200
201Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
202small so that the high bits of the hash code continue to affect the probe
203sequence across iterations; but you want it large so that in really bad cases
204the high-order hash bits have an effect on early iterations. 5 was "the
205best" in minimizing total collisions across experiments Tim Peters ran (on
206both normal and pathological cases), but 4 and 6 weren't significantly worse.
207
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000208Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000209approach, using repeated multiplication by x in GF(2**n) where an irreducible
210polynomial for each table size was chosen such that x was a primitive root.
211Christian Tismer later extended that to use division by x instead, as an
212efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000213also gave excellent collision statistics, but was more expensive: two
214if-tests were required inside the loop; computing "the next" index took about
215the same number of operations but without as much potential parallelism
216(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
217above, and then shifting perturb can be done while the table index is being
218masked); and the PyDictObject struct required a member to hold the table's
219polynomial. In Tim's experiments the current scheme ran faster, produced
220equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000221
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000222*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000223
Fred Drake1bff34a2000-08-31 19:31:38 +0000224/* forward declarations */
Victor Stinner742da042016-09-07 17:40:12 -0700225static Py_ssize_t lookdict(PyDictObject *mp, PyObject *key,
INADA Naokiba609772016-12-07 20:41:42 +0900226 Py_hash_t hash, PyObject **value_addr,
Victor Stinner742da042016-09-07 17:40:12 -0700227 Py_ssize_t *hashpos);
228static Py_ssize_t lookdict_unicode(PyDictObject *mp, PyObject *key,
INADA Naokiba609772016-12-07 20:41:42 +0900229 Py_hash_t hash, PyObject **value_addr,
Victor Stinner742da042016-09-07 17:40:12 -0700230 Py_ssize_t *hashpos);
231static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400232lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
INADA Naokiba609772016-12-07 20:41:42 +0900233 Py_hash_t hash, PyObject **value_addr,
Victor Stinner742da042016-09-07 17:40:12 -0700234 Py_ssize_t *hashpos);
235static Py_ssize_t lookdict_split(PyDictObject *mp, PyObject *key,
INADA Naokiba609772016-12-07 20:41:42 +0900236 Py_hash_t hash, PyObject **value_addr,
Victor Stinner742da042016-09-07 17:40:12 -0700237 Py_ssize_t *hashpos);
Fred Drake1bff34a2000-08-31 19:31:38 +0000238
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400239static int dictresize(PyDictObject *mp, Py_ssize_t minused);
Tim Petersdea48ec2001-05-22 20:40:22 +0000240
Benjamin Peterson3c569292016-09-08 13:16:41 -0700241/*Global counter used to set ma_version_tag field of dictionary.
Victor Stinner3b6a6b42016-09-08 12:51:24 -0700242 * It is incremented each time that a dictionary is created and each
243 * time that a dictionary is modified. */
244static uint64_t pydict_global_version = 0;
245
246#define DICT_NEXT_VERSION() (++pydict_global_version)
247
Victor Stinner742da042016-09-07 17:40:12 -0700248/* Dictionary reuse scheme to save calls to malloc and free */
Christian Heimes2202f872008-02-06 14:31:34 +0000249#ifndef PyDict_MAXFREELIST
250#define PyDict_MAXFREELIST 80
251#endif
252static PyDictObject *free_list[PyDict_MAXFREELIST];
253static int numfree = 0;
Victor Stinner742da042016-09-07 17:40:12 -0700254static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST];
255static int numfreekeys = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000256
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300257#include "clinic/dictobject.c.h"
258
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100259int
260PyDict_ClearFreeList(void)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 PyDictObject *op;
Victor Stinner742da042016-09-07 17:40:12 -0700263 int ret = numfree + numfreekeys;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 while (numfree) {
265 op = free_list[--numfree];
266 assert(PyDict_CheckExact(op));
267 PyObject_GC_Del(op);
268 }
Victor Stinner742da042016-09-07 17:40:12 -0700269 while (numfreekeys) {
270 PyObject_FREE(keys_free_list[--numfreekeys]);
271 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100272 return ret;
273}
274
David Malcolm49526f42012-06-22 14:55:41 -0400275/* Print summary info about the state of the optimized allocator */
276void
277_PyDict_DebugMallocStats(FILE *out)
278{
279 _PyDebugAllocatorStats(out,
280 "free PyDictObject", numfree, sizeof(PyDictObject));
281}
282
283
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100284void
285PyDict_Fini(void)
286{
287 PyDict_ClearFreeList();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000288}
289
Victor Stinner742da042016-09-07 17:40:12 -0700290#define DK_SIZE(dk) ((dk)->dk_size)
291#if SIZEOF_VOID_P > 4
Victor Stinner58f7c5a2016-09-08 11:37:36 -0700292#define DK_IXSIZE(dk) \
293 (DK_SIZE(dk) <= 0xff ? \
294 1 : DK_SIZE(dk) <= 0xffff ? \
295 2 : DK_SIZE(dk) <= 0xffffffff ? \
Benjamin Peterson3c569292016-09-08 13:16:41 -0700296 4 : sizeof(int64_t))
Victor Stinner742da042016-09-07 17:40:12 -0700297#else
Victor Stinner58f7c5a2016-09-08 11:37:36 -0700298#define DK_IXSIZE(dk) \
299 (DK_SIZE(dk) <= 0xff ? \
300 1 : DK_SIZE(dk) <= 0xffff ? \
Benjamin Peterson3c569292016-09-08 13:16:41 -0700301 2 : sizeof(int32_t))
Victor Stinner742da042016-09-07 17:40:12 -0700302#endif
Victor Stinner58f7c5a2016-09-08 11:37:36 -0700303#define DK_ENTRIES(dk) \
Benjamin Peterson186122e2016-09-08 12:20:12 -0700304 ((PyDictKeyEntry*)(&(dk)->dk_indices.as_1[DK_SIZE(dk) * DK_IXSIZE(dk)]))
Victor Stinner742da042016-09-07 17:40:12 -0700305
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200306#define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
307#define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
308
309#define DK_INCREF(dk) (DK_DEBUG_INCREF ++(dk)->dk_refcnt)
310#define DK_DECREF(dk) if (DK_DEBUG_DECREF (--(dk)->dk_refcnt) == 0) free_keys_object(dk)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400311#define DK_MASK(dk) (((dk)->dk_size)-1)
312#define IS_POWER_OF_2(x) (((x) & (x-1)) == 0)
313
Victor Stinner742da042016-09-07 17:40:12 -0700314/* lookup indices. returns DKIX_EMPTY, DKIX_DUMMY, or ix >=0 */
Benjamin Peterson73222252016-09-08 09:58:47 -0700315static inline Py_ssize_t
Victor Stinner742da042016-09-07 17:40:12 -0700316dk_get_index(PyDictKeysObject *keys, Py_ssize_t i)
317{
318 Py_ssize_t s = DK_SIZE(keys);
Victor Stinner71211e32016-09-08 10:52:46 -0700319 Py_ssize_t ix;
320
Victor Stinner742da042016-09-07 17:40:12 -0700321 if (s <= 0xff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700322 int8_t *indices = keys->dk_indices.as_1;
Victor Stinner208857e2016-09-08 11:35:46 -0700323 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700324 }
325 else if (s <= 0xffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700326 int16_t *indices = keys->dk_indices.as_2;
Victor Stinner208857e2016-09-08 11:35:46 -0700327 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700328 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700329#if SIZEOF_VOID_P > 4
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300330 else if (s > 0xffffffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700331 int64_t *indices = keys->dk_indices.as_8;
Victor Stinner208857e2016-09-08 11:35:46 -0700332 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700333 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700334#endif
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300335 else {
336 int32_t *indices = keys->dk_indices.as_4;
337 ix = indices[i];
338 }
Victor Stinner71211e32016-09-08 10:52:46 -0700339 assert(ix >= DKIX_DUMMY);
340 return ix;
Victor Stinner742da042016-09-07 17:40:12 -0700341}
342
343/* write to indices. */
Benjamin Peterson73222252016-09-08 09:58:47 -0700344static inline void
Victor Stinner742da042016-09-07 17:40:12 -0700345dk_set_index(PyDictKeysObject *keys, Py_ssize_t i, Py_ssize_t ix)
346{
347 Py_ssize_t s = DK_SIZE(keys);
Victor Stinner71211e32016-09-08 10:52:46 -0700348
349 assert(ix >= DKIX_DUMMY);
350
Victor Stinner742da042016-09-07 17:40:12 -0700351 if (s <= 0xff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700352 int8_t *indices = keys->dk_indices.as_1;
Victor Stinner71211e32016-09-08 10:52:46 -0700353 assert(ix <= 0x7f);
Victor Stinner208857e2016-09-08 11:35:46 -0700354 indices[i] = (char)ix;
Victor Stinner742da042016-09-07 17:40:12 -0700355 }
356 else if (s <= 0xffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700357 int16_t *indices = keys->dk_indices.as_2;
Victor Stinner71211e32016-09-08 10:52:46 -0700358 assert(ix <= 0x7fff);
Victor Stinner208857e2016-09-08 11:35:46 -0700359 indices[i] = (int16_t)ix;
Victor Stinner742da042016-09-07 17:40:12 -0700360 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700361#if SIZEOF_VOID_P > 4
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300362 else if (s > 0xffffffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700363 int64_t *indices = keys->dk_indices.as_8;
Victor Stinner208857e2016-09-08 11:35:46 -0700364 indices[i] = ix;
Victor Stinner742da042016-09-07 17:40:12 -0700365 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700366#endif
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300367 else {
368 int32_t *indices = keys->dk_indices.as_4;
369 assert(ix <= 0x7fffffff);
370 indices[i] = (int32_t)ix;
371 }
Victor Stinner742da042016-09-07 17:40:12 -0700372}
373
374
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200375/* USABLE_FRACTION is the maximum dictionary load.
Victor Stinner742da042016-09-07 17:40:12 -0700376 * Increasing this ratio makes dictionaries more dense resulting in more
377 * collisions. Decreasing it improves sparseness at the expense of spreading
378 * indices over more cache lines and at the cost of total memory consumed.
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200379 *
380 * USABLE_FRACTION must obey the following:
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400381 * (0 < USABLE_FRACTION(n) < n) for all n >= 2
382 *
Victor Stinner742da042016-09-07 17:40:12 -0700383 * USABLE_FRACTION should be quick to calculate.
384 * Fractions around 1/2 to 2/3 seem to work well in practice.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400385 */
Victor Stinner742da042016-09-07 17:40:12 -0700386#define USABLE_FRACTION(n) (((n) << 1)/3)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400387
Victor Stinner742da042016-09-07 17:40:12 -0700388/* ESTIMATE_SIZE is reverse function of USABLE_FRACTION.
389 * This can be used to reserve enough size to insert n entries without
390 * resizing.
391 */
INADA Naoki92c50ee2016-11-22 00:57:02 +0900392#define ESTIMATE_SIZE(n) (((n)*3+1) >> 1)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400393
Victor Stinner742da042016-09-07 17:40:12 -0700394/* Alternative fraction that is otherwise close enough to 2n/3 to make
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400395 * little difference. 8 * 2/3 == 8 * 5/8 == 5. 16 * 2/3 == 16 * 5/8 == 10.
396 * 32 * 2/3 = 21, 32 * 5/8 = 20.
397 * Its advantage is that it is faster to compute on machines with slow division.
398 * #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
Victor Stinner742da042016-09-07 17:40:12 -0700399 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400400
Victor Stinnera9f61a52013-07-16 22:17:26 +0200401/* GROWTH_RATE. Growth rate upon hitting maximum load.
402 * Currently set to used*2 + capacity/2.
403 * This means that dicts double in size when growing without deletions,
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700404 * but have more head room when the number of deletions is on a par with the
405 * number of insertions.
406 * Raising this to used*4 doubles memory consumption depending on the size of
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200407 * the dictionary, but results in half the number of resizes, less effort to
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700408 * resize.
409 * GROWTH_RATE was set to used*4 up to version 3.2.
410 * GROWTH_RATE was set to used*2 in version 3.3.0
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200411 */
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700412#define GROWTH_RATE(d) (((d)->ma_used*2)+((d)->ma_keys->dk_size>>1))
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400413
414#define ENSURE_ALLOWS_DELETIONS(d) \
415 if ((d)->ma_keys->dk_lookup == lookdict_unicode_nodummy) { \
416 (d)->ma_keys->dk_lookup = lookdict_unicode; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400418
419/* This immutable, empty PyDictKeysObject is used for PyDict_Clear()
420 * (which cannot fail and thus can do no allocation).
421 */
422static PyDictKeysObject empty_keys_struct = {
Serhiy Storchaka97932e42016-09-26 23:01:23 +0300423 1, /* dk_refcnt */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400424 1, /* dk_size */
425 lookdict_split, /* dk_lookup */
426 0, /* dk_usable (immutable) */
Victor Stinner742da042016-09-07 17:40:12 -0700427 0, /* dk_nentries */
Benjamin Peterson186122e2016-09-08 12:20:12 -0700428 .dk_indices = { .as_1 = {DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY,
429 DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY}},
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400430};
431
432static PyObject *empty_values[1] = { NULL };
433
434#define Py_EMPTY_KEYS &empty_keys_struct
435
Victor Stinner611b0fa2016-09-14 15:02:01 +0200436/* Uncomment to check the dict content in _PyDict_CheckConsistency() */
437/* #define DEBUG_PYDICT */
438
439
440#ifdef Py_DEBUG
441static int
442_PyDict_CheckConsistency(PyDictObject *mp)
443{
444 PyDictKeysObject *keys = mp->ma_keys;
445 int splitted = _PyDict_HasSplitTable(mp);
446 Py_ssize_t usable = USABLE_FRACTION(keys->dk_size);
447#ifdef DEBUG_PYDICT
448 PyDictKeyEntry *entries = DK_ENTRIES(keys);
449 Py_ssize_t i;
450#endif
451
452 assert(0 <= mp->ma_used && mp->ma_used <= usable);
453 assert(IS_POWER_OF_2(keys->dk_size));
454 assert(0 <= keys->dk_usable
455 && keys->dk_usable <= usable);
456 assert(0 <= keys->dk_nentries
457 && keys->dk_nentries <= usable);
458 assert(keys->dk_usable + keys->dk_nentries <= usable);
459
460 if (!splitted) {
461 /* combined table */
462 assert(keys->dk_refcnt == 1);
463 }
464
465#ifdef DEBUG_PYDICT
466 for (i=0; i < keys->dk_size; i++) {
467 Py_ssize_t ix = dk_get_index(keys, i);
468 assert(DKIX_DUMMY <= ix && ix <= usable);
469 }
470
471 for (i=0; i < usable; i++) {
472 PyDictKeyEntry *entry = &entries[i];
473 PyObject *key = entry->me_key;
474
475 if (key != NULL) {
476 if (PyUnicode_CheckExact(key)) {
477 Py_hash_t hash = ((PyASCIIObject *)key)->hash;
478 assert(hash != -1);
479 assert(entry->me_hash == hash);
480 }
481 else {
482 /* test_dict fails if PyObject_Hash() is called again */
483 assert(entry->me_hash != -1);
484 }
485 if (!splitted) {
486 assert(entry->me_value != NULL);
487 }
488 }
489
490 if (splitted) {
491 assert(entry->me_value == NULL);
492 }
493 }
494
495 if (splitted) {
496 /* splitted table */
497 for (i=0; i < mp->ma_used; i++) {
498 assert(mp->ma_values[i] != NULL);
499 }
500 }
501#endif
502
503 return 1;
504}
505#endif
506
507
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400508static PyDictKeysObject *new_keys_object(Py_ssize_t size)
509{
510 PyDictKeysObject *dk;
Victor Stinner742da042016-09-07 17:40:12 -0700511 Py_ssize_t es, usable;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400512
Victor Stinner742da042016-09-07 17:40:12 -0700513 assert(size >= PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400514 assert(IS_POWER_OF_2(size));
Victor Stinner742da042016-09-07 17:40:12 -0700515
516 usable = USABLE_FRACTION(size);
517 if (size <= 0xff) {
518 es = 1;
519 }
520 else if (size <= 0xffff) {
521 es = 2;
522 }
523#if SIZEOF_VOID_P > 4
524 else if (size <= 0xffffffff) {
525 es = 4;
526 }
527#endif
528 else {
529 es = sizeof(Py_ssize_t);
530 }
531
532 if (size == PyDict_MINSIZE && numfreekeys > 0) {
533 dk = keys_free_list[--numfreekeys];
534 }
535 else {
Victor Stinner98ee9d52016-09-08 09:33:56 -0700536 dk = PyObject_MALLOC(sizeof(PyDictKeysObject)
537 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
538 + es * size
539 + sizeof(PyDictKeyEntry) * usable);
Victor Stinner742da042016-09-07 17:40:12 -0700540 if (dk == NULL) {
541 PyErr_NoMemory();
542 return NULL;
543 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400544 }
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200545 DK_DEBUG_INCREF dk->dk_refcnt = 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400546 dk->dk_size = size;
Victor Stinner742da042016-09-07 17:40:12 -0700547 dk->dk_usable = usable;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400548 dk->dk_lookup = lookdict_unicode_nodummy;
Victor Stinner742da042016-09-07 17:40:12 -0700549 dk->dk_nentries = 0;
Benjamin Peterson186122e2016-09-08 12:20:12 -0700550 memset(&dk->dk_indices.as_1[0], 0xff, es * size);
Victor Stinner742da042016-09-07 17:40:12 -0700551 memset(DK_ENTRIES(dk), 0, sizeof(PyDictKeyEntry) * usable);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400552 return dk;
553}
554
555static void
556free_keys_object(PyDictKeysObject *keys)
557{
Victor Stinner742da042016-09-07 17:40:12 -0700558 PyDictKeyEntry *entries = DK_ENTRIES(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400559 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -0700560 for (i = 0, n = keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400561 Py_XDECREF(entries[i].me_key);
562 Py_XDECREF(entries[i].me_value);
563 }
Victor Stinner742da042016-09-07 17:40:12 -0700564 if (keys->dk_size == PyDict_MINSIZE && numfreekeys < PyDict_MAXFREELIST) {
565 keys_free_list[numfreekeys++] = keys;
566 return;
567 }
Raymond Hettingerce5179f2016-01-31 08:56:21 -0800568 PyObject_FREE(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400569}
570
571#define new_values(size) PyMem_NEW(PyObject *, size)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400572#define free_values(values) PyMem_FREE(values)
573
574/* Consumes a reference to the keys object */
575static PyObject *
576new_dict(PyDictKeysObject *keys, PyObject **values)
577{
578 PyDictObject *mp;
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200579 assert(keys != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 if (numfree) {
581 mp = free_list[--numfree];
582 assert (mp != NULL);
583 assert (Py_TYPE(mp) == &PyDict_Type);
584 _Py_NewReference((PyObject *)mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400586 else {
587 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
588 if (mp == NULL) {
589 DK_DECREF(keys);
590 free_values(values);
591 return NULL;
592 }
593 }
594 mp->ma_keys = keys;
595 mp->ma_values = values;
596 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -0700597 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +0200598 assert(_PyDict_CheckConsistency(mp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000600}
601
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400602/* Consumes a reference to the keys object */
603static PyObject *
604new_dict_with_shared_keys(PyDictKeysObject *keys)
605{
606 PyObject **values;
607 Py_ssize_t i, size;
608
Victor Stinner742da042016-09-07 17:40:12 -0700609 size = USABLE_FRACTION(DK_SIZE(keys));
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400610 values = new_values(size);
611 if (values == NULL) {
612 DK_DECREF(keys);
613 return PyErr_NoMemory();
614 }
615 for (i = 0; i < size; i++) {
616 values[i] = NULL;
617 }
618 return new_dict(keys, values);
619}
620
621PyObject *
622PyDict_New(void)
623{
Victor Stinner742da042016-09-07 17:40:12 -0700624 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200625 if (keys == NULL)
626 return NULL;
627 return new_dict(keys, NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400628}
629
Victor Stinner742da042016-09-07 17:40:12 -0700630/* Search index of hash table from offset of entry table */
631static Py_ssize_t
632lookdict_index(PyDictKeysObject *k, Py_hash_t hash, Py_ssize_t index)
633{
INADA Naoki267941c2016-10-06 15:19:07 +0900634 size_t i;
Victor Stinner742da042016-09-07 17:40:12 -0700635 size_t mask = DK_MASK(k);
636 Py_ssize_t ix;
637
638 i = (size_t)hash & mask;
639 ix = dk_get_index(k, i);
640 if (ix == index) {
641 return i;
642 }
643 if (ix == DKIX_EMPTY) {
644 return DKIX_EMPTY;
645 }
646
INADA Naoki267941c2016-10-06 15:19:07 +0900647 for (size_t perturb = hash;;) {
648 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700649 i = mask & ((i << 2) + i + perturb + 1);
650 ix = dk_get_index(k, i);
651 if (ix == index) {
652 return i;
653 }
654 if (ix == DKIX_EMPTY) {
655 return DKIX_EMPTY;
656 }
657 }
658 assert(0); /* NOT REACHED */
659 return DKIX_ERROR;
660}
661
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000662/*
663The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000664This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000665Open addressing is preferred over chaining since the link overhead for
666chaining would be substantial (100% with typical malloc overhead).
667
Tim Peterseb28ef22001-06-02 05:27:19 +0000668The initial probe index is computed as hash mod the table size. Subsequent
669probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000670
671All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000672
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000673The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000674contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000675Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000676
Victor Stinner742da042016-09-07 17:40:12 -0700677lookdict() is general-purpose, and may return DKIX_ERROR if (and only if) a
Victor Stinnera4348cc2016-09-08 12:01:25 -0700678comparison raises an exception.
Guido van Rossum89d8c602007-09-18 17:26:56 +0000679lookdict_unicode() below is specialized to string keys, comparison of which can
Victor Stinner742da042016-09-07 17:40:12 -0700680never raise an exception; that function can never return DKIX_ERROR.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400681lookdict_unicode_nodummy is further specialized for string keys that cannot be
682the <dummy> value.
Victor Stinner742da042016-09-07 17:40:12 -0700683For both, when the key isn't found a DKIX_EMPTY is returned. hashpos returns
684where the key index should be inserted.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000685*/
Victor Stinnerc7a8f672016-11-15 15:13:40 +0100686static Py_ssize_t _Py_HOT_FUNCTION
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400687lookdict(PyDictObject *mp, PyObject *key,
INADA Naokiba609772016-12-07 20:41:42 +0900688 Py_hash_t hash, PyObject **value_addr, Py_ssize_t *hashpos)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000689{
INADA Naoki267941c2016-10-06 15:19:07 +0900690 size_t i, mask;
Victor Stinner742da042016-09-07 17:40:12 -0700691 Py_ssize_t ix, freeslot;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200692 int cmp;
Victor Stinner742da042016-09-07 17:40:12 -0700693 PyDictKeysObject *dk;
694 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000696
Antoine Pitrou9a234902012-05-13 20:48:01 +0200697top:
Victor Stinner742da042016-09-07 17:40:12 -0700698 dk = mp->ma_keys;
699 mask = DK_MASK(dk);
700 ep0 = DK_ENTRIES(dk);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700702
703 ix = dk_get_index(dk, i);
704 if (ix == DKIX_EMPTY) {
705 if (hashpos != NULL)
706 *hashpos = i;
707 *value_addr = NULL;
708 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400709 }
Victor Stinner742da042016-09-07 17:40:12 -0700710 if (ix == DKIX_DUMMY) {
711 freeslot = i;
712 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 else {
Victor Stinner742da042016-09-07 17:40:12 -0700714 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300715 assert(ep->me_key != NULL);
Victor Stinner742da042016-09-07 17:40:12 -0700716 if (ep->me_key == key) {
INADA Naokiba609772016-12-07 20:41:42 +0900717 *value_addr = ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700718 if (hashpos != NULL)
719 *hashpos = i;
720 return ix;
721 }
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300722 if (ep->me_hash == hash) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 startkey = ep->me_key;
724 Py_INCREF(startkey);
725 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
726 Py_DECREF(startkey);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200727 if (cmp < 0) {
728 *value_addr = NULL;
Victor Stinner742da042016-09-07 17:40:12 -0700729 return DKIX_ERROR;
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200730 }
Victor Stinner742da042016-09-07 17:40:12 -0700731 if (dk == mp->ma_keys && ep->me_key == startkey) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400732 if (cmp > 0) {
INADA Naokiba609772016-12-07 20:41:42 +0900733 *value_addr = ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700734 if (hashpos != NULL)
735 *hashpos = i;
736 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400737 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 }
739 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200740 /* The dict was mutated, restart */
741 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 }
743 }
Victor Stinner742da042016-09-07 17:40:12 -0700744 freeslot = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 }
Tim Peters15d49292001-05-27 07:39:22 +0000746
INADA Naoki267941c2016-10-06 15:19:07 +0900747 for (size_t perturb = hash;;) {
748 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700749 i = ((i << 2) + i + perturb + 1) & mask;
750 ix = dk_get_index(dk, i);
751 if (ix == DKIX_EMPTY) {
752 if (hashpos != NULL) {
753 *hashpos = (freeslot == -1) ? (Py_ssize_t)i : freeslot;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400754 }
Victor Stinner742da042016-09-07 17:40:12 -0700755 *value_addr = NULL;
756 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400757 }
Victor Stinner742da042016-09-07 17:40:12 -0700758 if (ix == DKIX_DUMMY) {
759 if (freeslot == -1)
760 freeslot = i;
761 continue;
762 }
763 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300764 assert(ep->me_key != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400765 if (ep->me_key == key) {
Victor Stinner742da042016-09-07 17:40:12 -0700766 if (hashpos != NULL) {
767 *hashpos = i;
768 }
INADA Naokiba609772016-12-07 20:41:42 +0900769 *value_addr = ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700770 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400771 }
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300772 if (ep->me_hash == hash) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 startkey = ep->me_key;
774 Py_INCREF(startkey);
775 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
776 Py_DECREF(startkey);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400777 if (cmp < 0) {
778 *value_addr = NULL;
Victor Stinner742da042016-09-07 17:40:12 -0700779 return DKIX_ERROR;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400780 }
Victor Stinner742da042016-09-07 17:40:12 -0700781 if (dk == mp->ma_keys && ep->me_key == startkey) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400782 if (cmp > 0) {
Victor Stinner742da042016-09-07 17:40:12 -0700783 if (hashpos != NULL) {
784 *hashpos = i;
785 }
INADA Naokiba609772016-12-07 20:41:42 +0900786 *value_addr = ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700787 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400788 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 }
790 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200791 /* The dict was mutated, restart */
792 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 }
794 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 }
796 assert(0); /* NOT REACHED */
797 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000798}
799
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400800/* Specialized version for string-only keys */
Victor Stinnerc7a8f672016-11-15 15:13:40 +0100801static Py_ssize_t _Py_HOT_FUNCTION
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400802lookdict_unicode(PyDictObject *mp, PyObject *key,
INADA Naokiba609772016-12-07 20:41:42 +0900803 Py_hash_t hash, PyObject **value_addr, Py_ssize_t *hashpos)
Fred Drake1bff34a2000-08-31 19:31:38 +0000804{
INADA Naoki267941c2016-10-06 15:19:07 +0900805 size_t i;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200806 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700807 Py_ssize_t ix, freeslot;
808 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Fred Drake1bff34a2000-08-31 19:31:38 +0000809
Victor Stinner742da042016-09-07 17:40:12 -0700810 assert(mp->ma_values == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 /* Make sure this function doesn't have to handle non-unicode keys,
812 including subclasses of str; e.g., one reason to subclass
813 unicodes is to override __eq__, and for speed we don't cater to
814 that here. */
815 if (!PyUnicode_CheckExact(key)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400816 mp->ma_keys->dk_lookup = lookdict;
Victor Stinner742da042016-09-07 17:40:12 -0700817 return lookdict(mp, key, hash, value_addr, hashpos);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100819 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700820 ix = dk_get_index(mp->ma_keys, i);
821 if (ix == DKIX_EMPTY) {
822 if (hashpos != NULL)
823 *hashpos = i;
824 *value_addr = NULL;
825 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400826 }
Victor Stinner742da042016-09-07 17:40:12 -0700827 if (ix == DKIX_DUMMY) {
828 freeslot = i;
829 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 else {
Victor Stinner742da042016-09-07 17:40:12 -0700831 ep = &ep0[ix];
Victor Stinner742da042016-09-07 17:40:12 -0700832 assert(ep->me_key != NULL);
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300833 if (ep->me_key == key
834 || (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700835 if (hashpos != NULL)
836 *hashpos = i;
INADA Naokiba609772016-12-07 20:41:42 +0900837 *value_addr = ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700838 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400839 }
Victor Stinner742da042016-09-07 17:40:12 -0700840 freeslot = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 }
Tim Peters15d49292001-05-27 07:39:22 +0000842
INADA Naoki267941c2016-10-06 15:19:07 +0900843 for (size_t perturb = hash;;) {
844 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700845 i = mask & ((i << 2) + i + perturb + 1);
846 ix = dk_get_index(mp->ma_keys, i);
847 if (ix == DKIX_EMPTY) {
848 if (hashpos != NULL) {
849 *hashpos = (freeslot == -1) ? (Py_ssize_t)i : freeslot;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400850 }
Victor Stinner742da042016-09-07 17:40:12 -0700851 *value_addr = NULL;
852 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400853 }
Victor Stinner742da042016-09-07 17:40:12 -0700854 if (ix == DKIX_DUMMY) {
855 if (freeslot == -1)
856 freeslot = i;
857 continue;
858 }
859 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300860 assert(ep->me_key != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 if (ep->me_key == key
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300862 || (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
INADA Naokiba609772016-12-07 20:41:42 +0900863 *value_addr = ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700864 if (hashpos != NULL) {
865 *hashpos = i;
866 }
867 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400868 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 }
870 assert(0); /* NOT REACHED */
871 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000872}
873
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400874/* Faster version of lookdict_unicode when it is known that no <dummy> keys
875 * will be present. */
Victor Stinnerc7a8f672016-11-15 15:13:40 +0100876static Py_ssize_t _Py_HOT_FUNCTION
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400877lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
INADA Naokiba609772016-12-07 20:41:42 +0900878 Py_hash_t hash, PyObject **value_addr,
Victor Stinner742da042016-09-07 17:40:12 -0700879 Py_ssize_t *hashpos)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400880{
INADA Naoki267941c2016-10-06 15:19:07 +0900881 size_t i;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200882 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700883 Py_ssize_t ix;
884 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400885
Victor Stinner742da042016-09-07 17:40:12 -0700886 assert(mp->ma_values == NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400887 /* Make sure this function doesn't have to handle non-unicode keys,
888 including subclasses of str; e.g., one reason to subclass
889 unicodes is to override __eq__, and for speed we don't cater to
890 that here. */
891 if (!PyUnicode_CheckExact(key)) {
892 mp->ma_keys->dk_lookup = lookdict;
Victor Stinner742da042016-09-07 17:40:12 -0700893 return lookdict(mp, key, hash, value_addr, hashpos);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400894 }
895 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700896 ix = dk_get_index(mp->ma_keys, i);
897 assert (ix != DKIX_DUMMY);
898 if (ix == DKIX_EMPTY) {
899 if (hashpos != NULL)
900 *hashpos = i;
901 *value_addr = NULL;
902 return DKIX_EMPTY;
903 }
904 ep = &ep0[ix];
Victor Stinnerdee6e252016-09-08 11:16:07 -0700905 assert(ep->me_key != NULL);
906 assert(PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700907 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400908 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700909 if (hashpos != NULL)
910 *hashpos = i;
INADA Naokiba609772016-12-07 20:41:42 +0900911 *value_addr = ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700912 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400913 }
INADA Naoki267941c2016-10-06 15:19:07 +0900914 for (size_t perturb = hash;;) {
915 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700916 i = mask & ((i << 2) + i + perturb + 1);
917 ix = dk_get_index(mp->ma_keys, i);
918 assert (ix != DKIX_DUMMY);
919 if (ix == DKIX_EMPTY) {
920 if (hashpos != NULL)
921 *hashpos = i;
922 *value_addr = NULL;
923 return DKIX_EMPTY;
924 }
925 ep = &ep0[ix];
926 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
927 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400928 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700929 if (hashpos != NULL)
930 *hashpos = i;
INADA Naokiba609772016-12-07 20:41:42 +0900931 *value_addr = ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700932 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400933 }
934 }
935 assert(0); /* NOT REACHED */
936 return 0;
937}
938
939/* Version of lookdict for split tables.
940 * All split tables and only split tables use this lookup function.
941 * Split tables only contain unicode keys and no dummy keys,
942 * so algorithm is the same as lookdict_unicode_nodummy.
943 */
Victor Stinnerc7a8f672016-11-15 15:13:40 +0100944static Py_ssize_t _Py_HOT_FUNCTION
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400945lookdict_split(PyDictObject *mp, PyObject *key,
INADA Naokiba609772016-12-07 20:41:42 +0900946 Py_hash_t hash, PyObject **value_addr, Py_ssize_t *hashpos)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400947{
INADA Naoki267941c2016-10-06 15:19:07 +0900948 size_t i;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200949 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700950 Py_ssize_t ix;
951 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400952
Victor Stinner742da042016-09-07 17:40:12 -0700953 /* mp must split table */
954 assert(mp->ma_values != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400955 if (!PyUnicode_CheckExact(key)) {
Victor Stinner742da042016-09-07 17:40:12 -0700956 ix = lookdict(mp, key, hash, value_addr, hashpos);
957 if (ix >= 0) {
INADA Naokiba609772016-12-07 20:41:42 +0900958 *value_addr = mp->ma_values[ix];
Victor Stinner742da042016-09-07 17:40:12 -0700959 }
960 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400961 }
Victor Stinner742da042016-09-07 17:40:12 -0700962
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400963 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700964 ix = dk_get_index(mp->ma_keys, i);
965 if (ix == DKIX_EMPTY) {
966 if (hashpos != NULL)
967 *hashpos = i;
968 *value_addr = NULL;
969 return DKIX_EMPTY;
970 }
971 assert(ix >= 0);
972 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300973 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700974 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400975 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700976 if (hashpos != NULL)
977 *hashpos = i;
INADA Naokiba609772016-12-07 20:41:42 +0900978 *value_addr = mp->ma_values[ix];
Victor Stinner742da042016-09-07 17:40:12 -0700979 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400980 }
INADA Naoki267941c2016-10-06 15:19:07 +0900981 for (size_t perturb = hash;;) {
982 perturb >>= PERTURB_SHIFT;
Victor Stinner742da042016-09-07 17:40:12 -0700983 i = mask & ((i << 2) + i + perturb + 1);
984 ix = dk_get_index(mp->ma_keys, i);
985 if (ix == DKIX_EMPTY) {
986 if (hashpos != NULL)
987 *hashpos = i;
988 *value_addr = NULL;
989 return DKIX_EMPTY;
990 }
991 assert(ix >= 0);
992 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300993 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700994 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400995 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700996 if (hashpos != NULL)
997 *hashpos = i;
INADA Naokiba609772016-12-07 20:41:42 +0900998 *value_addr = mp->ma_values[ix];
Victor Stinner742da042016-09-07 17:40:12 -0700999 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001000 }
1001 }
1002 assert(0); /* NOT REACHED */
1003 return 0;
1004}
1005
Benjamin Petersonfb886362010-04-24 18:21:17 +00001006int
1007_PyDict_HasOnlyStringKeys(PyObject *dict)
1008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 Py_ssize_t pos = 0;
1010 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +00001011 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 /* Shortcut */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001013 if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 return 1;
1015 while (PyDict_Next(dict, &pos, &key, &value))
1016 if (!PyUnicode_Check(key))
1017 return 0;
1018 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +00001019}
1020
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001021#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 do { \
1023 if (!_PyObject_GC_IS_TRACKED(mp)) { \
1024 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
1025 _PyObject_GC_MAY_BE_TRACKED(value)) { \
1026 _PyObject_GC_TRACK(mp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 } \
1028 } \
1029 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001030
1031void
1032_PyDict_MaybeUntrack(PyObject *op)
1033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 PyDictObject *mp;
1035 PyObject *value;
Victor Stinner742da042016-09-07 17:40:12 -07001036 Py_ssize_t i, numentries;
1037 PyDictKeyEntry *ep0;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
1040 return;
1041
1042 mp = (PyDictObject *) op;
Victor Stinner742da042016-09-07 17:40:12 -07001043 ep0 = DK_ENTRIES(mp->ma_keys);
1044 numentries = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001045 if (_PyDict_HasSplitTable(mp)) {
Victor Stinner742da042016-09-07 17:40:12 -07001046 for (i = 0; i < numentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001047 if ((value = mp->ma_values[i]) == NULL)
1048 continue;
1049 if (_PyObject_GC_MAY_BE_TRACKED(value)) {
Victor Stinner742da042016-09-07 17:40:12 -07001050 assert(!_PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001051 return;
1052 }
1053 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001055 else {
Victor Stinner742da042016-09-07 17:40:12 -07001056 for (i = 0; i < numentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001057 if ((value = ep0[i].me_value) == NULL)
1058 continue;
1059 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
1060 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
1061 return;
1062 }
1063 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001065}
1066
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001067/* Internal function to find slot for an item from its hash
Victor Stinner3c336c52016-09-12 14:17:40 +02001068 when it is known that the key is not present in the dict.
1069
1070 The dict must be combined. */
INADA Naokiba609772016-12-07 20:41:42 +09001071static Py_ssize_t
1072find_empty_slot(PyDictKeysObject *keys, PyObject *key, Py_hash_t hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001073{
INADA Naoki267941c2016-10-06 15:19:07 +09001074 size_t i;
INADA Naokiba609772016-12-07 20:41:42 +09001075 size_t mask = DK_MASK(keys);
Victor Stinner742da042016-09-07 17:40:12 -07001076 Py_ssize_t ix;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001077
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001078 assert(key != NULL);
Victor Stinner3c336c52016-09-12 14:17:40 +02001079
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001080 i = hash & mask;
INADA Naokiba609772016-12-07 20:41:42 +09001081 ix = dk_get_index(keys, i);
INADA Naoki267941c2016-10-06 15:19:07 +09001082 for (size_t perturb = hash; ix != DKIX_EMPTY;) {
1083 perturb >>= PERTURB_SHIFT;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001084 i = (i << 2) + i + perturb + 1;
INADA Naokiba609772016-12-07 20:41:42 +09001085 ix = dk_get_index(keys, i & mask);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 }
INADA Naokiba609772016-12-07 20:41:42 +09001087 assert(DK_ENTRIES(keys)[keys->dk_nentries].me_value == NULL);
1088 return i & mask;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001089}
1090
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001091static int
1092insertion_resize(PyDictObject *mp)
1093{
Raymond Hettinger36f74aa2013-05-17 03:01:13 -07001094 return dictresize(mp, GROWTH_RATE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001095}
Antoine Pitroue965d972012-02-27 00:45:12 +01001096
1097/*
1098Internal routine to insert a new item into the table.
1099Used both by the internal resize routine and by the public insert routine.
Antoine Pitroue965d972012-02-27 00:45:12 +01001100Returns -1 if an error occurred, or 0 on success.
1101*/
1102static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001103insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001104{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001105 PyObject *old_value;
INADA Naokiba609772016-12-07 20:41:42 +09001106 PyDictKeyEntry *ep;
Victor Stinner742da042016-09-07 17:40:12 -07001107 Py_ssize_t hashpos, ix;
Antoine Pitroue965d972012-02-27 00:45:12 +01001108
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001109 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
1110 if (insertion_resize(mp) < 0)
1111 return -1;
1112 }
1113
INADA Naokiba609772016-12-07 20:41:42 +09001114 ix = mp->ma_keys->dk_lookup(mp, key, hash, &old_value, &hashpos);
Victor Stinner742da042016-09-07 17:40:12 -07001115 if (ix == DKIX_ERROR) {
Antoine Pitroue965d972012-02-27 00:45:12 +01001116 return -1;
1117 }
Victor Stinner742da042016-09-07 17:40:12 -07001118
Antoine Pitroud6967322014-10-18 00:35:00 +02001119 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
Benjamin Petersona6f195e2012-04-30 10:23:40 -04001120 Py_INCREF(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001121 MAINTAIN_TRACKING(mp, key, value);
Victor Stinner742da042016-09-07 17:40:12 -07001122
1123 /* When insertion order is different from shared key, we can't share
1124 * the key anymore. Convert this instance to combine table.
1125 */
1126 if (_PyDict_HasSplitTable(mp) &&
INADA Naokiba609772016-12-07 20:41:42 +09001127 ((ix >= 0 && old_value == NULL && mp->ma_used != ix) ||
Victor Stinner742da042016-09-07 17:40:12 -07001128 (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {
1129 if (insertion_resize(mp) < 0) {
1130 Py_DECREF(value);
1131 return -1;
1132 }
INADA Naokiba609772016-12-07 20:41:42 +09001133 hashpos = find_empty_slot(mp->ma_keys, key, hash);
Victor Stinner742da042016-09-07 17:40:12 -07001134 ix = DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001135 }
Victor Stinner742da042016-09-07 17:40:12 -07001136
1137 if (ix == DKIX_EMPTY) {
1138 /* Insert into new slot. */
INADA Naokiba609772016-12-07 20:41:42 +09001139 assert(old_value == NULL);
Victor Stinner742da042016-09-07 17:40:12 -07001140 if (mp->ma_keys->dk_usable <= 0) {
1141 /* Need to resize. */
1142 if (insertion_resize(mp) < 0) {
1143 Py_DECREF(value);
1144 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001145 }
INADA Naokiba609772016-12-07 20:41:42 +09001146 hashpos = find_empty_slot(mp->ma_keys, key, hash);
Victor Stinner742da042016-09-07 17:40:12 -07001147 }
INADA Naokiba609772016-12-07 20:41:42 +09001148 ep = &DK_ENTRIES(mp->ma_keys)[mp->ma_keys->dk_nentries];
Victor Stinner742da042016-09-07 17:40:12 -07001149 dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
1150 Py_INCREF(key);
1151 ep->me_key = key;
1152 ep->me_hash = hash;
1153 if (mp->ma_values) {
1154 assert (mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
1155 mp->ma_values[mp->ma_keys->dk_nentries] = value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001156 }
1157 else {
Victor Stinner742da042016-09-07 17:40:12 -07001158 ep->me_value = value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001159 }
1160 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001161 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07001162 mp->ma_keys->dk_usable--;
1163 mp->ma_keys->dk_nentries++;
1164 assert(mp->ma_keys->dk_usable >= 0);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001165 assert(_PyDict_CheckConsistency(mp));
Victor Stinner742da042016-09-07 17:40:12 -07001166 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001167 }
Victor Stinner742da042016-09-07 17:40:12 -07001168
INADA Naokiba609772016-12-07 20:41:42 +09001169 if (_PyDict_HasSplitTable(mp)) {
1170 mp->ma_values[ix] = value;
1171 if (old_value == NULL) {
1172 /* pending state */
1173 assert(ix == mp->ma_used);
1174 mp->ma_used++;
1175 }
1176 }
1177 else {
1178 assert(old_value != NULL);
1179 DK_ENTRIES(mp->ma_keys)[ix].me_value = value;
Victor Stinner742da042016-09-07 17:40:12 -07001180 }
1181
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001182 mp->ma_version_tag = DICT_NEXT_VERSION();
INADA Naokiba609772016-12-07 20:41:42 +09001183 Py_XDECREF(old_value); /* which **CAN** re-enter (see issue #22653) */
Victor Stinner611b0fa2016-09-14 15:02:01 +02001184 assert(_PyDict_CheckConsistency(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001185 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +01001186}
1187
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001188/*
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001189Internal routine used by dictresize() to buid a hashtable of entries.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001190*/
1191static void
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001192build_indices(PyDictKeysObject *keys, PyDictKeyEntry *ep, Py_ssize_t n)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001193{
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001194 size_t mask = (size_t)DK_SIZE(keys) - 1;
1195 for (Py_ssize_t ix = 0; ix != n; ix++, ep++) {
1196 Py_hash_t hash = ep->me_hash;
1197 size_t i = hash & mask;
1198 for (size_t perturb = hash; dk_get_index(keys, i) != DKIX_EMPTY;) {
1199 perturb >>= PERTURB_SHIFT;
1200 i = mask & ((i << 2) + i + perturb + 1);
1201 }
1202 dk_set_index(keys, i, ix);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001204}
1205
1206/*
1207Restructure the table by allocating a new table and reinserting all
1208items again. When entries have been deleted, the new table may
1209actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001210If a table is split (its keys and hashes are shared, its values are not),
1211then the values are temporarily copied into the table, it is resized as
1212a combined table, then the me_value slots in the old table are NULLed out.
1213After resizing a table is always combined,
1214but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001215*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001216static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001217dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001218{
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001219 Py_ssize_t newsize, numentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001220 PyDictKeysObject *oldkeys;
1221 PyObject **oldvalues;
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001222 PyDictKeyEntry *oldentries, *newentries;
Tim Peters91a364d2001-05-19 07:04:38 +00001223
Victor Stinner742da042016-09-07 17:40:12 -07001224 /* Find the smallest table size > minused. */
1225 for (newsize = PyDict_MINSIZE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 newsize <= minused && newsize > 0;
1227 newsize <<= 1)
1228 ;
1229 if (newsize <= 0) {
1230 PyErr_NoMemory();
1231 return -1;
1232 }
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001233
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001234 oldkeys = mp->ma_keys;
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001235
1236 /* NOTE: Current odict checks mp->ma_keys to detect resize happen.
1237 * So we can't reuse oldkeys even if oldkeys->dk_size == newsize.
1238 * TODO: Try reusing oldkeys when reimplement odict.
1239 */
1240
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001241 /* Allocate a new table. */
1242 mp->ma_keys = new_keys_object(newsize);
1243 if (mp->ma_keys == NULL) {
1244 mp->ma_keys = oldkeys;
1245 return -1;
1246 }
1247 if (oldkeys->dk_lookup == lookdict)
1248 mp->ma_keys->dk_lookup = lookdict;
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001249
1250 numentries = mp->ma_used;
1251 oldentries = DK_ENTRIES(oldkeys);
1252 newentries = DK_ENTRIES(mp->ma_keys);
1253 oldvalues = mp->ma_values;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001254 if (oldvalues != NULL) {
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001255 /* Convert split table into new combined table.
1256 * We must incref keys; we can transfer values.
1257 * Note that values of split table is always dense.
1258 */
1259 for (Py_ssize_t i = 0; i < numentries; i++) {
1260 assert(oldvalues[i] != NULL);
1261 PyDictKeyEntry *ep = &oldentries[i];
1262 PyObject *key = ep->me_key;
1263 Py_INCREF(key);
1264 newentries[i].me_key = key;
1265 newentries[i].me_hash = ep->me_hash;
1266 newentries[i].me_value = oldvalues[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 }
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001268
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001269 DK_DECREF(oldkeys);
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001270 mp->ma_values = NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001271 if (oldvalues != empty_values) {
1272 free_values(oldvalues);
1273 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001274 }
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001275 else { // combined table.
1276 if (oldkeys->dk_nentries == numentries) {
1277 memcpy(newentries, oldentries, numentries * sizeof(PyDictKeyEntry));
1278 }
1279 else {
1280 PyDictKeyEntry *ep = oldentries;
1281 for (Py_ssize_t i = 0; i < numentries; i++) {
1282 while (ep->me_value == NULL)
1283 ep++;
1284 newentries[i] = *ep++;
1285 }
1286 }
1287
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001288 assert(oldkeys->dk_lookup != lookdict_split);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001289 assert(oldkeys->dk_refcnt == 1);
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001290 if (oldkeys->dk_size == PyDict_MINSIZE &&
1291 numfreekeys < PyDict_MAXFREELIST) {
1292 DK_DEBUG_DECREF keys_free_list[numfreekeys++] = oldkeys;
1293 }
1294 else {
1295 DK_DEBUG_DECREF PyObject_FREE(oldkeys);
1296 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001297 }
Serhiy Storchakae26e20d2016-10-29 10:50:00 +03001298
1299 build_indices(mp->ma_keys, newentries, numentries);
1300 mp->ma_keys->dk_usable -= numentries;
1301 mp->ma_keys->dk_nentries = numentries;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001303}
1304
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001305/* Returns NULL if unable to split table.
1306 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001307static PyDictKeysObject *
1308make_keys_shared(PyObject *op)
1309{
1310 Py_ssize_t i;
1311 Py_ssize_t size;
1312 PyDictObject *mp = (PyDictObject *)op;
1313
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001314 if (!PyDict_CheckExact(op))
1315 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001316 if (!_PyDict_HasSplitTable(mp)) {
1317 PyDictKeyEntry *ep0;
1318 PyObject **values;
1319 assert(mp->ma_keys->dk_refcnt == 1);
1320 if (mp->ma_keys->dk_lookup == lookdict) {
1321 return NULL;
1322 }
1323 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
1324 /* Remove dummy keys */
1325 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
1326 return NULL;
1327 }
1328 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
1329 /* Copy values into a new array */
Victor Stinner742da042016-09-07 17:40:12 -07001330 ep0 = DK_ENTRIES(mp->ma_keys);
1331 size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001332 values = new_values(size);
1333 if (values == NULL) {
1334 PyErr_SetString(PyExc_MemoryError,
1335 "Not enough memory to allocate new values array");
1336 return NULL;
1337 }
1338 for (i = 0; i < size; i++) {
1339 values[i] = ep0[i].me_value;
1340 ep0[i].me_value = NULL;
1341 }
1342 mp->ma_keys->dk_lookup = lookdict_split;
1343 mp->ma_values = values;
1344 }
1345 DK_INCREF(mp->ma_keys);
1346 return mp->ma_keys;
1347}
Christian Heimes99170a52007-12-19 02:07:34 +00001348
1349PyObject *
1350_PyDict_NewPresized(Py_ssize_t minused)
1351{
INADA Naoki92c50ee2016-11-22 00:57:02 +09001352 const Py_ssize_t max_presize = 128 * 1024;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001353 Py_ssize_t newsize;
1354 PyDictKeysObject *new_keys;
INADA Naoki92c50ee2016-11-22 00:57:02 +09001355
1356 /* There are no strict guarantee that returned dict can contain minused
1357 * items without resize. So we create medium size dict instead of very
1358 * large dict or MemoryError.
1359 */
1360 if (minused > USABLE_FRACTION(max_presize)) {
1361 newsize = max_presize;
1362 }
1363 else {
1364 Py_ssize_t minsize = ESTIMATE_SIZE(minused);
1365 newsize = PyDict_MINSIZE;
1366 while (newsize < minsize) {
1367 newsize <<= 1;
1368 }
1369 }
1370 assert(IS_POWER_OF_2(newsize));
1371
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001372 new_keys = new_keys_object(newsize);
1373 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001375 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001376}
1377
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001378/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1379 * that may occur (originally dicts supported only string keys, and exceptions
1380 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001381 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001382 * (suppressed) occurred while computing the key's hash, or that some error
1383 * (suppressed) occurred when comparing keys in the dict's internal probe
1384 * sequence. A nasty example of the latter is when a Python-coded comparison
1385 * function hits a stack-depth error, which can cause this to return NULL
1386 * even if the key is present.
1387 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001388PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001389PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001390{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001391 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001392 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 PyDictObject *mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 PyThreadState *tstate;
INADA Naokiba609772016-12-07 20:41:42 +09001395 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 if (!PyDict_Check(op))
1398 return NULL;
1399 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001400 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 {
1402 hash = PyObject_Hash(key);
1403 if (hash == -1) {
1404 PyErr_Clear();
1405 return NULL;
1406 }
1407 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 /* We can arrive here with a NULL tstate during initialization: try
1410 running "python -Wi" for an example related to string interning.
1411 Let's just hope that no exception occurs then... This must be
1412 _PyThreadState_Current and not PyThreadState_GET() because in debug
1413 mode, the latter complains if tstate is NULL. */
Victor Stinner0cae6092016-11-11 01:43:56 +01001414 tstate = PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 if (tstate != NULL && tstate->curexc_type != NULL) {
1416 /* preserve the existing exception */
1417 PyObject *err_type, *err_value, *err_tb;
1418 PyErr_Fetch(&err_type, &err_value, &err_tb);
INADA Naokiba609772016-12-07 20:41:42 +09001419 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 /* ignore errors */
1421 PyErr_Restore(err_type, err_value, err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001422 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 return NULL;
1424 }
1425 else {
INADA Naokiba609772016-12-07 20:41:42 +09001426 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value, NULL);
Victor Stinner742da042016-09-07 17:40:12 -07001427 if (ix < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 PyErr_Clear();
1429 return NULL;
1430 }
1431 }
INADA Naokiba609772016-12-07 20:41:42 +09001432 return value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001433}
1434
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001435/* Same as PyDict_GetItemWithError() but with hash supplied by caller.
1436 This returns NULL *with* an exception set if an exception occurred.
1437 It returns NULL *without* an exception set if the key wasn't present.
1438*/
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001439PyObject *
1440_PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1441{
Victor Stinner742da042016-09-07 17:40:12 -07001442 Py_ssize_t ix;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001443 PyDictObject *mp = (PyDictObject *)op;
INADA Naokiba609772016-12-07 20:41:42 +09001444 PyObject *value;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001445
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001446 if (!PyDict_Check(op)) {
1447 PyErr_BadInternalCall();
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001448 return NULL;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001449 }
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001450
INADA Naokiba609772016-12-07 20:41:42 +09001451 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value, NULL);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02001452 if (ix < 0) {
1453 return NULL;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001454 }
INADA Naokiba609772016-12-07 20:41:42 +09001455 return value;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001456}
1457
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001458/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1459 This returns NULL *with* an exception set if an exception occurred.
1460 It returns NULL *without* an exception set if the key wasn't present.
1461*/
1462PyObject *
1463PyDict_GetItemWithError(PyObject *op, PyObject *key)
1464{
Victor Stinner742da042016-09-07 17:40:12 -07001465 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001466 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 PyDictObject*mp = (PyDictObject *)op;
INADA Naokiba609772016-12-07 20:41:42 +09001468 PyObject *value;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 if (!PyDict_Check(op)) {
1471 PyErr_BadInternalCall();
1472 return NULL;
1473 }
1474 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001475 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 {
1477 hash = PyObject_Hash(key);
1478 if (hash == -1) {
1479 return NULL;
1480 }
1481 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001482
INADA Naokiba609772016-12-07 20:41:42 +09001483 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value, NULL);
Victor Stinner742da042016-09-07 17:40:12 -07001484 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 return NULL;
INADA Naokiba609772016-12-07 20:41:42 +09001486 return value;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001487}
1488
Brett Cannonfd074152012-04-14 14:10:13 -04001489PyObject *
1490_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1491{
1492 PyObject *kv;
1493 kv = _PyUnicode_FromId(key); /* borrowed */
1494 if (kv == NULL)
1495 return NULL;
1496 return PyDict_GetItemWithError(dp, kv);
1497}
1498
Victor Stinnerb4efc962015-11-20 09:24:02 +01001499/* Fast version of global value lookup (LOAD_GLOBAL).
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001500 * Lookup in globals, then builtins.
Victor Stinnerb4efc962015-11-20 09:24:02 +01001501 *
1502 * Raise an exception and return NULL if an error occurred (ex: computing the
1503 * key hash failed, key comparison failed, ...). Return NULL if the key doesn't
1504 * exist. Return the value if the key exists.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001505 */
1506PyObject *
1507_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001508{
Victor Stinner742da042016-09-07 17:40:12 -07001509 Py_ssize_t ix;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001510 Py_hash_t hash;
INADA Naokiba609772016-12-07 20:41:42 +09001511 PyObject *value;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001512
1513 if (!PyUnicode_CheckExact(key) ||
1514 (hash = ((PyASCIIObject *) key)->hash) == -1)
1515 {
1516 hash = PyObject_Hash(key);
1517 if (hash == -1)
1518 return NULL;
Antoine Pitroue965d972012-02-27 00:45:12 +01001519 }
Victor Stinnerb4efc962015-11-20 09:24:02 +01001520
1521 /* namespace 1: globals */
INADA Naokiba609772016-12-07 20:41:42 +09001522 ix = globals->ma_keys->dk_lookup(globals, key, hash, &value, NULL);
Victor Stinner742da042016-09-07 17:40:12 -07001523 if (ix == DKIX_ERROR)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001524 return NULL;
INADA Naokiba609772016-12-07 20:41:42 +09001525 if (ix != DKIX_EMPTY && value != NULL)
1526 return value;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001527
1528 /* namespace 2: builtins */
INADA Naokiba609772016-12-07 20:41:42 +09001529 ix = builtins->ma_keys->dk_lookup(builtins, key, hash, &value, NULL);
Victor Stinner742da042016-09-07 17:40:12 -07001530 if (ix < 0)
Victor Stinnerb4efc962015-11-20 09:24:02 +01001531 return NULL;
INADA Naokiba609772016-12-07 20:41:42 +09001532 return value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001533}
1534
Antoine Pitroue965d972012-02-27 00:45:12 +01001535/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1536 * dictionary if it's merely replacing the value for an existing key.
1537 * This means that it's safe to loop over a dictionary with PyDict_Next()
1538 * and occasionally replace a value -- but you can't insert new keys or
1539 * remove them.
1540 */
1541int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001542PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001543{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001544 PyDictObject *mp;
1545 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001546 if (!PyDict_Check(op)) {
1547 PyErr_BadInternalCall();
1548 return -1;
1549 }
1550 assert(key);
1551 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001552 mp = (PyDictObject *)op;
1553 if (!PyUnicode_CheckExact(key) ||
1554 (hash = ((PyASCIIObject *) key)->hash) == -1)
1555 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001556 hash = PyObject_Hash(key);
1557 if (hash == -1)
1558 return -1;
1559 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001560
1561 /* insertdict() handles any resizing that might be necessary */
1562 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001563}
1564
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001565int
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001566_PyDict_SetItem_KnownHash(PyObject *op, PyObject *key, PyObject *value,
1567 Py_hash_t hash)
1568{
1569 PyDictObject *mp;
1570
1571 if (!PyDict_Check(op)) {
1572 PyErr_BadInternalCall();
1573 return -1;
1574 }
1575 assert(key);
1576 assert(value);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001577 assert(hash != -1);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001578 mp = (PyDictObject *)op;
1579
1580 /* insertdict() handles any resizing that might be necessary */
1581 return insertdict(mp, key, hash, value);
1582}
1583
1584int
Tim Peters1f5871e2000-07-04 17:44:48 +00001585PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001586{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001587 Py_hash_t hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 assert(key);
1590 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001591 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 hash = PyObject_Hash(key);
1593 if (hash == -1)
1594 return -1;
1595 }
Victor Stinner742da042016-09-07 17:40:12 -07001596
1597 return _PyDict_DelItem_KnownHash(op, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001598}
1599
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001600int
1601_PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1602{
Victor Stinner742da042016-09-07 17:40:12 -07001603 Py_ssize_t hashpos, ix;
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001604 PyDictObject *mp;
1605 PyDictKeyEntry *ep;
1606 PyObject *old_key, *old_value;
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001607
1608 if (!PyDict_Check(op)) {
1609 PyErr_BadInternalCall();
1610 return -1;
1611 }
1612 assert(key);
1613 assert(hash != -1);
1614 mp = (PyDictObject *)op;
INADA Naokiba609772016-12-07 20:41:42 +09001615 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &old_value, &hashpos);
Victor Stinner742da042016-09-07 17:40:12 -07001616 if (ix == DKIX_ERROR)
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001617 return -1;
INADA Naokiba609772016-12-07 20:41:42 +09001618 if (ix == DKIX_EMPTY || old_value == NULL) {
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001619 _PyErr_SetKeyError(key);
1620 return -1;
1621 }
Victor Stinner742da042016-09-07 17:40:12 -07001622 assert(dk_get_index(mp->ma_keys, hashpos) == ix);
Victor Stinner78601a32016-09-09 19:28:36 -07001623
1624 // Split table doesn't allow deletion. Combine it.
1625 if (_PyDict_HasSplitTable(mp)) {
1626 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1627 return -1;
1628 }
INADA Naokiba609772016-12-07 20:41:42 +09001629 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &old_value, &hashpos);
Victor Stinner78601a32016-09-09 19:28:36 -07001630 assert(ix >= 0);
1631 }
1632
Victor Stinner78601a32016-09-09 19:28:36 -07001633 assert(old_value != NULL);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001634 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001635 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner78601a32016-09-09 19:28:36 -07001636 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1637 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1638 ENSURE_ALLOWS_DELETIONS(mp);
1639 old_key = ep->me_key;
1640 ep->me_key = NULL;
INADA Naokiba609772016-12-07 20:41:42 +09001641 ep->me_value = NULL;
Victor Stinner78601a32016-09-09 19:28:36 -07001642 Py_DECREF(old_key);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001643 Py_DECREF(old_value);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001644
1645 assert(_PyDict_CheckConsistency(mp));
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001646 return 0;
1647}
1648
Guido van Rossum25831651993-05-19 14:50:45 +00001649void
Tim Peters1f5871e2000-07-04 17:44:48 +00001650PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001653 PyDictKeysObject *oldkeys;
1654 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 if (!PyDict_Check(op))
1658 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001659 mp = ((PyDictObject *)op);
1660 oldkeys = mp->ma_keys;
1661 oldvalues = mp->ma_values;
1662 if (oldvalues == empty_values)
1663 return;
1664 /* Empty the dict... */
1665 DK_INCREF(Py_EMPTY_KEYS);
1666 mp->ma_keys = Py_EMPTY_KEYS;
1667 mp->ma_values = empty_values;
1668 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001669 mp->ma_version_tag = DICT_NEXT_VERSION();
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001670 /* ...then clear the keys and values */
1671 if (oldvalues != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001672 n = oldkeys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001673 for (i = 0; i < n; i++)
1674 Py_CLEAR(oldvalues[i]);
1675 free_values(oldvalues);
1676 DK_DECREF(oldkeys);
1677 }
1678 else {
1679 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001680 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001681 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02001682 assert(_PyDict_CheckConsistency(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001683}
1684
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001685/* Internal version of PyDict_Next that returns a hash value in addition
1686 * to the key and value.
1687 * Return 1 on success, return 0 when the reached the end of the dictionary
1688 * (or if op is not a dictionary)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001689 */
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001690int
1691_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1692 PyObject **pvalue, Py_hash_t *phash)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001693{
INADA Naokica2d8be2016-11-04 16:59:10 +09001694 Py_ssize_t i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001695 PyDictObject *mp;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001696 PyDictKeyEntry *entry_ptr;
1697 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001698
1699 if (!PyDict_Check(op))
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001700 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 mp = (PyDictObject *)op;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001702 i = *ppos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001703 if (mp->ma_values) {
INADA Naokica2d8be2016-11-04 16:59:10 +09001704 if (i < 0 || i >= mp->ma_used)
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001705 return 0;
INADA Naokica2d8be2016-11-04 16:59:10 +09001706 /* values of split table is always dense */
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001707 entry_ptr = &DK_ENTRIES(mp->ma_keys)[i];
INADA Naokica2d8be2016-11-04 16:59:10 +09001708 value = mp->ma_values[i];
1709 assert(value != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001711 else {
INADA Naokica2d8be2016-11-04 16:59:10 +09001712 Py_ssize_t n = mp->ma_keys->dk_nentries;
1713 if (i < 0 || i >= n)
1714 return 0;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001715 entry_ptr = &DK_ENTRIES(mp->ma_keys)[i];
1716 while (i < n && entry_ptr->me_value == NULL) {
1717 entry_ptr++;
1718 i++;
Victor Stinner742da042016-09-07 17:40:12 -07001719 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001720 if (i >= n)
1721 return 0;
1722 value = entry_ptr->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 }
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001724 *ppos = i+1;
1725 if (pkey)
1726 *pkey = entry_ptr->me_key;
1727 if (phash)
1728 *phash = entry_ptr->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001729 if (pvalue)
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001730 *pvalue = value;
1731 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001732}
1733
Tim Peters080c88b2003-02-15 03:01:11 +00001734/*
1735 * Iterate over a dict. Use like so:
1736 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001737 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001738 * PyObject *key, *value;
1739 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001740 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001741 * Refer to borrowed references in key and value.
Tim Peters080c88b2003-02-15 03:01:11 +00001742 * }
1743 *
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001744 * Return 1 on success, return 0 when the reached the end of the dictionary
1745 * (or if op is not a dictionary)
1746 *
Tim Peters080c88b2003-02-15 03:01:11 +00001747 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001748 * mutates the dict. One exception: it is safe if the loop merely changes
1749 * the values associated with the keys (but doesn't insert new keys or
1750 * delete keys), via PyDict_SetItem().
1751 */
Guido van Rossum25831651993-05-19 14:50:45 +00001752int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001753PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001754{
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03001755 return _PyDict_Next(op, ppos, pkey, pvalue, NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00001756}
1757
Eric Snow96c6af92015-05-29 22:21:39 -06001758/* Internal version of dict.pop(). */
1759PyObject *
Yury Selivanov684ef2c2016-10-28 19:01:21 -04001760_PyDict_Pop(PyObject *dict, PyObject *key, PyObject *deflt)
Eric Snow96c6af92015-05-29 22:21:39 -06001761{
1762 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001763 Py_ssize_t ix, hashpos;
Eric Snow96c6af92015-05-29 22:21:39 -06001764 PyObject *old_value, *old_key;
1765 PyDictKeyEntry *ep;
Yury Selivanov684ef2c2016-10-28 19:01:21 -04001766 PyDictObject *mp;
1767
1768 assert(PyDict_Check(dict));
1769 mp = (PyDictObject *)dict;
Eric Snow96c6af92015-05-29 22:21:39 -06001770
1771 if (mp->ma_used == 0) {
1772 if (deflt) {
1773 Py_INCREF(deflt);
1774 return deflt;
1775 }
1776 _PyErr_SetKeyError(key);
1777 return NULL;
1778 }
1779 if (!PyUnicode_CheckExact(key) ||
1780 (hash = ((PyASCIIObject *) key)->hash) == -1) {
1781 hash = PyObject_Hash(key);
1782 if (hash == -1)
1783 return NULL;
1784 }
INADA Naokiba609772016-12-07 20:41:42 +09001785 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &old_value, &hashpos);
Victor Stinner742da042016-09-07 17:40:12 -07001786 if (ix == DKIX_ERROR)
Eric Snow96c6af92015-05-29 22:21:39 -06001787 return NULL;
INADA Naokiba609772016-12-07 20:41:42 +09001788 if (ix == DKIX_EMPTY || old_value == NULL) {
Eric Snow96c6af92015-05-29 22:21:39 -06001789 if (deflt) {
1790 Py_INCREF(deflt);
1791 return deflt;
1792 }
1793 _PyErr_SetKeyError(key);
1794 return NULL;
1795 }
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001796
Victor Stinner78601a32016-09-09 19:28:36 -07001797 // Split table doesn't allow deletion. Combine it.
1798 if (_PyDict_HasSplitTable(mp)) {
1799 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1800 return NULL;
1801 }
INADA Naokiba609772016-12-07 20:41:42 +09001802 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &old_value, &hashpos);
Victor Stinner78601a32016-09-09 19:28:36 -07001803 assert(ix >= 0);
1804 }
1805
Victor Stinner78601a32016-09-09 19:28:36 -07001806 assert(old_value != NULL);
Eric Snow96c6af92015-05-29 22:21:39 -06001807 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001808 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner78601a32016-09-09 19:28:36 -07001809 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1810 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1811 ENSURE_ALLOWS_DELETIONS(mp);
1812 old_key = ep->me_key;
1813 ep->me_key = NULL;
INADA Naokiba609772016-12-07 20:41:42 +09001814 ep->me_value = NULL;
Victor Stinner78601a32016-09-09 19:28:36 -07001815 Py_DECREF(old_key);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001816
1817 assert(_PyDict_CheckConsistency(mp));
Eric Snow96c6af92015-05-29 22:21:39 -06001818 return old_value;
1819}
1820
1821/* Internal version of dict.from_keys(). It is subclass-friendly. */
1822PyObject *
1823_PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
1824{
1825 PyObject *it; /* iter(iterable) */
1826 PyObject *key;
1827 PyObject *d;
1828 int status;
1829
Victor Stinnera5ed5f02016-12-06 18:45:50 +01001830 d = _PyObject_CallNoArg(cls);
Eric Snow96c6af92015-05-29 22:21:39 -06001831 if (d == NULL)
1832 return NULL;
1833
1834 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
1835 if (PyDict_CheckExact(iterable)) {
1836 PyDictObject *mp = (PyDictObject *)d;
1837 PyObject *oldvalue;
1838 Py_ssize_t pos = 0;
1839 PyObject *key;
1840 Py_hash_t hash;
1841
Victor Stinner742da042016-09-07 17:40:12 -07001842 if (dictresize(mp, ESTIMATE_SIZE(Py_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001843 Py_DECREF(d);
1844 return NULL;
1845 }
1846
1847 while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) {
1848 if (insertdict(mp, key, hash, value)) {
1849 Py_DECREF(d);
1850 return NULL;
1851 }
1852 }
1853 return d;
1854 }
1855 if (PyAnySet_CheckExact(iterable)) {
1856 PyDictObject *mp = (PyDictObject *)d;
1857 Py_ssize_t pos = 0;
1858 PyObject *key;
1859 Py_hash_t hash;
1860
Victor Stinner742da042016-09-07 17:40:12 -07001861 if (dictresize(mp, ESTIMATE_SIZE(PySet_GET_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001862 Py_DECREF(d);
1863 return NULL;
1864 }
1865
1866 while (_PySet_NextEntry(iterable, &pos, &key, &hash)) {
1867 if (insertdict(mp, key, hash, value)) {
1868 Py_DECREF(d);
1869 return NULL;
1870 }
1871 }
1872 return d;
1873 }
1874 }
1875
1876 it = PyObject_GetIter(iterable);
1877 if (it == NULL){
1878 Py_DECREF(d);
1879 return NULL;
1880 }
1881
1882 if (PyDict_CheckExact(d)) {
1883 while ((key = PyIter_Next(it)) != NULL) {
1884 status = PyDict_SetItem(d, key, value);
1885 Py_DECREF(key);
1886 if (status < 0)
1887 goto Fail;
1888 }
1889 } else {
1890 while ((key = PyIter_Next(it)) != NULL) {
1891 status = PyObject_SetItem(d, key, value);
1892 Py_DECREF(key);
1893 if (status < 0)
1894 goto Fail;
1895 }
1896 }
1897
1898 if (PyErr_Occurred())
1899 goto Fail;
1900 Py_DECREF(it);
1901 return d;
1902
1903Fail:
1904 Py_DECREF(it);
1905 Py_DECREF(d);
1906 return NULL;
1907}
1908
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001909/* Methods */
1910
1911static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001912dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001913{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001914 PyObject **values = mp->ma_values;
1915 PyDictKeysObject *keys = mp->ma_keys;
1916 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 PyObject_GC_UnTrack(mp);
1918 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001919 if (values != NULL) {
1920 if (values != empty_values) {
Victor Stinner742da042016-09-07 17:40:12 -07001921 for (i = 0, n = mp->ma_keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001922 Py_XDECREF(values[i]);
1923 }
1924 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001926 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02001928 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001929 assert(keys->dk_refcnt == 1);
1930 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001931 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1933 free_list[numfree++] = mp;
1934 else
1935 Py_TYPE(mp)->tp_free((PyObject *)mp);
1936 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001937}
1938
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001939
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001940static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001941dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001942{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001944 PyObject *key = NULL, *value = NULL;
1945 _PyUnicodeWriter writer;
1946 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00001947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 i = Py_ReprEnter((PyObject *)mp);
1949 if (i != 0) {
1950 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1951 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001954 Py_ReprLeave((PyObject *)mp);
1955 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 }
Tim Petersa7259592001-06-16 05:11:17 +00001957
Victor Stinnerf91929b2013-11-19 13:07:38 +01001958 _PyUnicodeWriter_Init(&writer);
1959 writer.overallocate = 1;
1960 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
1961 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00001962
Victor Stinnerf91929b2013-11-19 13:07:38 +01001963 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
1964 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 /* Do repr() on each key+value pair, and insert ": " between them.
1967 Note that repr may mutate the dict. */
1968 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001969 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001970 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001971 PyObject *s;
1972 int res;
1973
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001974 /* Prevent repr from deleting key or value during key format. */
1975 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02001977
Victor Stinnerf91929b2013-11-19 13:07:38 +01001978 if (!first) {
1979 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
1980 goto error;
1981 }
1982 first = 0;
1983
1984 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01001986 goto error;
1987 res = _PyUnicodeWriter_WriteStr(&writer, s);
1988 Py_DECREF(s);
1989 if (res < 0)
1990 goto error;
1991
1992 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
1993 goto error;
1994
1995 s = PyObject_Repr(value);
1996 if (s == NULL)
1997 goto error;
1998 res = _PyUnicodeWriter_WriteStr(&writer, s);
1999 Py_DECREF(s);
2000 if (res < 0)
2001 goto error;
2002
2003 Py_CLEAR(key);
2004 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 }
Tim Petersa7259592001-06-16 05:11:17 +00002006
Victor Stinnerf91929b2013-11-19 13:07:38 +01002007 writer.overallocate = 0;
2008 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
2009 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00002010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01002012
2013 return _PyUnicodeWriter_Finish(&writer);
2014
2015error:
2016 Py_ReprLeave((PyObject *)mp);
2017 _PyUnicodeWriter_Dealloc(&writer);
2018 Py_XDECREF(key);
2019 Py_XDECREF(value);
2020 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002021}
2022
Martin v. Löwis18e16552006-02-15 17:27:45 +00002023static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002024dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002025{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002027}
2028
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002029static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002030dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002031{
Victor Stinner742da042016-09-07 17:40:12 -07002032 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002033 Py_hash_t hash;
INADA Naokiba609772016-12-07 20:41:42 +09002034 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002037 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 hash = PyObject_Hash(key);
2039 if (hash == -1)
2040 return NULL;
2041 }
INADA Naokiba609772016-12-07 20:41:42 +09002042 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value, NULL);
Victor Stinner742da042016-09-07 17:40:12 -07002043 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 return NULL;
INADA Naokiba609772016-12-07 20:41:42 +09002045 if (ix == DKIX_EMPTY || value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 if (!PyDict_CheckExact(mp)) {
2047 /* Look up __missing__ method if we're a subclass. */
2048 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05002049 _Py_IDENTIFIER(__missing__);
2050 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 if (missing != NULL) {
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002052 res = PyObject_CallFunctionObjArgs(missing,
2053 key, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 Py_DECREF(missing);
2055 return res;
2056 }
2057 else if (PyErr_Occurred())
2058 return NULL;
2059 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07002060 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 return NULL;
2062 }
INADA Naokiba609772016-12-07 20:41:42 +09002063 Py_INCREF(value);
2064 return value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002065}
2066
2067static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002068dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 if (w == NULL)
2071 return PyDict_DelItem((PyObject *)mp, v);
2072 else
2073 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002074}
2075
Guido van Rossuma9e7a811997-05-13 21:02:11 +00002076static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 (lenfunc)dict_length, /*mp_length*/
2078 (binaryfunc)dict_subscript, /*mp_subscript*/
2079 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002080};
2081
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002082static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002083dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002084{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002085 PyObject *v;
2086 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002087 PyDictKeyEntry *ep;
2088 Py_ssize_t size, n, offset;
2089 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002090
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002091 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 n = mp->ma_used;
2093 v = PyList_New(n);
2094 if (v == NULL)
2095 return NULL;
2096 if (n != mp->ma_used) {
2097 /* Durnit. The allocations caused the dict to resize.
2098 * Just start over, this shouldn't normally happen.
2099 */
2100 Py_DECREF(v);
2101 goto again;
2102 }
Victor Stinner742da042016-09-07 17:40:12 -07002103 ep = DK_ENTRIES(mp->ma_keys);
2104 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002105 if (mp->ma_values) {
2106 value_ptr = mp->ma_values;
2107 offset = sizeof(PyObject *);
2108 }
2109 else {
2110 value_ptr = &ep[0].me_value;
2111 offset = sizeof(PyDictKeyEntry);
2112 }
2113 for (i = 0, j = 0; i < size; i++) {
2114 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 PyObject *key = ep[i].me_key;
2116 Py_INCREF(key);
2117 PyList_SET_ITEM(v, j, key);
2118 j++;
2119 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002120 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 }
2122 assert(j == n);
2123 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002124}
2125
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002126static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002127dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002128{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002129 PyObject *v;
2130 Py_ssize_t i, j;
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002131 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002132 Py_ssize_t size, n, offset;
2133 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002134
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002135 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 n = mp->ma_used;
2137 v = PyList_New(n);
2138 if (v == NULL)
2139 return NULL;
2140 if (n != mp->ma_used) {
2141 /* Durnit. The allocations caused the dict to resize.
2142 * Just start over, this shouldn't normally happen.
2143 */
2144 Py_DECREF(v);
2145 goto again;
2146 }
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002147 ep = DK_ENTRIES(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002148 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002149 if (mp->ma_values) {
2150 value_ptr = mp->ma_values;
2151 offset = sizeof(PyObject *);
2152 }
2153 else {
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002154 value_ptr = &ep[0].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002155 offset = sizeof(PyDictKeyEntry);
2156 }
2157 for (i = 0, j = 0; i < size; i++) {
2158 PyObject *value = *value_ptr;
2159 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2160 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 Py_INCREF(value);
2162 PyList_SET_ITEM(v, j, value);
2163 j++;
2164 }
2165 }
2166 assert(j == n);
2167 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002168}
2169
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002170static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002171dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002172{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002173 PyObject *v;
2174 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002175 Py_ssize_t size, offset;
2176 PyObject *item, *key;
2177 PyDictKeyEntry *ep;
2178 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 /* Preallocate the list of tuples, to avoid allocations during
2181 * the loop over the items, which could trigger GC, which
2182 * could resize the dict. :-(
2183 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002184 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 n = mp->ma_used;
2186 v = PyList_New(n);
2187 if (v == NULL)
2188 return NULL;
2189 for (i = 0; i < n; i++) {
2190 item = PyTuple_New(2);
2191 if (item == NULL) {
2192 Py_DECREF(v);
2193 return NULL;
2194 }
2195 PyList_SET_ITEM(v, i, item);
2196 }
2197 if (n != mp->ma_used) {
2198 /* Durnit. The allocations caused the dict to resize.
2199 * Just start over, this shouldn't normally happen.
2200 */
2201 Py_DECREF(v);
2202 goto again;
2203 }
2204 /* Nothing we do below makes any function calls. */
Victor Stinner742da042016-09-07 17:40:12 -07002205 ep = DK_ENTRIES(mp->ma_keys);
2206 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002207 if (mp->ma_values) {
2208 value_ptr = mp->ma_values;
2209 offset = sizeof(PyObject *);
2210 }
2211 else {
2212 value_ptr = &ep[0].me_value;
2213 offset = sizeof(PyDictKeyEntry);
2214 }
2215 for (i = 0, j = 0; i < size; i++) {
2216 PyObject *value = *value_ptr;
2217 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2218 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 key = ep[i].me_key;
2220 item = PyList_GET_ITEM(v, j);
2221 Py_INCREF(key);
2222 PyTuple_SET_ITEM(item, 0, key);
2223 Py_INCREF(value);
2224 PyTuple_SET_ITEM(item, 1, value);
2225 j++;
2226 }
2227 }
2228 assert(j == n);
2229 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002230}
2231
Larry Hastings5c661892014-01-24 06:17:25 -08002232/*[clinic input]
2233@classmethod
2234dict.fromkeys
Larry Hastings5c661892014-01-24 06:17:25 -08002235 iterable: object
2236 value: object=None
2237 /
2238
2239Returns a new dict with keys from iterable and values equal to value.
2240[clinic start generated code]*/
2241
Larry Hastings5c661892014-01-24 06:17:25 -08002242static PyObject *
2243dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002244/*[clinic end generated code: output=8fb98e4b10384999 input=b85a667f9bf4669d]*/
Larry Hastings5c661892014-01-24 06:17:25 -08002245{
Eric Snow96c6af92015-05-29 22:21:39 -06002246 return _PyDict_FromKeys((PyObject *)type, iterable, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002247}
2248
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002249static int
Victor Stinner742da042016-09-07 17:40:12 -07002250dict_update_common(PyObject *self, PyObject *args, PyObject *kwds,
2251 const char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 PyObject *arg = NULL;
2254 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
2257 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002260 _Py_IDENTIFIER(keys);
2261 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 result = PyDict_Merge(self, arg, 1);
2263 else
2264 result = PyDict_MergeFromSeq2(self, arg, 1);
2265 }
2266 if (result == 0 && kwds != NULL) {
2267 if (PyArg_ValidateKeywordArguments(kwds))
2268 result = PyDict_Merge(self, kwds, 1);
2269 else
2270 result = -1;
2271 }
2272 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002273}
2274
2275static PyObject *
2276dict_update(PyObject *self, PyObject *args, PyObject *kwds)
2277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 if (dict_update_common(self, args, kwds, "update") != -1)
2279 Py_RETURN_NONE;
2280 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002281}
2282
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002283/* Update unconditionally replaces existing items.
2284 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00002285 otherwise it leaves existing items unchanged.
2286
2287 PyDict_{Update,Merge} update/merge from a mapping object.
2288
Tim Petersf582b822001-12-11 18:51:08 +00002289 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00002290 producing iterable objects of length 2.
2291*/
2292
Tim Petersf582b822001-12-11 18:51:08 +00002293int
Tim Peters1fc240e2001-10-26 05:06:50 +00002294PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
2295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 PyObject *it; /* iter(seq2) */
2297 Py_ssize_t i; /* index into seq2 of current element */
2298 PyObject *item; /* seq2[i] */
2299 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 assert(d != NULL);
2302 assert(PyDict_Check(d));
2303 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00002304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 it = PyObject_GetIter(seq2);
2306 if (it == NULL)
2307 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 for (i = 0; ; ++i) {
2310 PyObject *key, *value;
2311 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00002312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002313 fast = NULL;
2314 item = PyIter_Next(it);
2315 if (item == NULL) {
2316 if (PyErr_Occurred())
2317 goto Fail;
2318 break;
2319 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 /* Convert item to sequence, and verify length 2. */
2322 fast = PySequence_Fast(item, "");
2323 if (fast == NULL) {
2324 if (PyErr_ExceptionMatches(PyExc_TypeError))
2325 PyErr_Format(PyExc_TypeError,
2326 "cannot convert dictionary update "
2327 "sequence element #%zd to a sequence",
2328 i);
2329 goto Fail;
2330 }
2331 n = PySequence_Fast_GET_SIZE(fast);
2332 if (n != 2) {
2333 PyErr_Format(PyExc_ValueError,
2334 "dictionary update sequence element #%zd "
2335 "has length %zd; 2 is required",
2336 i, n);
2337 goto Fail;
2338 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 /* Update/merge with this (key, value) pair. */
2341 key = PySequence_Fast_GET_ITEM(fast, 0);
2342 value = PySequence_Fast_GET_ITEM(fast, 1);
2343 if (override || PyDict_GetItem(d, key) == NULL) {
2344 int status = PyDict_SetItem(d, key, value);
2345 if (status < 0)
2346 goto Fail;
2347 }
2348 Py_DECREF(fast);
2349 Py_DECREF(item);
2350 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 i = 0;
Victor Stinner611b0fa2016-09-14 15:02:01 +02002353 assert(_PyDict_CheckConsistency((PyDictObject *)d));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00002355Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 Py_XDECREF(item);
2357 Py_XDECREF(fast);
2358 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002359Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 Py_DECREF(it);
2361 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00002362}
2363
doko@ubuntu.comc96df682016-10-11 08:04:02 +02002364static int
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002365dict_merge(PyObject *a, PyObject *b, int override)
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002366{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002367 PyDictObject *mp, *other;
2368 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -07002369 PyDictKeyEntry *entry, *ep0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002370
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002371 assert(0 <= override && override <= 2);
2372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 /* We accept for the argument either a concrete dictionary object,
2374 * or an abstract "mapping" object. For the former, we can do
2375 * things quite efficiently. For the latter, we only require that
2376 * PyMapping_Keys() and PyObject_GetItem() be supported.
2377 */
2378 if (a == NULL || !PyDict_Check(a) || b == NULL) {
2379 PyErr_BadInternalCall();
2380 return -1;
2381 }
2382 mp = (PyDictObject*)a;
2383 if (PyDict_Check(b)) {
2384 other = (PyDictObject*)b;
2385 if (other == mp || other->ma_used == 0)
2386 /* a.update(a) or a.update({}); nothing to do */
2387 return 0;
2388 if (mp->ma_used == 0)
2389 /* Since the target dict is empty, PyDict_GetItem()
2390 * always returns NULL. Setting override to 1
2391 * skips the unnecessary test.
2392 */
2393 override = 1;
2394 /* Do one big resize at the start, rather than
2395 * incrementally resizing as we insert new items. Expect
2396 * that there will be no (or few) overlapping keys.
2397 */
INADA Naokib1152be2016-10-27 19:26:50 +09002398 if (USABLE_FRACTION(mp->ma_keys->dk_size) < other->ma_used) {
2399 if (dictresize(mp, ESTIMATE_SIZE(mp->ma_used + other->ma_used))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 return -1;
INADA Naokib1152be2016-10-27 19:26:50 +09002401 }
2402 }
Victor Stinner742da042016-09-07 17:40:12 -07002403 ep0 = DK_ENTRIES(other->ma_keys);
2404 for (i = 0, n = other->ma_keys->dk_nentries; i < n; i++) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002405 PyObject *key, *value;
2406 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002407 entry = &ep0[i];
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002408 key = entry->me_key;
2409 hash = entry->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002410 if (other->ma_values)
2411 value = other->ma_values[i];
2412 else
2413 value = entry->me_value;
2414
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002415 if (value != NULL) {
2416 int err = 0;
2417 Py_INCREF(key);
2418 Py_INCREF(value);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002419 if (override == 1)
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002420 err = insertdict(mp, key, hash, value);
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002421 else if (_PyDict_GetItem_KnownHash(a, key, hash) == NULL) {
2422 if (PyErr_Occurred()) {
2423 Py_DECREF(value);
2424 Py_DECREF(key);
2425 return -1;
2426 }
2427 err = insertdict(mp, key, hash, value);
2428 }
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002429 else if (override != 0) {
2430 _PyErr_SetKeyError(key);
2431 Py_DECREF(value);
2432 Py_DECREF(key);
2433 return -1;
2434 }
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002435 Py_DECREF(value);
2436 Py_DECREF(key);
2437 if (err != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 return -1;
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002439
Victor Stinner742da042016-09-07 17:40:12 -07002440 if (n != other->ma_keys->dk_nentries) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002441 PyErr_SetString(PyExc_RuntimeError,
2442 "dict mutated during update");
2443 return -1;
2444 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 }
2446 }
2447 }
2448 else {
2449 /* Do it the generic, slower way */
2450 PyObject *keys = PyMapping_Keys(b);
2451 PyObject *iter;
2452 PyObject *key, *value;
2453 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 if (keys == NULL)
2456 /* Docstring says this is equivalent to E.keys() so
2457 * if E doesn't have a .keys() method we want
2458 * AttributeError to percolate up. Might as well
2459 * do the same for any other error.
2460 */
2461 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 iter = PyObject_GetIter(keys);
2464 Py_DECREF(keys);
2465 if (iter == NULL)
2466 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002469 if (override != 1 && PyDict_GetItem(a, key) != NULL) {
2470 if (override != 0) {
2471 _PyErr_SetKeyError(key);
2472 Py_DECREF(key);
2473 Py_DECREF(iter);
2474 return -1;
2475 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 Py_DECREF(key);
2477 continue;
2478 }
2479 value = PyObject_GetItem(b, key);
2480 if (value == NULL) {
2481 Py_DECREF(iter);
2482 Py_DECREF(key);
2483 return -1;
2484 }
2485 status = PyDict_SetItem(a, key, value);
2486 Py_DECREF(key);
2487 Py_DECREF(value);
2488 if (status < 0) {
2489 Py_DECREF(iter);
2490 return -1;
2491 }
2492 }
2493 Py_DECREF(iter);
2494 if (PyErr_Occurred())
2495 /* Iterator completed, via error */
2496 return -1;
2497 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02002498 assert(_PyDict_CheckConsistency((PyDictObject *)a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002500}
2501
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002502int
2503PyDict_Update(PyObject *a, PyObject *b)
2504{
2505 return dict_merge(a, b, 1);
2506}
2507
2508int
2509PyDict_Merge(PyObject *a, PyObject *b, int override)
2510{
2511 /* XXX Deprecate override not in (0, 1). */
2512 return dict_merge(a, b, override != 0);
2513}
2514
2515int
2516_PyDict_MergeEx(PyObject *a, PyObject *b, int override)
2517{
2518 return dict_merge(a, b, override);
2519}
2520
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002521static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002522dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002525}
2526
2527PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002528PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002531 PyDictObject *mp;
2532 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 if (o == NULL || !PyDict_Check(o)) {
2535 PyErr_BadInternalCall();
2536 return NULL;
2537 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002538 mp = (PyDictObject *)o;
2539 if (_PyDict_HasSplitTable(mp)) {
2540 PyDictObject *split_copy;
Victor Stinner742da042016-09-07 17:40:12 -07002541 Py_ssize_t size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
2542 PyObject **newvalues;
2543 newvalues = new_values(size);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002544 if (newvalues == NULL)
2545 return PyErr_NoMemory();
2546 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2547 if (split_copy == NULL) {
2548 free_values(newvalues);
2549 return NULL;
2550 }
2551 split_copy->ma_values = newvalues;
2552 split_copy->ma_keys = mp->ma_keys;
2553 split_copy->ma_used = mp->ma_used;
2554 DK_INCREF(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002555 for (i = 0, n = size; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002556 PyObject *value = mp->ma_values[i];
2557 Py_XINCREF(value);
2558 split_copy->ma_values[i] = value;
2559 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002560 if (_PyObject_GC_IS_TRACKED(mp))
2561 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002562 return (PyObject *)split_copy;
2563 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 copy = PyDict_New();
2565 if (copy == NULL)
2566 return NULL;
2567 if (PyDict_Merge(copy, o, 1) == 0)
2568 return copy;
2569 Py_DECREF(copy);
2570 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002571}
2572
Martin v. Löwis18e16552006-02-15 17:27:45 +00002573Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002574PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 if (mp == NULL || !PyDict_Check(mp)) {
2577 PyErr_BadInternalCall();
2578 return -1;
2579 }
2580 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002581}
2582
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002583PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002584PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002585{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 if (mp == NULL || !PyDict_Check(mp)) {
2587 PyErr_BadInternalCall();
2588 return NULL;
2589 }
2590 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002591}
2592
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002593PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002594PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 if (mp == NULL || !PyDict_Check(mp)) {
2597 PyErr_BadInternalCall();
2598 return NULL;
2599 }
2600 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002601}
2602
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002603PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002604PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 if (mp == NULL || !PyDict_Check(mp)) {
2607 PyErr_BadInternalCall();
2608 return NULL;
2609 }
2610 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002611}
2612
Tim Peterse63415e2001-05-08 04:38:29 +00002613/* Return 1 if dicts equal, 0 if not, -1 if error.
2614 * Gets out as soon as any difference is detected.
2615 * Uses only Py_EQ comparison.
2616 */
2617static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002618dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 if (a->ma_used != b->ma_used)
2623 /* can't be equal if # of entries differ */
2624 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Victor Stinner742da042016-09-07 17:40:12 -07002626 for (i = 0; i < a->ma_keys->dk_nentries; i++) {
2627 PyDictKeyEntry *ep = &DK_ENTRIES(a->ma_keys)[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002628 PyObject *aval;
2629 if (a->ma_values)
2630 aval = a->ma_values[i];
2631 else
2632 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 if (aval != NULL) {
2634 int cmp;
2635 PyObject *bval;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002636 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002637 /* temporarily bump aval's refcount to ensure it stays
2638 alive until we're done with it */
2639 Py_INCREF(aval);
2640 /* ditto for key */
2641 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002642 /* reuse the known hash value */
INADA Naokiba609772016-12-07 20:41:42 +09002643 b->ma_keys->dk_lookup(b, key, ep->me_hash, &bval, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 Py_DECREF(key);
2645 if (bval == NULL) {
2646 Py_DECREF(aval);
2647 if (PyErr_Occurred())
2648 return -1;
2649 return 0;
2650 }
2651 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2652 Py_DECREF(aval);
2653 if (cmp <= 0) /* error or not equal */
2654 return cmp;
2655 }
2656 }
2657 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002658}
Tim Peterse63415e2001-05-08 04:38:29 +00002659
2660static PyObject *
2661dict_richcompare(PyObject *v, PyObject *w, int op)
2662{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002663 int cmp;
2664 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2667 res = Py_NotImplemented;
2668 }
2669 else if (op == Py_EQ || op == Py_NE) {
2670 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2671 if (cmp < 0)
2672 return NULL;
2673 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2674 }
2675 else
2676 res = Py_NotImplemented;
2677 Py_INCREF(res);
2678 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002679}
Tim Peterse63415e2001-05-08 04:38:29 +00002680
Larry Hastings61272b72014-01-07 12:41:53 -08002681/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07002682
2683@coexist
2684dict.__contains__
2685
2686 key: object
2687 /
2688
Meador Ingee02de8c2014-01-14 16:48:31 -06002689True if D has a key k, else False.
Larry Hastings61272b72014-01-07 12:41:53 -08002690[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07002691
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002692static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08002693dict___contains__(PyDictObject *self, PyObject *key)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002694/*[clinic end generated code: output=a3d03db709ed6e6b input=b852b2a19b51ab24]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002695{
Larry Hastingsc2047262014-01-25 20:43:29 -08002696 register PyDictObject *mp = self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002697 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002698 Py_ssize_t ix;
INADA Naokiba609772016-12-07 20:41:42 +09002699 PyObject *value;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002702 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 hash = PyObject_Hash(key);
2704 if (hash == -1)
2705 return NULL;
2706 }
INADA Naokiba609772016-12-07 20:41:42 +09002707 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value, NULL);
Victor Stinner742da042016-09-07 17:40:12 -07002708 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 return NULL;
INADA Naokiba609772016-12-07 20:41:42 +09002710 if (ix == DKIX_EMPTY || value == NULL)
Victor Stinner742da042016-09-07 17:40:12 -07002711 Py_RETURN_FALSE;
2712 Py_RETURN_TRUE;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002713}
2714
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002715static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002716dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 PyObject *key;
2719 PyObject *failobj = Py_None;
2720 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002721 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002722 Py_ssize_t ix;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2725 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002728 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 hash = PyObject_Hash(key);
2730 if (hash == -1)
2731 return NULL;
2732 }
INADA Naokiba609772016-12-07 20:41:42 +09002733 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &val, NULL);
Victor Stinner742da042016-09-07 17:40:12 -07002734 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 return NULL;
INADA Naokiba609772016-12-07 20:41:42 +09002736 if (ix == DKIX_EMPTY || val == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 val = failobj;
INADA Naokiba609772016-12-07 20:41:42 +09002738 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 Py_INCREF(val);
2740 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002741}
2742
Benjamin Peterson00e98862013-03-07 22:16:29 -05002743PyObject *
2744PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002745{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002746 PyDictObject *mp = (PyDictObject *)d;
INADA Naoki93f26f72016-11-02 18:45:16 +09002747 PyObject *value;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002748 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002749 Py_ssize_t hashpos, ix;
Guido van Rossum164452c2000-08-08 16:12:54 +00002750
Benjamin Peterson00e98862013-03-07 22:16:29 -05002751 if (!PyDict_Check(d)) {
2752 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002754 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002757 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 hash = PyObject_Hash(key);
2759 if (hash == -1)
2760 return NULL;
2761 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002762
2763 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
2764 if (insertion_resize(mp) < 0)
2765 return NULL;
2766 }
2767
INADA Naokiba609772016-12-07 20:41:42 +09002768 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value, &hashpos);
Victor Stinner742da042016-09-07 17:40:12 -07002769 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 return NULL;
INADA Naoki93f26f72016-11-02 18:45:16 +09002771
2772 if (_PyDict_HasSplitTable(mp) &&
INADA Naokiba609772016-12-07 20:41:42 +09002773 ((ix >= 0 && value == NULL && mp->ma_used != ix) ||
INADA Naoki93f26f72016-11-02 18:45:16 +09002774 (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {
2775 if (insertion_resize(mp) < 0) {
2776 return NULL;
2777 }
INADA Naokiba609772016-12-07 20:41:42 +09002778 hashpos = find_empty_slot(mp->ma_keys, key, hash);
INADA Naoki93f26f72016-11-02 18:45:16 +09002779 ix = DKIX_EMPTY;
2780 }
2781
2782 if (ix == DKIX_EMPTY) {
2783 PyDictKeyEntry *ep, *ep0;
2784 value = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002785 if (mp->ma_keys->dk_usable <= 0) {
Victor Stinner3c336c52016-09-12 14:17:40 +02002786 if (insertion_resize(mp) < 0) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002787 return NULL;
Victor Stinner3c336c52016-09-12 14:17:40 +02002788 }
INADA Naokiba609772016-12-07 20:41:42 +09002789 hashpos = find_empty_slot(mp->ma_keys, key, hash);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002790 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002791 ep0 = DK_ENTRIES(mp->ma_keys);
2792 ep = &ep0[mp->ma_keys->dk_nentries];
2793 dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002794 Py_INCREF(key);
INADA Naoki93f26f72016-11-02 18:45:16 +09002795 Py_INCREF(value);
2796 MAINTAIN_TRACKING(mp, key, value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002797 ep->me_key = key;
2798 ep->me_hash = hash;
INADA Naokiba609772016-12-07 20:41:42 +09002799 if (_PyDict_HasSplitTable(mp)) {
INADA Naoki93f26f72016-11-02 18:45:16 +09002800 assert(mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
2801 mp->ma_values[mp->ma_keys->dk_nentries] = value;
Victor Stinner742da042016-09-07 17:40:12 -07002802 }
2803 else {
INADA Naoki93f26f72016-11-02 18:45:16 +09002804 ep->me_value = value;
Victor Stinner742da042016-09-07 17:40:12 -07002805 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002806 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002807 mp->ma_version_tag = DICT_NEXT_VERSION();
INADA Naoki93f26f72016-11-02 18:45:16 +09002808 mp->ma_keys->dk_usable--;
2809 mp->ma_keys->dk_nentries++;
2810 assert(mp->ma_keys->dk_usable >= 0);
2811 }
INADA Naokiba609772016-12-07 20:41:42 +09002812 else if (value == NULL) {
INADA Naoki93f26f72016-11-02 18:45:16 +09002813 value = defaultobj;
2814 assert(_PyDict_HasSplitTable(mp));
2815 assert(ix == mp->ma_used);
2816 Py_INCREF(value);
2817 MAINTAIN_TRACKING(mp, key, value);
INADA Naokiba609772016-12-07 20:41:42 +09002818 mp->ma_values[ix] = value;
INADA Naoki93f26f72016-11-02 18:45:16 +09002819 mp->ma_used++;
2820 mp->ma_version_tag = DICT_NEXT_VERSION();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 }
INADA Naoki93f26f72016-11-02 18:45:16 +09002822
2823 assert(_PyDict_CheckConsistency(mp));
2824 return value;
Guido van Rossum164452c2000-08-08 16:12:54 +00002825}
2826
Benjamin Peterson00e98862013-03-07 22:16:29 -05002827static PyObject *
2828dict_setdefault(PyDictObject *mp, PyObject *args)
2829{
2830 PyObject *key, *val;
2831 PyObject *defaultobj = Py_None;
2832
2833 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2834 return NULL;
2835
Benjamin Peterson55898502013-03-08 08:36:49 -05002836 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002837 Py_XINCREF(val);
2838 return val;
2839}
Guido van Rossum164452c2000-08-08 16:12:54 +00002840
2841static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002842dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 PyDict_Clear((PyObject *)mp);
2845 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002846}
2847
Guido van Rossumba6ab842000-12-12 22:02:18 +00002848static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002849dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002850{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00002852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002853 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2854 return NULL;
Eric Snow96c6af92015-05-29 22:21:39 -06002855
Yury Selivanov684ef2c2016-10-28 19:01:21 -04002856 return _PyDict_Pop((PyObject*)mp, key, deflt);
Guido van Rossume027d982002-04-12 15:11:59 +00002857}
2858
2859static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002860dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002861{
Victor Stinner742da042016-09-07 17:40:12 -07002862 Py_ssize_t i, j;
2863 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 /* Allocate the result tuple before checking the size. Believe it
2867 * or not, this allocation could trigger a garbage collection which
2868 * could empty the dict, so if we checked the size first and that
2869 * happened, the result would be an infinite loop (searching for an
2870 * entry that no longer exists). Note that the usual popitem()
2871 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2872 * tuple away if the dict *is* empty isn't a significant
2873 * inefficiency -- possible, but unlikely in practice.
2874 */
2875 res = PyTuple_New(2);
2876 if (res == NULL)
2877 return NULL;
2878 if (mp->ma_used == 0) {
2879 Py_DECREF(res);
2880 PyErr_SetString(PyExc_KeyError,
2881 "popitem(): dictionary is empty");
2882 return NULL;
2883 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002884 /* Convert split table to combined table */
2885 if (mp->ma_keys->dk_lookup == lookdict_split) {
2886 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2887 Py_DECREF(res);
2888 return NULL;
2889 }
2890 }
2891 ENSURE_ALLOWS_DELETIONS(mp);
Victor Stinner742da042016-09-07 17:40:12 -07002892
2893 /* Pop last item */
2894 ep0 = DK_ENTRIES(mp->ma_keys);
2895 i = mp->ma_keys->dk_nentries - 1;
2896 while (i >= 0 && ep0[i].me_value == NULL) {
2897 i--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 }
Victor Stinner742da042016-09-07 17:40:12 -07002899 assert(i >= 0);
2900
2901 ep = &ep0[i];
2902 j = lookdict_index(mp->ma_keys, ep->me_hash, i);
2903 assert(j >= 0);
2904 assert(dk_get_index(mp->ma_keys, j) == i);
2905 dk_set_index(mp->ma_keys, j, DKIX_DUMMY);
2906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 PyTuple_SET_ITEM(res, 0, ep->me_key);
2908 PyTuple_SET_ITEM(res, 1, ep->me_value);
Victor Stinner742da042016-09-07 17:40:12 -07002909 ep->me_key = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 ep->me_value = NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002911 /* We can't dk_usable++ since there is DKIX_DUMMY in indices */
2912 mp->ma_keys->dk_nentries = i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002914 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02002915 assert(_PyDict_CheckConsistency(mp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002916 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002917}
2918
Jeremy Hylton8caad492000-06-23 14:18:11 +00002919static int
2920dict_traverse(PyObject *op, visitproc visit, void *arg)
2921{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002922 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson55f44522016-09-05 12:12:59 -07002923 PyDictKeysObject *keys = mp->ma_keys;
Serhiy Storchaka46825d22016-09-26 21:29:34 +03002924 PyDictKeyEntry *entries = DK_ENTRIES(keys);
Victor Stinner742da042016-09-07 17:40:12 -07002925 Py_ssize_t i, n = keys->dk_nentries;
2926
Benjamin Peterson55f44522016-09-05 12:12:59 -07002927 if (keys->dk_lookup == lookdict) {
2928 for (i = 0; i < n; i++) {
2929 if (entries[i].me_value != NULL) {
2930 Py_VISIT(entries[i].me_value);
2931 Py_VISIT(entries[i].me_key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002932 }
2933 }
Victor Stinner742da042016-09-07 17:40:12 -07002934 }
2935 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002936 if (mp->ma_values != NULL) {
Benjamin Peterson55f44522016-09-05 12:12:59 -07002937 for (i = 0; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002938 Py_VISIT(mp->ma_values[i]);
2939 }
2940 }
2941 else {
Benjamin Peterson55f44522016-09-05 12:12:59 -07002942 for (i = 0; i < n; i++) {
2943 Py_VISIT(entries[i].me_value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002944 }
2945 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 }
2947 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002948}
2949
2950static int
2951dict_tp_clear(PyObject *op)
2952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 PyDict_Clear(op);
2954 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002955}
2956
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002957static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002958
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002959Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06002960_PyDict_SizeOf(PyDictObject *mp)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002961{
Victor Stinner742da042016-09-07 17:40:12 -07002962 Py_ssize_t size, usable, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002963
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002964 size = DK_SIZE(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002965 usable = USABLE_FRACTION(size);
2966
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002967 res = _PyObject_SIZE(Py_TYPE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002968 if (mp->ma_values)
Victor Stinner742da042016-09-07 17:40:12 -07002969 res += usable * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002970 /* If the dictionary is split, the keys portion is accounted-for
2971 in the type object. */
2972 if (mp->ma_keys->dk_refcnt == 1)
Victor Stinner98ee9d52016-09-08 09:33:56 -07002973 res += (sizeof(PyDictKeysObject)
2974 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
2975 + DK_IXSIZE(mp->ma_keys) * size
2976 + sizeof(PyDictKeyEntry) * usable);
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002977 return res;
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002978}
2979
2980Py_ssize_t
2981_PyDict_KeysSize(PyDictKeysObject *keys)
2982{
Victor Stinner98ee9d52016-09-08 09:33:56 -07002983 return (sizeof(PyDictKeysObject)
2984 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
2985 + DK_IXSIZE(keys) * DK_SIZE(keys)
2986 + USABLE_FRACTION(DK_SIZE(keys)) * sizeof(PyDictKeyEntry));
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002987}
2988
doko@ubuntu.com17210f52016-01-14 14:04:59 +01002989static PyObject *
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002990dict_sizeof(PyDictObject *mp)
2991{
2992 return PyLong_FromSsize_t(_PyDict_SizeOf(mp));
2993}
2994
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002995PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2996
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002997PyDoc_STRVAR(sizeof__doc__,
2998"D.__sizeof__() -> size of D in memory, in bytes");
2999
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003000PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00003001"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003002
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003003PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00003004"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 +00003005
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003006PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00003007"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00003008If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00003009
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003010PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00003011"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000030122-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003013
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003014PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04003015"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
3016If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
3017If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
3018In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00003019
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003020PyDoc_STRVAR(clear__doc__,
3021"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00003022
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003023PyDoc_STRVAR(copy__doc__,
3024"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00003025
Guido van Rossumb90c8482007-02-10 01:11:45 +00003026/* Forward */
3027static PyObject *dictkeys_new(PyObject *);
3028static PyObject *dictitems_new(PyObject *);
3029static PyObject *dictvalues_new(PyObject *);
3030
Guido van Rossum45c85d12007-07-27 16:31:40 +00003031PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00003033PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00003035PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00003037
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003038static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07003039 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003040 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
3041 getitem__doc__},
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003042 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 sizeof__doc__},
3044 {"get", (PyCFunction)dict_get, METH_VARARGS,
3045 get__doc__},
3046 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
3047 setdefault_doc__},
3048 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
3049 pop__doc__},
3050 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
3051 popitem__doc__},
3052 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
3053 keys__doc__},
3054 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
3055 items__doc__},
3056 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
3057 values__doc__},
3058 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
3059 update__doc__},
Larry Hastings5c661892014-01-24 06:17:25 -08003060 DICT_FROMKEYS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
3062 clear__doc__},
3063 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
3064 copy__doc__},
3065 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003066};
3067
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003068/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00003069int
3070PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003071{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00003072 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07003073 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 PyDictObject *mp = (PyDictObject *)op;
INADA Naokiba609772016-12-07 20:41:42 +09003075 PyObject *value;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003078 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003079 hash = PyObject_Hash(key);
3080 if (hash == -1)
3081 return -1;
3082 }
INADA Naokiba609772016-12-07 20:41:42 +09003083 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value, NULL);
Victor Stinner742da042016-09-07 17:40:12 -07003084 if (ix == DKIX_ERROR)
3085 return -1;
INADA Naokiba609772016-12-07 20:41:42 +09003086 return (ix != DKIX_EMPTY && value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003087}
3088
Thomas Wouterscf297e42007-02-23 15:07:44 +00003089/* Internal version of PyDict_Contains used when the hash value is already known */
3090int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00003091_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00003092{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 PyDictObject *mp = (PyDictObject *)op;
INADA Naokiba609772016-12-07 20:41:42 +09003094 PyObject *value;
Victor Stinner742da042016-09-07 17:40:12 -07003095 Py_ssize_t ix;
Thomas Wouterscf297e42007-02-23 15:07:44 +00003096
INADA Naokiba609772016-12-07 20:41:42 +09003097 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value, NULL);
Victor Stinner742da042016-09-07 17:40:12 -07003098 if (ix == DKIX_ERROR)
3099 return -1;
INADA Naokiba609772016-12-07 20:41:42 +09003100 return (ix != DKIX_EMPTY && value != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00003101}
3102
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003103/* Hack to implement "key in dict" */
3104static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 0, /* sq_length */
3106 0, /* sq_concat */
3107 0, /* sq_repeat */
3108 0, /* sq_item */
3109 0, /* sq_slice */
3110 0, /* sq_ass_item */
3111 0, /* sq_ass_slice */
3112 PyDict_Contains, /* sq_contains */
3113 0, /* sq_inplace_concat */
3114 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003115};
3116
Guido van Rossum09e563a2001-05-01 12:10:21 +00003117static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003118dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003121 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003123 assert(type != NULL && type->tp_alloc != NULL);
3124 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02003125 if (self == NULL)
3126 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003127 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003128
Victor Stinnera9f61a52013-07-16 22:17:26 +02003129 /* The object has been implicitly tracked by tp_alloc */
3130 if (type == &PyDict_Type)
3131 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003132
3133 d->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07003134 d->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07003135 d->ma_keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003136 if (d->ma_keys == NULL) {
3137 Py_DECREF(self);
3138 return NULL;
3139 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02003140 assert(_PyDict_CheckConsistency(d));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003142}
3143
Tim Peters25786c02001-09-02 08:22:48 +00003144static int
3145dict_init(PyObject *self, PyObject *args, PyObject *kwds)
3146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00003148}
3149
Tim Peters6d6c1a32001-08-02 04:15:00 +00003150static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003151dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00003152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00003154}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003155
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003156PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00003157"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00003158"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003159" (key, value) pairs\n"
3160"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00003161" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003162" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00003163" d[k] = v\n"
3164"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
3165" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00003166
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003167PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3169 "dict",
3170 sizeof(PyDictObject),
3171 0,
3172 (destructor)dict_dealloc, /* tp_dealloc */
3173 0, /* tp_print */
3174 0, /* tp_getattr */
3175 0, /* tp_setattr */
3176 0, /* tp_reserved */
3177 (reprfunc)dict_repr, /* tp_repr */
3178 0, /* tp_as_number */
3179 &dict_as_sequence, /* tp_as_sequence */
3180 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00003181 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003182 0, /* tp_call */
3183 0, /* tp_str */
3184 PyObject_GenericGetAttr, /* tp_getattro */
3185 0, /* tp_setattro */
3186 0, /* tp_as_buffer */
3187 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3188 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
3189 dictionary_doc, /* tp_doc */
3190 dict_traverse, /* tp_traverse */
3191 dict_tp_clear, /* tp_clear */
3192 dict_richcompare, /* tp_richcompare */
3193 0, /* tp_weaklistoffset */
3194 (getiterfunc)dict_iter, /* tp_iter */
3195 0, /* tp_iternext */
3196 mapp_methods, /* tp_methods */
3197 0, /* tp_members */
3198 0, /* tp_getset */
3199 0, /* tp_base */
3200 0, /* tp_dict */
3201 0, /* tp_descr_get */
3202 0, /* tp_descr_set */
3203 0, /* tp_dictoffset */
3204 dict_init, /* tp_init */
3205 PyType_GenericAlloc, /* tp_alloc */
3206 dict_new, /* tp_new */
3207 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003208};
3209
Victor Stinner3c1e4812012-03-26 22:10:51 +02003210PyObject *
3211_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
3212{
3213 PyObject *kv;
3214 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02003215 if (kv == NULL) {
3216 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003217 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02003218 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02003219 return PyDict_GetItem(dp, kv);
3220}
3221
Guido van Rossum3cca2451997-05-16 14:23:33 +00003222/* For backward compatibility with old dictionary interface */
3223
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003224PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003225PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 PyObject *kv, *rv;
3228 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003229 if (kv == NULL) {
3230 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003232 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 rv = PyDict_GetItem(v, kv);
3234 Py_DECREF(kv);
3235 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003236}
3237
3238int
Victor Stinner3c1e4812012-03-26 22:10:51 +02003239_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
3240{
3241 PyObject *kv;
3242 kv = _PyUnicode_FromId(key); /* borrowed */
3243 if (kv == NULL)
3244 return -1;
3245 return PyDict_SetItem(v, kv, item);
3246}
3247
3248int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003249PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 PyObject *kv;
3252 int err;
3253 kv = PyUnicode_FromString(key);
3254 if (kv == NULL)
3255 return -1;
3256 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
3257 err = PyDict_SetItem(v, kv, item);
3258 Py_DECREF(kv);
3259 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003260}
3261
3262int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01003263_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
3264{
3265 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
3266 if (kv == NULL)
3267 return -1;
3268 return PyDict_DelItem(v, kv);
3269}
3270
3271int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003272PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003274 PyObject *kv;
3275 int err;
3276 kv = PyUnicode_FromString(key);
3277 if (kv == NULL)
3278 return -1;
3279 err = PyDict_DelItem(v, kv);
3280 Py_DECREF(kv);
3281 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003282}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003283
Raymond Hettinger019a1482004-03-18 02:41:19 +00003284/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003285
3286typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 PyObject_HEAD
3288 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
3289 Py_ssize_t di_used;
3290 Py_ssize_t di_pos;
3291 PyObject* di_result; /* reusable result tuple for iteritems */
3292 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003293} dictiterobject;
3294
3295static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003296dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 dictiterobject *di;
3299 di = PyObject_GC_New(dictiterobject, itertype);
3300 if (di == NULL)
3301 return NULL;
3302 Py_INCREF(dict);
3303 di->di_dict = dict;
3304 di->di_used = dict->ma_used;
3305 di->di_pos = 0;
3306 di->len = dict->ma_used;
3307 if (itertype == &PyDictIterItem_Type) {
3308 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
3309 if (di->di_result == NULL) {
3310 Py_DECREF(di);
3311 return NULL;
3312 }
3313 }
3314 else
3315 di->di_result = NULL;
3316 _PyObject_GC_TRACK(di);
3317 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003318}
3319
3320static void
3321dictiter_dealloc(dictiterobject *di)
3322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003323 Py_XDECREF(di->di_dict);
3324 Py_XDECREF(di->di_result);
3325 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003326}
3327
3328static int
3329dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
3330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 Py_VISIT(di->di_dict);
3332 Py_VISIT(di->di_result);
3333 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003334}
3335
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003336static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003337dictiter_len(dictiterobject *di)
3338{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 Py_ssize_t len = 0;
3340 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
3341 len = di->len;
3342 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003343}
3344
Guido van Rossumb90c8482007-02-10 01:11:45 +00003345PyDoc_STRVAR(length_hint_doc,
3346 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003347
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003348static PyObject *
3349dictiter_reduce(dictiterobject *di);
3350
3351PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3352
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003353static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003354 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
3355 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003356 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
3357 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003359};
3360
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003361static PyObject*
3362dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00003363{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003364 PyObject *key;
INADA Naokica2d8be2016-11-04 16:59:10 +09003365 Py_ssize_t i;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003366 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003367 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00003368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 if (d == NULL)
3370 return NULL;
3371 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00003372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 if (di->di_used != d->ma_used) {
3374 PyErr_SetString(PyExc_RuntimeError,
3375 "dictionary changed size during iteration");
3376 di->di_used = -1; /* Make this state sticky */
3377 return NULL;
3378 }
Guido van Rossum2147df72002-07-16 20:30:22 +00003379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003380 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003381 k = d->ma_keys;
INADA Naokica2d8be2016-11-04 16:59:10 +09003382 assert(i >= 0);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003383 if (d->ma_values) {
INADA Naokica2d8be2016-11-04 16:59:10 +09003384 if (i >= d->ma_used)
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003385 goto fail;
3386 key = DK_ENTRIES(k)[i].me_key;
INADA Naokica2d8be2016-11-04 16:59:10 +09003387 assert(d->ma_values[i] != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003388 }
3389 else {
INADA Naokica2d8be2016-11-04 16:59:10 +09003390 Py_ssize_t n = k->dk_nentries;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003391 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(k)[i];
3392 while (i < n && entry_ptr->me_value == NULL) {
3393 entry_ptr++;
3394 i++;
3395 }
3396 if (i >= n)
3397 goto fail;
3398 key = entry_ptr->me_key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003399 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 di->di_pos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 di->len--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003402 Py_INCREF(key);
3403 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003404
3405fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003407 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003408 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003409}
3410
Raymond Hettinger019a1482004-03-18 02:41:19 +00003411PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003412 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3413 "dict_keyiterator", /* tp_name */
3414 sizeof(dictiterobject), /* tp_basicsize */
3415 0, /* tp_itemsize */
3416 /* methods */
3417 (destructor)dictiter_dealloc, /* tp_dealloc */
3418 0, /* tp_print */
3419 0, /* tp_getattr */
3420 0, /* tp_setattr */
3421 0, /* tp_reserved */
3422 0, /* tp_repr */
3423 0, /* tp_as_number */
3424 0, /* tp_as_sequence */
3425 0, /* tp_as_mapping */
3426 0, /* tp_hash */
3427 0, /* tp_call */
3428 0, /* tp_str */
3429 PyObject_GenericGetAttr, /* tp_getattro */
3430 0, /* tp_setattro */
3431 0, /* tp_as_buffer */
3432 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3433 0, /* tp_doc */
3434 (traverseproc)dictiter_traverse, /* tp_traverse */
3435 0, /* tp_clear */
3436 0, /* tp_richcompare */
3437 0, /* tp_weaklistoffset */
3438 PyObject_SelfIter, /* tp_iter */
3439 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
3440 dictiter_methods, /* tp_methods */
3441 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003442};
3443
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003444static PyObject *
3445dictiter_iternextvalue(dictiterobject *di)
Raymond Hettinger019a1482004-03-18 02:41:19 +00003446{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003447 PyObject *value;
INADA Naokica2d8be2016-11-04 16:59:10 +09003448 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003451 if (d == NULL)
3452 return NULL;
3453 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003455 if (di->di_used != d->ma_used) {
3456 PyErr_SetString(PyExc_RuntimeError,
3457 "dictionary changed size during iteration");
3458 di->di_used = -1; /* Make this state sticky */
3459 return NULL;
3460 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003462 i = di->di_pos;
INADA Naokica2d8be2016-11-04 16:59:10 +09003463 assert(i >= 0);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003464 if (d->ma_values) {
INADA Naokica2d8be2016-11-04 16:59:10 +09003465 if (i >= d->ma_used)
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003466 goto fail;
INADA Naokica2d8be2016-11-04 16:59:10 +09003467 value = d->ma_values[i];
3468 assert(value != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003469 }
3470 else {
INADA Naokica2d8be2016-11-04 16:59:10 +09003471 Py_ssize_t n = d->ma_keys->dk_nentries;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003472 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(d->ma_keys)[i];
3473 while (i < n && entry_ptr->me_value == NULL) {
3474 entry_ptr++;
3475 i++;
3476 }
3477 if (i >= n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003478 goto fail;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003479 value = entry_ptr->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003480 }
3481 di->di_pos = i+1;
3482 di->len--;
3483 Py_INCREF(value);
3484 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003485
3486fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003487 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003488 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003489 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003490}
3491
3492PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3494 "dict_valueiterator", /* tp_name */
3495 sizeof(dictiterobject), /* tp_basicsize */
3496 0, /* tp_itemsize */
3497 /* methods */
3498 (destructor)dictiter_dealloc, /* tp_dealloc */
3499 0, /* tp_print */
3500 0, /* tp_getattr */
3501 0, /* tp_setattr */
3502 0, /* tp_reserved */
3503 0, /* tp_repr */
3504 0, /* tp_as_number */
3505 0, /* tp_as_sequence */
3506 0, /* tp_as_mapping */
3507 0, /* tp_hash */
3508 0, /* tp_call */
3509 0, /* tp_str */
3510 PyObject_GenericGetAttr, /* tp_getattro */
3511 0, /* tp_setattro */
3512 0, /* tp_as_buffer */
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003513 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003514 0, /* tp_doc */
3515 (traverseproc)dictiter_traverse, /* tp_traverse */
3516 0, /* tp_clear */
3517 0, /* tp_richcompare */
3518 0, /* tp_weaklistoffset */
3519 PyObject_SelfIter, /* tp_iter */
3520 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
3521 dictiter_methods, /* tp_methods */
3522 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003523};
3524
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003525static PyObject *
3526dictiter_iternextitem(dictiterobject *di)
Raymond Hettinger019a1482004-03-18 02:41:19 +00003527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003528 PyObject *key, *value, *result = di->di_result;
INADA Naokica2d8be2016-11-04 16:59:10 +09003529 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003530 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003532 if (d == NULL)
3533 return NULL;
3534 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 if (di->di_used != d->ma_used) {
3537 PyErr_SetString(PyExc_RuntimeError,
3538 "dictionary changed size during iteration");
3539 di->di_used = -1; /* Make this state sticky */
3540 return NULL;
3541 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003543 i = di->di_pos;
INADA Naokica2d8be2016-11-04 16:59:10 +09003544 assert(i >= 0);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003545 if (d->ma_values) {
INADA Naokica2d8be2016-11-04 16:59:10 +09003546 if (i >= d->ma_used)
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003547 goto fail;
3548 key = DK_ENTRIES(d->ma_keys)[i].me_key;
INADA Naokica2d8be2016-11-04 16:59:10 +09003549 value = d->ma_values[i];
3550 assert(value != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003551 }
3552 else {
INADA Naokica2d8be2016-11-04 16:59:10 +09003553 Py_ssize_t n = d->ma_keys->dk_nentries;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003554 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(d->ma_keys)[i];
3555 while (i < n && entry_ptr->me_value == NULL) {
3556 entry_ptr++;
3557 i++;
3558 }
3559 if (i >= n)
3560 goto fail;
3561 key = entry_ptr->me_key;
3562 value = entry_ptr->me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003563 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003564 di->di_pos = i+1;
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003565 di->len--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003566 if (result->ob_refcnt == 1) {
3567 Py_INCREF(result);
3568 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3569 Py_DECREF(PyTuple_GET_ITEM(result, 1));
Serhiy Storchaka49f5cdd2016-10-09 23:08:05 +03003570 }
3571 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 result = PyTuple_New(2);
3573 if (result == NULL)
3574 return NULL;
3575 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003576 Py_INCREF(key);
3577 Py_INCREF(value);
Eric Snow96c6af92015-05-29 22:21:39 -06003578 PyTuple_SET_ITEM(result, 0, key); /* steals reference */
3579 PyTuple_SET_ITEM(result, 1, value); /* steals reference */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003580 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003581
3582fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003583 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003584 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003585 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003586}
3587
3588PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003589 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3590 "dict_itemiterator", /* tp_name */
3591 sizeof(dictiterobject), /* tp_basicsize */
3592 0, /* tp_itemsize */
3593 /* methods */
3594 (destructor)dictiter_dealloc, /* tp_dealloc */
3595 0, /* tp_print */
3596 0, /* tp_getattr */
3597 0, /* tp_setattr */
3598 0, /* tp_reserved */
3599 0, /* tp_repr */
3600 0, /* tp_as_number */
3601 0, /* tp_as_sequence */
3602 0, /* tp_as_mapping */
3603 0, /* tp_hash */
3604 0, /* tp_call */
3605 0, /* tp_str */
3606 PyObject_GenericGetAttr, /* tp_getattro */
3607 0, /* tp_setattro */
3608 0, /* tp_as_buffer */
3609 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3610 0, /* tp_doc */
3611 (traverseproc)dictiter_traverse, /* tp_traverse */
3612 0, /* tp_clear */
3613 0, /* tp_richcompare */
3614 0, /* tp_weaklistoffset */
3615 PyObject_SelfIter, /* tp_iter */
3616 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3617 dictiter_methods, /* tp_methods */
3618 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003619};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003620
3621
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003622static PyObject *
3623dictiter_reduce(dictiterobject *di)
3624{
3625 PyObject *list;
3626 dictiterobject tmp;
3627
3628 list = PyList_New(0);
3629 if (!list)
3630 return NULL;
3631
3632 /* copy the itertor state */
3633 tmp = *di;
3634 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003635
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003636 /* iterate the temporary into a list */
3637 for(;;) {
3638 PyObject *element = 0;
3639 if (Py_TYPE(di) == &PyDictIterItem_Type)
3640 element = dictiter_iternextitem(&tmp);
3641 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3642 element = dictiter_iternextkey(&tmp);
3643 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3644 element = dictiter_iternextvalue(&tmp);
3645 else
3646 assert(0);
3647 if (element) {
3648 if (PyList_Append(list, element)) {
3649 Py_DECREF(element);
3650 Py_DECREF(list);
3651 Py_XDECREF(tmp.di_dict);
3652 return NULL;
3653 }
3654 Py_DECREF(element);
3655 } else
3656 break;
3657 }
3658 Py_XDECREF(tmp.di_dict);
3659 /* check for error */
3660 if (tmp.di_dict != NULL) {
3661 /* we have an error */
3662 Py_DECREF(list);
3663 return NULL;
3664 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003665 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003666}
3667
Guido van Rossum3ac67412007-02-10 18:55:06 +00003668/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003669/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003670/***********************************************/
3671
Guido van Rossumb90c8482007-02-10 01:11:45 +00003672/* The instance lay-out is the same for all three; but the type differs. */
3673
Guido van Rossumb90c8482007-02-10 01:11:45 +00003674static void
Eric Snow96c6af92015-05-29 22:21:39 -06003675dictview_dealloc(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003677 Py_XDECREF(dv->dv_dict);
3678 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003679}
3680
3681static int
Eric Snow96c6af92015-05-29 22:21:39 -06003682dictview_traverse(_PyDictViewObject *dv, visitproc visit, void *arg)
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003684 Py_VISIT(dv->dv_dict);
3685 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003686}
3687
Guido van Rossum83825ac2007-02-10 04:54:19 +00003688static Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06003689dictview_len(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 Py_ssize_t len = 0;
3692 if (dv->dv_dict != NULL)
3693 len = dv->dv_dict->ma_used;
3694 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003695}
3696
Eric Snow96c6af92015-05-29 22:21:39 -06003697PyObject *
3698_PyDictView_New(PyObject *dict, PyTypeObject *type)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003699{
Eric Snow96c6af92015-05-29 22:21:39 -06003700 _PyDictViewObject *dv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003701 if (dict == NULL) {
3702 PyErr_BadInternalCall();
3703 return NULL;
3704 }
3705 if (!PyDict_Check(dict)) {
3706 /* XXX Get rid of this restriction later */
3707 PyErr_Format(PyExc_TypeError,
3708 "%s() requires a dict argument, not '%s'",
3709 type->tp_name, dict->ob_type->tp_name);
3710 return NULL;
3711 }
Eric Snow96c6af92015-05-29 22:21:39 -06003712 dv = PyObject_GC_New(_PyDictViewObject, type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003713 if (dv == NULL)
3714 return NULL;
3715 Py_INCREF(dict);
3716 dv->dv_dict = (PyDictObject *)dict;
3717 _PyObject_GC_TRACK(dv);
3718 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003719}
3720
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003721/* TODO(guido): The views objects are not complete:
3722
3723 * support more set operations
3724 * support arbitrary mappings?
3725 - either these should be static or exported in dictobject.h
3726 - if public then they should probably be in builtins
3727*/
3728
Guido van Rossumaac530c2007-08-24 22:33:45 +00003729/* Return 1 if self is a subset of other, iterating over self;
3730 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003731static int
3732all_contained_in(PyObject *self, PyObject *other)
3733{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003734 PyObject *iter = PyObject_GetIter(self);
3735 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 if (iter == NULL)
3738 return -1;
3739 for (;;) {
3740 PyObject *next = PyIter_Next(iter);
3741 if (next == NULL) {
3742 if (PyErr_Occurred())
3743 ok = -1;
3744 break;
3745 }
3746 ok = PySequence_Contains(other, next);
3747 Py_DECREF(next);
3748 if (ok <= 0)
3749 break;
3750 }
3751 Py_DECREF(iter);
3752 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003753}
3754
3755static PyObject *
3756dictview_richcompare(PyObject *self, PyObject *other, int op)
3757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003758 Py_ssize_t len_self, len_other;
3759 int ok;
3760 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 assert(self != NULL);
3763 assert(PyDictViewSet_Check(self));
3764 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003765
Brian Curtindfc80e32011-08-10 20:28:54 -05003766 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3767 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003769 len_self = PyObject_Size(self);
3770 if (len_self < 0)
3771 return NULL;
3772 len_other = PyObject_Size(other);
3773 if (len_other < 0)
3774 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 ok = 0;
3777 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003779 case Py_NE:
3780 case Py_EQ:
3781 if (len_self == len_other)
3782 ok = all_contained_in(self, other);
3783 if (op == Py_NE && ok >= 0)
3784 ok = !ok;
3785 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003787 case Py_LT:
3788 if (len_self < len_other)
3789 ok = all_contained_in(self, other);
3790 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003792 case Py_LE:
3793 if (len_self <= len_other)
3794 ok = all_contained_in(self, other);
3795 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003797 case Py_GT:
3798 if (len_self > len_other)
3799 ok = all_contained_in(other, self);
3800 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003802 case Py_GE:
3803 if (len_self >= len_other)
3804 ok = all_contained_in(other, self);
3805 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003807 }
3808 if (ok < 0)
3809 return NULL;
3810 result = ok ? Py_True : Py_False;
3811 Py_INCREF(result);
3812 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003813}
3814
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003815static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003816dictview_repr(_PyDictViewObject *dv)
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003818 PyObject *seq;
3819 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003821 seq = PySequence_List((PyObject *)dv);
3822 if (seq == NULL)
3823 return NULL;
3824
3825 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3826 Py_DECREF(seq);
3827 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003828}
3829
Guido van Rossum3ac67412007-02-10 18:55:06 +00003830/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003831
3832static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003833dictkeys_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003834{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003835 if (dv->dv_dict == NULL) {
3836 Py_RETURN_NONE;
3837 }
3838 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003839}
3840
3841static int
Eric Snow96c6af92015-05-29 22:21:39 -06003842dictkeys_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003844 if (dv->dv_dict == NULL)
3845 return 0;
3846 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003847}
3848
Guido van Rossum83825ac2007-02-10 04:54:19 +00003849static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003850 (lenfunc)dictview_len, /* sq_length */
3851 0, /* sq_concat */
3852 0, /* sq_repeat */
3853 0, /* sq_item */
3854 0, /* sq_slice */
3855 0, /* sq_ass_item */
3856 0, /* sq_ass_slice */
3857 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003858};
3859
Guido van Rossum523259b2007-08-24 23:41:22 +00003860static PyObject*
3861dictviews_sub(PyObject* self, PyObject *other)
3862{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003863 PyObject *result = PySet_New(self);
3864 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003865 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003867 if (result == NULL)
3868 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003869
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003870 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 if (tmp == NULL) {
3872 Py_DECREF(result);
3873 return NULL;
3874 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003876 Py_DECREF(tmp);
3877 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003878}
3879
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003880PyObject*
3881_PyDictView_Intersect(PyObject* self, PyObject *other)
Guido van Rossum523259b2007-08-24 23:41:22 +00003882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003883 PyObject *result = PySet_New(self);
3884 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003885 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003887 if (result == NULL)
3888 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003889
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003890 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003891 if (tmp == NULL) {
3892 Py_DECREF(result);
3893 return NULL;
3894 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003896 Py_DECREF(tmp);
3897 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003898}
3899
3900static PyObject*
3901dictviews_or(PyObject* self, PyObject *other)
3902{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 PyObject *result = PySet_New(self);
3904 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003905 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003907 if (result == NULL)
3908 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003909
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003910 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003911 if (tmp == NULL) {
3912 Py_DECREF(result);
3913 return NULL;
3914 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003916 Py_DECREF(tmp);
3917 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003918}
3919
3920static PyObject*
3921dictviews_xor(PyObject* self, PyObject *other)
3922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003923 PyObject *result = PySet_New(self);
3924 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003925 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 if (result == NULL)
3928 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003929
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003930 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003931 if (tmp == NULL) {
3932 Py_DECREF(result);
3933 return NULL;
3934 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003936 Py_DECREF(tmp);
3937 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003938}
3939
3940static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003941 0, /*nb_add*/
3942 (binaryfunc)dictviews_sub, /*nb_subtract*/
3943 0, /*nb_multiply*/
3944 0, /*nb_remainder*/
3945 0, /*nb_divmod*/
3946 0, /*nb_power*/
3947 0, /*nb_negative*/
3948 0, /*nb_positive*/
3949 0, /*nb_absolute*/
3950 0, /*nb_bool*/
3951 0, /*nb_invert*/
3952 0, /*nb_lshift*/
3953 0, /*nb_rshift*/
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003954 (binaryfunc)_PyDictView_Intersect, /*nb_and*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003955 (binaryfunc)dictviews_xor, /*nb_xor*/
3956 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003957};
3958
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003959static PyObject*
3960dictviews_isdisjoint(PyObject *self, PyObject *other)
3961{
3962 PyObject *it;
3963 PyObject *item = NULL;
3964
3965 if (self == other) {
Eric Snow96c6af92015-05-29 22:21:39 -06003966 if (dictview_len((_PyDictViewObject *)self) == 0)
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003967 Py_RETURN_TRUE;
3968 else
3969 Py_RETURN_FALSE;
3970 }
3971
3972 /* Iterate over the shorter object (only if other is a set,
3973 * because PySequence_Contains may be expensive otherwise): */
3974 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
Eric Snow96c6af92015-05-29 22:21:39 -06003975 Py_ssize_t len_self = dictview_len((_PyDictViewObject *)self);
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003976 Py_ssize_t len_other = PyObject_Size(other);
3977 if (len_other == -1)
3978 return NULL;
3979
3980 if ((len_other > len_self)) {
3981 PyObject *tmp = other;
3982 other = self;
3983 self = tmp;
3984 }
3985 }
3986
3987 it = PyObject_GetIter(other);
3988 if (it == NULL)
3989 return NULL;
3990
3991 while ((item = PyIter_Next(it)) != NULL) {
3992 int contains = PySequence_Contains(self, item);
3993 Py_DECREF(item);
3994 if (contains == -1) {
3995 Py_DECREF(it);
3996 return NULL;
3997 }
3998
3999 if (contains) {
4000 Py_DECREF(it);
4001 Py_RETURN_FALSE;
4002 }
4003 }
4004 Py_DECREF(it);
4005 if (PyErr_Occurred())
4006 return NULL; /* PyIter_Next raised an exception. */
4007 Py_RETURN_TRUE;
4008}
4009
4010PyDoc_STRVAR(isdisjoint_doc,
4011"Return True if the view and the given iterable have a null intersection.");
4012
Guido van Rossumb90c8482007-02-10 01:11:45 +00004013static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004014 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
4015 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004016 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004017};
4018
4019PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004020 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4021 "dict_keys", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004022 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004023 0, /* tp_itemsize */
4024 /* methods */
4025 (destructor)dictview_dealloc, /* tp_dealloc */
4026 0, /* tp_print */
4027 0, /* tp_getattr */
4028 0, /* tp_setattr */
4029 0, /* tp_reserved */
4030 (reprfunc)dictview_repr, /* tp_repr */
4031 &dictviews_as_number, /* tp_as_number */
4032 &dictkeys_as_sequence, /* tp_as_sequence */
4033 0, /* tp_as_mapping */
4034 0, /* tp_hash */
4035 0, /* tp_call */
4036 0, /* tp_str */
4037 PyObject_GenericGetAttr, /* tp_getattro */
4038 0, /* tp_setattro */
4039 0, /* tp_as_buffer */
4040 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4041 0, /* tp_doc */
4042 (traverseproc)dictview_traverse, /* tp_traverse */
4043 0, /* tp_clear */
4044 dictview_richcompare, /* tp_richcompare */
4045 0, /* tp_weaklistoffset */
4046 (getiterfunc)dictkeys_iter, /* tp_iter */
4047 0, /* tp_iternext */
4048 dictkeys_methods, /* tp_methods */
4049 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004050};
4051
4052static PyObject *
4053dictkeys_new(PyObject *dict)
4054{
Eric Snow96c6af92015-05-29 22:21:39 -06004055 return _PyDictView_New(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004056}
4057
Guido van Rossum3ac67412007-02-10 18:55:06 +00004058/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004059
4060static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004061dictitems_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004063 if (dv->dv_dict == NULL) {
4064 Py_RETURN_NONE;
4065 }
4066 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00004067}
4068
4069static int
Eric Snow96c6af92015-05-29 22:21:39 -06004070dictitems_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00004071{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004072 PyObject *key, *value, *found;
4073 if (dv->dv_dict == NULL)
4074 return 0;
4075 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
4076 return 0;
4077 key = PyTuple_GET_ITEM(obj, 0);
4078 value = PyTuple_GET_ITEM(obj, 1);
Raymond Hettinger6692f012016-09-18 21:46:08 -07004079 found = PyDict_GetItemWithError((PyObject *)dv->dv_dict, key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004080 if (found == NULL) {
4081 if (PyErr_Occurred())
4082 return -1;
4083 return 0;
4084 }
4085 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004086}
4087
Guido van Rossum83825ac2007-02-10 04:54:19 +00004088static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 (lenfunc)dictview_len, /* sq_length */
4090 0, /* sq_concat */
4091 0, /* sq_repeat */
4092 0, /* sq_item */
4093 0, /* sq_slice */
4094 0, /* sq_ass_item */
4095 0, /* sq_ass_slice */
4096 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004097};
4098
Guido van Rossumb90c8482007-02-10 01:11:45 +00004099static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004100 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
4101 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004103};
4104
4105PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004106 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4107 "dict_items", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004108 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004109 0, /* tp_itemsize */
4110 /* methods */
4111 (destructor)dictview_dealloc, /* tp_dealloc */
4112 0, /* tp_print */
4113 0, /* tp_getattr */
4114 0, /* tp_setattr */
4115 0, /* tp_reserved */
4116 (reprfunc)dictview_repr, /* tp_repr */
4117 &dictviews_as_number, /* tp_as_number */
4118 &dictitems_as_sequence, /* tp_as_sequence */
4119 0, /* tp_as_mapping */
4120 0, /* tp_hash */
4121 0, /* tp_call */
4122 0, /* tp_str */
4123 PyObject_GenericGetAttr, /* tp_getattro */
4124 0, /* tp_setattro */
4125 0, /* tp_as_buffer */
4126 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4127 0, /* tp_doc */
4128 (traverseproc)dictview_traverse, /* tp_traverse */
4129 0, /* tp_clear */
4130 dictview_richcompare, /* tp_richcompare */
4131 0, /* tp_weaklistoffset */
4132 (getiterfunc)dictitems_iter, /* tp_iter */
4133 0, /* tp_iternext */
4134 dictitems_methods, /* tp_methods */
4135 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004136};
4137
4138static PyObject *
4139dictitems_new(PyObject *dict)
4140{
Eric Snow96c6af92015-05-29 22:21:39 -06004141 return _PyDictView_New(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004142}
4143
Guido van Rossum3ac67412007-02-10 18:55:06 +00004144/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004145
4146static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004147dictvalues_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004149 if (dv->dv_dict == NULL) {
4150 Py_RETURN_NONE;
4151 }
4152 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004153}
4154
Guido van Rossum83825ac2007-02-10 04:54:19 +00004155static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004156 (lenfunc)dictview_len, /* sq_length */
4157 0, /* sq_concat */
4158 0, /* sq_repeat */
4159 0, /* sq_item */
4160 0, /* sq_slice */
4161 0, /* sq_ass_item */
4162 0, /* sq_ass_slice */
4163 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004164};
4165
Guido van Rossumb90c8482007-02-10 01:11:45 +00004166static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004168};
4169
4170PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004171 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4172 "dict_values", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004173 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 0, /* tp_itemsize */
4175 /* methods */
4176 (destructor)dictview_dealloc, /* tp_dealloc */
4177 0, /* tp_print */
4178 0, /* tp_getattr */
4179 0, /* tp_setattr */
4180 0, /* tp_reserved */
4181 (reprfunc)dictview_repr, /* tp_repr */
4182 0, /* tp_as_number */
4183 &dictvalues_as_sequence, /* tp_as_sequence */
4184 0, /* tp_as_mapping */
4185 0, /* tp_hash */
4186 0, /* tp_call */
4187 0, /* tp_str */
4188 PyObject_GenericGetAttr, /* tp_getattro */
4189 0, /* tp_setattro */
4190 0, /* tp_as_buffer */
4191 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4192 0, /* tp_doc */
4193 (traverseproc)dictview_traverse, /* tp_traverse */
4194 0, /* tp_clear */
4195 0, /* tp_richcompare */
4196 0, /* tp_weaklistoffset */
4197 (getiterfunc)dictvalues_iter, /* tp_iter */
4198 0, /* tp_iternext */
4199 dictvalues_methods, /* tp_methods */
4200 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004201};
4202
4203static PyObject *
4204dictvalues_new(PyObject *dict)
4205{
Eric Snow96c6af92015-05-29 22:21:39 -06004206 return _PyDictView_New(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004207}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004208
4209/* Returns NULL if cannot allocate a new PyDictKeysObject,
4210 but does not set an error */
4211PyDictKeysObject *
4212_PyDict_NewKeysForClass(void)
4213{
Victor Stinner742da042016-09-07 17:40:12 -07004214 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004215 if (keys == NULL)
4216 PyErr_Clear();
4217 else
4218 keys->dk_lookup = lookdict_split;
4219 return keys;
4220}
4221
4222#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
4223
4224PyObject *
4225PyObject_GenericGetDict(PyObject *obj, void *context)
4226{
4227 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
4228 if (dictptr == NULL) {
4229 PyErr_SetString(PyExc_AttributeError,
4230 "This object has no __dict__");
4231 return NULL;
4232 }
4233 dict = *dictptr;
4234 if (dict == NULL) {
4235 PyTypeObject *tp = Py_TYPE(obj);
4236 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
4237 DK_INCREF(CACHED_KEYS(tp));
4238 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
4239 }
4240 else {
4241 *dictptr = dict = PyDict_New();
4242 }
4243 }
4244 Py_XINCREF(dict);
4245 return dict;
4246}
4247
4248int
4249_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
Victor Stinner742da042016-09-07 17:40:12 -07004250 PyObject *key, PyObject *value)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004251{
4252 PyObject *dict;
4253 int res;
4254 PyDictKeysObject *cached;
4255
4256 assert(dictptr != NULL);
4257 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
4258 assert(dictptr != NULL);
4259 dict = *dictptr;
4260 if (dict == NULL) {
4261 DK_INCREF(cached);
4262 dict = new_dict_with_shared_keys(cached);
4263 if (dict == NULL)
4264 return -1;
4265 *dictptr = dict;
4266 }
4267 if (value == NULL) {
4268 res = PyDict_DelItem(dict, key);
4269 if (cached != ((PyDictObject *)dict)->ma_keys) {
4270 CACHED_KEYS(tp) = NULL;
4271 DK_DECREF(cached);
4272 }
4273 } else {
4274 res = PyDict_SetItem(dict, key, value);
4275 if (cached != ((PyDictObject *)dict)->ma_keys) {
4276 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004277 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004278 CACHED_KEYS(tp) = make_keys_shared(dict);
Victor Stinner742da042016-09-07 17:40:12 -07004279 }
4280 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004281 CACHED_KEYS(tp) = NULL;
4282 }
4283 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004284 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
4285 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004286 }
4287 }
4288 } else {
4289 dict = *dictptr;
4290 if (dict == NULL) {
4291 dict = PyDict_New();
4292 if (dict == NULL)
4293 return -1;
4294 *dictptr = dict;
4295 }
4296 if (value == NULL) {
4297 res = PyDict_DelItem(dict, key);
4298 } else {
4299 res = PyDict_SetItem(dict, key, value);
4300 }
4301 }
4302 return res;
4303}
4304
4305void
4306_PyDictKeys_DecRef(PyDictKeysObject *keys)
4307{
4308 DK_DECREF(keys);
4309}