blob: 06c54b566550a7b0cba6bae4fe2a56ca76834f8a [file] [log] [blame]
Guido van Rossum2bc13791999-03-24 19:06:42 +00001/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002
Raymond Hettinger930427b2003-05-03 06:51:59 +00003/* The distribution includes a separate file, Objects/dictnotes.txt,
Tim Peters60b29962006-01-01 01:19:23 +00004 describing explorations into dictionary design and optimization.
Raymond Hettinger930427b2003-05-03 06:51:59 +00005 It covers typical dictionary use patterns, the parameters for
6 tuning dictionaries, and several ideas for possible optimizations.
7*/
8
Victor Stinner742da042016-09-07 17:40:12 -07009/* PyDictKeysObject
10
11This implements the dictionary's hashtable.
12
Berker Peksag71c01d42016-09-09 03:57:23 +030013As of Python 3.6, this is compact and ordered. Basic idea is described here.
Benjamin Peterson003f0592016-09-08 10:14:31 -070014https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html
Victor Stinner742da042016-09-07 17:40:12 -070015
16layout:
17
18+---------------+
19| dk_refcnt |
20| dk_size |
21| dk_lookup |
22| dk_usable |
23| dk_nentries |
24+---------------+
25| dk_indices |
26| |
27+---------------+
28| dk_entries |
29| |
30+---------------+
31
32dk_indices is actual hashtable. It holds index in entries, or DKIX_EMPTY(-1)
33or DKIX_DUMMY(-2).
34Size of indices is dk_size. Type of each index in indices is vary on dk_size:
35
36* int8 for dk_size <= 128
37* int16 for 256 <= dk_size <= 2**15
38* int32 for 2**16 <= dk_size <= 2**31
39* int64 for 2**32 <= dk_size
40
41dk_entries is array of PyDictKeyEntry. It's size is USABLE_FRACTION(dk_size).
42DK_ENTRIES(dk) can be used to get pointer to entries.
43
44NOTE: Since negative value is used for DKIX_EMPTY and DKIX_DUMMY, type of
45dk_indices entry is signed integer and int16 is used for table which
46dk_size == 256.
47*/
48
Benjamin Peterson7d95e402012-04-23 11:24:50 -040049
50/*
Benjamin Peterson7d95e402012-04-23 11:24:50 -040051The DictObject can be in one of two forms.
Victor Stinner742da042016-09-07 17:40:12 -070052
Benjamin Peterson7d95e402012-04-23 11:24:50 -040053Either:
54 A combined table:
55 ma_values == NULL, dk_refcnt == 1.
56 Values are stored in the me_value field of the PyDictKeysObject.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040057Or:
58 A split table:
59 ma_values != NULL, dk_refcnt >= 1
60 Values are stored in the ma_values array.
Victor Stinner742da042016-09-07 17:40:12 -070061 Only string (unicode) keys are allowed.
62 All dicts sharing same key must have same insertion order.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040063
Victor Stinner742da042016-09-07 17:40:12 -070064There are four kinds of slots in the table (slot is index, and
65DK_ENTRIES(keys)[index] if index >= 0):
66
671. Unused. index == DKIX_EMPTY
68 Does not hold an active (key, value) pair now and never did. Unused can
69 transition to Active upon key insertion. This is each slot's initial state.
70
712. Active. index >= 0, me_key != NULL and me_value != NULL
72 Holds an active (key, value) pair. Active can transition to Dummy or
73 Pending upon key deletion (for combined and split tables respectively).
74 This is the only case in which me_value != NULL.
75
763. Dummy. index == DKIX_DUMMY (combined only)
77 Previously held an active (key, value) pair, but that was deleted and an
78 active pair has not yet overwritten the slot. Dummy can transition to
79 Active upon key insertion. Dummy slots cannot be made Unused again
80 else the probe sequence in case of collision would have no way to know
81 they were once active.
82
834. Pending. index >= 0, key != NULL, and value == NULL (split only)
84 Not yet inserted in split-table.
Benjamin Peterson7d95e402012-04-23 11:24:50 -040085*/
86
Victor Stinner742da042016-09-07 17:40:12 -070087/*
88Preserving insertion order
Benjamin Peterson7d95e402012-04-23 11:24:50 -040089
Victor Stinner742da042016-09-07 17:40:12 -070090It's simple for combined table. Since dk_entries is mostly append only, we can
91get insertion order by just iterating dk_entries.
92
93One exception is .popitem(). It removes last item in dk_entries and decrement
94dk_nentries to achieve amortized O(1). Since there are DKIX_DUMMY remains in
95dk_indices, we can't increment dk_usable even though dk_nentries is
96decremented.
97
98In split table, inserting into pending entry is allowed only for dk_entries[ix]
99where ix == mp->ma_used. Inserting into other index and deleting item cause
100converting the dict to the combined table.
101*/
102
103/* PyDict_MINSIZE is the starting size for any new dict.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400104 * 8 allows dicts with no more than 5 active entries; experiments suggested
105 * this suffices for the majority of dicts (consisting mostly of usually-small
106 * dicts created to pass keyword arguments).
107 * Making this 8, rather than 4 reduces the number of resizes for most
108 * dictionaries, without any significant extra memory use.
109 */
Victor Stinner742da042016-09-07 17:40:12 -0700110#define PyDict_MINSIZE 8
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400111
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112#include "Python.h"
Eric Snow96c6af92015-05-29 22:21:39 -0600113#include "dict-common.h"
Victor Stinner990397e2016-09-09 20:22:59 -0700114#include "stringlib/eq.h" /* to get unicode_eq() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000115
Larry Hastings61272b72014-01-07 12:41:53 -0800116/*[clinic input]
Larry Hastingsc2047262014-01-25 20:43:29 -0800117class dict "PyDictObject *" "&PyDict_Type"
Larry Hastings61272b72014-01-07 12:41:53 -0800118[clinic start generated code]*/
Larry Hastings581ee362014-01-28 05:00:08 -0800119/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f157a5a0ce9589d6]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800120
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400121
122/*
123To ensure the lookup algorithm terminates, there must be at least one Unused
124slot (NULL key) in the table.
125To avoid slowing down lookups on a near-full table, we resize the table when
126it's USABLE_FRACTION (currently two-thirds) full.
127*/
Guido van Rossum16e93a81997-01-28 00:00:11 +0000128
Tim Peterseb28ef22001-06-02 05:27:19 +0000129#define PERTURB_SHIFT 5
130
Guido van Rossum16e93a81997-01-28 00:00:11 +0000131/*
Tim Peterseb28ef22001-06-02 05:27:19 +0000132Major subtleties ahead: Most hash schemes depend on having a "good" hash
133function, in the sense of simulating randomness. Python doesn't: its most
R David Murray537ad7a2016-07-10 12:33:18 -0400134important hash functions (for ints) are very regular in common
Tim Peterseb28ef22001-06-02 05:27:19 +0000135cases:
Tim Peters15d49292001-05-27 07:39:22 +0000136
R David Murray537ad7a2016-07-10 12:33:18 -0400137 >>>[hash(i) for i in range(4)]
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000138 [0, 1, 2, 3]
Tim Peters15d49292001-05-27 07:39:22 +0000139
Tim Peterseb28ef22001-06-02 05:27:19 +0000140This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
141the low-order i bits as the initial table index is extremely fast, and there
R David Murray537ad7a2016-07-10 12:33:18 -0400142are no collisions at all for dicts indexed by a contiguous range of ints. So
143this gives better-than-random behavior in common cases, and that's very
144desirable.
Tim Peters15d49292001-05-27 07:39:22 +0000145
Tim Peterseb28ef22001-06-02 05:27:19 +0000146OTOH, when collisions occur, the tendency to fill contiguous slices of the
147hash table makes a good collision resolution strategy crucial. Taking only
148the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000150their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
151 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +0000152
Tim Peterseb28ef22001-06-02 05:27:19 +0000153But catering to unusual cases should not slow the usual ones, so we just take
154the last i bits anyway. It's up to collision resolution to do the rest. If
155we *usually* find the key we're looking for on the first try (and, it turns
156out, we usually do -- the table load factor is kept under 2/3, so the odds
157are solidly in our favor), then it makes best sense to keep the initial index
158computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +0000159
Tim Peterseb28ef22001-06-02 05:27:19 +0000160The first half of collision resolution is to visit table indices via this
161recurrence:
Tim Peters15d49292001-05-27 07:39:22 +0000162
Tim Peterseb28ef22001-06-02 05:27:19 +0000163 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +0000164
Tim Peterseb28ef22001-06-02 05:27:19 +0000165For any initial j in range(2**i), repeating that 2**i times generates each
166int in range(2**i) exactly once (see any text on random-number generation for
167proof). By itself, this doesn't help much: like linear probing (setting
168j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
169order. This would be bad, except that's not the only thing we do, and it's
170actually *good* in the common cases where hash keys are consecutive. In an
171example that's really too small to make this entirely clear, for a table of
172size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +0000173
Tim Peterseb28ef22001-06-02 05:27:19 +0000174 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
175
176If two things come in at index 5, the first place we look after is index 2,
177not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
178Linear probing is deadly in this case because there the fixed probe order
179is the *same* as the order consecutive keys are likely to arrive. But it's
180extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
181and certain that consecutive hash codes do not.
182
183The other half of the strategy is to get the other bits of the hash code
184into play. This is done by initializing a (unsigned) vrbl "perturb" to the
185full hash code, and changing the recurrence to:
186
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 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700329#if SIZEOF_VOID_P > 4
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300330 else if (s > 0xffffffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700331 int64_t *indices = keys->dk_indices.as_8;
Victor Stinner208857e2016-09-08 11:35:46 -0700332 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700333 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700334#endif
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300335 else {
336 int32_t *indices = keys->dk_indices.as_4;
337 ix = indices[i];
338 }
Victor Stinner71211e32016-09-08 10:52:46 -0700339 assert(ix >= DKIX_DUMMY);
340 return ix;
Victor Stinner742da042016-09-07 17:40:12 -0700341}
342
343/* write to indices. */
Benjamin Peterson73222252016-09-08 09:58:47 -0700344static inline void
Victor Stinner742da042016-09-07 17:40:12 -0700345dk_set_index(PyDictKeysObject *keys, Py_ssize_t i, Py_ssize_t ix)
346{
347 Py_ssize_t s = DK_SIZE(keys);
Victor Stinner71211e32016-09-08 10:52:46 -0700348
349 assert(ix >= DKIX_DUMMY);
350
Victor Stinner742da042016-09-07 17:40:12 -0700351 if (s <= 0xff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700352 int8_t *indices = keys->dk_indices.as_1;
Victor Stinner71211e32016-09-08 10:52:46 -0700353 assert(ix <= 0x7f);
Victor Stinner208857e2016-09-08 11:35:46 -0700354 indices[i] = (char)ix;
Victor Stinner742da042016-09-07 17:40:12 -0700355 }
356 else if (s <= 0xffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700357 int16_t *indices = keys->dk_indices.as_2;
Victor Stinner71211e32016-09-08 10:52:46 -0700358 assert(ix <= 0x7fff);
Victor Stinner208857e2016-09-08 11:35:46 -0700359 indices[i] = (int16_t)ix;
Victor Stinner742da042016-09-07 17:40:12 -0700360 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700361#if SIZEOF_VOID_P > 4
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300362 else if (s > 0xffffffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700363 int64_t *indices = keys->dk_indices.as_8;
Victor Stinner208857e2016-09-08 11:35:46 -0700364 indices[i] = ix;
Victor Stinner742da042016-09-07 17:40:12 -0700365 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700366#endif
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300367 else {
368 int32_t *indices = keys->dk_indices.as_4;
369 assert(ix <= 0x7fffffff);
370 indices[i] = (int32_t)ix;
371 }
Victor Stinner742da042016-09-07 17:40:12 -0700372}
373
374
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200375/* USABLE_FRACTION is the maximum dictionary load.
Victor Stinner742da042016-09-07 17:40:12 -0700376 * Increasing this ratio makes dictionaries more dense resulting in more
377 * collisions. Decreasing it improves sparseness at the expense of spreading
378 * indices over more cache lines and at the cost of total memory consumed.
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200379 *
380 * USABLE_FRACTION must obey the following:
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400381 * (0 < USABLE_FRACTION(n) < n) for all n >= 2
382 *
Victor Stinner742da042016-09-07 17:40:12 -0700383 * USABLE_FRACTION should be quick to calculate.
384 * Fractions around 1/2 to 2/3 seem to work well in practice.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400385 */
Victor Stinner742da042016-09-07 17:40:12 -0700386#define USABLE_FRACTION(n) (((n) << 1)/3)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400387
Victor Stinner742da042016-09-07 17:40:12 -0700388/* ESTIMATE_SIZE is reverse function of USABLE_FRACTION.
389 * This can be used to reserve enough size to insert n entries without
390 * resizing.
391 */
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
Victor Stinner3c336c52016-09-12 14:17:40 +0200987 when it is known that the key is not present in the dict.
988
989 The dict must be combined. */
Victor Stinner99264802016-09-13 09:38:29 +0200990static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400991find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Victor Stinner742da042016-09-07 17:40:12 -0700992 PyObject ***value_addr, Py_ssize_t *hashpos)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000993{
Victor Stinner742da042016-09-07 17:40:12 -0700994 size_t i, perturb;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400995 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700996 Py_ssize_t ix;
997 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000998
Victor Stinner3c336c52016-09-12 14:17:40 +0200999 assert(!_PyDict_HasSplitTable(mp));
Victor Stinner742da042016-09-07 17:40:12 -07001000 assert(hashpos != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001001 assert(key != NULL);
Victor Stinner3c336c52016-09-12 14:17:40 +02001002
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001003 if (!PyUnicode_CheckExact(key))
1004 mp->ma_keys->dk_lookup = lookdict;
1005 i = hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -07001006 ix = dk_get_index(mp->ma_keys, i);
1007 for (perturb = hash; ix != DKIX_EMPTY; perturb >>= PERTURB_SHIFT) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001008 i = (i << 2) + i + perturb + 1;
Victor Stinner742da042016-09-07 17:40:12 -07001009 ix = dk_get_index(mp->ma_keys, i & mask);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 }
Victor Stinner742da042016-09-07 17:40:12 -07001011 ep = &ep0[mp->ma_keys->dk_nentries];
1012 *hashpos = i & mask;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001013 assert(ep->me_value == NULL);
Victor Stinner99264802016-09-13 09:38:29 +02001014 *value_addr = &ep->me_value;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001015}
1016
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001017static int
1018insertion_resize(PyDictObject *mp)
1019{
Raymond Hettinger36f74aa2013-05-17 03:01:13 -07001020 return dictresize(mp, GROWTH_RATE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001021}
Antoine Pitroue965d972012-02-27 00:45:12 +01001022
1023/*
1024Internal routine to insert a new item into the table.
1025Used both by the internal resize routine and by the public insert routine.
Antoine Pitroue965d972012-02-27 00:45:12 +01001026Returns -1 if an error occurred, or 0 on success.
1027*/
1028static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001029insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001030{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001031 PyObject *old_value;
1032 PyObject **value_addr;
Victor Stinner742da042016-09-07 17:40:12 -07001033 PyDictKeyEntry *ep, *ep0;
1034 Py_ssize_t hashpos, ix;
Antoine Pitroue965d972012-02-27 00:45:12 +01001035
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001036 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
1037 if (insertion_resize(mp) < 0)
1038 return -1;
1039 }
1040
Victor Stinner742da042016-09-07 17:40:12 -07001041 ix = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr, &hashpos);
1042 if (ix == DKIX_ERROR) {
Antoine Pitroue965d972012-02-27 00:45:12 +01001043 return -1;
1044 }
Victor Stinner742da042016-09-07 17:40:12 -07001045
Antoine Pitroud6967322014-10-18 00:35:00 +02001046 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
Benjamin Petersona6f195e2012-04-30 10:23:40 -04001047 Py_INCREF(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001048 MAINTAIN_TRACKING(mp, key, value);
Victor Stinner742da042016-09-07 17:40:12 -07001049
1050 /* When insertion order is different from shared key, we can't share
1051 * the key anymore. Convert this instance to combine table.
1052 */
1053 if (_PyDict_HasSplitTable(mp) &&
1054 ((ix >= 0 && *value_addr == NULL && mp->ma_used != ix) ||
1055 (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {
1056 if (insertion_resize(mp) < 0) {
1057 Py_DECREF(value);
1058 return -1;
1059 }
1060 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
1061 ix = DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001062 }
Victor Stinner742da042016-09-07 17:40:12 -07001063
1064 if (ix == DKIX_EMPTY) {
1065 /* Insert into new slot. */
1066 if (mp->ma_keys->dk_usable <= 0) {
1067 /* Need to resize. */
1068 if (insertion_resize(mp) < 0) {
1069 Py_DECREF(value);
1070 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001071 }
Victor Stinner742da042016-09-07 17:40:12 -07001072 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
1073 }
1074 ep0 = DK_ENTRIES(mp->ma_keys);
1075 ep = &ep0[mp->ma_keys->dk_nentries];
1076 dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
1077 Py_INCREF(key);
1078 ep->me_key = key;
1079 ep->me_hash = hash;
1080 if (mp->ma_values) {
1081 assert (mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
1082 mp->ma_values[mp->ma_keys->dk_nentries] = value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001083 }
1084 else {
Victor Stinner742da042016-09-07 17:40:12 -07001085 ep->me_value = value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001086 }
1087 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001088 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07001089 mp->ma_keys->dk_usable--;
1090 mp->ma_keys->dk_nentries++;
1091 assert(mp->ma_keys->dk_usable >= 0);
1092 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001093 }
Victor Stinner742da042016-09-07 17:40:12 -07001094
1095 assert(value_addr != NULL);
1096
1097 old_value = *value_addr;
1098 if (old_value != NULL) {
1099 *value_addr = value;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001100 mp->ma_version_tag = DICT_NEXT_VERSION();
1101
Victor Stinner742da042016-09-07 17:40:12 -07001102 Py_DECREF(old_value); /* which **CAN** re-enter (see issue #22653) */
1103 return 0;
1104 }
1105
1106 /* pending state */
1107 assert(_PyDict_HasSplitTable(mp));
1108 assert(ix == mp->ma_used);
1109 *value_addr = value;
1110 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001111 mp->ma_version_tag = DICT_NEXT_VERSION();
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001112 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +01001113}
1114
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001115/*
1116Internal routine used by dictresize() to insert an item which is
1117known to be absent from the dict. This routine also assumes that
1118the dict contains no deleted entries. Besides the performance benefit,
1119using insertdict() in dictresize() is dangerous (SF bug #1456209).
1120Note that no refcounts are changed by this routine; if needed, the caller
1121is responsible for incref'ing `key` and `value`.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001122Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
1123must set them correctly
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001124*/
1125static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001126insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001128{
Victor Stinner742da042016-09-07 17:40:12 -07001129 size_t i, perturb;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001130 PyDictKeysObject *k = mp->ma_keys;
1131 size_t mask = (size_t)DK_SIZE(k)-1;
Victor Stinner742da042016-09-07 17:40:12 -07001132 PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001133 PyDictKeyEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001134
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001135 assert(k->dk_lookup != NULL);
1136 assert(value != NULL);
1137 assert(key != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001138 assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
1139 i = hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -07001140 for (perturb = hash; dk_get_index(k, i) != DKIX_EMPTY;
1141 perturb >>= PERTURB_SHIFT) {
1142 i = mask & ((i << 2) + i + perturb + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 }
Victor Stinner742da042016-09-07 17:40:12 -07001144 ep = &ep0[k->dk_nentries];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 assert(ep->me_value == NULL);
Victor Stinner742da042016-09-07 17:40:12 -07001146 dk_set_index(k, i, k->dk_nentries);
1147 k->dk_nentries++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001149 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001151}
1152
1153/*
1154Restructure the table by allocating a new table and reinserting all
1155items again. When entries have been deleted, the new table may
1156actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001157If a table is split (its keys and hashes are shared, its values are not),
1158then the values are temporarily copied into the table, it is resized as
1159a combined table, then the me_value slots in the old table are NULLed out.
1160After resizing a table is always combined,
1161but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001162*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001163static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001164dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001165{
Victor Stinner742da042016-09-07 17:40:12 -07001166 Py_ssize_t i, newsize;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001167 PyDictKeysObject *oldkeys;
1168 PyObject **oldvalues;
Victor Stinner742da042016-09-07 17:40:12 -07001169 PyDictKeyEntry *ep0;
Tim Peters91a364d2001-05-19 07:04:38 +00001170
Victor Stinner742da042016-09-07 17:40:12 -07001171 /* Find the smallest table size > minused. */
1172 for (newsize = PyDict_MINSIZE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 newsize <= minused && newsize > 0;
1174 newsize <<= 1)
1175 ;
1176 if (newsize <= 0) {
1177 PyErr_NoMemory();
1178 return -1;
1179 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001180 oldkeys = mp->ma_keys;
1181 oldvalues = mp->ma_values;
1182 /* Allocate a new table. */
1183 mp->ma_keys = new_keys_object(newsize);
1184 if (mp->ma_keys == NULL) {
1185 mp->ma_keys = oldkeys;
1186 return -1;
1187 }
1188 if (oldkeys->dk_lookup == lookdict)
1189 mp->ma_keys->dk_lookup = lookdict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001190 mp->ma_values = NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001191 ep0 = DK_ENTRIES(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001192 /* Main loop below assumes we can transfer refcount to new keys
1193 * and that value is stored in me_value.
1194 * Increment ref-counts and copy values here to compensate
1195 * This (resizing a split table) should be relatively rare */
1196 if (oldvalues != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001197 for (i = 0; i < oldkeys->dk_nentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001198 if (oldvalues[i] != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001199 Py_INCREF(ep0[i].me_key);
1200 ep0[i].me_value = oldvalues[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 }
1203 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001204 /* Main loop */
Victor Stinner742da042016-09-07 17:40:12 -07001205 for (i = 0; i < oldkeys->dk_nentries; i++) {
1206 PyDictKeyEntry *ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001207 if (ep->me_value != NULL) {
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001208 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001211 mp->ma_keys->dk_usable -= mp->ma_used;
1212 if (oldvalues != NULL) {
1213 /* NULL out me_value slot in oldkeys, in case it was shared */
Victor Stinner742da042016-09-07 17:40:12 -07001214 for (i = 0; i < oldkeys->dk_nentries; i++)
1215 ep0[i].me_value = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001216 DK_DECREF(oldkeys);
Victor Stinner742da042016-09-07 17:40:12 -07001217 if (oldvalues != empty_values) {
1218 free_values(oldvalues);
1219 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001220 }
1221 else {
1222 assert(oldkeys->dk_lookup != lookdict_split);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001223 assert(oldkeys->dk_refcnt == 1);
Raymond Hettingerce5179f2016-01-31 08:56:21 -08001224 DK_DEBUG_DECREF PyObject_FREE(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001225 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001227}
1228
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001229/* Returns NULL if unable to split table.
1230 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001231static PyDictKeysObject *
1232make_keys_shared(PyObject *op)
1233{
1234 Py_ssize_t i;
1235 Py_ssize_t size;
1236 PyDictObject *mp = (PyDictObject *)op;
1237
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001238 if (!PyDict_CheckExact(op))
1239 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001240 if (!_PyDict_HasSplitTable(mp)) {
1241 PyDictKeyEntry *ep0;
1242 PyObject **values;
1243 assert(mp->ma_keys->dk_refcnt == 1);
1244 if (mp->ma_keys->dk_lookup == lookdict) {
1245 return NULL;
1246 }
1247 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
1248 /* Remove dummy keys */
1249 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
1250 return NULL;
1251 }
1252 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
1253 /* Copy values into a new array */
Victor Stinner742da042016-09-07 17:40:12 -07001254 ep0 = DK_ENTRIES(mp->ma_keys);
1255 size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001256 values = new_values(size);
1257 if (values == NULL) {
1258 PyErr_SetString(PyExc_MemoryError,
1259 "Not enough memory to allocate new values array");
1260 return NULL;
1261 }
1262 for (i = 0; i < size; i++) {
1263 values[i] = ep0[i].me_value;
1264 ep0[i].me_value = NULL;
1265 }
1266 mp->ma_keys->dk_lookup = lookdict_split;
1267 mp->ma_values = values;
1268 }
1269 DK_INCREF(mp->ma_keys);
1270 return mp->ma_keys;
1271}
Christian Heimes99170a52007-12-19 02:07:34 +00001272
1273PyObject *
1274_PyDict_NewPresized(Py_ssize_t minused)
1275{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001276 Py_ssize_t newsize;
1277 PyDictKeysObject *new_keys;
Victor Stinner742da042016-09-07 17:40:12 -07001278 for (newsize = PyDict_MINSIZE;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001279 newsize <= minused && newsize > 0;
1280 newsize <<= 1)
1281 ;
1282 new_keys = new_keys_object(newsize);
1283 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001285 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001286}
1287
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001288/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1289 * that may occur (originally dicts supported only string keys, and exceptions
1290 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001291 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001292 * (suppressed) occurred while computing the key's hash, or that some error
1293 * (suppressed) occurred when comparing keys in the dict's internal probe
1294 * sequence. A nasty example of the latter is when a Python-coded comparison
1295 * function hits a stack-depth error, which can cause this to return NULL
1296 * even if the key is present.
1297 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001299PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001300{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001301 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001302 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 PyDictObject *mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001305 PyObject **value_addr;
1306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 if (!PyDict_Check(op))
1308 return NULL;
1309 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001310 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 {
1312 hash = PyObject_Hash(key);
1313 if (hash == -1) {
1314 PyErr_Clear();
1315 return NULL;
1316 }
1317 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 /* We can arrive here with a NULL tstate during initialization: try
1320 running "python -Wi" for an example related to string interning.
1321 Let's just hope that no exception occurs then... This must be
1322 _PyThreadState_Current and not PyThreadState_GET() because in debug
1323 mode, the latter complains if tstate is NULL. */
Victor Stinnerbfd316e2016-01-20 11:12:38 +01001324 tstate = _PyThreadState_UncheckedGet();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 if (tstate != NULL && tstate->curexc_type != NULL) {
1326 /* preserve the existing exception */
1327 PyObject *err_type, *err_value, *err_tb;
1328 PyErr_Fetch(&err_type, &err_value, &err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001329 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 /* ignore errors */
1331 PyErr_Restore(err_type, err_value, err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001332 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 return NULL;
1334 }
1335 else {
Victor Stinner742da042016-09-07 17:40:12 -07001336 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1337 if (ix < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 PyErr_Clear();
1339 return NULL;
1340 }
1341 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001342 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001343}
1344
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001345PyObject *
1346_PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1347{
Victor Stinner742da042016-09-07 17:40:12 -07001348 Py_ssize_t ix;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001349 PyDictObject *mp = (PyDictObject *)op;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001350 PyThreadState *tstate;
1351 PyObject **value_addr;
1352
1353 if (!PyDict_Check(op))
1354 return NULL;
1355
1356 /* We can arrive here with a NULL tstate during initialization: try
1357 running "python -Wi" for an example related to string interning.
1358 Let's just hope that no exception occurs then... This must be
1359 _PyThreadState_Current and not PyThreadState_GET() because in debug
1360 mode, the latter complains if tstate is NULL. */
Victor Stinnerbfd316e2016-01-20 11:12:38 +01001361 tstate = _PyThreadState_UncheckedGet();
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001362 if (tstate != NULL && tstate->curexc_type != NULL) {
1363 /* preserve the existing exception */
1364 PyObject *err_type, *err_value, *err_tb;
1365 PyErr_Fetch(&err_type, &err_value, &err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001366 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001367 /* ignore errors */
1368 PyErr_Restore(err_type, err_value, err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001369 if (ix == DKIX_EMPTY)
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001370 return NULL;
1371 }
1372 else {
Victor Stinner742da042016-09-07 17:40:12 -07001373 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1374 if (ix == DKIX_EMPTY) {
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001375 PyErr_Clear();
1376 return NULL;
1377 }
1378 }
1379 return *value_addr;
1380}
1381
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001382/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1383 This returns NULL *with* an exception set if an exception occurred.
1384 It returns NULL *without* an exception set if the key wasn't present.
1385*/
1386PyObject *
1387PyDict_GetItemWithError(PyObject *op, PyObject *key)
1388{
Victor Stinner742da042016-09-07 17:40:12 -07001389 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001390 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001392 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 if (!PyDict_Check(op)) {
1395 PyErr_BadInternalCall();
1396 return NULL;
1397 }
1398 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001399 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 {
1401 hash = PyObject_Hash(key);
1402 if (hash == -1) {
1403 return NULL;
1404 }
1405 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001406
Victor Stinner742da042016-09-07 17:40:12 -07001407 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1408 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001410 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001411}
1412
Brett Cannonfd074152012-04-14 14:10:13 -04001413PyObject *
1414_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1415{
1416 PyObject *kv;
1417 kv = _PyUnicode_FromId(key); /* borrowed */
1418 if (kv == NULL)
1419 return NULL;
1420 return PyDict_GetItemWithError(dp, kv);
1421}
1422
Victor Stinnerb4efc962015-11-20 09:24:02 +01001423/* Fast version of global value lookup (LOAD_GLOBAL).
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001424 * Lookup in globals, then builtins.
Victor Stinnerb4efc962015-11-20 09:24:02 +01001425 *
1426 * Raise an exception and return NULL if an error occurred (ex: computing the
1427 * key hash failed, key comparison failed, ...). Return NULL if the key doesn't
1428 * exist. Return the value if the key exists.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001429 */
1430PyObject *
1431_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001432{
Victor Stinner742da042016-09-07 17:40:12 -07001433 Py_ssize_t ix;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001434 Py_hash_t hash;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001435 PyObject **value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001436
1437 if (!PyUnicode_CheckExact(key) ||
1438 (hash = ((PyASCIIObject *) key)->hash) == -1)
1439 {
1440 hash = PyObject_Hash(key);
1441 if (hash == -1)
1442 return NULL;
Antoine Pitroue965d972012-02-27 00:45:12 +01001443 }
Victor Stinnerb4efc962015-11-20 09:24:02 +01001444
1445 /* namespace 1: globals */
Victor Stinner742da042016-09-07 17:40:12 -07001446 ix = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr, NULL);
1447 if (ix == DKIX_ERROR)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001448 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001449 if (ix != DKIX_EMPTY && *value_addr != NULL)
1450 return *value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001451
1452 /* namespace 2: builtins */
Victor Stinner742da042016-09-07 17:40:12 -07001453 ix = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr, NULL);
1454 if (ix < 0)
Victor Stinnerb4efc962015-11-20 09:24:02 +01001455 return NULL;
1456 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001457}
1458
Antoine Pitroue965d972012-02-27 00:45:12 +01001459/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1460 * dictionary if it's merely replacing the value for an existing key.
1461 * This means that it's safe to loop over a dictionary with PyDict_Next()
1462 * and occasionally replace a value -- but you can't insert new keys or
1463 * remove them.
1464 */
1465int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001466PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001467{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001468 PyDictObject *mp;
1469 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001470 if (!PyDict_Check(op)) {
1471 PyErr_BadInternalCall();
1472 return -1;
1473 }
1474 assert(key);
1475 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001476 mp = (PyDictObject *)op;
1477 if (!PyUnicode_CheckExact(key) ||
1478 (hash = ((PyASCIIObject *) key)->hash) == -1)
1479 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001480 hash = PyObject_Hash(key);
1481 if (hash == -1)
1482 return -1;
1483 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001484
1485 /* insertdict() handles any resizing that might be necessary */
1486 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001487}
1488
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001489int
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001490_PyDict_SetItem_KnownHash(PyObject *op, PyObject *key, PyObject *value,
1491 Py_hash_t hash)
1492{
1493 PyDictObject *mp;
1494
1495 if (!PyDict_Check(op)) {
1496 PyErr_BadInternalCall();
1497 return -1;
1498 }
1499 assert(key);
1500 assert(value);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001501 assert(hash != -1);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001502 mp = (PyDictObject *)op;
1503
1504 /* insertdict() handles any resizing that might be necessary */
1505 return insertdict(mp, key, hash, value);
1506}
1507
1508int
Tim Peters1f5871e2000-07-04 17:44:48 +00001509PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001510{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001511 Py_hash_t hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 assert(key);
1514 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001515 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 hash = PyObject_Hash(key);
1517 if (hash == -1)
1518 return -1;
1519 }
Victor Stinner742da042016-09-07 17:40:12 -07001520
1521 return _PyDict_DelItem_KnownHash(op, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001522}
1523
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001524int
1525_PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1526{
Victor Stinner742da042016-09-07 17:40:12 -07001527 Py_ssize_t hashpos, ix;
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001528 PyDictObject *mp;
1529 PyDictKeyEntry *ep;
1530 PyObject *old_key, *old_value;
1531 PyObject **value_addr;
1532
1533 if (!PyDict_Check(op)) {
1534 PyErr_BadInternalCall();
1535 return -1;
1536 }
1537 assert(key);
1538 assert(hash != -1);
1539 mp = (PyDictObject *)op;
Victor Stinner742da042016-09-07 17:40:12 -07001540 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1541 if (ix == DKIX_ERROR)
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001542 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07001543 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001544 _PyErr_SetKeyError(key);
1545 return -1;
1546 }
Victor Stinner742da042016-09-07 17:40:12 -07001547 assert(dk_get_index(mp->ma_keys, hashpos) == ix);
Victor Stinner78601a32016-09-09 19:28:36 -07001548
1549 // Split table doesn't allow deletion. Combine it.
1550 if (_PyDict_HasSplitTable(mp)) {
1551 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1552 return -1;
1553 }
1554 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1555 assert(ix >= 0);
1556 }
1557
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001558 old_value = *value_addr;
Victor Stinner78601a32016-09-09 19:28:36 -07001559 assert(old_value != NULL);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001560 *value_addr = NULL;
1561 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001562 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner78601a32016-09-09 19:28:36 -07001563 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1564 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1565 ENSURE_ALLOWS_DELETIONS(mp);
1566 old_key = ep->me_key;
1567 ep->me_key = NULL;
1568 Py_DECREF(old_key);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001569 Py_DECREF(old_value);
1570 return 0;
1571}
1572
Guido van Rossum25831651993-05-19 14:50:45 +00001573void
Tim Peters1f5871e2000-07-04 17:44:48 +00001574PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001577 PyDictKeysObject *oldkeys;
1578 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 if (!PyDict_Check(op))
1582 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001583 mp = ((PyDictObject *)op);
1584 oldkeys = mp->ma_keys;
1585 oldvalues = mp->ma_values;
1586 if (oldvalues == empty_values)
1587 return;
1588 /* Empty the dict... */
1589 DK_INCREF(Py_EMPTY_KEYS);
1590 mp->ma_keys = Py_EMPTY_KEYS;
1591 mp->ma_values = empty_values;
1592 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001593 mp->ma_version_tag = DICT_NEXT_VERSION();
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001594 /* ...then clear the keys and values */
1595 if (oldvalues != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001596 n = oldkeys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001597 for (i = 0; i < n; i++)
1598 Py_CLEAR(oldvalues[i]);
1599 free_values(oldvalues);
1600 DK_DECREF(oldkeys);
1601 }
1602 else {
1603 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001604 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001605 }
1606}
1607
1608/* Returns -1 if no more items (or op is not a dict),
1609 * index of item otherwise. Stores value in pvalue
1610 */
Benjamin Peterson73222252016-09-08 09:58:47 -07001611static inline Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001612dict_next(PyObject *op, Py_ssize_t i, PyObject **pvalue)
1613{
Victor Stinner742da042016-09-07 17:40:12 -07001614 Py_ssize_t n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001615 PyDictObject *mp;
Victor Stinner742da042016-09-07 17:40:12 -07001616 PyObject **value_ptr = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001617
1618 if (!PyDict_Check(op))
1619 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001621 if (i < 0)
1622 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07001623
1624 n = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001625 if (mp->ma_values) {
Victor Stinner742da042016-09-07 17:40:12 -07001626 for (; i < n; i++) {
1627 value_ptr = &mp->ma_values[i];
1628 if (*value_ptr != NULL)
1629 break;
1630 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001632 else {
Victor Stinner742da042016-09-07 17:40:12 -07001633 PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys);
1634 for (; i < n; i++) {
1635 value_ptr = &ep0[i].me_value;
1636 if (*value_ptr != NULL)
1637 break;
1638 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 }
Victor Stinner742da042016-09-07 17:40:12 -07001640 if (i >= n)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001641 return -1;
1642 if (pvalue)
1643 *pvalue = *value_ptr;
1644 return i;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001645}
1646
Tim Peters080c88b2003-02-15 03:01:11 +00001647/*
1648 * Iterate over a dict. Use like so:
1649 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001650 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001651 * PyObject *key, *value;
1652 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001653 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +00001654 * Refer to borrowed references in key and value.
1655 * }
1656 *
1657 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001658 * mutates the dict. One exception: it is safe if the loop merely changes
1659 * the values associated with the keys (but doesn't insert new keys or
1660 * delete keys), via PyDict_SetItem().
1661 */
Guido van Rossum25831651993-05-19 14:50:45 +00001662int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001663PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001664{
Victor Stinner742da042016-09-07 17:40:12 -07001665 PyDictObject *mp = (PyDictObject*)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001666 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 if (i < 0)
1668 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001669 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 *ppos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 if (pkey)
Victor Stinner742da042016-09-07 17:40:12 -07001672 *pkey = DK_ENTRIES(mp->ma_keys)[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001674}
1675
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001676/* Internal version of PyDict_Next that returns a hash value in addition
1677 * to the key and value.
1678 */
Thomas Wouterscf297e42007-02-23 15:07:44 +00001679int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001680_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1681 PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001682{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001683 PyDictObject *mp;
Victor Stinner742da042016-09-07 17:40:12 -07001684 PyDictKeyEntry *ep0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001685 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 if (i < 0)
1687 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001688 mp = (PyDictObject *)op;
Victor Stinner742da042016-09-07 17:40:12 -07001689 ep0 = DK_ENTRIES(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 *ppos = i+1;
Victor Stinner742da042016-09-07 17:40:12 -07001691 *phash = ep0[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 if (pkey)
Victor Stinner742da042016-09-07 17:40:12 -07001693 *pkey = ep0[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001695}
1696
Eric Snow96c6af92015-05-29 22:21:39 -06001697/* Internal version of dict.pop(). */
1698PyObject *
1699_PyDict_Pop(PyDictObject *mp, PyObject *key, PyObject *deflt)
1700{
1701 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001702 Py_ssize_t ix, hashpos;
Eric Snow96c6af92015-05-29 22:21:39 -06001703 PyObject *old_value, *old_key;
1704 PyDictKeyEntry *ep;
1705 PyObject **value_addr;
1706
1707 if (mp->ma_used == 0) {
1708 if (deflt) {
1709 Py_INCREF(deflt);
1710 return deflt;
1711 }
1712 _PyErr_SetKeyError(key);
1713 return NULL;
1714 }
1715 if (!PyUnicode_CheckExact(key) ||
1716 (hash = ((PyASCIIObject *) key)->hash) == -1) {
1717 hash = PyObject_Hash(key);
1718 if (hash == -1)
1719 return NULL;
1720 }
Victor Stinner742da042016-09-07 17:40:12 -07001721 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1722 if (ix == DKIX_ERROR)
Eric Snow96c6af92015-05-29 22:21:39 -06001723 return NULL;
Victor Stinnerd0ad11f2016-09-13 16:56:38 +02001724 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Eric Snow96c6af92015-05-29 22:21:39 -06001725 if (deflt) {
1726 Py_INCREF(deflt);
1727 return deflt;
1728 }
1729 _PyErr_SetKeyError(key);
1730 return NULL;
1731 }
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001732
Victor Stinner78601a32016-09-09 19:28:36 -07001733 // Split table doesn't allow deletion. Combine it.
1734 if (_PyDict_HasSplitTable(mp)) {
1735 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1736 return NULL;
1737 }
1738 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1739 assert(ix >= 0);
1740 }
1741
Victor Stinner742da042016-09-07 17:40:12 -07001742 old_value = *value_addr;
Victor Stinner78601a32016-09-09 19:28:36 -07001743 assert(old_value != NULL);
Eric Snow96c6af92015-05-29 22:21:39 -06001744 *value_addr = NULL;
1745 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001746 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner78601a32016-09-09 19:28:36 -07001747 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1748 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1749 ENSURE_ALLOWS_DELETIONS(mp);
1750 old_key = ep->me_key;
1751 ep->me_key = NULL;
1752 Py_DECREF(old_key);
Eric Snow96c6af92015-05-29 22:21:39 -06001753 return old_value;
1754}
1755
1756/* Internal version of dict.from_keys(). It is subclass-friendly. */
1757PyObject *
1758_PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
1759{
1760 PyObject *it; /* iter(iterable) */
1761 PyObject *key;
1762 PyObject *d;
1763 int status;
1764
1765 d = PyObject_CallObject(cls, NULL);
1766 if (d == NULL)
1767 return NULL;
1768
1769 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
1770 if (PyDict_CheckExact(iterable)) {
1771 PyDictObject *mp = (PyDictObject *)d;
1772 PyObject *oldvalue;
1773 Py_ssize_t pos = 0;
1774 PyObject *key;
1775 Py_hash_t hash;
1776
Victor Stinner742da042016-09-07 17:40:12 -07001777 if (dictresize(mp, ESTIMATE_SIZE(Py_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001778 Py_DECREF(d);
1779 return NULL;
1780 }
1781
1782 while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) {
1783 if (insertdict(mp, key, hash, value)) {
1784 Py_DECREF(d);
1785 return NULL;
1786 }
1787 }
1788 return d;
1789 }
1790 if (PyAnySet_CheckExact(iterable)) {
1791 PyDictObject *mp = (PyDictObject *)d;
1792 Py_ssize_t pos = 0;
1793 PyObject *key;
1794 Py_hash_t hash;
1795
Victor Stinner742da042016-09-07 17:40:12 -07001796 if (dictresize(mp, ESTIMATE_SIZE(PySet_GET_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001797 Py_DECREF(d);
1798 return NULL;
1799 }
1800
1801 while (_PySet_NextEntry(iterable, &pos, &key, &hash)) {
1802 if (insertdict(mp, key, hash, value)) {
1803 Py_DECREF(d);
1804 return NULL;
1805 }
1806 }
1807 return d;
1808 }
1809 }
1810
1811 it = PyObject_GetIter(iterable);
1812 if (it == NULL){
1813 Py_DECREF(d);
1814 return NULL;
1815 }
1816
1817 if (PyDict_CheckExact(d)) {
1818 while ((key = PyIter_Next(it)) != NULL) {
1819 status = PyDict_SetItem(d, key, value);
1820 Py_DECREF(key);
1821 if (status < 0)
1822 goto Fail;
1823 }
1824 } else {
1825 while ((key = PyIter_Next(it)) != NULL) {
1826 status = PyObject_SetItem(d, key, value);
1827 Py_DECREF(key);
1828 if (status < 0)
1829 goto Fail;
1830 }
1831 }
1832
1833 if (PyErr_Occurred())
1834 goto Fail;
1835 Py_DECREF(it);
1836 return d;
1837
1838Fail:
1839 Py_DECREF(it);
1840 Py_DECREF(d);
1841 return NULL;
1842}
1843
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001844/* Methods */
1845
1846static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001847dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001848{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001849 PyObject **values = mp->ma_values;
1850 PyDictKeysObject *keys = mp->ma_keys;
1851 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 PyObject_GC_UnTrack(mp);
1853 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001854 if (values != NULL) {
1855 if (values != empty_values) {
Victor Stinner742da042016-09-07 17:40:12 -07001856 for (i = 0, n = mp->ma_keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001857 Py_XDECREF(values[i]);
1858 }
1859 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001861 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02001863 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001864 assert(keys->dk_refcnt == 1);
1865 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001866 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1868 free_list[numfree++] = mp;
1869 else
1870 Py_TYPE(mp)->tp_free((PyObject *)mp);
1871 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001872}
1873
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001874
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001875static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001876dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001877{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001879 PyObject *key = NULL, *value = NULL;
1880 _PyUnicodeWriter writer;
1881 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 i = Py_ReprEnter((PyObject *)mp);
1884 if (i != 0) {
1885 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1886 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001889 Py_ReprLeave((PyObject *)mp);
1890 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 }
Tim Petersa7259592001-06-16 05:11:17 +00001892
Victor Stinnerf91929b2013-11-19 13:07:38 +01001893 _PyUnicodeWriter_Init(&writer);
1894 writer.overallocate = 1;
1895 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
1896 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00001897
Victor Stinnerf91929b2013-11-19 13:07:38 +01001898 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
1899 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 /* Do repr() on each key+value pair, and insert ": " between them.
1902 Note that repr may mutate the dict. */
1903 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001904 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001906 PyObject *s;
1907 int res;
1908
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001909 /* Prevent repr from deleting key or value during key format. */
1910 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02001912
Victor Stinnerf91929b2013-11-19 13:07:38 +01001913 if (!first) {
1914 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
1915 goto error;
1916 }
1917 first = 0;
1918
1919 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01001921 goto error;
1922 res = _PyUnicodeWriter_WriteStr(&writer, s);
1923 Py_DECREF(s);
1924 if (res < 0)
1925 goto error;
1926
1927 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
1928 goto error;
1929
1930 s = PyObject_Repr(value);
1931 if (s == NULL)
1932 goto error;
1933 res = _PyUnicodeWriter_WriteStr(&writer, s);
1934 Py_DECREF(s);
1935 if (res < 0)
1936 goto error;
1937
1938 Py_CLEAR(key);
1939 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 }
Tim Petersa7259592001-06-16 05:11:17 +00001941
Victor Stinnerf91929b2013-11-19 13:07:38 +01001942 writer.overallocate = 0;
1943 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
1944 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01001947
1948 return _PyUnicodeWriter_Finish(&writer);
1949
1950error:
1951 Py_ReprLeave((PyObject *)mp);
1952 _PyUnicodeWriter_Dealloc(&writer);
1953 Py_XDECREF(key);
1954 Py_XDECREF(value);
1955 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001956}
1957
Martin v. Löwis18e16552006-02-15 17:27:45 +00001958static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001959dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001962}
1963
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001964static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001965dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001967 PyObject *v;
Victor Stinner742da042016-09-07 17:40:12 -07001968 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001969 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001970 PyObject **value_addr;
1971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001973 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 hash = PyObject_Hash(key);
1975 if (hash == -1)
1976 return NULL;
1977 }
Victor Stinner742da042016-09-07 17:40:12 -07001978 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1979 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001981 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 if (!PyDict_CheckExact(mp)) {
1983 /* Look up __missing__ method if we're a subclass. */
1984 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05001985 _Py_IDENTIFIER(__missing__);
1986 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 if (missing != NULL) {
1988 res = PyObject_CallFunctionObjArgs(missing,
1989 key, NULL);
1990 Py_DECREF(missing);
1991 return res;
1992 }
1993 else if (PyErr_Occurred())
1994 return NULL;
1995 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07001996 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 return NULL;
1998 }
Victor Stinner742da042016-09-07 17:40:12 -07001999 v = *value_addr;
2000 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002002}
2003
2004static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002005dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002006{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002007 if (w == NULL)
2008 return PyDict_DelItem((PyObject *)mp, v);
2009 else
2010 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002011}
2012
Guido van Rossuma9e7a811997-05-13 21:02:11 +00002013static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 (lenfunc)dict_length, /*mp_length*/
2015 (binaryfunc)dict_subscript, /*mp_subscript*/
2016 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002017};
2018
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002019static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002020dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002021{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002022 PyObject *v;
2023 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002024 PyDictKeyEntry *ep;
2025 Py_ssize_t size, n, offset;
2026 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002027
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002028 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 n = mp->ma_used;
2030 v = PyList_New(n);
2031 if (v == NULL)
2032 return NULL;
2033 if (n != mp->ma_used) {
2034 /* Durnit. The allocations caused the dict to resize.
2035 * Just start over, this shouldn't normally happen.
2036 */
2037 Py_DECREF(v);
2038 goto again;
2039 }
Victor Stinner742da042016-09-07 17:40:12 -07002040 ep = DK_ENTRIES(mp->ma_keys);
2041 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002042 if (mp->ma_values) {
2043 value_ptr = mp->ma_values;
2044 offset = sizeof(PyObject *);
2045 }
2046 else {
2047 value_ptr = &ep[0].me_value;
2048 offset = sizeof(PyDictKeyEntry);
2049 }
2050 for (i = 0, j = 0; i < size; i++) {
2051 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 PyObject *key = ep[i].me_key;
2053 Py_INCREF(key);
2054 PyList_SET_ITEM(v, j, key);
2055 j++;
2056 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002057 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 }
2059 assert(j == n);
2060 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002061}
2062
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002063static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002064dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002065{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002066 PyObject *v;
2067 Py_ssize_t i, j;
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002068 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002069 Py_ssize_t size, n, offset;
2070 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002071
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002072 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 n = mp->ma_used;
2074 v = PyList_New(n);
2075 if (v == NULL)
2076 return NULL;
2077 if (n != mp->ma_used) {
2078 /* Durnit. The allocations caused the dict to resize.
2079 * Just start over, this shouldn't normally happen.
2080 */
2081 Py_DECREF(v);
2082 goto again;
2083 }
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002084 ep = DK_ENTRIES(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002085 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002086 if (mp->ma_values) {
2087 value_ptr = mp->ma_values;
2088 offset = sizeof(PyObject *);
2089 }
2090 else {
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002091 value_ptr = &ep[0].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002092 offset = sizeof(PyDictKeyEntry);
2093 }
2094 for (i = 0, j = 0; i < size; i++) {
2095 PyObject *value = *value_ptr;
2096 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2097 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 Py_INCREF(value);
2099 PyList_SET_ITEM(v, j, value);
2100 j++;
2101 }
2102 }
2103 assert(j == n);
2104 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002105}
2106
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002107static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002108dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002109{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002110 PyObject *v;
2111 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002112 Py_ssize_t size, offset;
2113 PyObject *item, *key;
2114 PyDictKeyEntry *ep;
2115 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 /* Preallocate the list of tuples, to avoid allocations during
2118 * the loop over the items, which could trigger GC, which
2119 * could resize the dict. :-(
2120 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002121 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 n = mp->ma_used;
2123 v = PyList_New(n);
2124 if (v == NULL)
2125 return NULL;
2126 for (i = 0; i < n; i++) {
2127 item = PyTuple_New(2);
2128 if (item == NULL) {
2129 Py_DECREF(v);
2130 return NULL;
2131 }
2132 PyList_SET_ITEM(v, i, item);
2133 }
2134 if (n != mp->ma_used) {
2135 /* Durnit. The allocations caused the dict to resize.
2136 * Just start over, this shouldn't normally happen.
2137 */
2138 Py_DECREF(v);
2139 goto again;
2140 }
2141 /* Nothing we do below makes any function calls. */
Victor Stinner742da042016-09-07 17:40:12 -07002142 ep = DK_ENTRIES(mp->ma_keys);
2143 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002144 if (mp->ma_values) {
2145 value_ptr = mp->ma_values;
2146 offset = sizeof(PyObject *);
2147 }
2148 else {
2149 value_ptr = &ep[0].me_value;
2150 offset = sizeof(PyDictKeyEntry);
2151 }
2152 for (i = 0, j = 0; i < size; i++) {
2153 PyObject *value = *value_ptr;
2154 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2155 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 key = ep[i].me_key;
2157 item = PyList_GET_ITEM(v, j);
2158 Py_INCREF(key);
2159 PyTuple_SET_ITEM(item, 0, key);
2160 Py_INCREF(value);
2161 PyTuple_SET_ITEM(item, 1, value);
2162 j++;
2163 }
2164 }
2165 assert(j == n);
2166 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002167}
2168
Larry Hastings5c661892014-01-24 06:17:25 -08002169/*[clinic input]
2170@classmethod
2171dict.fromkeys
Larry Hastings5c661892014-01-24 06:17:25 -08002172 iterable: object
2173 value: object=None
2174 /
2175
2176Returns a new dict with keys from iterable and values equal to value.
2177[clinic start generated code]*/
2178
Larry Hastings5c661892014-01-24 06:17:25 -08002179static PyObject *
2180dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002181/*[clinic end generated code: output=8fb98e4b10384999 input=b85a667f9bf4669d]*/
Larry Hastings5c661892014-01-24 06:17:25 -08002182{
Eric Snow96c6af92015-05-29 22:21:39 -06002183 return _PyDict_FromKeys((PyObject *)type, iterable, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002184}
2185
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002186static int
Victor Stinner742da042016-09-07 17:40:12 -07002187dict_update_common(PyObject *self, PyObject *args, PyObject *kwds,
2188 const char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002189{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 PyObject *arg = NULL;
2191 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
2194 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002197 _Py_IDENTIFIER(keys);
2198 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 result = PyDict_Merge(self, arg, 1);
2200 else
2201 result = PyDict_MergeFromSeq2(self, arg, 1);
2202 }
2203 if (result == 0 && kwds != NULL) {
2204 if (PyArg_ValidateKeywordArguments(kwds))
2205 result = PyDict_Merge(self, kwds, 1);
2206 else
2207 result = -1;
2208 }
2209 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002210}
2211
2212static PyObject *
2213dict_update(PyObject *self, PyObject *args, PyObject *kwds)
2214{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002215 if (dict_update_common(self, args, kwds, "update") != -1)
2216 Py_RETURN_NONE;
2217 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002218}
2219
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002220/* Update unconditionally replaces existing items.
2221 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00002222 otherwise it leaves existing items unchanged.
2223
2224 PyDict_{Update,Merge} update/merge from a mapping object.
2225
Tim Petersf582b822001-12-11 18:51:08 +00002226 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00002227 producing iterable objects of length 2.
2228*/
2229
Tim Petersf582b822001-12-11 18:51:08 +00002230int
Tim Peters1fc240e2001-10-26 05:06:50 +00002231PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
2232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 PyObject *it; /* iter(seq2) */
2234 Py_ssize_t i; /* index into seq2 of current element */
2235 PyObject *item; /* seq2[i] */
2236 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00002237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 assert(d != NULL);
2239 assert(PyDict_Check(d));
2240 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00002241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 it = PyObject_GetIter(seq2);
2243 if (it == NULL)
2244 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 for (i = 0; ; ++i) {
2247 PyObject *key, *value;
2248 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00002249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 fast = NULL;
2251 item = PyIter_Next(it);
2252 if (item == NULL) {
2253 if (PyErr_Occurred())
2254 goto Fail;
2255 break;
2256 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 /* Convert item to sequence, and verify length 2. */
2259 fast = PySequence_Fast(item, "");
2260 if (fast == NULL) {
2261 if (PyErr_ExceptionMatches(PyExc_TypeError))
2262 PyErr_Format(PyExc_TypeError,
2263 "cannot convert dictionary update "
2264 "sequence element #%zd to a sequence",
2265 i);
2266 goto Fail;
2267 }
2268 n = PySequence_Fast_GET_SIZE(fast);
2269 if (n != 2) {
2270 PyErr_Format(PyExc_ValueError,
2271 "dictionary update sequence element #%zd "
2272 "has length %zd; 2 is required",
2273 i, n);
2274 goto Fail;
2275 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 /* Update/merge with this (key, value) pair. */
2278 key = PySequence_Fast_GET_ITEM(fast, 0);
2279 value = PySequence_Fast_GET_ITEM(fast, 1);
2280 if (override || PyDict_GetItem(d, key) == NULL) {
2281 int status = PyDict_SetItem(d, key, value);
2282 if (status < 0)
2283 goto Fail;
2284 }
2285 Py_DECREF(fast);
2286 Py_DECREF(item);
2287 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 i = 0;
2290 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00002291Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 Py_XDECREF(item);
2293 Py_XDECREF(fast);
2294 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002295Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 Py_DECREF(it);
2297 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00002298}
2299
Tim Peters6d6c1a32001-08-02 04:15:00 +00002300int
2301PyDict_Update(PyObject *a, PyObject *b)
2302{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002304}
2305
2306int
2307PyDict_Merge(PyObject *a, PyObject *b, int override)
2308{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002309 PyDictObject *mp, *other;
2310 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -07002311 PyDictKeyEntry *entry, *ep0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002313 /* We accept for the argument either a concrete dictionary object,
2314 * or an abstract "mapping" object. For the former, we can do
2315 * things quite efficiently. For the latter, we only require that
2316 * PyMapping_Keys() and PyObject_GetItem() be supported.
2317 */
2318 if (a == NULL || !PyDict_Check(a) || b == NULL) {
2319 PyErr_BadInternalCall();
2320 return -1;
2321 }
2322 mp = (PyDictObject*)a;
2323 if (PyDict_Check(b)) {
2324 other = (PyDictObject*)b;
2325 if (other == mp || other->ma_used == 0)
2326 /* a.update(a) or a.update({}); nothing to do */
2327 return 0;
2328 if (mp->ma_used == 0)
2329 /* Since the target dict is empty, PyDict_GetItem()
2330 * always returns NULL. Setting override to 1
2331 * skips the unnecessary test.
2332 */
2333 override = 1;
2334 /* Do one big resize at the start, rather than
2335 * incrementally resizing as we insert new items. Expect
2336 * that there will be no (or few) overlapping keys.
2337 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002338 if (mp->ma_keys->dk_usable * 3 < other->ma_used * 2)
2339 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07002341 ep0 = DK_ENTRIES(other->ma_keys);
2342 for (i = 0, n = other->ma_keys->dk_nentries; i < n; i++) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002343 PyObject *key, *value;
2344 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002345 entry = &ep0[i];
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002346 key = entry->me_key;
2347 hash = entry->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002348 if (other->ma_values)
2349 value = other->ma_values[i];
2350 else
2351 value = entry->me_value;
2352
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002353 if (value != NULL) {
2354 int err = 0;
2355 Py_INCREF(key);
2356 Py_INCREF(value);
2357 if (override || PyDict_GetItem(a, key) == NULL)
2358 err = insertdict(mp, key, hash, value);
2359 Py_DECREF(value);
2360 Py_DECREF(key);
2361 if (err != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 return -1;
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002363
Victor Stinner742da042016-09-07 17:40:12 -07002364 if (n != other->ma_keys->dk_nentries) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002365 PyErr_SetString(PyExc_RuntimeError,
2366 "dict mutated during update");
2367 return -1;
2368 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 }
2370 }
2371 }
2372 else {
2373 /* Do it the generic, slower way */
2374 PyObject *keys = PyMapping_Keys(b);
2375 PyObject *iter;
2376 PyObject *key, *value;
2377 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 if (keys == NULL)
2380 /* Docstring says this is equivalent to E.keys() so
2381 * if E doesn't have a .keys() method we want
2382 * AttributeError to percolate up. Might as well
2383 * do the same for any other error.
2384 */
2385 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 iter = PyObject_GetIter(keys);
2388 Py_DECREF(keys);
2389 if (iter == NULL)
2390 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
2393 if (!override && PyDict_GetItem(a, key) != NULL) {
2394 Py_DECREF(key);
2395 continue;
2396 }
2397 value = PyObject_GetItem(b, key);
2398 if (value == NULL) {
2399 Py_DECREF(iter);
2400 Py_DECREF(key);
2401 return -1;
2402 }
2403 status = PyDict_SetItem(a, key, value);
2404 Py_DECREF(key);
2405 Py_DECREF(value);
2406 if (status < 0) {
2407 Py_DECREF(iter);
2408 return -1;
2409 }
2410 }
2411 Py_DECREF(iter);
2412 if (PyErr_Occurred())
2413 /* Iterator completed, via error */
2414 return -1;
2415 }
2416 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002417}
2418
2419static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002420dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002421{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002423}
2424
2425PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002426PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002427{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002429 PyDictObject *mp;
2430 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 if (o == NULL || !PyDict_Check(o)) {
2433 PyErr_BadInternalCall();
2434 return NULL;
2435 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002436 mp = (PyDictObject *)o;
2437 if (_PyDict_HasSplitTable(mp)) {
2438 PyDictObject *split_copy;
Victor Stinner742da042016-09-07 17:40:12 -07002439 Py_ssize_t size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
2440 PyObject **newvalues;
2441 newvalues = new_values(size);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002442 if (newvalues == NULL)
2443 return PyErr_NoMemory();
2444 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2445 if (split_copy == NULL) {
2446 free_values(newvalues);
2447 return NULL;
2448 }
2449 split_copy->ma_values = newvalues;
2450 split_copy->ma_keys = mp->ma_keys;
2451 split_copy->ma_used = mp->ma_used;
2452 DK_INCREF(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002453 for (i = 0, n = size; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002454 PyObject *value = mp->ma_values[i];
2455 Py_XINCREF(value);
2456 split_copy->ma_values[i] = value;
2457 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002458 if (_PyObject_GC_IS_TRACKED(mp))
2459 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002460 return (PyObject *)split_copy;
2461 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 copy = PyDict_New();
2463 if (copy == NULL)
2464 return NULL;
2465 if (PyDict_Merge(copy, o, 1) == 0)
2466 return copy;
2467 Py_DECREF(copy);
2468 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002469}
2470
Martin v. Löwis18e16552006-02-15 17:27:45 +00002471Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002472PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 if (mp == NULL || !PyDict_Check(mp)) {
2475 PyErr_BadInternalCall();
2476 return -1;
2477 }
2478 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002479}
2480
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002481PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002482PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 if (mp == NULL || !PyDict_Check(mp)) {
2485 PyErr_BadInternalCall();
2486 return NULL;
2487 }
2488 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002489}
2490
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002491PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002492PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002493{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 if (mp == NULL || !PyDict_Check(mp)) {
2495 PyErr_BadInternalCall();
2496 return NULL;
2497 }
2498 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002499}
2500
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002501PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002502PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 if (mp == NULL || !PyDict_Check(mp)) {
2505 PyErr_BadInternalCall();
2506 return NULL;
2507 }
2508 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002509}
2510
Tim Peterse63415e2001-05-08 04:38:29 +00002511/* Return 1 if dicts equal, 0 if not, -1 if error.
2512 * Gets out as soon as any difference is detected.
2513 * Uses only Py_EQ comparison.
2514 */
2515static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002516dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 if (a->ma_used != b->ma_used)
2521 /* can't be equal if # of entries differ */
2522 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Victor Stinner742da042016-09-07 17:40:12 -07002524 for (i = 0; i < a->ma_keys->dk_nentries; i++) {
2525 PyDictKeyEntry *ep = &DK_ENTRIES(a->ma_keys)[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002526 PyObject *aval;
2527 if (a->ma_values)
2528 aval = a->ma_values[i];
2529 else
2530 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 if (aval != NULL) {
2532 int cmp;
2533 PyObject *bval;
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002534 PyObject **vaddr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002535 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 /* temporarily bump aval's refcount to ensure it stays
2537 alive until we're done with it */
2538 Py_INCREF(aval);
2539 /* ditto for key */
2540 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002541 /* reuse the known hash value */
Victor Stinner742da042016-09-07 17:40:12 -07002542 if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr, NULL) < 0)
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002543 bval = NULL;
2544 else
2545 bval = *vaddr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 Py_DECREF(key);
2547 if (bval == NULL) {
2548 Py_DECREF(aval);
2549 if (PyErr_Occurred())
2550 return -1;
2551 return 0;
2552 }
2553 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2554 Py_DECREF(aval);
2555 if (cmp <= 0) /* error or not equal */
2556 return cmp;
2557 }
2558 }
2559 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002560}
Tim Peterse63415e2001-05-08 04:38:29 +00002561
2562static PyObject *
2563dict_richcompare(PyObject *v, PyObject *w, int op)
2564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 int cmp;
2566 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2569 res = Py_NotImplemented;
2570 }
2571 else if (op == Py_EQ || op == Py_NE) {
2572 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2573 if (cmp < 0)
2574 return NULL;
2575 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2576 }
2577 else
2578 res = Py_NotImplemented;
2579 Py_INCREF(res);
2580 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002581}
Tim Peterse63415e2001-05-08 04:38:29 +00002582
Larry Hastings61272b72014-01-07 12:41:53 -08002583/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07002584
2585@coexist
2586dict.__contains__
2587
2588 key: object
2589 /
2590
Meador Ingee02de8c2014-01-14 16:48:31 -06002591True if D has a key k, else False.
Larry Hastings61272b72014-01-07 12:41:53 -08002592[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07002593
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002594static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08002595dict___contains__(PyDictObject *self, PyObject *key)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002596/*[clinic end generated code: output=a3d03db709ed6e6b input=b852b2a19b51ab24]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002597{
Larry Hastingsc2047262014-01-25 20:43:29 -08002598 register PyDictObject *mp = self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002599 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002600 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002601 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002604 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 hash = PyObject_Hash(key);
2606 if (hash == -1)
2607 return NULL;
2608 }
Victor Stinner742da042016-09-07 17:40:12 -07002609 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2610 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002612 if (ix == DKIX_EMPTY || *value_addr == NULL)
2613 Py_RETURN_FALSE;
2614 Py_RETURN_TRUE;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002615}
2616
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002617static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002618dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 PyObject *key;
2621 PyObject *failobj = Py_None;
2622 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002623 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002624 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002625 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2628 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002631 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 hash = PyObject_Hash(key);
2633 if (hash == -1)
2634 return NULL;
2635 }
Victor Stinner742da042016-09-07 17:40:12 -07002636 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2637 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002639 if (ix == DKIX_EMPTY || *value_addr == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 val = failobj;
Victor Stinner742da042016-09-07 17:40:12 -07002641 else
2642 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 Py_INCREF(val);
2644 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002645}
2646
Benjamin Peterson00e98862013-03-07 22:16:29 -05002647PyObject *
2648PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002649{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002650 PyDictObject *mp = (PyDictObject *)d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002652 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002653 Py_ssize_t hashpos, ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002654 PyDictKeyEntry *ep;
2655 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002656
Benjamin Peterson00e98862013-03-07 22:16:29 -05002657 if (!PyDict_Check(d)) {
2658 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002660 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002662 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002663 hash = PyObject_Hash(key);
2664 if (hash == -1)
2665 return NULL;
2666 }
Victor Stinner742da042016-09-07 17:40:12 -07002667 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
2668 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002670 if (ix == DKIX_EMPTY || *value_addr == NULL) {
2671 val = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002672 if (mp->ma_keys->dk_usable <= 0) {
2673 /* Need to resize. */
Victor Stinner3c336c52016-09-12 14:17:40 +02002674 if (insertion_resize(mp) < 0) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002675 return NULL;
Victor Stinner3c336c52016-09-12 14:17:40 +02002676 }
Victor Stinner742da042016-09-07 17:40:12 -07002677 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002678 }
Victor Stinner742da042016-09-07 17:40:12 -07002679 ix = mp->ma_keys->dk_nentries;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002680 Py_INCREF(defaultobj);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002681 Py_INCREF(key);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002682 MAINTAIN_TRACKING(mp, key, defaultobj);
Victor Stinner742da042016-09-07 17:40:12 -07002683 dk_set_index(mp->ma_keys, hashpos, ix);
2684 ep = &DK_ENTRIES(mp->ma_keys)[ix];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002685 ep->me_key = key;
2686 ep->me_hash = hash;
Victor Stinner742da042016-09-07 17:40:12 -07002687 if (mp->ma_values) {
2688 mp->ma_values[ix] = val;
2689 }
2690 else {
2691 ep->me_value = val;
2692 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002693 mp->ma_keys->dk_usable--;
Victor Stinner742da042016-09-07 17:40:12 -07002694 mp->ma_keys->dk_nentries++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002695 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002696 mp->ma_version_tag = DICT_NEXT_VERSION();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 }
Victor Stinner742da042016-09-07 17:40:12 -07002698 else
2699 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00002701}
2702
Benjamin Peterson00e98862013-03-07 22:16:29 -05002703static PyObject *
2704dict_setdefault(PyDictObject *mp, PyObject *args)
2705{
2706 PyObject *key, *val;
2707 PyObject *defaultobj = Py_None;
2708
2709 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2710 return NULL;
2711
Benjamin Peterson55898502013-03-08 08:36:49 -05002712 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002713 Py_XINCREF(val);
2714 return val;
2715}
Guido van Rossum164452c2000-08-08 16:12:54 +00002716
2717static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002718dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 PyDict_Clear((PyObject *)mp);
2721 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002722}
2723
Guido van Rossumba6ab842000-12-12 22:02:18 +00002724static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002725dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002726{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00002728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2730 return NULL;
Eric Snow96c6af92015-05-29 22:21:39 -06002731
2732 return _PyDict_Pop(mp, key, deflt);
Guido van Rossume027d982002-04-12 15:11:59 +00002733}
2734
2735static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002736dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002737{
Victor Stinner742da042016-09-07 17:40:12 -07002738 Py_ssize_t i, j;
2739 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 /* Allocate the result tuple before checking the size. Believe it
2743 * or not, this allocation could trigger a garbage collection which
2744 * could empty the dict, so if we checked the size first and that
2745 * happened, the result would be an infinite loop (searching for an
2746 * entry that no longer exists). Note that the usual popitem()
2747 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2748 * tuple away if the dict *is* empty isn't a significant
2749 * inefficiency -- possible, but unlikely in practice.
2750 */
2751 res = PyTuple_New(2);
2752 if (res == NULL)
2753 return NULL;
2754 if (mp->ma_used == 0) {
2755 Py_DECREF(res);
2756 PyErr_SetString(PyExc_KeyError,
2757 "popitem(): dictionary is empty");
2758 return NULL;
2759 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002760 /* Convert split table to combined table */
2761 if (mp->ma_keys->dk_lookup == lookdict_split) {
2762 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2763 Py_DECREF(res);
2764 return NULL;
2765 }
2766 }
2767 ENSURE_ALLOWS_DELETIONS(mp);
Victor Stinner742da042016-09-07 17:40:12 -07002768
2769 /* Pop last item */
2770 ep0 = DK_ENTRIES(mp->ma_keys);
2771 i = mp->ma_keys->dk_nentries - 1;
2772 while (i >= 0 && ep0[i].me_value == NULL) {
2773 i--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 }
Victor Stinner742da042016-09-07 17:40:12 -07002775 assert(i >= 0);
2776
2777 ep = &ep0[i];
2778 j = lookdict_index(mp->ma_keys, ep->me_hash, i);
2779 assert(j >= 0);
2780 assert(dk_get_index(mp->ma_keys, j) == i);
2781 dk_set_index(mp->ma_keys, j, DKIX_DUMMY);
2782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 PyTuple_SET_ITEM(res, 0, ep->me_key);
2784 PyTuple_SET_ITEM(res, 1, ep->me_value);
Victor Stinner742da042016-09-07 17:40:12 -07002785 ep->me_key = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 ep->me_value = NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002787 /* We can't dk_usable++ since there is DKIX_DUMMY in indices */
2788 mp->ma_keys->dk_nentries = i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002790 mp->ma_version_tag = DICT_NEXT_VERSION();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002792}
2793
Jeremy Hylton8caad492000-06-23 14:18:11 +00002794static int
2795dict_traverse(PyObject *op, visitproc visit, void *arg)
2796{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002797 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson55f44522016-09-05 12:12:59 -07002798 PyDictKeysObject *keys = mp->ma_keys;
Victor Stinner742da042016-09-07 17:40:12 -07002799 PyDictKeyEntry *entries = DK_ENTRIES(mp->ma_keys);
2800 Py_ssize_t i, n = keys->dk_nentries;
2801
Benjamin Peterson55f44522016-09-05 12:12:59 -07002802 if (keys->dk_lookup == lookdict) {
2803 for (i = 0; i < n; i++) {
2804 if (entries[i].me_value != NULL) {
2805 Py_VISIT(entries[i].me_value);
2806 Py_VISIT(entries[i].me_key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002807 }
2808 }
Victor Stinner742da042016-09-07 17:40:12 -07002809 }
2810 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002811 if (mp->ma_values != NULL) {
Benjamin Peterson55f44522016-09-05 12:12:59 -07002812 for (i = 0; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002813 Py_VISIT(mp->ma_values[i]);
2814 }
2815 }
2816 else {
Benjamin Peterson55f44522016-09-05 12:12:59 -07002817 for (i = 0; i < n; i++) {
2818 Py_VISIT(entries[i].me_value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002819 }
2820 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 }
2822 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002823}
2824
2825static int
2826dict_tp_clear(PyObject *op)
2827{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 PyDict_Clear(op);
2829 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002830}
2831
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002832static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002833
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002834Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06002835_PyDict_SizeOf(PyDictObject *mp)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002836{
Victor Stinner742da042016-09-07 17:40:12 -07002837 Py_ssize_t size, usable, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002838
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002839 size = DK_SIZE(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002840 usable = USABLE_FRACTION(size);
2841
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002842 res = _PyObject_SIZE(Py_TYPE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002843 if (mp->ma_values)
Victor Stinner742da042016-09-07 17:40:12 -07002844 res += usable * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002845 /* If the dictionary is split, the keys portion is accounted-for
2846 in the type object. */
2847 if (mp->ma_keys->dk_refcnt == 1)
Victor Stinner98ee9d52016-09-08 09:33:56 -07002848 res += (sizeof(PyDictKeysObject)
2849 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
2850 + DK_IXSIZE(mp->ma_keys) * size
2851 + sizeof(PyDictKeyEntry) * usable);
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002852 return res;
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002853}
2854
2855Py_ssize_t
2856_PyDict_KeysSize(PyDictKeysObject *keys)
2857{
Victor Stinner98ee9d52016-09-08 09:33:56 -07002858 return (sizeof(PyDictKeysObject)
2859 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
2860 + DK_IXSIZE(keys) * DK_SIZE(keys)
2861 + USABLE_FRACTION(DK_SIZE(keys)) * sizeof(PyDictKeyEntry));
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002862}
2863
doko@ubuntu.com17210f52016-01-14 14:04:59 +01002864static PyObject *
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002865dict_sizeof(PyDictObject *mp)
2866{
2867 return PyLong_FromSsize_t(_PyDict_SizeOf(mp));
2868}
2869
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002870PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2871
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002872PyDoc_STRVAR(sizeof__doc__,
2873"D.__sizeof__() -> size of D in memory, in bytes");
2874
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002875PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002876"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002877
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002878PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002879"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 +00002880
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002881PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002882"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002883If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002884
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002885PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002886"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000028872-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002888
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002889PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04002890"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
2891If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
2892If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
2893In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002894
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002895PyDoc_STRVAR(clear__doc__,
2896"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002897
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002898PyDoc_STRVAR(copy__doc__,
2899"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002900
Guido van Rossumb90c8482007-02-10 01:11:45 +00002901/* Forward */
2902static PyObject *dictkeys_new(PyObject *);
2903static PyObject *dictitems_new(PyObject *);
2904static PyObject *dictvalues_new(PyObject *);
2905
Guido van Rossum45c85d12007-07-27 16:31:40 +00002906PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002908PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002910PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002911 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002912
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002913static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002914 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2916 getitem__doc__},
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002917 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 sizeof__doc__},
2919 {"get", (PyCFunction)dict_get, METH_VARARGS,
2920 get__doc__},
2921 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2922 setdefault_doc__},
2923 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2924 pop__doc__},
2925 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2926 popitem__doc__},
2927 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2928 keys__doc__},
2929 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2930 items__doc__},
2931 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2932 values__doc__},
2933 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2934 update__doc__},
Larry Hastings5c661892014-01-24 06:17:25 -08002935 DICT_FROMKEYS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002936 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2937 clear__doc__},
2938 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2939 copy__doc__},
2940 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002941};
2942
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002943/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002944int
2945PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002946{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002947 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002948 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002950 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002953 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 hash = PyObject_Hash(key);
2955 if (hash == -1)
2956 return -1;
2957 }
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);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002962}
2963
Thomas Wouterscf297e42007-02-23 15:07:44 +00002964/* Internal version of PyDict_Contains used when the hash value is already known */
2965int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002966_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002969 PyObject **value_addr;
Victor Stinner742da042016-09-07 17:40:12 -07002970 Py_ssize_t ix;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002971
Victor Stinner742da042016-09-07 17:40:12 -07002972 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2973 if (ix == DKIX_ERROR)
2974 return -1;
2975 return (ix != DKIX_EMPTY && *value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002976}
2977
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002978/* Hack to implement "key in dict" */
2979static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002980 0, /* sq_length */
2981 0, /* sq_concat */
2982 0, /* sq_repeat */
2983 0, /* sq_item */
2984 0, /* sq_slice */
2985 0, /* sq_ass_item */
2986 0, /* sq_ass_slice */
2987 PyDict_Contains, /* sq_contains */
2988 0, /* sq_inplace_concat */
2989 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002990};
2991
Guido van Rossum09e563a2001-05-01 12:10:21 +00002992static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002993dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002996 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002998 assert(type != NULL && type->tp_alloc != NULL);
2999 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02003000 if (self == NULL)
3001 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003002 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003003
Victor Stinnera9f61a52013-07-16 22:17:26 +02003004 /* The object has been implicitly tracked by tp_alloc */
3005 if (type == &PyDict_Type)
3006 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003007
3008 d->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07003009 d->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07003010 d->ma_keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003011 if (d->ma_keys == NULL) {
3012 Py_DECREF(self);
3013 return NULL;
3014 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003016}
3017
Tim Peters25786c02001-09-02 08:22:48 +00003018static int
3019dict_init(PyObject *self, PyObject *args, PyObject *kwds)
3020{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00003022}
3023
Tim Peters6d6c1a32001-08-02 04:15:00 +00003024static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003025dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00003026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003027 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00003028}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003030PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00003031"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00003032"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003033" (key, value) pairs\n"
3034"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00003035" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003036" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00003037" d[k] = v\n"
3038"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
3039" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00003040
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003041PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3043 "dict",
3044 sizeof(PyDictObject),
3045 0,
3046 (destructor)dict_dealloc, /* tp_dealloc */
3047 0, /* tp_print */
3048 0, /* tp_getattr */
3049 0, /* tp_setattr */
3050 0, /* tp_reserved */
3051 (reprfunc)dict_repr, /* tp_repr */
3052 0, /* tp_as_number */
3053 &dict_as_sequence, /* tp_as_sequence */
3054 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00003055 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056 0, /* tp_call */
3057 0, /* tp_str */
3058 PyObject_GenericGetAttr, /* tp_getattro */
3059 0, /* tp_setattro */
3060 0, /* tp_as_buffer */
3061 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3062 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
3063 dictionary_doc, /* tp_doc */
3064 dict_traverse, /* tp_traverse */
3065 dict_tp_clear, /* tp_clear */
3066 dict_richcompare, /* tp_richcompare */
3067 0, /* tp_weaklistoffset */
3068 (getiterfunc)dict_iter, /* tp_iter */
3069 0, /* tp_iternext */
3070 mapp_methods, /* tp_methods */
3071 0, /* tp_members */
3072 0, /* tp_getset */
3073 0, /* tp_base */
3074 0, /* tp_dict */
3075 0, /* tp_descr_get */
3076 0, /* tp_descr_set */
3077 0, /* tp_dictoffset */
3078 dict_init, /* tp_init */
3079 PyType_GenericAlloc, /* tp_alloc */
3080 dict_new, /* tp_new */
3081 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003082};
3083
Victor Stinner3c1e4812012-03-26 22:10:51 +02003084PyObject *
3085_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
3086{
3087 PyObject *kv;
3088 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02003089 if (kv == NULL) {
3090 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003091 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02003092 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02003093 return PyDict_GetItem(dp, kv);
3094}
3095
Guido van Rossum3cca2451997-05-16 14:23:33 +00003096/* For backward compatibility with old dictionary interface */
3097
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003098PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003099PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003101 PyObject *kv, *rv;
3102 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003103 if (kv == NULL) {
3104 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003106 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 rv = PyDict_GetItem(v, kv);
3108 Py_DECREF(kv);
3109 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003110}
3111
3112int
Victor Stinner3c1e4812012-03-26 22:10:51 +02003113_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
3114{
3115 PyObject *kv;
3116 kv = _PyUnicode_FromId(key); /* borrowed */
3117 if (kv == NULL)
3118 return -1;
3119 return PyDict_SetItem(v, kv, item);
3120}
3121
3122int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003123PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 PyObject *kv;
3126 int err;
3127 kv = PyUnicode_FromString(key);
3128 if (kv == NULL)
3129 return -1;
3130 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
3131 err = PyDict_SetItem(v, kv, item);
3132 Py_DECREF(kv);
3133 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003134}
3135
3136int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01003137_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
3138{
3139 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
3140 if (kv == NULL)
3141 return -1;
3142 return PyDict_DelItem(v, kv);
3143}
3144
3145int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003146PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 PyObject *kv;
3149 int err;
3150 kv = PyUnicode_FromString(key);
3151 if (kv == NULL)
3152 return -1;
3153 err = PyDict_DelItem(v, kv);
3154 Py_DECREF(kv);
3155 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003156}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003157
Raymond Hettinger019a1482004-03-18 02:41:19 +00003158/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003159
3160typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003161 PyObject_HEAD
3162 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
3163 Py_ssize_t di_used;
3164 Py_ssize_t di_pos;
3165 PyObject* di_result; /* reusable result tuple for iteritems */
3166 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003167} dictiterobject;
3168
3169static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003170dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 dictiterobject *di;
3173 di = PyObject_GC_New(dictiterobject, itertype);
3174 if (di == NULL)
3175 return NULL;
3176 Py_INCREF(dict);
3177 di->di_dict = dict;
3178 di->di_used = dict->ma_used;
3179 di->di_pos = 0;
3180 di->len = dict->ma_used;
3181 if (itertype == &PyDictIterItem_Type) {
3182 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
3183 if (di->di_result == NULL) {
3184 Py_DECREF(di);
3185 return NULL;
3186 }
3187 }
3188 else
3189 di->di_result = NULL;
3190 _PyObject_GC_TRACK(di);
3191 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003192}
3193
3194static void
3195dictiter_dealloc(dictiterobject *di)
3196{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 Py_XDECREF(di->di_dict);
3198 Py_XDECREF(di->di_result);
3199 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003200}
3201
3202static int
3203dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
3204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 Py_VISIT(di->di_dict);
3206 Py_VISIT(di->di_result);
3207 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003208}
3209
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003210static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003211dictiter_len(dictiterobject *di)
3212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 Py_ssize_t len = 0;
3214 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
3215 len = di->len;
3216 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003217}
3218
Guido van Rossumb90c8482007-02-10 01:11:45 +00003219PyDoc_STRVAR(length_hint_doc,
3220 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003221
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003222static PyObject *
3223dictiter_reduce(dictiterobject *di);
3224
3225PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3226
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003227static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
3229 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003230 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
3231 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003233};
3234
Raymond Hettinger019a1482004-03-18 02:41:19 +00003235static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00003236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 PyObject *key;
Victor Stinner742da042016-09-07 17:40:12 -07003238 Py_ssize_t i, n, offset;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003239 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003241 PyObject **value_ptr;
Guido van Rossum213c7a62001-04-23 14:08:49 +00003242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 if (d == NULL)
3244 return NULL;
3245 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00003246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 if (di->di_used != d->ma_used) {
3248 PyErr_SetString(PyExc_RuntimeError,
3249 "dictionary changed size during iteration");
3250 di->di_used = -1; /* Make this state sticky */
3251 return NULL;
3252 }
Guido van Rossum2147df72002-07-16 20:30:22 +00003253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 i = di->di_pos;
3255 if (i < 0)
3256 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003257 k = d->ma_keys;
3258 if (d->ma_values) {
3259 value_ptr = &d->ma_values[i];
3260 offset = sizeof(PyObject *);
3261 }
3262 else {
Victor Stinner742da042016-09-07 17:40:12 -07003263 value_ptr = &DK_ENTRIES(k)[i].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003264 offset = sizeof(PyDictKeyEntry);
3265 }
Victor Stinner742da042016-09-07 17:40:12 -07003266 n = k->dk_nentries - 1;
3267 while (i <= n && *value_ptr == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003268 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003270 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003271 di->di_pos = i+1;
Victor Stinner742da042016-09-07 17:40:12 -07003272 if (i > n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 goto fail;
3274 di->len--;
Victor Stinner742da042016-09-07 17:40:12 -07003275 key = DK_ENTRIES(k)[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 Py_INCREF(key);
3277 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003278
3279fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003281 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003282 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003283}
3284
Raymond Hettinger019a1482004-03-18 02:41:19 +00003285PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3287 "dict_keyiterator", /* tp_name */
3288 sizeof(dictiterobject), /* tp_basicsize */
3289 0, /* tp_itemsize */
3290 /* methods */
3291 (destructor)dictiter_dealloc, /* tp_dealloc */
3292 0, /* tp_print */
3293 0, /* tp_getattr */
3294 0, /* tp_setattr */
3295 0, /* tp_reserved */
3296 0, /* tp_repr */
3297 0, /* tp_as_number */
3298 0, /* tp_as_sequence */
3299 0, /* tp_as_mapping */
3300 0, /* tp_hash */
3301 0, /* tp_call */
3302 0, /* tp_str */
3303 PyObject_GenericGetAttr, /* tp_getattro */
3304 0, /* tp_setattro */
3305 0, /* tp_as_buffer */
3306 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3307 0, /* tp_doc */
3308 (traverseproc)dictiter_traverse, /* tp_traverse */
3309 0, /* tp_clear */
3310 0, /* tp_richcompare */
3311 0, /* tp_weaklistoffset */
3312 PyObject_SelfIter, /* tp_iter */
3313 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
3314 dictiter_methods, /* tp_methods */
3315 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003316};
3317
3318static PyObject *dictiter_iternextvalue(dictiterobject *di)
3319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 PyObject *value;
Victor Stinner742da042016-09-07 17:40:12 -07003321 Py_ssize_t i, n, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003323 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 if (d == NULL)
3326 return NULL;
3327 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 if (di->di_used != d->ma_used) {
3330 PyErr_SetString(PyExc_RuntimeError,
3331 "dictionary changed size during iteration");
3332 di->di_used = -1; /* Make this state sticky */
3333 return NULL;
3334 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 i = di->di_pos;
Victor Stinner742da042016-09-07 17:40:12 -07003337 n = d->ma_keys->dk_nentries - 1;
3338 if (i < 0 || i > n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003340 if (d->ma_values) {
3341 value_ptr = &d->ma_values[i];
3342 offset = sizeof(PyObject *);
3343 }
3344 else {
Victor Stinner742da042016-09-07 17:40:12 -07003345 value_ptr = &DK_ENTRIES(d->ma_keys)[i].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003346 offset = sizeof(PyDictKeyEntry);
3347 }
Victor Stinner742da042016-09-07 17:40:12 -07003348 while (i <= n && *value_ptr == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003349 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 i++;
Victor Stinner742da042016-09-07 17:40:12 -07003351 if (i > n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003352 goto fail;
3353 }
3354 di->di_pos = i+1;
3355 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003356 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 Py_INCREF(value);
3358 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003359
3360fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003362 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003364}
3365
3366PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003367 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3368 "dict_valueiterator", /* tp_name */
3369 sizeof(dictiterobject), /* tp_basicsize */
3370 0, /* tp_itemsize */
3371 /* methods */
3372 (destructor)dictiter_dealloc, /* tp_dealloc */
3373 0, /* tp_print */
3374 0, /* tp_getattr */
3375 0, /* tp_setattr */
3376 0, /* tp_reserved */
3377 0, /* tp_repr */
3378 0, /* tp_as_number */
3379 0, /* tp_as_sequence */
3380 0, /* tp_as_mapping */
3381 0, /* tp_hash */
3382 0, /* tp_call */
3383 0, /* tp_str */
3384 PyObject_GenericGetAttr, /* tp_getattro */
3385 0, /* tp_setattro */
3386 0, /* tp_as_buffer */
3387 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3388 0, /* tp_doc */
3389 (traverseproc)dictiter_traverse, /* tp_traverse */
3390 0, /* tp_clear */
3391 0, /* tp_richcompare */
3392 0, /* tp_weaklistoffset */
3393 PyObject_SelfIter, /* tp_iter */
3394 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
3395 dictiter_methods, /* tp_methods */
3396 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003397};
3398
3399static PyObject *dictiter_iternextitem(dictiterobject *di)
3400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 PyObject *key, *value, *result = di->di_result;
Victor Stinner742da042016-09-07 17:40:12 -07003402 Py_ssize_t i, n, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003404 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 if (d == NULL)
3407 return NULL;
3408 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003410 if (di->di_used != d->ma_used) {
3411 PyErr_SetString(PyExc_RuntimeError,
3412 "dictionary changed size during iteration");
3413 di->di_used = -1; /* Make this state sticky */
3414 return NULL;
3415 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 i = di->di_pos;
3418 if (i < 0)
3419 goto fail;
Victor Stinner742da042016-09-07 17:40:12 -07003420 n = d->ma_keys->dk_nentries - 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003421 if (d->ma_values) {
3422 value_ptr = &d->ma_values[i];
3423 offset = sizeof(PyObject *);
3424 }
3425 else {
Victor Stinner742da042016-09-07 17:40:12 -07003426 value_ptr = &DK_ENTRIES(d->ma_keys)[i].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003427 offset = sizeof(PyDictKeyEntry);
3428 }
Victor Stinner742da042016-09-07 17:40:12 -07003429 while (i <= n && *value_ptr == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003430 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003431 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003432 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003433 di->di_pos = i+1;
Victor Stinner742da042016-09-07 17:40:12 -07003434 if (i > n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 if (result->ob_refcnt == 1) {
3438 Py_INCREF(result);
3439 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3440 Py_DECREF(PyTuple_GET_ITEM(result, 1));
3441 } else {
3442 result = PyTuple_New(2);
3443 if (result == NULL)
3444 return NULL;
3445 }
3446 di->len--;
Victor Stinner742da042016-09-07 17:40:12 -07003447 key = DK_ENTRIES(d->ma_keys)[i].me_key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003448 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 Py_INCREF(key);
3450 Py_INCREF(value);
Eric Snow96c6af92015-05-29 22:21:39 -06003451 PyTuple_SET_ITEM(result, 0, key); /* steals reference */
3452 PyTuple_SET_ITEM(result, 1, value); /* steals reference */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003454
3455fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003457 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003459}
3460
3461PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003462 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3463 "dict_itemiterator", /* tp_name */
3464 sizeof(dictiterobject), /* tp_basicsize */
3465 0, /* tp_itemsize */
3466 /* methods */
3467 (destructor)dictiter_dealloc, /* tp_dealloc */
3468 0, /* tp_print */
3469 0, /* tp_getattr */
3470 0, /* tp_setattr */
3471 0, /* tp_reserved */
3472 0, /* tp_repr */
3473 0, /* tp_as_number */
3474 0, /* tp_as_sequence */
3475 0, /* tp_as_mapping */
3476 0, /* tp_hash */
3477 0, /* tp_call */
3478 0, /* tp_str */
3479 PyObject_GenericGetAttr, /* tp_getattro */
3480 0, /* tp_setattro */
3481 0, /* tp_as_buffer */
3482 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3483 0, /* tp_doc */
3484 (traverseproc)dictiter_traverse, /* tp_traverse */
3485 0, /* tp_clear */
3486 0, /* tp_richcompare */
3487 0, /* tp_weaklistoffset */
3488 PyObject_SelfIter, /* tp_iter */
3489 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3490 dictiter_methods, /* tp_methods */
3491 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003492};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003493
3494
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003495static PyObject *
3496dictiter_reduce(dictiterobject *di)
3497{
3498 PyObject *list;
3499 dictiterobject tmp;
3500
3501 list = PyList_New(0);
3502 if (!list)
3503 return NULL;
3504
3505 /* copy the itertor state */
3506 tmp = *di;
3507 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003508
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003509 /* iterate the temporary into a list */
3510 for(;;) {
3511 PyObject *element = 0;
3512 if (Py_TYPE(di) == &PyDictIterItem_Type)
3513 element = dictiter_iternextitem(&tmp);
3514 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3515 element = dictiter_iternextkey(&tmp);
3516 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3517 element = dictiter_iternextvalue(&tmp);
3518 else
3519 assert(0);
3520 if (element) {
3521 if (PyList_Append(list, element)) {
3522 Py_DECREF(element);
3523 Py_DECREF(list);
3524 Py_XDECREF(tmp.di_dict);
3525 return NULL;
3526 }
3527 Py_DECREF(element);
3528 } else
3529 break;
3530 }
3531 Py_XDECREF(tmp.di_dict);
3532 /* check for error */
3533 if (tmp.di_dict != NULL) {
3534 /* we have an error */
3535 Py_DECREF(list);
3536 return NULL;
3537 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003538 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003539}
3540
Guido van Rossum3ac67412007-02-10 18:55:06 +00003541/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003542/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003543/***********************************************/
3544
Guido van Rossumb90c8482007-02-10 01:11:45 +00003545/* The instance lay-out is the same for all three; but the type differs. */
3546
Guido van Rossumb90c8482007-02-10 01:11:45 +00003547static void
Eric Snow96c6af92015-05-29 22:21:39 -06003548dictview_dealloc(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 Py_XDECREF(dv->dv_dict);
3551 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003552}
3553
3554static int
Eric Snow96c6af92015-05-29 22:21:39 -06003555dictview_traverse(_PyDictViewObject *dv, visitproc visit, void *arg)
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003556{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003557 Py_VISIT(dv->dv_dict);
3558 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003559}
3560
Guido van Rossum83825ac2007-02-10 04:54:19 +00003561static Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06003562dictview_len(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003564 Py_ssize_t len = 0;
3565 if (dv->dv_dict != NULL)
3566 len = dv->dv_dict->ma_used;
3567 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003568}
3569
Eric Snow96c6af92015-05-29 22:21:39 -06003570PyObject *
3571_PyDictView_New(PyObject *dict, PyTypeObject *type)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003572{
Eric Snow96c6af92015-05-29 22:21:39 -06003573 _PyDictViewObject *dv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003574 if (dict == NULL) {
3575 PyErr_BadInternalCall();
3576 return NULL;
3577 }
3578 if (!PyDict_Check(dict)) {
3579 /* XXX Get rid of this restriction later */
3580 PyErr_Format(PyExc_TypeError,
3581 "%s() requires a dict argument, not '%s'",
3582 type->tp_name, dict->ob_type->tp_name);
3583 return NULL;
3584 }
Eric Snow96c6af92015-05-29 22:21:39 -06003585 dv = PyObject_GC_New(_PyDictViewObject, type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003586 if (dv == NULL)
3587 return NULL;
3588 Py_INCREF(dict);
3589 dv->dv_dict = (PyDictObject *)dict;
3590 _PyObject_GC_TRACK(dv);
3591 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003592}
3593
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003594/* TODO(guido): The views objects are not complete:
3595
3596 * support more set operations
3597 * support arbitrary mappings?
3598 - either these should be static or exported in dictobject.h
3599 - if public then they should probably be in builtins
3600*/
3601
Guido van Rossumaac530c2007-08-24 22:33:45 +00003602/* Return 1 if self is a subset of other, iterating over self;
3603 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003604static int
3605all_contained_in(PyObject *self, PyObject *other)
3606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003607 PyObject *iter = PyObject_GetIter(self);
3608 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003610 if (iter == NULL)
3611 return -1;
3612 for (;;) {
3613 PyObject *next = PyIter_Next(iter);
3614 if (next == NULL) {
3615 if (PyErr_Occurred())
3616 ok = -1;
3617 break;
3618 }
3619 ok = PySequence_Contains(other, next);
3620 Py_DECREF(next);
3621 if (ok <= 0)
3622 break;
3623 }
3624 Py_DECREF(iter);
3625 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003626}
3627
3628static PyObject *
3629dictview_richcompare(PyObject *self, PyObject *other, int op)
3630{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003631 Py_ssize_t len_self, len_other;
3632 int ok;
3633 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 assert(self != NULL);
3636 assert(PyDictViewSet_Check(self));
3637 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003638
Brian Curtindfc80e32011-08-10 20:28:54 -05003639 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3640 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003642 len_self = PyObject_Size(self);
3643 if (len_self < 0)
3644 return NULL;
3645 len_other = PyObject_Size(other);
3646 if (len_other < 0)
3647 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003649 ok = 0;
3650 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003652 case Py_NE:
3653 case Py_EQ:
3654 if (len_self == len_other)
3655 ok = all_contained_in(self, other);
3656 if (op == Py_NE && ok >= 0)
3657 ok = !ok;
3658 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003660 case Py_LT:
3661 if (len_self < len_other)
3662 ok = all_contained_in(self, other);
3663 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003665 case Py_LE:
3666 if (len_self <= len_other)
3667 ok = all_contained_in(self, other);
3668 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003670 case Py_GT:
3671 if (len_self > len_other)
3672 ok = all_contained_in(other, self);
3673 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003675 case Py_GE:
3676 if (len_self >= len_other)
3677 ok = all_contained_in(other, self);
3678 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 }
3681 if (ok < 0)
3682 return NULL;
3683 result = ok ? Py_True : Py_False;
3684 Py_INCREF(result);
3685 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003686}
3687
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003688static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003689dictview_repr(_PyDictViewObject *dv)
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 PyObject *seq;
3692 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003694 seq = PySequence_List((PyObject *)dv);
3695 if (seq == NULL)
3696 return NULL;
3697
3698 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3699 Py_DECREF(seq);
3700 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003701}
3702
Guido van Rossum3ac67412007-02-10 18:55:06 +00003703/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003704
3705static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003706dictkeys_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003708 if (dv->dv_dict == NULL) {
3709 Py_RETURN_NONE;
3710 }
3711 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003712}
3713
3714static int
Eric Snow96c6af92015-05-29 22:21:39 -06003715dictkeys_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003716{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003717 if (dv->dv_dict == NULL)
3718 return 0;
3719 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003720}
3721
Guido van Rossum83825ac2007-02-10 04:54:19 +00003722static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003723 (lenfunc)dictview_len, /* sq_length */
3724 0, /* sq_concat */
3725 0, /* sq_repeat */
3726 0, /* sq_item */
3727 0, /* sq_slice */
3728 0, /* sq_ass_item */
3729 0, /* sq_ass_slice */
3730 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003731};
3732
Guido van Rossum523259b2007-08-24 23:41:22 +00003733static PyObject*
3734dictviews_sub(PyObject* self, PyObject *other)
3735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 PyObject *result = PySet_New(self);
3737 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003738 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003740 if (result == NULL)
3741 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003742
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003743 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003744 if (tmp == NULL) {
3745 Py_DECREF(result);
3746 return NULL;
3747 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 Py_DECREF(tmp);
3750 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003751}
3752
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003753PyObject*
3754_PyDictView_Intersect(PyObject* self, PyObject *other)
Guido van Rossum523259b2007-08-24 23:41:22 +00003755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003756 PyObject *result = PySet_New(self);
3757 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003758 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003760 if (result == NULL)
3761 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003762
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003763 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003764 if (tmp == NULL) {
3765 Py_DECREF(result);
3766 return NULL;
3767 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003769 Py_DECREF(tmp);
3770 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003771}
3772
3773static PyObject*
3774dictviews_or(PyObject* self, PyObject *other)
3775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 PyObject *result = PySet_New(self);
3777 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003778 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003780 if (result == NULL)
3781 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003782
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003783 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003784 if (tmp == NULL) {
3785 Py_DECREF(result);
3786 return NULL;
3787 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003789 Py_DECREF(tmp);
3790 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003791}
3792
3793static PyObject*
3794dictviews_xor(PyObject* self, PyObject *other)
3795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003796 PyObject *result = PySet_New(self);
3797 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003798 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003800 if (result == NULL)
3801 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003802
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003803 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003804 if (tmp == NULL) {
3805 Py_DECREF(result);
3806 return NULL;
3807 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003809 Py_DECREF(tmp);
3810 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003811}
3812
3813static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003814 0, /*nb_add*/
3815 (binaryfunc)dictviews_sub, /*nb_subtract*/
3816 0, /*nb_multiply*/
3817 0, /*nb_remainder*/
3818 0, /*nb_divmod*/
3819 0, /*nb_power*/
3820 0, /*nb_negative*/
3821 0, /*nb_positive*/
3822 0, /*nb_absolute*/
3823 0, /*nb_bool*/
3824 0, /*nb_invert*/
3825 0, /*nb_lshift*/
3826 0, /*nb_rshift*/
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003827 (binaryfunc)_PyDictView_Intersect, /*nb_and*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003828 (binaryfunc)dictviews_xor, /*nb_xor*/
3829 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003830};
3831
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003832static PyObject*
3833dictviews_isdisjoint(PyObject *self, PyObject *other)
3834{
3835 PyObject *it;
3836 PyObject *item = NULL;
3837
3838 if (self == other) {
Eric Snow96c6af92015-05-29 22:21:39 -06003839 if (dictview_len((_PyDictViewObject *)self) == 0)
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003840 Py_RETURN_TRUE;
3841 else
3842 Py_RETURN_FALSE;
3843 }
3844
3845 /* Iterate over the shorter object (only if other is a set,
3846 * because PySequence_Contains may be expensive otherwise): */
3847 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
Eric Snow96c6af92015-05-29 22:21:39 -06003848 Py_ssize_t len_self = dictview_len((_PyDictViewObject *)self);
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003849 Py_ssize_t len_other = PyObject_Size(other);
3850 if (len_other == -1)
3851 return NULL;
3852
3853 if ((len_other > len_self)) {
3854 PyObject *tmp = other;
3855 other = self;
3856 self = tmp;
3857 }
3858 }
3859
3860 it = PyObject_GetIter(other);
3861 if (it == NULL)
3862 return NULL;
3863
3864 while ((item = PyIter_Next(it)) != NULL) {
3865 int contains = PySequence_Contains(self, item);
3866 Py_DECREF(item);
3867 if (contains == -1) {
3868 Py_DECREF(it);
3869 return NULL;
3870 }
3871
3872 if (contains) {
3873 Py_DECREF(it);
3874 Py_RETURN_FALSE;
3875 }
3876 }
3877 Py_DECREF(it);
3878 if (PyErr_Occurred())
3879 return NULL; /* PyIter_Next raised an exception. */
3880 Py_RETURN_TRUE;
3881}
3882
3883PyDoc_STRVAR(isdisjoint_doc,
3884"Return True if the view and the given iterable have a null intersection.");
3885
Guido van Rossumb90c8482007-02-10 01:11:45 +00003886static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003887 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3888 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003889 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003890};
3891
3892PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003893 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3894 "dict_keys", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06003895 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003896 0, /* tp_itemsize */
3897 /* methods */
3898 (destructor)dictview_dealloc, /* tp_dealloc */
3899 0, /* tp_print */
3900 0, /* tp_getattr */
3901 0, /* tp_setattr */
3902 0, /* tp_reserved */
3903 (reprfunc)dictview_repr, /* tp_repr */
3904 &dictviews_as_number, /* tp_as_number */
3905 &dictkeys_as_sequence, /* tp_as_sequence */
3906 0, /* tp_as_mapping */
3907 0, /* tp_hash */
3908 0, /* tp_call */
3909 0, /* tp_str */
3910 PyObject_GenericGetAttr, /* tp_getattro */
3911 0, /* tp_setattro */
3912 0, /* tp_as_buffer */
3913 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3914 0, /* tp_doc */
3915 (traverseproc)dictview_traverse, /* tp_traverse */
3916 0, /* tp_clear */
3917 dictview_richcompare, /* tp_richcompare */
3918 0, /* tp_weaklistoffset */
3919 (getiterfunc)dictkeys_iter, /* tp_iter */
3920 0, /* tp_iternext */
3921 dictkeys_methods, /* tp_methods */
3922 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003923};
3924
3925static PyObject *
3926dictkeys_new(PyObject *dict)
3927{
Eric Snow96c6af92015-05-29 22:21:39 -06003928 return _PyDictView_New(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003929}
3930
Guido van Rossum3ac67412007-02-10 18:55:06 +00003931/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003932
3933static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003934dictitems_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003936 if (dv->dv_dict == NULL) {
3937 Py_RETURN_NONE;
3938 }
3939 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003940}
3941
3942static int
Eric Snow96c6af92015-05-29 22:21:39 -06003943dictitems_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003945 PyObject *key, *value, *found;
3946 if (dv->dv_dict == NULL)
3947 return 0;
3948 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3949 return 0;
3950 key = PyTuple_GET_ITEM(obj, 0);
3951 value = PyTuple_GET_ITEM(obj, 1);
3952 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3953 if (found == NULL) {
3954 if (PyErr_Occurred())
3955 return -1;
3956 return 0;
3957 }
3958 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003959}
3960
Guido van Rossum83825ac2007-02-10 04:54:19 +00003961static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003962 (lenfunc)dictview_len, /* sq_length */
3963 0, /* sq_concat */
3964 0, /* sq_repeat */
3965 0, /* sq_item */
3966 0, /* sq_slice */
3967 0, /* sq_ass_item */
3968 0, /* sq_ass_slice */
3969 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003970};
3971
Guido van Rossumb90c8482007-02-10 01:11:45 +00003972static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003973 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3974 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003975 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003976};
3977
3978PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003979 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3980 "dict_items", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06003981 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003982 0, /* tp_itemsize */
3983 /* methods */
3984 (destructor)dictview_dealloc, /* tp_dealloc */
3985 0, /* tp_print */
3986 0, /* tp_getattr */
3987 0, /* tp_setattr */
3988 0, /* tp_reserved */
3989 (reprfunc)dictview_repr, /* tp_repr */
3990 &dictviews_as_number, /* tp_as_number */
3991 &dictitems_as_sequence, /* tp_as_sequence */
3992 0, /* tp_as_mapping */
3993 0, /* tp_hash */
3994 0, /* tp_call */
3995 0, /* tp_str */
3996 PyObject_GenericGetAttr, /* tp_getattro */
3997 0, /* tp_setattro */
3998 0, /* tp_as_buffer */
3999 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4000 0, /* tp_doc */
4001 (traverseproc)dictview_traverse, /* tp_traverse */
4002 0, /* tp_clear */
4003 dictview_richcompare, /* tp_richcompare */
4004 0, /* tp_weaklistoffset */
4005 (getiterfunc)dictitems_iter, /* tp_iter */
4006 0, /* tp_iternext */
4007 dictitems_methods, /* tp_methods */
4008 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004009};
4010
4011static PyObject *
4012dictitems_new(PyObject *dict)
4013{
Eric Snow96c6af92015-05-29 22:21:39 -06004014 return _PyDictView_New(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004015}
4016
Guido van Rossum3ac67412007-02-10 18:55:06 +00004017/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004018
4019static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004020dictvalues_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004022 if (dv->dv_dict == NULL) {
4023 Py_RETURN_NONE;
4024 }
4025 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004026}
4027
Guido van Rossum83825ac2007-02-10 04:54:19 +00004028static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004029 (lenfunc)dictview_len, /* sq_length */
4030 0, /* sq_concat */
4031 0, /* sq_repeat */
4032 0, /* sq_item */
4033 0, /* sq_slice */
4034 0, /* sq_ass_item */
4035 0, /* sq_ass_slice */
4036 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004037};
4038
Guido van Rossumb90c8482007-02-10 01:11:45 +00004039static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004040 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004041};
4042
4043PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4045 "dict_values", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004046 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004047 0, /* tp_itemsize */
4048 /* methods */
4049 (destructor)dictview_dealloc, /* tp_dealloc */
4050 0, /* tp_print */
4051 0, /* tp_getattr */
4052 0, /* tp_setattr */
4053 0, /* tp_reserved */
4054 (reprfunc)dictview_repr, /* tp_repr */
4055 0, /* tp_as_number */
4056 &dictvalues_as_sequence, /* tp_as_sequence */
4057 0, /* tp_as_mapping */
4058 0, /* tp_hash */
4059 0, /* tp_call */
4060 0, /* tp_str */
4061 PyObject_GenericGetAttr, /* tp_getattro */
4062 0, /* tp_setattro */
4063 0, /* tp_as_buffer */
4064 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4065 0, /* tp_doc */
4066 (traverseproc)dictview_traverse, /* tp_traverse */
4067 0, /* tp_clear */
4068 0, /* tp_richcompare */
4069 0, /* tp_weaklistoffset */
4070 (getiterfunc)dictvalues_iter, /* tp_iter */
4071 0, /* tp_iternext */
4072 dictvalues_methods, /* tp_methods */
4073 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004074};
4075
4076static PyObject *
4077dictvalues_new(PyObject *dict)
4078{
Eric Snow96c6af92015-05-29 22:21:39 -06004079 return _PyDictView_New(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004080}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004081
4082/* Returns NULL if cannot allocate a new PyDictKeysObject,
4083 but does not set an error */
4084PyDictKeysObject *
4085_PyDict_NewKeysForClass(void)
4086{
Victor Stinner742da042016-09-07 17:40:12 -07004087 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004088 if (keys == NULL)
4089 PyErr_Clear();
4090 else
4091 keys->dk_lookup = lookdict_split;
4092 return keys;
4093}
4094
4095#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
4096
4097PyObject *
4098PyObject_GenericGetDict(PyObject *obj, void *context)
4099{
4100 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
4101 if (dictptr == NULL) {
4102 PyErr_SetString(PyExc_AttributeError,
4103 "This object has no __dict__");
4104 return NULL;
4105 }
4106 dict = *dictptr;
4107 if (dict == NULL) {
4108 PyTypeObject *tp = Py_TYPE(obj);
4109 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
4110 DK_INCREF(CACHED_KEYS(tp));
4111 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
4112 }
4113 else {
4114 *dictptr = dict = PyDict_New();
4115 }
4116 }
4117 Py_XINCREF(dict);
4118 return dict;
4119}
4120
4121int
4122_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
Victor Stinner742da042016-09-07 17:40:12 -07004123 PyObject *key, PyObject *value)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004124{
4125 PyObject *dict;
4126 int res;
4127 PyDictKeysObject *cached;
4128
4129 assert(dictptr != NULL);
4130 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
4131 assert(dictptr != NULL);
4132 dict = *dictptr;
4133 if (dict == NULL) {
4134 DK_INCREF(cached);
4135 dict = new_dict_with_shared_keys(cached);
4136 if (dict == NULL)
4137 return -1;
4138 *dictptr = dict;
4139 }
4140 if (value == NULL) {
4141 res = PyDict_DelItem(dict, key);
4142 if (cached != ((PyDictObject *)dict)->ma_keys) {
4143 CACHED_KEYS(tp) = NULL;
4144 DK_DECREF(cached);
4145 }
4146 } else {
4147 res = PyDict_SetItem(dict, key, value);
4148 if (cached != ((PyDictObject *)dict)->ma_keys) {
4149 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004150 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004151 CACHED_KEYS(tp) = make_keys_shared(dict);
Victor Stinner742da042016-09-07 17:40:12 -07004152 }
4153 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004154 CACHED_KEYS(tp) = NULL;
4155 }
4156 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004157 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
4158 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004159 }
4160 }
4161 } else {
4162 dict = *dictptr;
4163 if (dict == NULL) {
4164 dict = PyDict_New();
4165 if (dict == NULL)
4166 return -1;
4167 *dictptr = dict;
4168 }
4169 if (value == NULL) {
4170 res = PyDict_DelItem(dict, key);
4171 } else {
4172 res = PyDict_SetItem(dict, key, value);
4173 }
4174 }
4175 return res;
4176}
4177
4178void
4179_PyDictKeys_DecRef(PyDictKeysObject *keys)
4180{
4181 DK_DECREF(keys);
4182}