blob: 461eb57ccc1dbf666f2af1733b7c4dbdd40ef663 [file] [log] [blame]
Guido van Rossum2bc13791999-03-24 19:06:42 +00001/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002
Raymond Hettinger930427b2003-05-03 06:51:59 +00003/* The distribution includes a separate file, Objects/dictnotes.txt,
Tim Peters60b29962006-01-01 01:19:23 +00004 describing explorations into dictionary design and optimization.
Raymond Hettinger930427b2003-05-03 06:51:59 +00005 It covers typical dictionary use patterns, the parameters for
6 tuning dictionaries, and several ideas for possible optimizations.
7*/
8
Victor Stinner742da042016-09-07 17:40:12 -07009/* PyDictKeysObject
10
11This implements the dictionary's hashtable.
12
Berker Peksag71c01d42016-09-09 03:57:23 +030013As of Python 3.6, this is compact and ordered. Basic idea is described here.
Benjamin Peterson003f0592016-09-08 10:14:31 -070014https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html
Victor Stinner742da042016-09-07 17:40:12 -070015
16layout:
17
18+---------------+
19| dk_refcnt |
20| dk_size |
21| dk_lookup |
22| dk_usable |
23| dk_nentries |
24+---------------+
25| dk_indices |
26| |
27+---------------+
28| dk_entries |
29| |
30+---------------+
31
32dk_indices is actual hashtable. It holds index in entries, or DKIX_EMPTY(-1)
33or DKIX_DUMMY(-2).
34Size of indices is dk_size. Type of each index in indices is vary on dk_size:
35
36* int8 for dk_size <= 128
37* int16 for 256 <= dk_size <= 2**15
38* int32 for 2**16 <= dk_size <= 2**31
39* int64 for 2**32 <= dk_size
40
41dk_entries is array of PyDictKeyEntry. It's size is USABLE_FRACTION(dk_size).
42DK_ENTRIES(dk) can be used to get pointer to entries.
43
44NOTE: Since negative value is used for DKIX_EMPTY and DKIX_DUMMY, type of
45dk_indices entry is signed integer and int16 is used for table which
46dk_size == 256.
47*/
48
Benjamin Peterson7d95e402012-04-23 11:24:50 -040049
50/*
Benjamin Peterson7d95e402012-04-23 11:24:50 -040051The DictObject can be in one of two forms.
Victor Stinner742da042016-09-07 17:40:12 -070052
Benjamin Peterson7d95e402012-04-23 11:24:50 -040053Either:
54 A combined table:
55 ma_values == NULL, dk_refcnt == 1.
56 Values are stored in the me_value field of the PyDictKeysObject.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040057Or:
58 A split table:
59 ma_values != NULL, dk_refcnt >= 1
60 Values are stored in the ma_values array.
Victor Stinner742da042016-09-07 17:40:12 -070061 Only string (unicode) keys are allowed.
62 All dicts sharing same key must have same insertion order.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040063
Victor Stinner742da042016-09-07 17:40:12 -070064There are four kinds of slots in the table (slot is index, and
65DK_ENTRIES(keys)[index] if index >= 0):
66
671. Unused. index == DKIX_EMPTY
68 Does not hold an active (key, value) pair now and never did. Unused can
69 transition to Active upon key insertion. This is each slot's initial state.
70
712. Active. index >= 0, me_key != NULL and me_value != NULL
72 Holds an active (key, value) pair. Active can transition to Dummy or
73 Pending upon key deletion (for combined and split tables respectively).
74 This is the only case in which me_value != NULL.
75
763. Dummy. index == DKIX_DUMMY (combined only)
77 Previously held an active (key, value) pair, but that was deleted and an
78 active pair has not yet overwritten the slot. Dummy can transition to
79 Active upon key insertion. Dummy slots cannot be made Unused again
80 else the probe sequence in case of collision would have no way to know
81 they were once active.
82
834. Pending. index >= 0, key != NULL, and value == NULL (split only)
84 Not yet inserted in split-table.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040085*/
86
Victor Stinner742da042016-09-07 17:40:12 -070087/*
88Preserving insertion order
Benjamin Peterson7d95e402012-04-23 11:24:50 -040089
Victor Stinner742da042016-09-07 17:40:12 -070090It's simple for combined table. Since dk_entries is mostly append only, we can
91get insertion order by just iterating dk_entries.
92
93One exception is .popitem(). It removes last item in dk_entries and decrement
94dk_nentries to achieve amortized O(1). Since there are DKIX_DUMMY remains in
95dk_indices, we can't increment dk_usable even though dk_nentries is
96decremented.
97
98In split table, inserting into pending entry is allowed only for dk_entries[ix]
99where ix == mp->ma_used. Inserting into other index and deleting item cause
100converting the dict to the combined table.
101*/
102
103/* PyDict_MINSIZE is the starting size for any new dict.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400104 * 8 allows dicts with no more than 5 active entries; experiments suggested
105 * this suffices for the majority of dicts (consisting mostly of usually-small
106 * dicts created to pass keyword arguments).
107 * Making this 8, rather than 4 reduces the number of resizes for most
108 * dictionaries, without any significant extra memory use.
109 */
Victor Stinner742da042016-09-07 17:40:12 -0700110#define PyDict_MINSIZE 8
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400111
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112#include "Python.h"
Eric Snow96c6af92015-05-29 22:21:39 -0600113#include "dict-common.h"
Christian Heimes0ded5b52007-12-10 15:50:56 +0000114#include "stringlib/eq.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000115
Larry Hastings61272b72014-01-07 12:41:53 -0800116/*[clinic input]
Larry Hastingsc2047262014-01-25 20:43:29 -0800117class dict "PyDictObject *" "&PyDict_Type"
Larry Hastings61272b72014-01-07 12:41:53 -0800118[clinic start generated code]*/
Larry Hastings581ee362014-01-28 05:00:08 -0800119/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f157a5a0ce9589d6]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800120
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400121
122/*
123To ensure the lookup algorithm terminates, there must be at least one Unused
124slot (NULL key) in the table.
125To avoid slowing down lookups on a near-full table, we resize the table when
126it's USABLE_FRACTION (currently two-thirds) full.
127*/
Guido van Rossum16e93a81997-01-28 00:00:11 +0000128
Tim Peterseb28ef22001-06-02 05:27:19 +0000129#define PERTURB_SHIFT 5
130
Guido van Rossum16e93a81997-01-28 00:00:11 +0000131/*
Tim Peterseb28ef22001-06-02 05:27:19 +0000132Major subtleties ahead: Most hash schemes depend on having a "good" hash
133function, in the sense of simulating randomness. Python doesn't: its most
R David Murray537ad7a2016-07-10 12:33:18 -0400134important hash functions (for ints) are very regular in common
Tim Peterseb28ef22001-06-02 05:27:19 +0000135cases:
Tim Peters15d49292001-05-27 07:39:22 +0000136
R David Murray537ad7a2016-07-10 12:33:18 -0400137 >>>[hash(i) for i in range(4)]
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000138 [0, 1, 2, 3]
Tim Peters15d49292001-05-27 07:39:22 +0000139
Tim Peterseb28ef22001-06-02 05:27:19 +0000140This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
141the low-order i bits as the initial table index is extremely fast, and there
R David Murray537ad7a2016-07-10 12:33:18 -0400142are no collisions at all for dicts indexed by a contiguous range of ints. So
143this gives better-than-random behavior in common cases, and that's very
144desirable.
Tim Peters15d49292001-05-27 07:39:22 +0000145
Tim Peterseb28ef22001-06-02 05:27:19 +0000146OTOH, when collisions occur, the tendency to fill contiguous slices of the
147hash table makes a good collision resolution strategy crucial. Taking only
148the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000150their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
151 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +0000152
Tim Peterseb28ef22001-06-02 05:27:19 +0000153But catering to unusual cases should not slow the usual ones, so we just take
154the last i bits anyway. It's up to collision resolution to do the rest. If
155we *usually* find the key we're looking for on the first try (and, it turns
156out, we usually do -- the table load factor is kept under 2/3, so the odds
157are solidly in our favor), then it makes best sense to keep the initial index
158computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +0000159
Tim Peterseb28ef22001-06-02 05:27:19 +0000160The first half of collision resolution is to visit table indices via this
161recurrence:
Tim Peters15d49292001-05-27 07:39:22 +0000162
Tim Peterseb28ef22001-06-02 05:27:19 +0000163 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +0000164
Tim Peterseb28ef22001-06-02 05:27:19 +0000165For any initial j in range(2**i), repeating that 2**i times generates each
166int in range(2**i) exactly once (see any text on random-number generation for
167proof). By itself, this doesn't help much: like linear probing (setting
168j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
169order. This would be bad, except that's not the only thing we do, and it's
170actually *good* in the common cases where hash keys are consecutive. In an
171example that's really too small to make this entirely clear, for a table of
172size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +0000173
Tim Peterseb28ef22001-06-02 05:27:19 +0000174 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
175
176If two things come in at index 5, the first place we look after is index 2,
177not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
178Linear probing is deadly in this case because there the fixed probe order
179is the *same* as the order consecutive keys are likely to arrive. But it's
180extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
181and certain that consecutive hash codes do not.
182
183The other half of the strategy is to get the other bits of the hash code
184into play. This is done by initializing a (unsigned) vrbl "perturb" to the
185full hash code, and changing the recurrence to:
186
187 j = (5*j) + 1 + perturb;
188 perturb >>= PERTURB_SHIFT;
189 use j % 2**i as the next table index;
190
191Now the probe sequence depends (eventually) on every bit in the hash code,
192and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
193because it quickly magnifies small differences in the bits that didn't affect
194the initial index. Note that because perturb is unsigned, if the recurrence
195is executed often enough perturb eventually becomes and remains 0. At that
196point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
197that's certain to find an empty slot eventually (since it generates every int
198in range(2**i), and we make sure there's always at least one empty slot).
199
200Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
201small so that the high bits of the hash code continue to affect the probe
202sequence across iterations; but you want it large so that in really bad cases
203the high-order hash bits have an effect on early iterations. 5 was "the
204best" in minimizing total collisions across experiments Tim Peters ran (on
205both normal and pathological cases), but 4 and 6 weren't significantly worse.
206
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000207Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000208approach, using repeated multiplication by x in GF(2**n) where an irreducible
209polynomial for each table size was chosen such that x was a primitive root.
210Christian Tismer later extended that to use division by x instead, as an
211efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000212also gave excellent collision statistics, but was more expensive: two
213if-tests were required inside the loop; computing "the next" index took about
214the same number of operations but without as much potential parallelism
215(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
216above, and then shifting perturb can be done while the table index is being
217masked); and the PyDictObject struct required a member to hold the table's
218polynomial. In Tim's experiments the current scheme ran faster, produced
219equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000220
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000221*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000222
Fred Drake1bff34a2000-08-31 19:31:38 +0000223/* forward declarations */
Victor Stinner742da042016-09-07 17:40:12 -0700224static Py_ssize_t lookdict(PyDictObject *mp, PyObject *key,
225 Py_hash_t hash, PyObject ***value_addr,
226 Py_ssize_t *hashpos);
227static Py_ssize_t lookdict_unicode(PyDictObject *mp, PyObject *key,
228 Py_hash_t hash, PyObject ***value_addr,
229 Py_ssize_t *hashpos);
230static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400231lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700232 Py_hash_t hash, PyObject ***value_addr,
233 Py_ssize_t *hashpos);
234static Py_ssize_t lookdict_split(PyDictObject *mp, PyObject *key,
235 Py_hash_t hash, PyObject ***value_addr,
236 Py_ssize_t *hashpos);
Fred Drake1bff34a2000-08-31 19:31:38 +0000237
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400238static int dictresize(PyDictObject *mp, Py_ssize_t minused);
Tim Petersdea48ec2001-05-22 20:40:22 +0000239
Benjamin Peterson3c569292016-09-08 13:16:41 -0700240/*Global counter used to set ma_version_tag field of dictionary.
Victor Stinner3b6a6b42016-09-08 12:51:24 -0700241 * It is incremented each time that a dictionary is created and each
242 * time that a dictionary is modified. */
243static uint64_t pydict_global_version = 0;
244
245#define DICT_NEXT_VERSION() (++pydict_global_version)
246
Victor Stinner742da042016-09-07 17:40:12 -0700247/* Dictionary reuse scheme to save calls to malloc and free */
Christian Heimes2202f872008-02-06 14:31:34 +0000248#ifndef PyDict_MAXFREELIST
249#define PyDict_MAXFREELIST 80
250#endif
251static PyDictObject *free_list[PyDict_MAXFREELIST];
252static int numfree = 0;
Victor Stinner742da042016-09-07 17:40:12 -0700253static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST];
254static int numfreekeys = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000255
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300256#include "clinic/dictobject.c.h"
257
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100258int
259PyDict_ClearFreeList(void)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000260{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 PyDictObject *op;
Victor Stinner742da042016-09-07 17:40:12 -0700262 int ret = numfree + numfreekeys;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 while (numfree) {
264 op = free_list[--numfree];
265 assert(PyDict_CheckExact(op));
266 PyObject_GC_Del(op);
267 }
Victor Stinner742da042016-09-07 17:40:12 -0700268 while (numfreekeys) {
269 PyObject_FREE(keys_free_list[--numfreekeys]);
270 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100271 return ret;
272}
273
David Malcolm49526f42012-06-22 14:55:41 -0400274/* Print summary info about the state of the optimized allocator */
275void
276_PyDict_DebugMallocStats(FILE *out)
277{
278 _PyDebugAllocatorStats(out,
279 "free PyDictObject", numfree, sizeof(PyDictObject));
280}
281
282
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100283void
284PyDict_Fini(void)
285{
286 PyDict_ClearFreeList();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000287}
288
Victor Stinner742da042016-09-07 17:40:12 -0700289#define DK_SIZE(dk) ((dk)->dk_size)
290#if SIZEOF_VOID_P > 4
Victor Stinner58f7c5a2016-09-08 11:37:36 -0700291#define DK_IXSIZE(dk) \
292 (DK_SIZE(dk) <= 0xff ? \
293 1 : DK_SIZE(dk) <= 0xffff ? \
294 2 : DK_SIZE(dk) <= 0xffffffff ? \
Benjamin Peterson3c569292016-09-08 13:16:41 -0700295 4 : sizeof(int64_t))
Victor Stinner742da042016-09-07 17:40:12 -0700296#else
Victor Stinner58f7c5a2016-09-08 11:37:36 -0700297#define DK_IXSIZE(dk) \
298 (DK_SIZE(dk) <= 0xff ? \
299 1 : DK_SIZE(dk) <= 0xffff ? \
Benjamin Peterson3c569292016-09-08 13:16:41 -0700300 2 : sizeof(int32_t))
Victor Stinner742da042016-09-07 17:40:12 -0700301#endif
Victor Stinner58f7c5a2016-09-08 11:37:36 -0700302#define DK_ENTRIES(dk) \
Benjamin Peterson186122e2016-09-08 12:20:12 -0700303 ((PyDictKeyEntry*)(&(dk)->dk_indices.as_1[DK_SIZE(dk) * DK_IXSIZE(dk)]))
Victor Stinner742da042016-09-07 17:40:12 -0700304
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200305#define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
306#define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
307
308#define DK_INCREF(dk) (DK_DEBUG_INCREF ++(dk)->dk_refcnt)
309#define DK_DECREF(dk) if (DK_DEBUG_DECREF (--(dk)->dk_refcnt) == 0) free_keys_object(dk)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400310#define DK_MASK(dk) (((dk)->dk_size)-1)
311#define IS_POWER_OF_2(x) (((x) & (x-1)) == 0)
312
Victor Stinner742da042016-09-07 17:40:12 -0700313
314/* 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 }
Victor Stinner742da042016-09-07 17:40:12 -0700329 else if (s <= 0xffffffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700330 int32_t *indices = keys->dk_indices.as_4;
Victor Stinner208857e2016-09-08 11:35:46 -0700331 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700332 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700333#if SIZEOF_VOID_P > 4
Victor Stinner742da042016-09-07 17:40:12 -0700334 else {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700335 int64_t *indices = keys->dk_indices.as_8;
Victor Stinner208857e2016-09-08 11:35:46 -0700336 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700337 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700338#endif
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 }
Victor Stinner742da042016-09-07 17:40:12 -0700361 else if (s <= 0xffffffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700362 int32_t *indices = keys->dk_indices.as_4;
Victor Stinner71211e32016-09-08 10:52:46 -0700363 assert(ix <= 0x7fffffff);
Victor Stinner208857e2016-09-08 11:35:46 -0700364 indices[i] = (int32_t)ix;
Victor Stinner742da042016-09-07 17:40:12 -0700365 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700366#if SIZEOF_VOID_P > 4
Victor Stinner742da042016-09-07 17:40:12 -0700367 else {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700368 int64_t *indices = keys->dk_indices.as_8;
Victor Stinner208857e2016-09-08 11:35:46 -0700369 indices[i] = ix;
Victor Stinner742da042016-09-07 17:40:12 -0700370 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700371#endif
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 */
392#define ESTIMATE_SIZE(n) (((n)*3) >> 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 = {
423 2, /* dk_refcnt 1 for this struct, 1 for dummy_struct */
424 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
436static PyDictKeysObject *new_keys_object(Py_ssize_t size)
437{
438 PyDictKeysObject *dk;
Victor Stinner742da042016-09-07 17:40:12 -0700439 Py_ssize_t es, usable;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400440
Victor Stinner742da042016-09-07 17:40:12 -0700441 assert(size >= PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400442 assert(IS_POWER_OF_2(size));
Victor Stinner742da042016-09-07 17:40:12 -0700443
444 usable = USABLE_FRACTION(size);
445 if (size <= 0xff) {
446 es = 1;
447 }
448 else if (size <= 0xffff) {
449 es = 2;
450 }
451#if SIZEOF_VOID_P > 4
452 else if (size <= 0xffffffff) {
453 es = 4;
454 }
455#endif
456 else {
457 es = sizeof(Py_ssize_t);
458 }
459
460 if (size == PyDict_MINSIZE && numfreekeys > 0) {
461 dk = keys_free_list[--numfreekeys];
462 }
463 else {
Victor Stinner98ee9d52016-09-08 09:33:56 -0700464 dk = PyObject_MALLOC(sizeof(PyDictKeysObject)
465 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
466 + es * size
467 + sizeof(PyDictKeyEntry) * usable);
Victor Stinner742da042016-09-07 17:40:12 -0700468 if (dk == NULL) {
469 PyErr_NoMemory();
470 return NULL;
471 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400472 }
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200473 DK_DEBUG_INCREF dk->dk_refcnt = 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400474 dk->dk_size = size;
Victor Stinner742da042016-09-07 17:40:12 -0700475 dk->dk_usable = usable;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400476 dk->dk_lookup = lookdict_unicode_nodummy;
Victor Stinner742da042016-09-07 17:40:12 -0700477 dk->dk_nentries = 0;
Benjamin Peterson186122e2016-09-08 12:20:12 -0700478 memset(&dk->dk_indices.as_1[0], 0xff, es * size);
Victor Stinner742da042016-09-07 17:40:12 -0700479 memset(DK_ENTRIES(dk), 0, sizeof(PyDictKeyEntry) * usable);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400480 return dk;
481}
482
483static void
484free_keys_object(PyDictKeysObject *keys)
485{
Victor Stinner742da042016-09-07 17:40:12 -0700486 PyDictKeyEntry *entries = DK_ENTRIES(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400487 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -0700488 for (i = 0, n = keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400489 Py_XDECREF(entries[i].me_key);
490 Py_XDECREF(entries[i].me_value);
491 }
Victor Stinner742da042016-09-07 17:40:12 -0700492 if (keys->dk_size == PyDict_MINSIZE && numfreekeys < PyDict_MAXFREELIST) {
493 keys_free_list[numfreekeys++] = keys;
494 return;
495 }
Raymond Hettingerce5179f2016-01-31 08:56:21 -0800496 PyObject_FREE(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400497}
498
499#define new_values(size) PyMem_NEW(PyObject *, size)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400500#define free_values(values) PyMem_FREE(values)
501
502/* Consumes a reference to the keys object */
503static PyObject *
504new_dict(PyDictKeysObject *keys, PyObject **values)
505{
506 PyDictObject *mp;
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200507 assert(keys != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 if (numfree) {
509 mp = free_list[--numfree];
510 assert (mp != NULL);
511 assert (Py_TYPE(mp) == &PyDict_Type);
512 _Py_NewReference((PyObject *)mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400514 else {
515 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
516 if (mp == NULL) {
517 DK_DECREF(keys);
518 free_values(values);
519 return NULL;
520 }
521 }
522 mp->ma_keys = keys;
523 mp->ma_values = values;
524 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -0700525 mp->ma_version_tag = DICT_NEXT_VERSION();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000527}
528
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400529/* Consumes a reference to the keys object */
530static PyObject *
531new_dict_with_shared_keys(PyDictKeysObject *keys)
532{
533 PyObject **values;
534 Py_ssize_t i, size;
535
Victor Stinner742da042016-09-07 17:40:12 -0700536 size = USABLE_FRACTION(DK_SIZE(keys));
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400537 values = new_values(size);
538 if (values == NULL) {
539 DK_DECREF(keys);
540 return PyErr_NoMemory();
541 }
542 for (i = 0; i < size; i++) {
543 values[i] = NULL;
544 }
545 return new_dict(keys, values);
546}
547
548PyObject *
549PyDict_New(void)
550{
Victor Stinner742da042016-09-07 17:40:12 -0700551 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200552 if (keys == NULL)
553 return NULL;
554 return new_dict(keys, NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400555}
556
Victor Stinner742da042016-09-07 17:40:12 -0700557/* Search index of hash table from offset of entry table */
558static Py_ssize_t
559lookdict_index(PyDictKeysObject *k, Py_hash_t hash, Py_ssize_t index)
560{
561 size_t i, perturb;
562 size_t mask = DK_MASK(k);
563 Py_ssize_t ix;
564
565 i = (size_t)hash & mask;
566 ix = dk_get_index(k, i);
567 if (ix == index) {
568 return i;
569 }
570 if (ix == DKIX_EMPTY) {
571 return DKIX_EMPTY;
572 }
573
574 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
575 i = mask & ((i << 2) + i + perturb + 1);
576 ix = dk_get_index(k, i);
577 if (ix == index) {
578 return i;
579 }
580 if (ix == DKIX_EMPTY) {
581 return DKIX_EMPTY;
582 }
583 }
584 assert(0); /* NOT REACHED */
585 return DKIX_ERROR;
586}
587
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000588/*
589The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000590This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000591Open addressing is preferred over chaining since the link overhead for
592chaining would be substantial (100% with typical malloc overhead).
593
Tim Peterseb28ef22001-06-02 05:27:19 +0000594The initial probe index is computed as hash mod the table size. Subsequent
595probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000596
597All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000598
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000599The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000600contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000601Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000602
Victor Stinner742da042016-09-07 17:40:12 -0700603lookdict() is general-purpose, and may return DKIX_ERROR if (and only if) a
Victor Stinnera4348cc2016-09-08 12:01:25 -0700604comparison raises an exception.
Guido van Rossum89d8c602007-09-18 17:26:56 +0000605lookdict_unicode() below is specialized to string keys, comparison of which can
Victor Stinner742da042016-09-07 17:40:12 -0700606never raise an exception; that function can never return DKIX_ERROR.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400607lookdict_unicode_nodummy is further specialized for string keys that cannot be
608the <dummy> value.
Victor Stinner742da042016-09-07 17:40:12 -0700609For both, when the key isn't found a DKIX_EMPTY is returned. hashpos returns
610where the key index should be inserted.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000611*/
Victor Stinner742da042016-09-07 17:40:12 -0700612static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400613lookdict(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700614 Py_hash_t hash, PyObject ***value_addr, Py_ssize_t *hashpos)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000615{
Victor Stinner742da042016-09-07 17:40:12 -0700616 size_t i, perturb, mask;
617 Py_ssize_t ix, freeslot;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200618 int cmp;
Victor Stinner742da042016-09-07 17:40:12 -0700619 PyDictKeysObject *dk;
620 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000622
Antoine Pitrou9a234902012-05-13 20:48:01 +0200623top:
Victor Stinner742da042016-09-07 17:40:12 -0700624 dk = mp->ma_keys;
625 mask = DK_MASK(dk);
626 ep0 = DK_ENTRIES(dk);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700628
629 ix = dk_get_index(dk, i);
630 if (ix == DKIX_EMPTY) {
631 if (hashpos != NULL)
632 *hashpos = i;
633 *value_addr = NULL;
634 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400635 }
Victor Stinner742da042016-09-07 17:40:12 -0700636 if (ix == DKIX_DUMMY) {
637 freeslot = i;
638 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 else {
Victor Stinner742da042016-09-07 17:40:12 -0700640 ep = &ep0[ix];
641 if (ep->me_key == key) {
642 *value_addr = &ep->me_value;
643 if (hashpos != NULL)
644 *hashpos = i;
645 return ix;
646 }
647 if (ep->me_key != NULL && ep->me_hash == hash) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 startkey = ep->me_key;
649 Py_INCREF(startkey);
650 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
651 Py_DECREF(startkey);
652 if (cmp < 0)
Victor Stinner742da042016-09-07 17:40:12 -0700653 return DKIX_ERROR;
654 if (dk == mp->ma_keys && ep->me_key == startkey) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400655 if (cmp > 0) {
656 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700657 if (hashpos != NULL)
658 *hashpos = i;
659 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400660 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 }
662 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200663 /* The dict was mutated, restart */
664 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 }
666 }
Victor Stinner742da042016-09-07 17:40:12 -0700667 freeslot = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 }
Tim Peters15d49292001-05-27 07:39:22 +0000669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
Victor Stinner742da042016-09-07 17:40:12 -0700671 i = ((i << 2) + i + perturb + 1) & mask;
672 ix = dk_get_index(dk, i);
673 if (ix == DKIX_EMPTY) {
674 if (hashpos != NULL) {
675 *hashpos = (freeslot == -1) ? (Py_ssize_t)i : freeslot;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400676 }
Victor Stinner742da042016-09-07 17:40:12 -0700677 *value_addr = NULL;
678 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400679 }
Victor Stinner742da042016-09-07 17:40:12 -0700680 if (ix == DKIX_DUMMY) {
681 if (freeslot == -1)
682 freeslot = i;
683 continue;
684 }
685 ep = &ep0[ix];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400686 if (ep->me_key == key) {
Victor Stinner742da042016-09-07 17:40:12 -0700687 if (hashpos != NULL) {
688 *hashpos = i;
689 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400690 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700691 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400692 }
Victor Stinner742da042016-09-07 17:40:12 -0700693 if (ep->me_hash == hash && ep->me_key != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 startkey = ep->me_key;
695 Py_INCREF(startkey);
696 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
697 Py_DECREF(startkey);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400698 if (cmp < 0) {
699 *value_addr = NULL;
Victor Stinner742da042016-09-07 17:40:12 -0700700 return DKIX_ERROR;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400701 }
Victor Stinner742da042016-09-07 17:40:12 -0700702 if (dk == mp->ma_keys && ep->me_key == startkey) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400703 if (cmp > 0) {
Victor Stinner742da042016-09-07 17:40:12 -0700704 if (hashpos != NULL) {
705 *hashpos = i;
706 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400707 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700708 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400709 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 }
711 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200712 /* The dict was mutated, restart */
713 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 }
715 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 }
717 assert(0); /* NOT REACHED */
718 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000719}
720
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400721/* Specialized version for string-only keys */
Victor Stinner742da042016-09-07 17:40:12 -0700722static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400723lookdict_unicode(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700724 Py_hash_t hash, PyObject ***value_addr, Py_ssize_t *hashpos)
Fred Drake1bff34a2000-08-31 19:31:38 +0000725{
Victor Stinner742da042016-09-07 17:40:12 -0700726 size_t i, perturb;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200727 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700728 Py_ssize_t ix, freeslot;
729 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Fred Drake1bff34a2000-08-31 19:31:38 +0000730
Victor Stinner742da042016-09-07 17:40:12 -0700731 assert(mp->ma_values == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 /* Make sure this function doesn't have to handle non-unicode keys,
733 including subclasses of str; e.g., one reason to subclass
734 unicodes is to override __eq__, and for speed we don't cater to
735 that here. */
736 if (!PyUnicode_CheckExact(key)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400737 mp->ma_keys->dk_lookup = lookdict;
Victor Stinner742da042016-09-07 17:40:12 -0700738 return lookdict(mp, key, hash, value_addr, hashpos);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100740 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700741 ix = dk_get_index(mp->ma_keys, i);
742 if (ix == DKIX_EMPTY) {
743 if (hashpos != NULL)
744 *hashpos = i;
745 *value_addr = NULL;
746 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400747 }
Victor Stinner742da042016-09-07 17:40:12 -0700748 if (ix == DKIX_DUMMY) {
749 freeslot = i;
750 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 else {
Victor Stinner742da042016-09-07 17:40:12 -0700752 ep = &ep0[ix];
753 /* only split table can be ix != DKIX_DUMMY && me_key == NULL */
754 assert(ep->me_key != NULL);
755 if (ep->me_key == key || (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
756 if (hashpos != NULL)
757 *hashpos = i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400758 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700759 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400760 }
Victor Stinner742da042016-09-07 17:40:12 -0700761 freeslot = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 }
Tim Peters15d49292001-05-27 07:39:22 +0000763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
Victor Stinner742da042016-09-07 17:40:12 -0700765 i = mask & ((i << 2) + i + perturb + 1);
766 ix = dk_get_index(mp->ma_keys, i);
767 if (ix == DKIX_EMPTY) {
768 if (hashpos != NULL) {
769 *hashpos = (freeslot == -1) ? (Py_ssize_t)i : freeslot;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400770 }
Victor Stinner742da042016-09-07 17:40:12 -0700771 *value_addr = NULL;
772 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400773 }
Victor Stinner742da042016-09-07 17:40:12 -0700774 if (ix == DKIX_DUMMY) {
775 if (freeslot == -1)
776 freeslot = i;
777 continue;
778 }
779 ep = &ep0[ix];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 if (ep->me_key == key
781 || (ep->me_hash == hash
Victor Stinner742da042016-09-07 17:40:12 -0700782 && ep->me_key != NULL
783 && unicode_eq(ep->me_key, key))) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400784 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700785 if (hashpos != NULL) {
786 *hashpos = i;
787 }
788 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400789 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 }
791 assert(0); /* NOT REACHED */
792 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000793}
794
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400795/* Faster version of lookdict_unicode when it is known that no <dummy> keys
796 * will be present. */
Victor Stinner742da042016-09-07 17:40:12 -0700797static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400798lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700799 Py_hash_t hash, PyObject ***value_addr,
800 Py_ssize_t *hashpos)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400801{
Victor Stinner742da042016-09-07 17:40:12 -0700802 size_t i, perturb;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200803 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700804 Py_ssize_t ix;
805 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400806
Victor Stinner742da042016-09-07 17:40:12 -0700807 assert(mp->ma_values == NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400808 /* Make sure this function doesn't have to handle non-unicode keys,
809 including subclasses of str; e.g., one reason to subclass
810 unicodes is to override __eq__, and for speed we don't cater to
811 that here. */
812 if (!PyUnicode_CheckExact(key)) {
813 mp->ma_keys->dk_lookup = lookdict;
Victor Stinner742da042016-09-07 17:40:12 -0700814 return lookdict(mp, key, hash, value_addr, hashpos);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400815 }
816 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700817 ix = dk_get_index(mp->ma_keys, i);
818 assert (ix != DKIX_DUMMY);
819 if (ix == DKIX_EMPTY) {
820 if (hashpos != NULL)
821 *hashpos = i;
822 *value_addr = NULL;
823 return DKIX_EMPTY;
824 }
825 ep = &ep0[ix];
Victor Stinnerdee6e252016-09-08 11:16:07 -0700826 assert(ep->me_key != NULL);
827 assert(PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700828 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400829 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700830 if (hashpos != NULL)
831 *hashpos = i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400832 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700833 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400834 }
835 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
Victor Stinner742da042016-09-07 17:40:12 -0700836 i = mask & ((i << 2) + i + perturb + 1);
837 ix = dk_get_index(mp->ma_keys, i);
838 assert (ix != DKIX_DUMMY);
839 if (ix == DKIX_EMPTY) {
840 if (hashpos != NULL)
841 *hashpos = i;
842 *value_addr = NULL;
843 return DKIX_EMPTY;
844 }
845 ep = &ep0[ix];
846 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
847 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400848 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700849 if (hashpos != NULL)
850 *hashpos = i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400851 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700852 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400853 }
854 }
855 assert(0); /* NOT REACHED */
856 return 0;
857}
858
859/* Version of lookdict for split tables.
860 * All split tables and only split tables use this lookup function.
861 * Split tables only contain unicode keys and no dummy keys,
862 * so algorithm is the same as lookdict_unicode_nodummy.
863 */
Victor Stinner742da042016-09-07 17:40:12 -0700864static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400865lookdict_split(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700866 Py_hash_t hash, PyObject ***value_addr, Py_ssize_t *hashpos)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400867{
Victor Stinner742da042016-09-07 17:40:12 -0700868 size_t i, perturb;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200869 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700870 Py_ssize_t ix;
871 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400872
Victor Stinner742da042016-09-07 17:40:12 -0700873 /* mp must split table */
874 assert(mp->ma_values != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400875 if (!PyUnicode_CheckExact(key)) {
Victor Stinner742da042016-09-07 17:40:12 -0700876 ix = lookdict(mp, key, hash, value_addr, hashpos);
877 if (ix >= 0) {
878 *value_addr = &mp->ma_values[ix];
879 }
880 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400881 }
Victor Stinner742da042016-09-07 17:40:12 -0700882
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400883 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700884 ix = dk_get_index(mp->ma_keys, i);
885 if (ix == DKIX_EMPTY) {
886 if (hashpos != NULL)
887 *hashpos = i;
888 *value_addr = NULL;
889 return DKIX_EMPTY;
890 }
891 assert(ix >= 0);
892 ep = &ep0[ix];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400893 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700894 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400895 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700896 if (hashpos != NULL)
897 *hashpos = i;
898 *value_addr = &mp->ma_values[ix];
899 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400900 }
901 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
Victor Stinner742da042016-09-07 17:40:12 -0700902 i = mask & ((i << 2) + i + perturb + 1);
903 ix = dk_get_index(mp->ma_keys, i);
904 if (ix == DKIX_EMPTY) {
905 if (hashpos != NULL)
906 *hashpos = i;
907 *value_addr = NULL;
908 return DKIX_EMPTY;
909 }
910 assert(ix >= 0);
911 ep = &ep0[ix];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400912 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700913 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400914 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700915 if (hashpos != NULL)
916 *hashpos = i;
917 *value_addr = &mp->ma_values[ix];
918 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400919 }
920 }
921 assert(0); /* NOT REACHED */
922 return 0;
923}
924
Benjamin Petersonfb886362010-04-24 18:21:17 +0000925int
926_PyDict_HasOnlyStringKeys(PyObject *dict)
927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 Py_ssize_t pos = 0;
929 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +0000930 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 /* Shortcut */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400932 if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 return 1;
934 while (PyDict_Next(dict, &pos, &key, &value))
935 if (!PyUnicode_Check(key))
936 return 0;
937 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +0000938}
939
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000940#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 do { \
942 if (!_PyObject_GC_IS_TRACKED(mp)) { \
943 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
944 _PyObject_GC_MAY_BE_TRACKED(value)) { \
945 _PyObject_GC_TRACK(mp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 } \
947 } \
948 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000949
950void
951_PyDict_MaybeUntrack(PyObject *op)
952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 PyDictObject *mp;
954 PyObject *value;
Victor Stinner742da042016-09-07 17:40:12 -0700955 Py_ssize_t i, numentries;
956 PyDictKeyEntry *ep0;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
959 return;
960
961 mp = (PyDictObject *) op;
Victor Stinner742da042016-09-07 17:40:12 -0700962 ep0 = DK_ENTRIES(mp->ma_keys);
963 numentries = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400964 if (_PyDict_HasSplitTable(mp)) {
Victor Stinner742da042016-09-07 17:40:12 -0700965 for (i = 0; i < numentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400966 if ((value = mp->ma_values[i]) == NULL)
967 continue;
968 if (_PyObject_GC_MAY_BE_TRACKED(value)) {
Victor Stinner742da042016-09-07 17:40:12 -0700969 assert(!_PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key));
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400970 return;
971 }
972 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400974 else {
Victor Stinner742da042016-09-07 17:40:12 -0700975 for (i = 0; i < numentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400976 if ((value = ep0[i].me_value) == NULL)
977 continue;
978 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
979 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
980 return;
981 }
982 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000984}
985
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400986/* Internal function to find slot for an item from its hash
987 * when it is known that the key is not present in the dict.
988 */
Victor Stinner742da042016-09-07 17:40:12 -0700989static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400990find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Victor Stinner742da042016-09-07 17:40:12 -0700991 PyObject ***value_addr, Py_ssize_t *hashpos)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000992{
Victor Stinner742da042016-09-07 17:40:12 -0700993 size_t i, perturb;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400994 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700995 Py_ssize_t ix;
996 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000997
Victor Stinner742da042016-09-07 17:40:12 -0700998 assert(hashpos != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400999 assert(key != NULL);
1000 if (!PyUnicode_CheckExact(key))
1001 mp->ma_keys->dk_lookup = lookdict;
1002 i = hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -07001003 ix = dk_get_index(mp->ma_keys, i);
1004 for (perturb = hash; ix != DKIX_EMPTY; perturb >>= PERTURB_SHIFT) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001005 i = (i << 2) + i + perturb + 1;
Victor Stinner742da042016-09-07 17:40:12 -07001006 ix = dk_get_index(mp->ma_keys, i & mask);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 }
Victor Stinner742da042016-09-07 17:40:12 -07001008 ep = &ep0[mp->ma_keys->dk_nentries];
1009 *hashpos = i & mask;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001010 assert(ep->me_value == NULL);
1011 if (mp->ma_values)
Victor Stinner742da042016-09-07 17:40:12 -07001012 *value_addr = &mp->ma_values[ix];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001013 else
1014 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -07001015 return ix;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001016}
1017
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001018static int
1019insertion_resize(PyDictObject *mp)
1020{
Raymond Hettinger36f74aa2013-05-17 03:01:13 -07001021 return dictresize(mp, GROWTH_RATE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001022}
Antoine Pitroue965d972012-02-27 00:45:12 +01001023
1024/*
1025Internal routine to insert a new item into the table.
1026Used both by the internal resize routine and by the public insert routine.
Antoine Pitroue965d972012-02-27 00:45:12 +01001027Returns -1 if an error occurred, or 0 on success.
1028*/
1029static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001030insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001031{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001032 PyObject *old_value;
1033 PyObject **value_addr;
Victor Stinner742da042016-09-07 17:40:12 -07001034 PyDictKeyEntry *ep, *ep0;
1035 Py_ssize_t hashpos, ix;
Antoine Pitroue965d972012-02-27 00:45:12 +01001036
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001037 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
1038 if (insertion_resize(mp) < 0)
1039 return -1;
1040 }
1041
Victor Stinner742da042016-09-07 17:40:12 -07001042 ix = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr, &hashpos);
1043 if (ix == DKIX_ERROR) {
Antoine Pitroue965d972012-02-27 00:45:12 +01001044 return -1;
1045 }
Victor Stinner742da042016-09-07 17:40:12 -07001046
Antoine Pitroud6967322014-10-18 00:35:00 +02001047 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
Benjamin Petersona6f195e2012-04-30 10:23:40 -04001048 Py_INCREF(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001049 MAINTAIN_TRACKING(mp, key, value);
Victor Stinner742da042016-09-07 17:40:12 -07001050
1051 /* When insertion order is different from shared key, we can't share
1052 * the key anymore. Convert this instance to combine table.
1053 */
1054 if (_PyDict_HasSplitTable(mp) &&
1055 ((ix >= 0 && *value_addr == NULL && mp->ma_used != ix) ||
1056 (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {
1057 if (insertion_resize(mp) < 0) {
1058 Py_DECREF(value);
1059 return -1;
1060 }
1061 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
1062 ix = DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001063 }
Victor Stinner742da042016-09-07 17:40:12 -07001064
1065 if (ix == DKIX_EMPTY) {
1066 /* Insert into new slot. */
1067 if (mp->ma_keys->dk_usable <= 0) {
1068 /* Need to resize. */
1069 if (insertion_resize(mp) < 0) {
1070 Py_DECREF(value);
1071 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001072 }
Victor Stinner742da042016-09-07 17:40:12 -07001073 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
1074 }
1075 ep0 = DK_ENTRIES(mp->ma_keys);
1076 ep = &ep0[mp->ma_keys->dk_nentries];
1077 dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
1078 Py_INCREF(key);
1079 ep->me_key = key;
1080 ep->me_hash = hash;
1081 if (mp->ma_values) {
1082 assert (mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
1083 mp->ma_values[mp->ma_keys->dk_nentries] = value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001084 }
1085 else {
Victor Stinner742da042016-09-07 17:40:12 -07001086 ep->me_value = value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001087 }
1088 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001089 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07001090 mp->ma_keys->dk_usable--;
1091 mp->ma_keys->dk_nentries++;
1092 assert(mp->ma_keys->dk_usable >= 0);
1093 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001094 }
Victor Stinner742da042016-09-07 17:40:12 -07001095
1096 assert(value_addr != NULL);
1097
1098 old_value = *value_addr;
1099 if (old_value != NULL) {
1100 *value_addr = value;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001101 mp->ma_version_tag = DICT_NEXT_VERSION();
1102
Victor Stinner742da042016-09-07 17:40:12 -07001103 Py_DECREF(old_value); /* which **CAN** re-enter (see issue #22653) */
1104 return 0;
1105 }
1106
1107 /* pending state */
1108 assert(_PyDict_HasSplitTable(mp));
1109 assert(ix == mp->ma_used);
1110 *value_addr = value;
1111 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001112 mp->ma_version_tag = DICT_NEXT_VERSION();
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001113 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +01001114}
1115
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001116/*
1117Internal routine used by dictresize() to insert an item which is
1118known to be absent from the dict. This routine also assumes that
1119the dict contains no deleted entries. Besides the performance benefit,
1120using insertdict() in dictresize() is dangerous (SF bug #1456209).
1121Note that no refcounts are changed by this routine; if needed, the caller
1122is responsible for incref'ing `key` and `value`.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001123Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
1124must set them correctly
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001125*/
1126static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001127insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001129{
Victor Stinner742da042016-09-07 17:40:12 -07001130 size_t i, perturb;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001131 PyDictKeysObject *k = mp->ma_keys;
1132 size_t mask = (size_t)DK_SIZE(k)-1;
Victor Stinner742da042016-09-07 17:40:12 -07001133 PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001134 PyDictKeyEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001135
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001136 assert(k->dk_lookup != NULL);
1137 assert(value != NULL);
1138 assert(key != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001139 assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
1140 i = hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -07001141 for (perturb = hash; dk_get_index(k, i) != DKIX_EMPTY;
1142 perturb >>= PERTURB_SHIFT) {
1143 i = mask & ((i << 2) + i + perturb + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 }
Victor Stinner742da042016-09-07 17:40:12 -07001145 ep = &ep0[k->dk_nentries];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 assert(ep->me_value == NULL);
Victor Stinner742da042016-09-07 17:40:12 -07001147 dk_set_index(k, i, k->dk_nentries);
1148 k->dk_nentries++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001150 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001152}
1153
1154/*
1155Restructure the table by allocating a new table and reinserting all
1156items again. When entries have been deleted, the new table may
1157actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001158If a table is split (its keys and hashes are shared, its values are not),
1159then the values are temporarily copied into the table, it is resized as
1160a combined table, then the me_value slots in the old table are NULLed out.
1161After resizing a table is always combined,
1162but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001163*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001164static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001165dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001166{
Victor Stinner742da042016-09-07 17:40:12 -07001167 Py_ssize_t i, newsize;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001168 PyDictKeysObject *oldkeys;
1169 PyObject **oldvalues;
Victor Stinner742da042016-09-07 17:40:12 -07001170 PyDictKeyEntry *ep0;
Tim Peters91a364d2001-05-19 07:04:38 +00001171
Victor Stinner742da042016-09-07 17:40:12 -07001172 /* Find the smallest table size > minused. */
1173 for (newsize = PyDict_MINSIZE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 newsize <= minused && newsize > 0;
1175 newsize <<= 1)
1176 ;
1177 if (newsize <= 0) {
1178 PyErr_NoMemory();
1179 return -1;
1180 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001181 oldkeys = mp->ma_keys;
1182 oldvalues = mp->ma_values;
1183 /* Allocate a new table. */
1184 mp->ma_keys = new_keys_object(newsize);
1185 if (mp->ma_keys == NULL) {
1186 mp->ma_keys = oldkeys;
1187 return -1;
1188 }
1189 if (oldkeys->dk_lookup == lookdict)
1190 mp->ma_keys->dk_lookup = lookdict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001191 mp->ma_values = NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001192 ep0 = DK_ENTRIES(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001193 /* Main loop below assumes we can transfer refcount to new keys
1194 * and that value is stored in me_value.
1195 * Increment ref-counts and copy values here to compensate
1196 * This (resizing a split table) should be relatively rare */
1197 if (oldvalues != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001198 for (i = 0; i < oldkeys->dk_nentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001199 if (oldvalues[i] != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001200 Py_INCREF(ep0[i].me_key);
1201 ep0[i].me_value = oldvalues[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 }
1204 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001205 /* Main loop */
Victor Stinner742da042016-09-07 17:40:12 -07001206 for (i = 0; i < oldkeys->dk_nentries; i++) {
1207 PyDictKeyEntry *ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001208 if (ep->me_value != NULL) {
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001209 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001212 mp->ma_keys->dk_usable -= mp->ma_used;
1213 if (oldvalues != NULL) {
1214 /* NULL out me_value slot in oldkeys, in case it was shared */
Victor Stinner742da042016-09-07 17:40:12 -07001215 for (i = 0; i < oldkeys->dk_nentries; i++)
1216 ep0[i].me_value = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001217 DK_DECREF(oldkeys);
Victor Stinner742da042016-09-07 17:40:12 -07001218 if (oldvalues != empty_values) {
1219 free_values(oldvalues);
1220 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001221 }
1222 else {
1223 assert(oldkeys->dk_lookup != lookdict_split);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001224 assert(oldkeys->dk_refcnt == 1);
Raymond Hettingerce5179f2016-01-31 08:56:21 -08001225 DK_DEBUG_DECREF PyObject_FREE(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001226 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001228}
1229
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001230/* Returns NULL if unable to split table.
1231 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001232static PyDictKeysObject *
1233make_keys_shared(PyObject *op)
1234{
1235 Py_ssize_t i;
1236 Py_ssize_t size;
1237 PyDictObject *mp = (PyDictObject *)op;
1238
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001239 if (!PyDict_CheckExact(op))
1240 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001241 if (!_PyDict_HasSplitTable(mp)) {
1242 PyDictKeyEntry *ep0;
1243 PyObject **values;
1244 assert(mp->ma_keys->dk_refcnt == 1);
1245 if (mp->ma_keys->dk_lookup == lookdict) {
1246 return NULL;
1247 }
1248 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
1249 /* Remove dummy keys */
1250 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
1251 return NULL;
1252 }
1253 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
1254 /* Copy values into a new array */
Victor Stinner742da042016-09-07 17:40:12 -07001255 ep0 = DK_ENTRIES(mp->ma_keys);
1256 size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001257 values = new_values(size);
1258 if (values == NULL) {
1259 PyErr_SetString(PyExc_MemoryError,
1260 "Not enough memory to allocate new values array");
1261 return NULL;
1262 }
1263 for (i = 0; i < size; i++) {
1264 values[i] = ep0[i].me_value;
1265 ep0[i].me_value = NULL;
1266 }
1267 mp->ma_keys->dk_lookup = lookdict_split;
1268 mp->ma_values = values;
1269 }
1270 DK_INCREF(mp->ma_keys);
1271 return mp->ma_keys;
1272}
Christian Heimes99170a52007-12-19 02:07:34 +00001273
1274PyObject *
1275_PyDict_NewPresized(Py_ssize_t minused)
1276{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001277 Py_ssize_t newsize;
1278 PyDictKeysObject *new_keys;
Victor Stinner742da042016-09-07 17:40:12 -07001279 for (newsize = PyDict_MINSIZE;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001280 newsize <= minused && newsize > 0;
1281 newsize <<= 1)
1282 ;
1283 new_keys = new_keys_object(newsize);
1284 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001286 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001287}
1288
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001289/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1290 * that may occur (originally dicts supported only string keys, and exceptions
1291 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001292 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001293 * (suppressed) occurred while computing the key's hash, or that some error
1294 * (suppressed) occurred when comparing keys in the dict's internal probe
1295 * sequence. A nasty example of the latter is when a Python-coded comparison
1296 * function hits a stack-depth error, which can cause this to return NULL
1297 * even if the key is present.
1298 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001299PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001300PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001301{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001302 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001303 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 PyDictObject *mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001306 PyObject **value_addr;
1307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 if (!PyDict_Check(op))
1309 return NULL;
1310 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001311 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 {
1313 hash = PyObject_Hash(key);
1314 if (hash == -1) {
1315 PyErr_Clear();
1316 return NULL;
1317 }
1318 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 /* We can arrive here with a NULL tstate during initialization: try
1321 running "python -Wi" for an example related to string interning.
1322 Let's just hope that no exception occurs then... This must be
1323 _PyThreadState_Current and not PyThreadState_GET() because in debug
1324 mode, the latter complains if tstate is NULL. */
Victor Stinnerbfd316e2016-01-20 11:12:38 +01001325 tstate = _PyThreadState_UncheckedGet();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 if (tstate != NULL && tstate->curexc_type != NULL) {
1327 /* preserve the existing exception */
1328 PyObject *err_type, *err_value, *err_tb;
1329 PyErr_Fetch(&err_type, &err_value, &err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001330 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 /* ignore errors */
1332 PyErr_Restore(err_type, err_value, err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001333 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 return NULL;
1335 }
1336 else {
Victor Stinner742da042016-09-07 17:40:12 -07001337 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1338 if (ix < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 PyErr_Clear();
1340 return NULL;
1341 }
1342 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001343 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001344}
1345
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001346PyObject *
1347_PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1348{
Victor Stinner742da042016-09-07 17:40:12 -07001349 Py_ssize_t ix;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001350 PyDictObject *mp = (PyDictObject *)op;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001351 PyThreadState *tstate;
1352 PyObject **value_addr;
1353
1354 if (!PyDict_Check(op))
1355 return NULL;
1356
1357 /* We can arrive here with a NULL tstate during initialization: try
1358 running "python -Wi" for an example related to string interning.
1359 Let's just hope that no exception occurs then... This must be
1360 _PyThreadState_Current and not PyThreadState_GET() because in debug
1361 mode, the latter complains if tstate is NULL. */
Victor Stinnerbfd316e2016-01-20 11:12:38 +01001362 tstate = _PyThreadState_UncheckedGet();
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001363 if (tstate != NULL && tstate->curexc_type != NULL) {
1364 /* preserve the existing exception */
1365 PyObject *err_type, *err_value, *err_tb;
1366 PyErr_Fetch(&err_type, &err_value, &err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001367 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001368 /* ignore errors */
1369 PyErr_Restore(err_type, err_value, err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001370 if (ix == DKIX_EMPTY)
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001371 return NULL;
1372 }
1373 else {
Victor Stinner742da042016-09-07 17:40:12 -07001374 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1375 if (ix == DKIX_EMPTY) {
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001376 PyErr_Clear();
1377 return NULL;
1378 }
1379 }
1380 return *value_addr;
1381}
1382
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001383/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1384 This returns NULL *with* an exception set if an exception occurred.
1385 It returns NULL *without* an exception set if the key wasn't present.
1386*/
1387PyObject *
1388PyDict_GetItemWithError(PyObject *op, PyObject *key)
1389{
Victor Stinner742da042016-09-07 17:40:12 -07001390 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001391 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001393 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 if (!PyDict_Check(op)) {
1396 PyErr_BadInternalCall();
1397 return NULL;
1398 }
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 return NULL;
1405 }
1406 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001407
Victor Stinner742da042016-09-07 17:40:12 -07001408 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1409 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001411 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001412}
1413
Brett Cannonfd074152012-04-14 14:10:13 -04001414PyObject *
1415_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1416{
1417 PyObject *kv;
1418 kv = _PyUnicode_FromId(key); /* borrowed */
1419 if (kv == NULL)
1420 return NULL;
1421 return PyDict_GetItemWithError(dp, kv);
1422}
1423
Victor Stinnerb4efc962015-11-20 09:24:02 +01001424/* Fast version of global value lookup (LOAD_GLOBAL).
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001425 * Lookup in globals, then builtins.
Victor Stinnerb4efc962015-11-20 09:24:02 +01001426 *
1427 * Raise an exception and return NULL if an error occurred (ex: computing the
1428 * key hash failed, key comparison failed, ...). Return NULL if the key doesn't
1429 * exist. Return the value if the key exists.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001430 */
1431PyObject *
1432_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001433{
Victor Stinner742da042016-09-07 17:40:12 -07001434 Py_ssize_t ix;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001435 Py_hash_t hash;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001436 PyObject **value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001437
1438 if (!PyUnicode_CheckExact(key) ||
1439 (hash = ((PyASCIIObject *) key)->hash) == -1)
1440 {
1441 hash = PyObject_Hash(key);
1442 if (hash == -1)
1443 return NULL;
Antoine Pitroue965d972012-02-27 00:45:12 +01001444 }
Victor Stinnerb4efc962015-11-20 09:24:02 +01001445
1446 /* namespace 1: globals */
Victor Stinner742da042016-09-07 17:40:12 -07001447 ix = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr, NULL);
1448 if (ix == DKIX_ERROR)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001449 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001450 if (ix != DKIX_EMPTY && *value_addr != NULL)
1451 return *value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001452
1453 /* namespace 2: builtins */
Victor Stinner742da042016-09-07 17:40:12 -07001454 ix = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr, NULL);
1455 if (ix < 0)
Victor Stinnerb4efc962015-11-20 09:24:02 +01001456 return NULL;
1457 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001458}
1459
Antoine Pitroue965d972012-02-27 00:45:12 +01001460/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1461 * dictionary if it's merely replacing the value for an existing key.
1462 * This means that it's safe to loop over a dictionary with PyDict_Next()
1463 * and occasionally replace a value -- but you can't insert new keys or
1464 * remove them.
1465 */
1466int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001467PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001468{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001469 PyDictObject *mp;
1470 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001471 if (!PyDict_Check(op)) {
1472 PyErr_BadInternalCall();
1473 return -1;
1474 }
1475 assert(key);
1476 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001477 mp = (PyDictObject *)op;
1478 if (!PyUnicode_CheckExact(key) ||
1479 (hash = ((PyASCIIObject *) key)->hash) == -1)
1480 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001481 hash = PyObject_Hash(key);
1482 if (hash == -1)
1483 return -1;
1484 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001485
1486 /* insertdict() handles any resizing that might be necessary */
1487 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001488}
1489
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001490int
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001491_PyDict_SetItem_KnownHash(PyObject *op, PyObject *key, PyObject *value,
1492 Py_hash_t hash)
1493{
1494 PyDictObject *mp;
1495
1496 if (!PyDict_Check(op)) {
1497 PyErr_BadInternalCall();
1498 return -1;
1499 }
1500 assert(key);
1501 assert(value);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001502 assert(hash != -1);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001503 mp = (PyDictObject *)op;
1504
1505 /* insertdict() handles any resizing that might be necessary */
1506 return insertdict(mp, key, hash, value);
1507}
1508
1509int
Tim Peters1f5871e2000-07-04 17:44:48 +00001510PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001511{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001512 Py_hash_t hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 assert(key);
1515 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001516 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 hash = PyObject_Hash(key);
1518 if (hash == -1)
1519 return -1;
1520 }
Victor Stinner742da042016-09-07 17:40:12 -07001521
1522 return _PyDict_DelItem_KnownHash(op, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001523}
1524
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001525int
1526_PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1527{
Victor Stinner742da042016-09-07 17:40:12 -07001528 Py_ssize_t hashpos, ix;
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001529 PyDictObject *mp;
1530 PyDictKeyEntry *ep;
1531 PyObject *old_key, *old_value;
1532 PyObject **value_addr;
1533
1534 if (!PyDict_Check(op)) {
1535 PyErr_BadInternalCall();
1536 return -1;
1537 }
1538 assert(key);
1539 assert(hash != -1);
1540 mp = (PyDictObject *)op;
Victor Stinner742da042016-09-07 17:40:12 -07001541 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1542 if (ix == DKIX_ERROR)
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001543 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07001544 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001545 _PyErr_SetKeyError(key);
1546 return -1;
1547 }
Victor Stinner742da042016-09-07 17:40:12 -07001548 assert(dk_get_index(mp->ma_keys, hashpos) == ix);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001549 old_value = *value_addr;
1550 *value_addr = NULL;
1551 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001552 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07001553 if (_PyDict_HasSplitTable(mp)) {
1554 mp->ma_keys->dk_usable = 0;
1555 }
1556 else {
1557 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1558 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001559 ENSURE_ALLOWS_DELETIONS(mp);
1560 old_key = ep->me_key;
Victor Stinner742da042016-09-07 17:40:12 -07001561 ep->me_key = NULL;
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001562 Py_DECREF(old_key);
1563 }
1564 Py_DECREF(old_value);
1565 return 0;
1566}
1567
Guido van Rossum25831651993-05-19 14:50:45 +00001568void
Tim Peters1f5871e2000-07-04 17:44:48 +00001569PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001570{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001572 PyDictKeysObject *oldkeys;
1573 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 if (!PyDict_Check(op))
1577 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001578 mp = ((PyDictObject *)op);
1579 oldkeys = mp->ma_keys;
1580 oldvalues = mp->ma_values;
1581 if (oldvalues == empty_values)
1582 return;
1583 /* Empty the dict... */
1584 DK_INCREF(Py_EMPTY_KEYS);
1585 mp->ma_keys = Py_EMPTY_KEYS;
1586 mp->ma_values = empty_values;
1587 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001588 mp->ma_version_tag = DICT_NEXT_VERSION();
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001589 /* ...then clear the keys and values */
1590 if (oldvalues != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001591 n = oldkeys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001592 for (i = 0; i < n; i++)
1593 Py_CLEAR(oldvalues[i]);
1594 free_values(oldvalues);
1595 DK_DECREF(oldkeys);
1596 }
1597 else {
1598 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001599 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001600 }
1601}
1602
1603/* Returns -1 if no more items (or op is not a dict),
1604 * index of item otherwise. Stores value in pvalue
1605 */
Benjamin Peterson73222252016-09-08 09:58:47 -07001606static inline Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001607dict_next(PyObject *op, Py_ssize_t i, PyObject **pvalue)
1608{
Victor Stinner742da042016-09-07 17:40:12 -07001609 Py_ssize_t n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001610 PyDictObject *mp;
Victor Stinner742da042016-09-07 17:40:12 -07001611 PyObject **value_ptr = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001612
1613 if (!PyDict_Check(op))
1614 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001616 if (i < 0)
1617 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07001618
1619 n = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001620 if (mp->ma_values) {
Victor Stinner742da042016-09-07 17:40:12 -07001621 for (; i < n; i++) {
1622 value_ptr = &mp->ma_values[i];
1623 if (*value_ptr != NULL)
1624 break;
1625 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001627 else {
Victor Stinner742da042016-09-07 17:40:12 -07001628 PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys);
1629 for (; i < n; i++) {
1630 value_ptr = &ep0[i].me_value;
1631 if (*value_ptr != NULL)
1632 break;
1633 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 }
Victor Stinner742da042016-09-07 17:40:12 -07001635 if (i >= n)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001636 return -1;
1637 if (pvalue)
1638 *pvalue = *value_ptr;
1639 return i;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001640}
1641
Tim Peters080c88b2003-02-15 03:01:11 +00001642/*
1643 * Iterate over a dict. Use like so:
1644 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001645 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001646 * PyObject *key, *value;
1647 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001648 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +00001649 * Refer to borrowed references in key and value.
1650 * }
1651 *
1652 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001653 * mutates the dict. One exception: it is safe if the loop merely changes
1654 * the values associated with the keys (but doesn't insert new keys or
1655 * delete keys), via PyDict_SetItem().
1656 */
Guido van Rossum25831651993-05-19 14:50:45 +00001657int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001658PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001659{
Victor Stinner742da042016-09-07 17:40:12 -07001660 PyDictObject *mp = (PyDictObject*)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001661 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 if (i < 0)
1663 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001664 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 *ppos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 if (pkey)
Victor Stinner742da042016-09-07 17:40:12 -07001667 *pkey = DK_ENTRIES(mp->ma_keys)[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001669}
1670
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001671/* Internal version of PyDict_Next that returns a hash value in addition
1672 * to the key and value.
1673 */
Thomas Wouterscf297e42007-02-23 15:07:44 +00001674int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001675_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1676 PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001677{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001678 PyDictObject *mp;
Victor Stinner742da042016-09-07 17:40:12 -07001679 PyDictKeyEntry *ep0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001680 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 if (i < 0)
1682 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001683 mp = (PyDictObject *)op;
Victor Stinner742da042016-09-07 17:40:12 -07001684 ep0 = DK_ENTRIES(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 *ppos = i+1;
Victor Stinner742da042016-09-07 17:40:12 -07001686 *phash = ep0[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 if (pkey)
Victor Stinner742da042016-09-07 17:40:12 -07001688 *pkey = ep0[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001690}
1691
Eric Snow96c6af92015-05-29 22:21:39 -06001692/* Internal version of dict.pop(). */
1693PyObject *
1694_PyDict_Pop(PyDictObject *mp, PyObject *key, PyObject *deflt)
1695{
1696 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001697 Py_ssize_t ix, hashpos;
Eric Snow96c6af92015-05-29 22:21:39 -06001698 PyObject *old_value, *old_key;
1699 PyDictKeyEntry *ep;
1700 PyObject **value_addr;
1701
1702 if (mp->ma_used == 0) {
1703 if (deflt) {
1704 Py_INCREF(deflt);
1705 return deflt;
1706 }
1707 _PyErr_SetKeyError(key);
1708 return NULL;
1709 }
1710 if (!PyUnicode_CheckExact(key) ||
1711 (hash = ((PyASCIIObject *) key)->hash) == -1) {
1712 hash = PyObject_Hash(key);
1713 if (hash == -1)
1714 return NULL;
1715 }
Victor Stinner742da042016-09-07 17:40:12 -07001716 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1717 if (ix == DKIX_ERROR)
Eric Snow96c6af92015-05-29 22:21:39 -06001718 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001719 if (ix == DKIX_EMPTY) {
Eric Snow96c6af92015-05-29 22:21:39 -06001720 if (deflt) {
1721 Py_INCREF(deflt);
1722 return deflt;
1723 }
1724 _PyErr_SetKeyError(key);
1725 return NULL;
1726 }
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001727
Victor Stinner742da042016-09-07 17:40:12 -07001728 old_value = *value_addr;
Eric Snow96c6af92015-05-29 22:21:39 -06001729 *value_addr = NULL;
1730 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001731 mp->ma_version_tag = DICT_NEXT_VERSION();
Eric Snow96c6af92015-05-29 22:21:39 -06001732 if (!_PyDict_HasSplitTable(mp)) {
Victor Stinner742da042016-09-07 17:40:12 -07001733 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1734 ep = &DK_ENTRIES(mp->ma_keys)[ix];
Eric Snow96c6af92015-05-29 22:21:39 -06001735 ENSURE_ALLOWS_DELETIONS(mp);
1736 old_key = ep->me_key;
Victor Stinner742da042016-09-07 17:40:12 -07001737 ep->me_key = NULL;
Eric Snow96c6af92015-05-29 22:21:39 -06001738 Py_DECREF(old_key);
1739 }
1740 return old_value;
1741}
1742
1743/* Internal version of dict.from_keys(). It is subclass-friendly. */
1744PyObject *
1745_PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
1746{
1747 PyObject *it; /* iter(iterable) */
1748 PyObject *key;
1749 PyObject *d;
1750 int status;
1751
1752 d = PyObject_CallObject(cls, NULL);
1753 if (d == NULL)
1754 return NULL;
1755
1756 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
1757 if (PyDict_CheckExact(iterable)) {
1758 PyDictObject *mp = (PyDictObject *)d;
1759 PyObject *oldvalue;
1760 Py_ssize_t pos = 0;
1761 PyObject *key;
1762 Py_hash_t hash;
1763
Victor Stinner742da042016-09-07 17:40:12 -07001764 if (dictresize(mp, ESTIMATE_SIZE(Py_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001765 Py_DECREF(d);
1766 return NULL;
1767 }
1768
1769 while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) {
1770 if (insertdict(mp, key, hash, value)) {
1771 Py_DECREF(d);
1772 return NULL;
1773 }
1774 }
1775 return d;
1776 }
1777 if (PyAnySet_CheckExact(iterable)) {
1778 PyDictObject *mp = (PyDictObject *)d;
1779 Py_ssize_t pos = 0;
1780 PyObject *key;
1781 Py_hash_t hash;
1782
Victor Stinner742da042016-09-07 17:40:12 -07001783 if (dictresize(mp, ESTIMATE_SIZE(PySet_GET_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001784 Py_DECREF(d);
1785 return NULL;
1786 }
1787
1788 while (_PySet_NextEntry(iterable, &pos, &key, &hash)) {
1789 if (insertdict(mp, key, hash, value)) {
1790 Py_DECREF(d);
1791 return NULL;
1792 }
1793 }
1794 return d;
1795 }
1796 }
1797
1798 it = PyObject_GetIter(iterable);
1799 if (it == NULL){
1800 Py_DECREF(d);
1801 return NULL;
1802 }
1803
1804 if (PyDict_CheckExact(d)) {
1805 while ((key = PyIter_Next(it)) != NULL) {
1806 status = PyDict_SetItem(d, key, value);
1807 Py_DECREF(key);
1808 if (status < 0)
1809 goto Fail;
1810 }
1811 } else {
1812 while ((key = PyIter_Next(it)) != NULL) {
1813 status = PyObject_SetItem(d, key, value);
1814 Py_DECREF(key);
1815 if (status < 0)
1816 goto Fail;
1817 }
1818 }
1819
1820 if (PyErr_Occurred())
1821 goto Fail;
1822 Py_DECREF(it);
1823 return d;
1824
1825Fail:
1826 Py_DECREF(it);
1827 Py_DECREF(d);
1828 return NULL;
1829}
1830
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001831/* Methods */
1832
1833static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001834dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001835{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001836 PyObject **values = mp->ma_values;
1837 PyDictKeysObject *keys = mp->ma_keys;
1838 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 PyObject_GC_UnTrack(mp);
1840 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001841 if (values != NULL) {
1842 if (values != empty_values) {
Victor Stinner742da042016-09-07 17:40:12 -07001843 for (i = 0, n = mp->ma_keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001844 Py_XDECREF(values[i]);
1845 }
1846 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001848 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02001850 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001851 assert(keys->dk_refcnt == 1);
1852 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001853 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1855 free_list[numfree++] = mp;
1856 else
1857 Py_TYPE(mp)->tp_free((PyObject *)mp);
1858 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001859}
1860
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001861
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001862static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001863dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001864{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001866 PyObject *key = NULL, *value = NULL;
1867 _PyUnicodeWriter writer;
1868 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00001869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 i = Py_ReprEnter((PyObject *)mp);
1871 if (i != 0) {
1872 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1873 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001876 Py_ReprLeave((PyObject *)mp);
1877 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 }
Tim Petersa7259592001-06-16 05:11:17 +00001879
Victor Stinnerf91929b2013-11-19 13:07:38 +01001880 _PyUnicodeWriter_Init(&writer);
1881 writer.overallocate = 1;
1882 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
1883 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00001884
Victor Stinnerf91929b2013-11-19 13:07:38 +01001885 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
1886 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 /* Do repr() on each key+value pair, and insert ": " between them.
1889 Note that repr may mutate the dict. */
1890 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001891 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001893 PyObject *s;
1894 int res;
1895
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001896 /* Prevent repr from deleting key or value during key format. */
1897 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02001899
Victor Stinnerf91929b2013-11-19 13:07:38 +01001900 if (!first) {
1901 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
1902 goto error;
1903 }
1904 first = 0;
1905
1906 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01001908 goto error;
1909 res = _PyUnicodeWriter_WriteStr(&writer, s);
1910 Py_DECREF(s);
1911 if (res < 0)
1912 goto error;
1913
1914 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
1915 goto error;
1916
1917 s = PyObject_Repr(value);
1918 if (s == NULL)
1919 goto error;
1920 res = _PyUnicodeWriter_WriteStr(&writer, s);
1921 Py_DECREF(s);
1922 if (res < 0)
1923 goto error;
1924
1925 Py_CLEAR(key);
1926 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 }
Tim Petersa7259592001-06-16 05:11:17 +00001928
Victor Stinnerf91929b2013-11-19 13:07:38 +01001929 writer.overallocate = 0;
1930 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
1931 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01001934
1935 return _PyUnicodeWriter_Finish(&writer);
1936
1937error:
1938 Py_ReprLeave((PyObject *)mp);
1939 _PyUnicodeWriter_Dealloc(&writer);
1940 Py_XDECREF(key);
1941 Py_XDECREF(value);
1942 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001943}
1944
Martin v. Löwis18e16552006-02-15 17:27:45 +00001945static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001946dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001949}
1950
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001951static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001952dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 PyObject *v;
Victor Stinner742da042016-09-07 17:40:12 -07001955 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001956 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001957 PyObject **value_addr;
1958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001960 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 hash = PyObject_Hash(key);
1962 if (hash == -1)
1963 return NULL;
1964 }
Victor Stinner742da042016-09-07 17:40:12 -07001965 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1966 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001967 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001968 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 if (!PyDict_CheckExact(mp)) {
1970 /* Look up __missing__ method if we're a subclass. */
1971 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05001972 _Py_IDENTIFIER(__missing__);
1973 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 if (missing != NULL) {
1975 res = PyObject_CallFunctionObjArgs(missing,
1976 key, NULL);
1977 Py_DECREF(missing);
1978 return res;
1979 }
1980 else if (PyErr_Occurred())
1981 return NULL;
1982 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07001983 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 return NULL;
1985 }
Victor Stinner742da042016-09-07 17:40:12 -07001986 v = *value_addr;
1987 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001989}
1990
1991static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001992dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001993{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 if (w == NULL)
1995 return PyDict_DelItem((PyObject *)mp, v);
1996 else
1997 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001998}
1999
Guido van Rossuma9e7a811997-05-13 21:02:11 +00002000static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 (lenfunc)dict_length, /*mp_length*/
2002 (binaryfunc)dict_subscript, /*mp_subscript*/
2003 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002004};
2005
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002006static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002007dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002008{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002009 PyObject *v;
2010 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002011 PyDictKeyEntry *ep;
2012 Py_ssize_t size, n, offset;
2013 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002014
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002015 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 n = mp->ma_used;
2017 v = PyList_New(n);
2018 if (v == NULL)
2019 return NULL;
2020 if (n != mp->ma_used) {
2021 /* Durnit. The allocations caused the dict to resize.
2022 * Just start over, this shouldn't normally happen.
2023 */
2024 Py_DECREF(v);
2025 goto again;
2026 }
Victor Stinner742da042016-09-07 17:40:12 -07002027 ep = DK_ENTRIES(mp->ma_keys);
2028 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002029 if (mp->ma_values) {
2030 value_ptr = mp->ma_values;
2031 offset = sizeof(PyObject *);
2032 }
2033 else {
2034 value_ptr = &ep[0].me_value;
2035 offset = sizeof(PyDictKeyEntry);
2036 }
2037 for (i = 0, j = 0; i < size; i++) {
2038 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 PyObject *key = ep[i].me_key;
2040 Py_INCREF(key);
2041 PyList_SET_ITEM(v, j, key);
2042 j++;
2043 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002044 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 }
2046 assert(j == n);
2047 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002048}
2049
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002050static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002051dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002052{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002053 PyObject *v;
2054 Py_ssize_t i, j;
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002055 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002056 Py_ssize_t size, n, offset;
2057 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002058
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002059 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 n = mp->ma_used;
2061 v = PyList_New(n);
2062 if (v == NULL)
2063 return NULL;
2064 if (n != mp->ma_used) {
2065 /* Durnit. The allocations caused the dict to resize.
2066 * Just start over, this shouldn't normally happen.
2067 */
2068 Py_DECREF(v);
2069 goto again;
2070 }
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002071 ep = DK_ENTRIES(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002072 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002073 if (mp->ma_values) {
2074 value_ptr = mp->ma_values;
2075 offset = sizeof(PyObject *);
2076 }
2077 else {
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002078 value_ptr = &ep[0].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002079 offset = sizeof(PyDictKeyEntry);
2080 }
2081 for (i = 0, j = 0; i < size; i++) {
2082 PyObject *value = *value_ptr;
2083 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2084 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 Py_INCREF(value);
2086 PyList_SET_ITEM(v, j, value);
2087 j++;
2088 }
2089 }
2090 assert(j == n);
2091 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002092}
2093
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002094static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002095dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002096{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002097 PyObject *v;
2098 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002099 Py_ssize_t size, offset;
2100 PyObject *item, *key;
2101 PyDictKeyEntry *ep;
2102 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 /* Preallocate the list of tuples, to avoid allocations during
2105 * the loop over the items, which could trigger GC, which
2106 * could resize the dict. :-(
2107 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002108 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 n = mp->ma_used;
2110 v = PyList_New(n);
2111 if (v == NULL)
2112 return NULL;
2113 for (i = 0; i < n; i++) {
2114 item = PyTuple_New(2);
2115 if (item == NULL) {
2116 Py_DECREF(v);
2117 return NULL;
2118 }
2119 PyList_SET_ITEM(v, i, item);
2120 }
2121 if (n != mp->ma_used) {
2122 /* Durnit. The allocations caused the dict to resize.
2123 * Just start over, this shouldn't normally happen.
2124 */
2125 Py_DECREF(v);
2126 goto again;
2127 }
2128 /* Nothing we do below makes any function calls. */
Victor Stinner742da042016-09-07 17:40:12 -07002129 ep = DK_ENTRIES(mp->ma_keys);
2130 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002131 if (mp->ma_values) {
2132 value_ptr = mp->ma_values;
2133 offset = sizeof(PyObject *);
2134 }
2135 else {
2136 value_ptr = &ep[0].me_value;
2137 offset = sizeof(PyDictKeyEntry);
2138 }
2139 for (i = 0, j = 0; i < size; i++) {
2140 PyObject *value = *value_ptr;
2141 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2142 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 key = ep[i].me_key;
2144 item = PyList_GET_ITEM(v, j);
2145 Py_INCREF(key);
2146 PyTuple_SET_ITEM(item, 0, key);
2147 Py_INCREF(value);
2148 PyTuple_SET_ITEM(item, 1, value);
2149 j++;
2150 }
2151 }
2152 assert(j == n);
2153 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002154}
2155
Larry Hastings5c661892014-01-24 06:17:25 -08002156/*[clinic input]
2157@classmethod
2158dict.fromkeys
Larry Hastings5c661892014-01-24 06:17:25 -08002159 iterable: object
2160 value: object=None
2161 /
2162
2163Returns a new dict with keys from iterable and values equal to value.
2164[clinic start generated code]*/
2165
Larry Hastings5c661892014-01-24 06:17:25 -08002166static PyObject *
2167dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002168/*[clinic end generated code: output=8fb98e4b10384999 input=b85a667f9bf4669d]*/
Larry Hastings5c661892014-01-24 06:17:25 -08002169{
Eric Snow96c6af92015-05-29 22:21:39 -06002170 return _PyDict_FromKeys((PyObject *)type, iterable, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002171}
2172
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002173static int
Victor Stinner742da042016-09-07 17:40:12 -07002174dict_update_common(PyObject *self, PyObject *args, PyObject *kwds,
2175 const char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 PyObject *arg = NULL;
2178 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
2181 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002184 _Py_IDENTIFIER(keys);
2185 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 result = PyDict_Merge(self, arg, 1);
2187 else
2188 result = PyDict_MergeFromSeq2(self, arg, 1);
2189 }
2190 if (result == 0 && kwds != NULL) {
2191 if (PyArg_ValidateKeywordArguments(kwds))
2192 result = PyDict_Merge(self, kwds, 1);
2193 else
2194 result = -1;
2195 }
2196 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002197}
2198
2199static PyObject *
2200dict_update(PyObject *self, PyObject *args, PyObject *kwds)
2201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 if (dict_update_common(self, args, kwds, "update") != -1)
2203 Py_RETURN_NONE;
2204 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002205}
2206
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002207/* Update unconditionally replaces existing items.
2208 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00002209 otherwise it leaves existing items unchanged.
2210
2211 PyDict_{Update,Merge} update/merge from a mapping object.
2212
Tim Petersf582b822001-12-11 18:51:08 +00002213 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00002214 producing iterable objects of length 2.
2215*/
2216
Tim Petersf582b822001-12-11 18:51:08 +00002217int
Tim Peters1fc240e2001-10-26 05:06:50 +00002218PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
2219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002220 PyObject *it; /* iter(seq2) */
2221 Py_ssize_t i; /* index into seq2 of current element */
2222 PyObject *item; /* seq2[i] */
2223 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00002224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 assert(d != NULL);
2226 assert(PyDict_Check(d));
2227 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00002228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 it = PyObject_GetIter(seq2);
2230 if (it == NULL)
2231 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 for (i = 0; ; ++i) {
2234 PyObject *key, *value;
2235 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00002236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 fast = NULL;
2238 item = PyIter_Next(it);
2239 if (item == NULL) {
2240 if (PyErr_Occurred())
2241 goto Fail;
2242 break;
2243 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 /* Convert item to sequence, and verify length 2. */
2246 fast = PySequence_Fast(item, "");
2247 if (fast == NULL) {
2248 if (PyErr_ExceptionMatches(PyExc_TypeError))
2249 PyErr_Format(PyExc_TypeError,
2250 "cannot convert dictionary update "
2251 "sequence element #%zd to a sequence",
2252 i);
2253 goto Fail;
2254 }
2255 n = PySequence_Fast_GET_SIZE(fast);
2256 if (n != 2) {
2257 PyErr_Format(PyExc_ValueError,
2258 "dictionary update sequence element #%zd "
2259 "has length %zd; 2 is required",
2260 i, n);
2261 goto Fail;
2262 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 /* Update/merge with this (key, value) pair. */
2265 key = PySequence_Fast_GET_ITEM(fast, 0);
2266 value = PySequence_Fast_GET_ITEM(fast, 1);
2267 if (override || PyDict_GetItem(d, key) == NULL) {
2268 int status = PyDict_SetItem(d, key, value);
2269 if (status < 0)
2270 goto Fail;
2271 }
2272 Py_DECREF(fast);
2273 Py_DECREF(item);
2274 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 i = 0;
2277 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00002278Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 Py_XDECREF(item);
2280 Py_XDECREF(fast);
2281 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002282Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 Py_DECREF(it);
2284 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00002285}
2286
Tim Peters6d6c1a32001-08-02 04:15:00 +00002287int
2288PyDict_Update(PyObject *a, PyObject *b)
2289{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002291}
2292
2293int
2294PyDict_Merge(PyObject *a, PyObject *b, int override)
2295{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002296 PyDictObject *mp, *other;
2297 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -07002298 PyDictKeyEntry *entry, *ep0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 /* We accept for the argument either a concrete dictionary object,
2301 * or an abstract "mapping" object. For the former, we can do
2302 * things quite efficiently. For the latter, we only require that
2303 * PyMapping_Keys() and PyObject_GetItem() be supported.
2304 */
2305 if (a == NULL || !PyDict_Check(a) || b == NULL) {
2306 PyErr_BadInternalCall();
2307 return -1;
2308 }
2309 mp = (PyDictObject*)a;
2310 if (PyDict_Check(b)) {
2311 other = (PyDictObject*)b;
2312 if (other == mp || other->ma_used == 0)
2313 /* a.update(a) or a.update({}); nothing to do */
2314 return 0;
2315 if (mp->ma_used == 0)
2316 /* Since the target dict is empty, PyDict_GetItem()
2317 * always returns NULL. Setting override to 1
2318 * skips the unnecessary test.
2319 */
2320 override = 1;
2321 /* Do one big resize at the start, rather than
2322 * incrementally resizing as we insert new items. Expect
2323 * that there will be no (or few) overlapping keys.
2324 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002325 if (mp->ma_keys->dk_usable * 3 < other->ma_used * 2)
2326 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07002328 ep0 = DK_ENTRIES(other->ma_keys);
2329 for (i = 0, n = other->ma_keys->dk_nentries; i < n; i++) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002330 PyObject *key, *value;
2331 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002332 entry = &ep0[i];
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002333 key = entry->me_key;
2334 hash = entry->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002335 if (other->ma_values)
2336 value = other->ma_values[i];
2337 else
2338 value = entry->me_value;
2339
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002340 if (value != NULL) {
2341 int err = 0;
2342 Py_INCREF(key);
2343 Py_INCREF(value);
2344 if (override || PyDict_GetItem(a, key) == NULL)
2345 err = insertdict(mp, key, hash, value);
2346 Py_DECREF(value);
2347 Py_DECREF(key);
2348 if (err != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 return -1;
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002350
Victor Stinner742da042016-09-07 17:40:12 -07002351 if (n != other->ma_keys->dk_nentries) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002352 PyErr_SetString(PyExc_RuntimeError,
2353 "dict mutated during update");
2354 return -1;
2355 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 }
2357 }
2358 }
2359 else {
2360 /* Do it the generic, slower way */
2361 PyObject *keys = PyMapping_Keys(b);
2362 PyObject *iter;
2363 PyObject *key, *value;
2364 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 if (keys == NULL)
2367 /* Docstring says this is equivalent to E.keys() so
2368 * if E doesn't have a .keys() method we want
2369 * AttributeError to percolate up. Might as well
2370 * do the same for any other error.
2371 */
2372 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 iter = PyObject_GetIter(keys);
2375 Py_DECREF(keys);
2376 if (iter == NULL)
2377 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
2380 if (!override && PyDict_GetItem(a, key) != NULL) {
2381 Py_DECREF(key);
2382 continue;
2383 }
2384 value = PyObject_GetItem(b, key);
2385 if (value == NULL) {
2386 Py_DECREF(iter);
2387 Py_DECREF(key);
2388 return -1;
2389 }
2390 status = PyDict_SetItem(a, key, value);
2391 Py_DECREF(key);
2392 Py_DECREF(value);
2393 if (status < 0) {
2394 Py_DECREF(iter);
2395 return -1;
2396 }
2397 }
2398 Py_DECREF(iter);
2399 if (PyErr_Occurred())
2400 /* Iterator completed, via error */
2401 return -1;
2402 }
2403 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002404}
2405
2406static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002407dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002410}
2411
2412PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002413PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002416 PyDictObject *mp;
2417 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 if (o == NULL || !PyDict_Check(o)) {
2420 PyErr_BadInternalCall();
2421 return NULL;
2422 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002423 mp = (PyDictObject *)o;
2424 if (_PyDict_HasSplitTable(mp)) {
2425 PyDictObject *split_copy;
Victor Stinner742da042016-09-07 17:40:12 -07002426 Py_ssize_t size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
2427 PyObject **newvalues;
2428 newvalues = new_values(size);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002429 if (newvalues == NULL)
2430 return PyErr_NoMemory();
2431 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2432 if (split_copy == NULL) {
2433 free_values(newvalues);
2434 return NULL;
2435 }
2436 split_copy->ma_values = newvalues;
2437 split_copy->ma_keys = mp->ma_keys;
2438 split_copy->ma_used = mp->ma_used;
2439 DK_INCREF(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002440 for (i = 0, n = size; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002441 PyObject *value = mp->ma_values[i];
2442 Py_XINCREF(value);
2443 split_copy->ma_values[i] = value;
2444 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002445 if (_PyObject_GC_IS_TRACKED(mp))
2446 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002447 return (PyObject *)split_copy;
2448 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 copy = PyDict_New();
2450 if (copy == NULL)
2451 return NULL;
2452 if (PyDict_Merge(copy, o, 1) == 0)
2453 return copy;
2454 Py_DECREF(copy);
2455 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002456}
2457
Martin v. Löwis18e16552006-02-15 17:27:45 +00002458Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002459PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002460{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 if (mp == NULL || !PyDict_Check(mp)) {
2462 PyErr_BadInternalCall();
2463 return -1;
2464 }
2465 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002466}
2467
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002468PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002469PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 if (mp == NULL || !PyDict_Check(mp)) {
2472 PyErr_BadInternalCall();
2473 return NULL;
2474 }
2475 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002476}
2477
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002478PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002479PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002480{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 if (mp == NULL || !PyDict_Check(mp)) {
2482 PyErr_BadInternalCall();
2483 return NULL;
2484 }
2485 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002486}
2487
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002488PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002489PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 if (mp == NULL || !PyDict_Check(mp)) {
2492 PyErr_BadInternalCall();
2493 return NULL;
2494 }
2495 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002496}
2497
Tim Peterse63415e2001-05-08 04:38:29 +00002498/* Return 1 if dicts equal, 0 if not, -1 if error.
2499 * Gets out as soon as any difference is detected.
2500 * Uses only Py_EQ comparison.
2501 */
2502static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002503dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 if (a->ma_used != b->ma_used)
2508 /* can't be equal if # of entries differ */
2509 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Victor Stinner742da042016-09-07 17:40:12 -07002511 for (i = 0; i < a->ma_keys->dk_nentries; i++) {
2512 PyDictKeyEntry *ep = &DK_ENTRIES(a->ma_keys)[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002513 PyObject *aval;
2514 if (a->ma_values)
2515 aval = a->ma_values[i];
2516 else
2517 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 if (aval != NULL) {
2519 int cmp;
2520 PyObject *bval;
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002521 PyObject **vaddr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002522 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 /* temporarily bump aval's refcount to ensure it stays
2524 alive until we're done with it */
2525 Py_INCREF(aval);
2526 /* ditto for key */
2527 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002528 /* reuse the known hash value */
Victor Stinner742da042016-09-07 17:40:12 -07002529 if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr, NULL) < 0)
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002530 bval = NULL;
2531 else
2532 bval = *vaddr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 Py_DECREF(key);
2534 if (bval == NULL) {
2535 Py_DECREF(aval);
2536 if (PyErr_Occurred())
2537 return -1;
2538 return 0;
2539 }
2540 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2541 Py_DECREF(aval);
2542 if (cmp <= 0) /* error or not equal */
2543 return cmp;
2544 }
2545 }
2546 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002547}
Tim Peterse63415e2001-05-08 04:38:29 +00002548
2549static PyObject *
2550dict_richcompare(PyObject *v, PyObject *w, int op)
2551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 int cmp;
2553 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2556 res = Py_NotImplemented;
2557 }
2558 else if (op == Py_EQ || op == Py_NE) {
2559 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2560 if (cmp < 0)
2561 return NULL;
2562 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2563 }
2564 else
2565 res = Py_NotImplemented;
2566 Py_INCREF(res);
2567 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002568}
Tim Peterse63415e2001-05-08 04:38:29 +00002569
Larry Hastings61272b72014-01-07 12:41:53 -08002570/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07002571
2572@coexist
2573dict.__contains__
2574
2575 key: object
2576 /
2577
Meador Ingee02de8c2014-01-14 16:48:31 -06002578True if D has a key k, else False.
Larry Hastings61272b72014-01-07 12:41:53 -08002579[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07002580
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002581static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08002582dict___contains__(PyDictObject *self, PyObject *key)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002583/*[clinic end generated code: output=a3d03db709ed6e6b input=b852b2a19b51ab24]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002584{
Larry Hastingsc2047262014-01-25 20:43:29 -08002585 register PyDictObject *mp = self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002586 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002587 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002588 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002591 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 hash = PyObject_Hash(key);
2593 if (hash == -1)
2594 return NULL;
2595 }
Victor Stinner742da042016-09-07 17:40:12 -07002596 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2597 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002599 if (ix == DKIX_EMPTY || *value_addr == NULL)
2600 Py_RETURN_FALSE;
2601 Py_RETURN_TRUE;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002602}
2603
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002604static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002605dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 PyObject *key;
2608 PyObject *failobj = Py_None;
2609 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002610 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002611 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002612 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2615 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002618 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 hash = PyObject_Hash(key);
2620 if (hash == -1)
2621 return NULL;
2622 }
Victor Stinner742da042016-09-07 17:40:12 -07002623 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2624 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002626 if (ix == DKIX_EMPTY || *value_addr == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 val = failobj;
Victor Stinner742da042016-09-07 17:40:12 -07002628 else
2629 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 Py_INCREF(val);
2631 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002632}
2633
Benjamin Peterson00e98862013-03-07 22:16:29 -05002634PyObject *
2635PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002636{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002637 PyDictObject *mp = (PyDictObject *)d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002639 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002640 Py_ssize_t hashpos, ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002641 PyDictKeyEntry *ep;
2642 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002643
Benjamin Peterson00e98862013-03-07 22:16:29 -05002644 if (!PyDict_Check(d)) {
2645 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002647 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002649 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 hash = PyObject_Hash(key);
2651 if (hash == -1)
2652 return NULL;
2653 }
Victor Stinner742da042016-09-07 17:40:12 -07002654 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
2655 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002657 if (ix == DKIX_EMPTY || *value_addr == NULL) {
2658 val = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002659 if (mp->ma_keys->dk_usable <= 0) {
2660 /* Need to resize. */
2661 if (insertion_resize(mp) < 0)
2662 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002663 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002664 }
Victor Stinner742da042016-09-07 17:40:12 -07002665 ix = mp->ma_keys->dk_nentries;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002666 Py_INCREF(defaultobj);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002667 Py_INCREF(key);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002668 MAINTAIN_TRACKING(mp, key, defaultobj);
Victor Stinner742da042016-09-07 17:40:12 -07002669 dk_set_index(mp->ma_keys, hashpos, ix);
2670 ep = &DK_ENTRIES(mp->ma_keys)[ix];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002671 ep->me_key = key;
2672 ep->me_hash = hash;
Victor Stinner742da042016-09-07 17:40:12 -07002673 if (mp->ma_values) {
2674 mp->ma_values[ix] = val;
2675 }
2676 else {
2677 ep->me_value = val;
2678 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002679 mp->ma_keys->dk_usable--;
Victor Stinner742da042016-09-07 17:40:12 -07002680 mp->ma_keys->dk_nentries++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002681 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002682 mp->ma_version_tag = DICT_NEXT_VERSION();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 }
Victor Stinner742da042016-09-07 17:40:12 -07002684 else
2685 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00002687}
2688
Benjamin Peterson00e98862013-03-07 22:16:29 -05002689static PyObject *
2690dict_setdefault(PyDictObject *mp, PyObject *args)
2691{
2692 PyObject *key, *val;
2693 PyObject *defaultobj = Py_None;
2694
2695 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2696 return NULL;
2697
Benjamin Peterson55898502013-03-08 08:36:49 -05002698 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002699 Py_XINCREF(val);
2700 return val;
2701}
Guido van Rossum164452c2000-08-08 16:12:54 +00002702
2703static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002704dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 PyDict_Clear((PyObject *)mp);
2707 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002708}
2709
Guido van Rossumba6ab842000-12-12 22:02:18 +00002710static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002711dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00002714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2716 return NULL;
Eric Snow96c6af92015-05-29 22:21:39 -06002717
2718 return _PyDict_Pop(mp, key, deflt);
Guido van Rossume027d982002-04-12 15:11:59 +00002719}
2720
2721static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002722dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002723{
Victor Stinner742da042016-09-07 17:40:12 -07002724 Py_ssize_t i, j;
2725 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 /* Allocate the result tuple before checking the size. Believe it
2729 * or not, this allocation could trigger a garbage collection which
2730 * could empty the dict, so if we checked the size first and that
2731 * happened, the result would be an infinite loop (searching for an
2732 * entry that no longer exists). Note that the usual popitem()
2733 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2734 * tuple away if the dict *is* empty isn't a significant
2735 * inefficiency -- possible, but unlikely in practice.
2736 */
2737 res = PyTuple_New(2);
2738 if (res == NULL)
2739 return NULL;
2740 if (mp->ma_used == 0) {
2741 Py_DECREF(res);
2742 PyErr_SetString(PyExc_KeyError,
2743 "popitem(): dictionary is empty");
2744 return NULL;
2745 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002746 /* Convert split table to combined table */
2747 if (mp->ma_keys->dk_lookup == lookdict_split) {
2748 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2749 Py_DECREF(res);
2750 return NULL;
2751 }
2752 }
2753 ENSURE_ALLOWS_DELETIONS(mp);
Victor Stinner742da042016-09-07 17:40:12 -07002754
2755 /* Pop last item */
2756 ep0 = DK_ENTRIES(mp->ma_keys);
2757 i = mp->ma_keys->dk_nentries - 1;
2758 while (i >= 0 && ep0[i].me_value == NULL) {
2759 i--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 }
Victor Stinner742da042016-09-07 17:40:12 -07002761 assert(i >= 0);
2762
2763 ep = &ep0[i];
2764 j = lookdict_index(mp->ma_keys, ep->me_hash, i);
2765 assert(j >= 0);
2766 assert(dk_get_index(mp->ma_keys, j) == i);
2767 dk_set_index(mp->ma_keys, j, DKIX_DUMMY);
2768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 PyTuple_SET_ITEM(res, 0, ep->me_key);
2770 PyTuple_SET_ITEM(res, 1, ep->me_value);
Victor Stinner742da042016-09-07 17:40:12 -07002771 ep->me_key = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002772 ep->me_value = NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002773 /* We can't dk_usable++ since there is DKIX_DUMMY in indices */
2774 mp->ma_keys->dk_nentries = i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002776 mp->ma_version_tag = DICT_NEXT_VERSION();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002778}
2779
Jeremy Hylton8caad492000-06-23 14:18:11 +00002780static int
2781dict_traverse(PyObject *op, visitproc visit, void *arg)
2782{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002783 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson55f44522016-09-05 12:12:59 -07002784 PyDictKeysObject *keys = mp->ma_keys;
Victor Stinner742da042016-09-07 17:40:12 -07002785 PyDictKeyEntry *entries = DK_ENTRIES(mp->ma_keys);
2786 Py_ssize_t i, n = keys->dk_nentries;
2787
Benjamin Peterson55f44522016-09-05 12:12:59 -07002788 if (keys->dk_lookup == lookdict) {
2789 for (i = 0; i < n; i++) {
2790 if (entries[i].me_value != NULL) {
2791 Py_VISIT(entries[i].me_value);
2792 Py_VISIT(entries[i].me_key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002793 }
2794 }
Victor Stinner742da042016-09-07 17:40:12 -07002795 }
2796 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002797 if (mp->ma_values != NULL) {
Benjamin Peterson55f44522016-09-05 12:12:59 -07002798 for (i = 0; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002799 Py_VISIT(mp->ma_values[i]);
2800 }
2801 }
2802 else {
Benjamin Peterson55f44522016-09-05 12:12:59 -07002803 for (i = 0; i < n; i++) {
2804 Py_VISIT(entries[i].me_value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002805 }
2806 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 }
2808 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002809}
2810
2811static int
2812dict_tp_clear(PyObject *op)
2813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 PyDict_Clear(op);
2815 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002816}
2817
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002818static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002819
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002820Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06002821_PyDict_SizeOf(PyDictObject *mp)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002822{
Victor Stinner742da042016-09-07 17:40:12 -07002823 Py_ssize_t size, usable, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002824
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002825 size = DK_SIZE(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002826 usable = USABLE_FRACTION(size);
2827
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002828 res = _PyObject_SIZE(Py_TYPE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002829 if (mp->ma_values)
Victor Stinner742da042016-09-07 17:40:12 -07002830 res += usable * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002831 /* If the dictionary is split, the keys portion is accounted-for
2832 in the type object. */
2833 if (mp->ma_keys->dk_refcnt == 1)
Victor Stinner98ee9d52016-09-08 09:33:56 -07002834 res += (sizeof(PyDictKeysObject)
2835 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
2836 + DK_IXSIZE(mp->ma_keys) * size
2837 + sizeof(PyDictKeyEntry) * usable);
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002838 return res;
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002839}
2840
2841Py_ssize_t
2842_PyDict_KeysSize(PyDictKeysObject *keys)
2843{
Victor Stinner98ee9d52016-09-08 09:33:56 -07002844 return (sizeof(PyDictKeysObject)
2845 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
2846 + DK_IXSIZE(keys) * DK_SIZE(keys)
2847 + USABLE_FRACTION(DK_SIZE(keys)) * sizeof(PyDictKeyEntry));
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002848}
2849
doko@ubuntu.com17210f52016-01-14 14:04:59 +01002850static PyObject *
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002851dict_sizeof(PyDictObject *mp)
2852{
2853 return PyLong_FromSsize_t(_PyDict_SizeOf(mp));
2854}
2855
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002856PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2857
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002858PyDoc_STRVAR(sizeof__doc__,
2859"D.__sizeof__() -> size of D in memory, in bytes");
2860
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002861PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002862"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002863
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002864PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002865"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 +00002866
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002867PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002868"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002869If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002870
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002871PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002872"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000028732-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002874
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002875PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04002876"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
2877If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
2878If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
2879In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002880
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002881PyDoc_STRVAR(clear__doc__,
2882"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002883
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002884PyDoc_STRVAR(copy__doc__,
2885"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002886
Guido van Rossumb90c8482007-02-10 01:11:45 +00002887/* Forward */
2888static PyObject *dictkeys_new(PyObject *);
2889static PyObject *dictitems_new(PyObject *);
2890static PyObject *dictvalues_new(PyObject *);
2891
Guido van Rossum45c85d12007-07-27 16:31:40 +00002892PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002894PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002895 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002896PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002898
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002899static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002900 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2902 getitem__doc__},
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002903 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904 sizeof__doc__},
2905 {"get", (PyCFunction)dict_get, METH_VARARGS,
2906 get__doc__},
2907 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2908 setdefault_doc__},
2909 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2910 pop__doc__},
2911 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2912 popitem__doc__},
2913 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2914 keys__doc__},
2915 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2916 items__doc__},
2917 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2918 values__doc__},
2919 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2920 update__doc__},
Larry Hastings5c661892014-01-24 06:17:25 -08002921 DICT_FROMKEYS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2923 clear__doc__},
2924 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2925 copy__doc__},
2926 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002927};
2928
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002929/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002930int
2931PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002932{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002933 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002934 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002935 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002936 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002938 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002939 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002940 hash = PyObject_Hash(key);
2941 if (hash == -1)
2942 return -1;
2943 }
Victor Stinner742da042016-09-07 17:40:12 -07002944 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2945 if (ix == DKIX_ERROR)
2946 return -1;
2947 return (ix != DKIX_EMPTY && *value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002948}
2949
Thomas Wouterscf297e42007-02-23 15:07:44 +00002950/* Internal version of PyDict_Contains used when the hash value is already known */
2951int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002952_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002955 PyObject **value_addr;
Victor Stinner742da042016-09-07 17:40:12 -07002956 Py_ssize_t ix;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002957
Victor Stinner742da042016-09-07 17:40:12 -07002958 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2959 if (ix == DKIX_ERROR)
2960 return -1;
2961 return (ix != DKIX_EMPTY && *value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002962}
2963
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002964/* Hack to implement "key in dict" */
2965static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002966 0, /* sq_length */
2967 0, /* sq_concat */
2968 0, /* sq_repeat */
2969 0, /* sq_item */
2970 0, /* sq_slice */
2971 0, /* sq_ass_item */
2972 0, /* sq_ass_slice */
2973 PyDict_Contains, /* sq_contains */
2974 0, /* sq_inplace_concat */
2975 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002976};
2977
Guido van Rossum09e563a2001-05-01 12:10:21 +00002978static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002979dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002982 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002984 assert(type != NULL && type->tp_alloc != NULL);
2985 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02002986 if (self == NULL)
2987 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002988 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002989
Victor Stinnera9f61a52013-07-16 22:17:26 +02002990 /* The object has been implicitly tracked by tp_alloc */
2991 if (type == &PyDict_Type)
2992 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002993
2994 d->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002995 d->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07002996 d->ma_keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002997 if (d->ma_keys == NULL) {
2998 Py_DECREF(self);
2999 return NULL;
3000 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003001 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003002}
3003
Tim Peters25786c02001-09-02 08:22:48 +00003004static int
3005dict_init(PyObject *self, PyObject *args, PyObject *kwds)
3006{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003007 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00003008}
3009
Tim Peters6d6c1a32001-08-02 04:15:00 +00003010static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003011dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00003012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00003014}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003015
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003016PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00003017"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00003018"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003019" (key, value) pairs\n"
3020"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00003021" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003022" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00003023" d[k] = v\n"
3024"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
3025" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00003026
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003027PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003028 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3029 "dict",
3030 sizeof(PyDictObject),
3031 0,
3032 (destructor)dict_dealloc, /* tp_dealloc */
3033 0, /* tp_print */
3034 0, /* tp_getattr */
3035 0, /* tp_setattr */
3036 0, /* tp_reserved */
3037 (reprfunc)dict_repr, /* tp_repr */
3038 0, /* tp_as_number */
3039 &dict_as_sequence, /* tp_as_sequence */
3040 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00003041 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 0, /* tp_call */
3043 0, /* tp_str */
3044 PyObject_GenericGetAttr, /* tp_getattro */
3045 0, /* tp_setattro */
3046 0, /* tp_as_buffer */
3047 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3048 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
3049 dictionary_doc, /* tp_doc */
3050 dict_traverse, /* tp_traverse */
3051 dict_tp_clear, /* tp_clear */
3052 dict_richcompare, /* tp_richcompare */
3053 0, /* tp_weaklistoffset */
3054 (getiterfunc)dict_iter, /* tp_iter */
3055 0, /* tp_iternext */
3056 mapp_methods, /* tp_methods */
3057 0, /* tp_members */
3058 0, /* tp_getset */
3059 0, /* tp_base */
3060 0, /* tp_dict */
3061 0, /* tp_descr_get */
3062 0, /* tp_descr_set */
3063 0, /* tp_dictoffset */
3064 dict_init, /* tp_init */
3065 PyType_GenericAlloc, /* tp_alloc */
3066 dict_new, /* tp_new */
3067 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003068};
3069
Victor Stinner3c1e4812012-03-26 22:10:51 +02003070PyObject *
3071_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
3072{
3073 PyObject *kv;
3074 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02003075 if (kv == NULL) {
3076 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003077 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02003078 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02003079 return PyDict_GetItem(dp, kv);
3080}
3081
Guido van Rossum3cca2451997-05-16 14:23:33 +00003082/* For backward compatibility with old dictionary interface */
3083
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003084PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003085PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 PyObject *kv, *rv;
3088 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003089 if (kv == NULL) {
3090 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003092 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 rv = PyDict_GetItem(v, kv);
3094 Py_DECREF(kv);
3095 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003096}
3097
3098int
Victor Stinner3c1e4812012-03-26 22:10:51 +02003099_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
3100{
3101 PyObject *kv;
3102 kv = _PyUnicode_FromId(key); /* borrowed */
3103 if (kv == NULL)
3104 return -1;
3105 return PyDict_SetItem(v, kv, item);
3106}
3107
3108int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003109PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 PyObject *kv;
3112 int err;
3113 kv = PyUnicode_FromString(key);
3114 if (kv == NULL)
3115 return -1;
3116 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
3117 err = PyDict_SetItem(v, kv, item);
3118 Py_DECREF(kv);
3119 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003120}
3121
3122int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01003123_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
3124{
3125 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
3126 if (kv == NULL)
3127 return -1;
3128 return PyDict_DelItem(v, kv);
3129}
3130
3131int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003132PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003134 PyObject *kv;
3135 int err;
3136 kv = PyUnicode_FromString(key);
3137 if (kv == NULL)
3138 return -1;
3139 err = PyDict_DelItem(v, kv);
3140 Py_DECREF(kv);
3141 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003142}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003143
Raymond Hettinger019a1482004-03-18 02:41:19 +00003144/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003145
3146typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 PyObject_HEAD
3148 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
3149 Py_ssize_t di_used;
3150 Py_ssize_t di_pos;
3151 PyObject* di_result; /* reusable result tuple for iteritems */
3152 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003153} dictiterobject;
3154
3155static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003156dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003158 dictiterobject *di;
3159 di = PyObject_GC_New(dictiterobject, itertype);
3160 if (di == NULL)
3161 return NULL;
3162 Py_INCREF(dict);
3163 di->di_dict = dict;
3164 di->di_used = dict->ma_used;
3165 di->di_pos = 0;
3166 di->len = dict->ma_used;
3167 if (itertype == &PyDictIterItem_Type) {
3168 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
3169 if (di->di_result == NULL) {
3170 Py_DECREF(di);
3171 return NULL;
3172 }
3173 }
3174 else
3175 di->di_result = NULL;
3176 _PyObject_GC_TRACK(di);
3177 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003178}
3179
3180static void
3181dictiter_dealloc(dictiterobject *di)
3182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 Py_XDECREF(di->di_dict);
3184 Py_XDECREF(di->di_result);
3185 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003186}
3187
3188static int
3189dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
3190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 Py_VISIT(di->di_dict);
3192 Py_VISIT(di->di_result);
3193 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003194}
3195
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003196static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003197dictiter_len(dictiterobject *di)
3198{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003199 Py_ssize_t len = 0;
3200 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
3201 len = di->len;
3202 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003203}
3204
Guido van Rossumb90c8482007-02-10 01:11:45 +00003205PyDoc_STRVAR(length_hint_doc,
3206 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003207
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003208static PyObject *
3209dictiter_reduce(dictiterobject *di);
3210
3211PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3212
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003213static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
3215 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003216 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
3217 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003219};
3220
Raymond Hettinger019a1482004-03-18 02:41:19 +00003221static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00003222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 PyObject *key;
Victor Stinner742da042016-09-07 17:40:12 -07003224 Py_ssize_t i, n, offset;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003225 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003227 PyObject **value_ptr;
Guido van Rossum213c7a62001-04-23 14:08:49 +00003228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003229 if (d == NULL)
3230 return NULL;
3231 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00003232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 if (di->di_used != d->ma_used) {
3234 PyErr_SetString(PyExc_RuntimeError,
3235 "dictionary changed size during iteration");
3236 di->di_used = -1; /* Make this state sticky */
3237 return NULL;
3238 }
Guido van Rossum2147df72002-07-16 20:30:22 +00003239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 i = di->di_pos;
3241 if (i < 0)
3242 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003243 k = d->ma_keys;
3244 if (d->ma_values) {
3245 value_ptr = &d->ma_values[i];
3246 offset = sizeof(PyObject *);
3247 }
3248 else {
Victor Stinner742da042016-09-07 17:40:12 -07003249 value_ptr = &DK_ENTRIES(k)[i].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003250 offset = sizeof(PyDictKeyEntry);
3251 }
Victor Stinner742da042016-09-07 17:40:12 -07003252 n = k->dk_nentries - 1;
3253 while (i <= n && *value_ptr == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003254 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003256 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 di->di_pos = i+1;
Victor Stinner742da042016-09-07 17:40:12 -07003258 if (i > n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003259 goto fail;
3260 di->len--;
Victor Stinner742da042016-09-07 17:40:12 -07003261 key = DK_ENTRIES(k)[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 Py_INCREF(key);
3263 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003264
3265fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003267 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003269}
3270
Raymond Hettinger019a1482004-03-18 02:41:19 +00003271PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003272 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3273 "dict_keyiterator", /* tp_name */
3274 sizeof(dictiterobject), /* tp_basicsize */
3275 0, /* tp_itemsize */
3276 /* methods */
3277 (destructor)dictiter_dealloc, /* tp_dealloc */
3278 0, /* tp_print */
3279 0, /* tp_getattr */
3280 0, /* tp_setattr */
3281 0, /* tp_reserved */
3282 0, /* tp_repr */
3283 0, /* tp_as_number */
3284 0, /* tp_as_sequence */
3285 0, /* tp_as_mapping */
3286 0, /* tp_hash */
3287 0, /* tp_call */
3288 0, /* tp_str */
3289 PyObject_GenericGetAttr, /* tp_getattro */
3290 0, /* tp_setattro */
3291 0, /* tp_as_buffer */
3292 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3293 0, /* tp_doc */
3294 (traverseproc)dictiter_traverse, /* tp_traverse */
3295 0, /* tp_clear */
3296 0, /* tp_richcompare */
3297 0, /* tp_weaklistoffset */
3298 PyObject_SelfIter, /* tp_iter */
3299 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
3300 dictiter_methods, /* tp_methods */
3301 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003302};
3303
3304static PyObject *dictiter_iternextvalue(dictiterobject *di)
3305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 PyObject *value;
Victor Stinner742da042016-09-07 17:40:12 -07003307 Py_ssize_t i, n, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003309 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003311 if (d == NULL)
3312 return NULL;
3313 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 if (di->di_used != d->ma_used) {
3316 PyErr_SetString(PyExc_RuntimeError,
3317 "dictionary changed size during iteration");
3318 di->di_used = -1; /* Make this state sticky */
3319 return NULL;
3320 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 i = di->di_pos;
Victor Stinner742da042016-09-07 17:40:12 -07003323 n = d->ma_keys->dk_nentries - 1;
3324 if (i < 0 || i > n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003326 if (d->ma_values) {
3327 value_ptr = &d->ma_values[i];
3328 offset = sizeof(PyObject *);
3329 }
3330 else {
Victor Stinner742da042016-09-07 17:40:12 -07003331 value_ptr = &DK_ENTRIES(d->ma_keys)[i].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003332 offset = sizeof(PyDictKeyEntry);
3333 }
Victor Stinner742da042016-09-07 17:40:12 -07003334 while (i <= n && *value_ptr == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003335 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 i++;
Victor Stinner742da042016-09-07 17:40:12 -07003337 if (i > n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 goto fail;
3339 }
3340 di->di_pos = i+1;
3341 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003342 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 Py_INCREF(value);
3344 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003345
3346fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003348 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003350}
3351
3352PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3354 "dict_valueiterator", /* tp_name */
3355 sizeof(dictiterobject), /* tp_basicsize */
3356 0, /* tp_itemsize */
3357 /* methods */
3358 (destructor)dictiter_dealloc, /* tp_dealloc */
3359 0, /* tp_print */
3360 0, /* tp_getattr */
3361 0, /* tp_setattr */
3362 0, /* tp_reserved */
3363 0, /* tp_repr */
3364 0, /* tp_as_number */
3365 0, /* tp_as_sequence */
3366 0, /* tp_as_mapping */
3367 0, /* tp_hash */
3368 0, /* tp_call */
3369 0, /* tp_str */
3370 PyObject_GenericGetAttr, /* tp_getattro */
3371 0, /* tp_setattro */
3372 0, /* tp_as_buffer */
3373 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3374 0, /* tp_doc */
3375 (traverseproc)dictiter_traverse, /* tp_traverse */
3376 0, /* tp_clear */
3377 0, /* tp_richcompare */
3378 0, /* tp_weaklistoffset */
3379 PyObject_SelfIter, /* tp_iter */
3380 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
3381 dictiter_methods, /* tp_methods */
3382 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003383};
3384
3385static PyObject *dictiter_iternextitem(dictiterobject *di)
3386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 PyObject *key, *value, *result = di->di_result;
Victor Stinner742da042016-09-07 17:40:12 -07003388 Py_ssize_t i, n, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003389 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003390 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 if (d == NULL)
3393 return NULL;
3394 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 if (di->di_used != d->ma_used) {
3397 PyErr_SetString(PyExc_RuntimeError,
3398 "dictionary changed size during iteration");
3399 di->di_used = -1; /* Make this state sticky */
3400 return NULL;
3401 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 i = di->di_pos;
3404 if (i < 0)
3405 goto fail;
Victor Stinner742da042016-09-07 17:40:12 -07003406 n = d->ma_keys->dk_nentries - 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003407 if (d->ma_values) {
3408 value_ptr = &d->ma_values[i];
3409 offset = sizeof(PyObject *);
3410 }
3411 else {
Victor Stinner742da042016-09-07 17:40:12 -07003412 value_ptr = &DK_ENTRIES(d->ma_keys)[i].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003413 offset = sizeof(PyDictKeyEntry);
3414 }
Victor Stinner742da042016-09-07 17:40:12 -07003415 while (i <= n && *value_ptr == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003416 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003418 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 di->di_pos = i+1;
Victor Stinner742da042016-09-07 17:40:12 -07003420 if (i > n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003423 if (result->ob_refcnt == 1) {
3424 Py_INCREF(result);
3425 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3426 Py_DECREF(PyTuple_GET_ITEM(result, 1));
3427 } else {
3428 result = PyTuple_New(2);
3429 if (result == NULL)
3430 return NULL;
3431 }
3432 di->len--;
Victor Stinner742da042016-09-07 17:40:12 -07003433 key = DK_ENTRIES(d->ma_keys)[i].me_key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003434 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435 Py_INCREF(key);
3436 Py_INCREF(value);
Eric Snow96c6af92015-05-29 22:21:39 -06003437 PyTuple_SET_ITEM(result, 0, key); /* steals reference */
3438 PyTuple_SET_ITEM(result, 1, value); /* steals reference */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003440
3441fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003442 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003443 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003444 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003445}
3446
3447PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003448 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3449 "dict_itemiterator", /* tp_name */
3450 sizeof(dictiterobject), /* tp_basicsize */
3451 0, /* tp_itemsize */
3452 /* methods */
3453 (destructor)dictiter_dealloc, /* tp_dealloc */
3454 0, /* tp_print */
3455 0, /* tp_getattr */
3456 0, /* tp_setattr */
3457 0, /* tp_reserved */
3458 0, /* tp_repr */
3459 0, /* tp_as_number */
3460 0, /* tp_as_sequence */
3461 0, /* tp_as_mapping */
3462 0, /* tp_hash */
3463 0, /* tp_call */
3464 0, /* tp_str */
3465 PyObject_GenericGetAttr, /* tp_getattro */
3466 0, /* tp_setattro */
3467 0, /* tp_as_buffer */
3468 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3469 0, /* tp_doc */
3470 (traverseproc)dictiter_traverse, /* tp_traverse */
3471 0, /* tp_clear */
3472 0, /* tp_richcompare */
3473 0, /* tp_weaklistoffset */
3474 PyObject_SelfIter, /* tp_iter */
3475 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3476 dictiter_methods, /* tp_methods */
3477 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003478};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003479
3480
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003481static PyObject *
3482dictiter_reduce(dictiterobject *di)
3483{
3484 PyObject *list;
3485 dictiterobject tmp;
3486
3487 list = PyList_New(0);
3488 if (!list)
3489 return NULL;
3490
3491 /* copy the itertor state */
3492 tmp = *di;
3493 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003494
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003495 /* iterate the temporary into a list */
3496 for(;;) {
3497 PyObject *element = 0;
3498 if (Py_TYPE(di) == &PyDictIterItem_Type)
3499 element = dictiter_iternextitem(&tmp);
3500 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3501 element = dictiter_iternextkey(&tmp);
3502 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3503 element = dictiter_iternextvalue(&tmp);
3504 else
3505 assert(0);
3506 if (element) {
3507 if (PyList_Append(list, element)) {
3508 Py_DECREF(element);
3509 Py_DECREF(list);
3510 Py_XDECREF(tmp.di_dict);
3511 return NULL;
3512 }
3513 Py_DECREF(element);
3514 } else
3515 break;
3516 }
3517 Py_XDECREF(tmp.di_dict);
3518 /* check for error */
3519 if (tmp.di_dict != NULL) {
3520 /* we have an error */
3521 Py_DECREF(list);
3522 return NULL;
3523 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003524 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003525}
3526
Guido van Rossum3ac67412007-02-10 18:55:06 +00003527/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003528/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003529/***********************************************/
3530
Guido van Rossumb90c8482007-02-10 01:11:45 +00003531/* The instance lay-out is the same for all three; but the type differs. */
3532
Guido van Rossumb90c8482007-02-10 01:11:45 +00003533static void
Eric Snow96c6af92015-05-29 22:21:39 -06003534dictview_dealloc(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 Py_XDECREF(dv->dv_dict);
3537 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003538}
3539
3540static int
Eric Snow96c6af92015-05-29 22:21:39 -06003541dictview_traverse(_PyDictViewObject *dv, visitproc visit, void *arg)
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003543 Py_VISIT(dv->dv_dict);
3544 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003545}
3546
Guido van Rossum83825ac2007-02-10 04:54:19 +00003547static Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06003548dictview_len(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 Py_ssize_t len = 0;
3551 if (dv->dv_dict != NULL)
3552 len = dv->dv_dict->ma_used;
3553 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003554}
3555
Eric Snow96c6af92015-05-29 22:21:39 -06003556PyObject *
3557_PyDictView_New(PyObject *dict, PyTypeObject *type)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003558{
Eric Snow96c6af92015-05-29 22:21:39 -06003559 _PyDictViewObject *dv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 if (dict == NULL) {
3561 PyErr_BadInternalCall();
3562 return NULL;
3563 }
3564 if (!PyDict_Check(dict)) {
3565 /* XXX Get rid of this restriction later */
3566 PyErr_Format(PyExc_TypeError,
3567 "%s() requires a dict argument, not '%s'",
3568 type->tp_name, dict->ob_type->tp_name);
3569 return NULL;
3570 }
Eric Snow96c6af92015-05-29 22:21:39 -06003571 dv = PyObject_GC_New(_PyDictViewObject, type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 if (dv == NULL)
3573 return NULL;
3574 Py_INCREF(dict);
3575 dv->dv_dict = (PyDictObject *)dict;
3576 _PyObject_GC_TRACK(dv);
3577 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003578}
3579
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003580/* TODO(guido): The views objects are not complete:
3581
3582 * support more set operations
3583 * support arbitrary mappings?
3584 - either these should be static or exported in dictobject.h
3585 - if public then they should probably be in builtins
3586*/
3587
Guido van Rossumaac530c2007-08-24 22:33:45 +00003588/* Return 1 if self is a subset of other, iterating over self;
3589 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003590static int
3591all_contained_in(PyObject *self, PyObject *other)
3592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003593 PyObject *iter = PyObject_GetIter(self);
3594 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003596 if (iter == NULL)
3597 return -1;
3598 for (;;) {
3599 PyObject *next = PyIter_Next(iter);
3600 if (next == NULL) {
3601 if (PyErr_Occurred())
3602 ok = -1;
3603 break;
3604 }
3605 ok = PySequence_Contains(other, next);
3606 Py_DECREF(next);
3607 if (ok <= 0)
3608 break;
3609 }
3610 Py_DECREF(iter);
3611 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003612}
3613
3614static PyObject *
3615dictview_richcompare(PyObject *self, PyObject *other, int op)
3616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003617 Py_ssize_t len_self, len_other;
3618 int ok;
3619 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003621 assert(self != NULL);
3622 assert(PyDictViewSet_Check(self));
3623 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003624
Brian Curtindfc80e32011-08-10 20:28:54 -05003625 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3626 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003628 len_self = PyObject_Size(self);
3629 if (len_self < 0)
3630 return NULL;
3631 len_other = PyObject_Size(other);
3632 if (len_other < 0)
3633 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 ok = 0;
3636 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003638 case Py_NE:
3639 case Py_EQ:
3640 if (len_self == len_other)
3641 ok = all_contained_in(self, other);
3642 if (op == Py_NE && ok >= 0)
3643 ok = !ok;
3644 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003646 case Py_LT:
3647 if (len_self < len_other)
3648 ok = all_contained_in(self, other);
3649 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003651 case Py_LE:
3652 if (len_self <= len_other)
3653 ok = all_contained_in(self, other);
3654 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003656 case Py_GT:
3657 if (len_self > len_other)
3658 ok = all_contained_in(other, self);
3659 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003661 case Py_GE:
3662 if (len_self >= len_other)
3663 ok = all_contained_in(other, self);
3664 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003666 }
3667 if (ok < 0)
3668 return NULL;
3669 result = ok ? Py_True : Py_False;
3670 Py_INCREF(result);
3671 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003672}
3673
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003674static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003675dictview_repr(_PyDictViewObject *dv)
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003677 PyObject *seq;
3678 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 seq = PySequence_List((PyObject *)dv);
3681 if (seq == NULL)
3682 return NULL;
3683
3684 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3685 Py_DECREF(seq);
3686 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003687}
3688
Guido van Rossum3ac67412007-02-10 18:55:06 +00003689/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003690
3691static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003692dictkeys_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003694 if (dv->dv_dict == NULL) {
3695 Py_RETURN_NONE;
3696 }
3697 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003698}
3699
3700static int
Eric Snow96c6af92015-05-29 22:21:39 -06003701dictkeys_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003703 if (dv->dv_dict == NULL)
3704 return 0;
3705 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003706}
3707
Guido van Rossum83825ac2007-02-10 04:54:19 +00003708static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003709 (lenfunc)dictview_len, /* sq_length */
3710 0, /* sq_concat */
3711 0, /* sq_repeat */
3712 0, /* sq_item */
3713 0, /* sq_slice */
3714 0, /* sq_ass_item */
3715 0, /* sq_ass_slice */
3716 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003717};
3718
Guido van Rossum523259b2007-08-24 23:41:22 +00003719static PyObject*
3720dictviews_sub(PyObject* self, PyObject *other)
3721{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003722 PyObject *result = PySet_New(self);
3723 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003724 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003726 if (result == NULL)
3727 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003728
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003729 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003730 if (tmp == NULL) {
3731 Py_DECREF(result);
3732 return NULL;
3733 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003735 Py_DECREF(tmp);
3736 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003737}
3738
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003739PyObject*
3740_PyDictView_Intersect(PyObject* self, PyObject *other)
Guido van Rossum523259b2007-08-24 23:41:22 +00003741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 PyObject *result = PySet_New(self);
3743 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003744 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 if (result == NULL)
3747 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003748
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003749 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003750 if (tmp == NULL) {
3751 Py_DECREF(result);
3752 return NULL;
3753 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003755 Py_DECREF(tmp);
3756 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003757}
3758
3759static PyObject*
3760dictviews_or(PyObject* self, PyObject *other)
3761{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 PyObject *result = PySet_New(self);
3763 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003764 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 if (result == NULL)
3767 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003768
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003769 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003770 if (tmp == NULL) {
3771 Py_DECREF(result);
3772 return NULL;
3773 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 Py_DECREF(tmp);
3776 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003777}
3778
3779static PyObject*
3780dictviews_xor(PyObject* self, PyObject *other)
3781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003782 PyObject *result = PySet_New(self);
3783 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003784 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 if (result == NULL)
3787 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003788
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003789 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003790 if (tmp == NULL) {
3791 Py_DECREF(result);
3792 return NULL;
3793 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003795 Py_DECREF(tmp);
3796 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003797}
3798
3799static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003800 0, /*nb_add*/
3801 (binaryfunc)dictviews_sub, /*nb_subtract*/
3802 0, /*nb_multiply*/
3803 0, /*nb_remainder*/
3804 0, /*nb_divmod*/
3805 0, /*nb_power*/
3806 0, /*nb_negative*/
3807 0, /*nb_positive*/
3808 0, /*nb_absolute*/
3809 0, /*nb_bool*/
3810 0, /*nb_invert*/
3811 0, /*nb_lshift*/
3812 0, /*nb_rshift*/
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003813 (binaryfunc)_PyDictView_Intersect, /*nb_and*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003814 (binaryfunc)dictviews_xor, /*nb_xor*/
3815 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003816};
3817
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003818static PyObject*
3819dictviews_isdisjoint(PyObject *self, PyObject *other)
3820{
3821 PyObject *it;
3822 PyObject *item = NULL;
3823
3824 if (self == other) {
Eric Snow96c6af92015-05-29 22:21:39 -06003825 if (dictview_len((_PyDictViewObject *)self) == 0)
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003826 Py_RETURN_TRUE;
3827 else
3828 Py_RETURN_FALSE;
3829 }
3830
3831 /* Iterate over the shorter object (only if other is a set,
3832 * because PySequence_Contains may be expensive otherwise): */
3833 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
Eric Snow96c6af92015-05-29 22:21:39 -06003834 Py_ssize_t len_self = dictview_len((_PyDictViewObject *)self);
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003835 Py_ssize_t len_other = PyObject_Size(other);
3836 if (len_other == -1)
3837 return NULL;
3838
3839 if ((len_other > len_self)) {
3840 PyObject *tmp = other;
3841 other = self;
3842 self = tmp;
3843 }
3844 }
3845
3846 it = PyObject_GetIter(other);
3847 if (it == NULL)
3848 return NULL;
3849
3850 while ((item = PyIter_Next(it)) != NULL) {
3851 int contains = PySequence_Contains(self, item);
3852 Py_DECREF(item);
3853 if (contains == -1) {
3854 Py_DECREF(it);
3855 return NULL;
3856 }
3857
3858 if (contains) {
3859 Py_DECREF(it);
3860 Py_RETURN_FALSE;
3861 }
3862 }
3863 Py_DECREF(it);
3864 if (PyErr_Occurred())
3865 return NULL; /* PyIter_Next raised an exception. */
3866 Py_RETURN_TRUE;
3867}
3868
3869PyDoc_STRVAR(isdisjoint_doc,
3870"Return True if the view and the given iterable have a null intersection.");
3871
Guido van Rossumb90c8482007-02-10 01:11:45 +00003872static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003873 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3874 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003875 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003876};
3877
3878PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003879 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3880 "dict_keys", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06003881 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003882 0, /* tp_itemsize */
3883 /* methods */
3884 (destructor)dictview_dealloc, /* tp_dealloc */
3885 0, /* tp_print */
3886 0, /* tp_getattr */
3887 0, /* tp_setattr */
3888 0, /* tp_reserved */
3889 (reprfunc)dictview_repr, /* tp_repr */
3890 &dictviews_as_number, /* tp_as_number */
3891 &dictkeys_as_sequence, /* tp_as_sequence */
3892 0, /* tp_as_mapping */
3893 0, /* tp_hash */
3894 0, /* tp_call */
3895 0, /* tp_str */
3896 PyObject_GenericGetAttr, /* tp_getattro */
3897 0, /* tp_setattro */
3898 0, /* tp_as_buffer */
3899 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3900 0, /* tp_doc */
3901 (traverseproc)dictview_traverse, /* tp_traverse */
3902 0, /* tp_clear */
3903 dictview_richcompare, /* tp_richcompare */
3904 0, /* tp_weaklistoffset */
3905 (getiterfunc)dictkeys_iter, /* tp_iter */
3906 0, /* tp_iternext */
3907 dictkeys_methods, /* tp_methods */
3908 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003909};
3910
3911static PyObject *
3912dictkeys_new(PyObject *dict)
3913{
Eric Snow96c6af92015-05-29 22:21:39 -06003914 return _PyDictView_New(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003915}
3916
Guido van Rossum3ac67412007-02-10 18:55:06 +00003917/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003918
3919static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003920dictitems_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003922 if (dv->dv_dict == NULL) {
3923 Py_RETURN_NONE;
3924 }
3925 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003926}
3927
3928static int
Eric Snow96c6af92015-05-29 22:21:39 -06003929dictitems_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003930{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003931 PyObject *key, *value, *found;
3932 if (dv->dv_dict == NULL)
3933 return 0;
3934 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3935 return 0;
3936 key = PyTuple_GET_ITEM(obj, 0);
3937 value = PyTuple_GET_ITEM(obj, 1);
3938 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3939 if (found == NULL) {
3940 if (PyErr_Occurred())
3941 return -1;
3942 return 0;
3943 }
3944 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003945}
3946
Guido van Rossum83825ac2007-02-10 04:54:19 +00003947static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003948 (lenfunc)dictview_len, /* sq_length */
3949 0, /* sq_concat */
3950 0, /* sq_repeat */
3951 0, /* sq_item */
3952 0, /* sq_slice */
3953 0, /* sq_ass_item */
3954 0, /* sq_ass_slice */
3955 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003956};
3957
Guido van Rossumb90c8482007-02-10 01:11:45 +00003958static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003959 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3960 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003961 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003962};
3963
3964PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3966 "dict_items", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06003967 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003968 0, /* tp_itemsize */
3969 /* methods */
3970 (destructor)dictview_dealloc, /* tp_dealloc */
3971 0, /* tp_print */
3972 0, /* tp_getattr */
3973 0, /* tp_setattr */
3974 0, /* tp_reserved */
3975 (reprfunc)dictview_repr, /* tp_repr */
3976 &dictviews_as_number, /* tp_as_number */
3977 &dictitems_as_sequence, /* tp_as_sequence */
3978 0, /* tp_as_mapping */
3979 0, /* tp_hash */
3980 0, /* tp_call */
3981 0, /* tp_str */
3982 PyObject_GenericGetAttr, /* tp_getattro */
3983 0, /* tp_setattro */
3984 0, /* tp_as_buffer */
3985 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3986 0, /* tp_doc */
3987 (traverseproc)dictview_traverse, /* tp_traverse */
3988 0, /* tp_clear */
3989 dictview_richcompare, /* tp_richcompare */
3990 0, /* tp_weaklistoffset */
3991 (getiterfunc)dictitems_iter, /* tp_iter */
3992 0, /* tp_iternext */
3993 dictitems_methods, /* tp_methods */
3994 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003995};
3996
3997static PyObject *
3998dictitems_new(PyObject *dict)
3999{
Eric Snow96c6af92015-05-29 22:21:39 -06004000 return _PyDictView_New(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004001}
4002
Guido van Rossum3ac67412007-02-10 18:55:06 +00004003/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004004
4005static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004006dictvalues_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004008 if (dv->dv_dict == NULL) {
4009 Py_RETURN_NONE;
4010 }
4011 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004012}
4013
Guido van Rossum83825ac2007-02-10 04:54:19 +00004014static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004015 (lenfunc)dictview_len, /* sq_length */
4016 0, /* sq_concat */
4017 0, /* sq_repeat */
4018 0, /* sq_item */
4019 0, /* sq_slice */
4020 0, /* sq_ass_item */
4021 0, /* sq_ass_slice */
4022 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004023};
4024
Guido van Rossumb90c8482007-02-10 01:11:45 +00004025static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004026 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004027};
4028
4029PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004030 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4031 "dict_values", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004032 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004033 0, /* tp_itemsize */
4034 /* methods */
4035 (destructor)dictview_dealloc, /* tp_dealloc */
4036 0, /* tp_print */
4037 0, /* tp_getattr */
4038 0, /* tp_setattr */
4039 0, /* tp_reserved */
4040 (reprfunc)dictview_repr, /* tp_repr */
4041 0, /* tp_as_number */
4042 &dictvalues_as_sequence, /* tp_as_sequence */
4043 0, /* tp_as_mapping */
4044 0, /* tp_hash */
4045 0, /* tp_call */
4046 0, /* tp_str */
4047 PyObject_GenericGetAttr, /* tp_getattro */
4048 0, /* tp_setattro */
4049 0, /* tp_as_buffer */
4050 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4051 0, /* tp_doc */
4052 (traverseproc)dictview_traverse, /* tp_traverse */
4053 0, /* tp_clear */
4054 0, /* tp_richcompare */
4055 0, /* tp_weaklistoffset */
4056 (getiterfunc)dictvalues_iter, /* tp_iter */
4057 0, /* tp_iternext */
4058 dictvalues_methods, /* tp_methods */
4059 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004060};
4061
4062static PyObject *
4063dictvalues_new(PyObject *dict)
4064{
Eric Snow96c6af92015-05-29 22:21:39 -06004065 return _PyDictView_New(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004066}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004067
4068/* Returns NULL if cannot allocate a new PyDictKeysObject,
4069 but does not set an error */
4070PyDictKeysObject *
4071_PyDict_NewKeysForClass(void)
4072{
Victor Stinner742da042016-09-07 17:40:12 -07004073 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004074 if (keys == NULL)
4075 PyErr_Clear();
4076 else
4077 keys->dk_lookup = lookdict_split;
4078 return keys;
4079}
4080
4081#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
4082
4083PyObject *
4084PyObject_GenericGetDict(PyObject *obj, void *context)
4085{
4086 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
4087 if (dictptr == NULL) {
4088 PyErr_SetString(PyExc_AttributeError,
4089 "This object has no __dict__");
4090 return NULL;
4091 }
4092 dict = *dictptr;
4093 if (dict == NULL) {
4094 PyTypeObject *tp = Py_TYPE(obj);
4095 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
4096 DK_INCREF(CACHED_KEYS(tp));
4097 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
4098 }
4099 else {
4100 *dictptr = dict = PyDict_New();
4101 }
4102 }
4103 Py_XINCREF(dict);
4104 return dict;
4105}
4106
4107int
4108_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
Victor Stinner742da042016-09-07 17:40:12 -07004109 PyObject *key, PyObject *value)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004110{
4111 PyObject *dict;
4112 int res;
4113 PyDictKeysObject *cached;
4114
4115 assert(dictptr != NULL);
4116 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
4117 assert(dictptr != NULL);
4118 dict = *dictptr;
4119 if (dict == NULL) {
4120 DK_INCREF(cached);
4121 dict = new_dict_with_shared_keys(cached);
4122 if (dict == NULL)
4123 return -1;
4124 *dictptr = dict;
4125 }
4126 if (value == NULL) {
4127 res = PyDict_DelItem(dict, key);
4128 if (cached != ((PyDictObject *)dict)->ma_keys) {
4129 CACHED_KEYS(tp) = NULL;
4130 DK_DECREF(cached);
4131 }
4132 } else {
4133 res = PyDict_SetItem(dict, key, value);
4134 if (cached != ((PyDictObject *)dict)->ma_keys) {
4135 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004136 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004137 CACHED_KEYS(tp) = make_keys_shared(dict);
Victor Stinner742da042016-09-07 17:40:12 -07004138 }
4139 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004140 CACHED_KEYS(tp) = NULL;
4141 }
4142 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004143 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
4144 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004145 }
4146 }
4147 } else {
4148 dict = *dictptr;
4149 if (dict == NULL) {
4150 dict = PyDict_New();
4151 if (dict == NULL)
4152 return -1;
4153 *dictptr = dict;
4154 }
4155 if (value == NULL) {
4156 res = PyDict_DelItem(dict, key);
4157 } else {
4158 res = PyDict_SetItem(dict, key, value);
4159 }
4160 }
4161 return res;
4162}
4163
4164void
4165_PyDictKeys_DecRef(PyDictKeysObject *keys)
4166{
4167 DK_DECREF(keys);
4168}