blob: 36ea8f1a5a52c9a37d70b5e49027342de10b2545 [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/* lookup indices. returns DKIX_EMPTY, DKIX_DUMMY, or ix >=0 */
Benjamin Peterson73222252016-09-08 09:58:47 -0700314static inline Py_ssize_t
Victor Stinner742da042016-09-07 17:40:12 -0700315dk_get_index(PyDictKeysObject *keys, Py_ssize_t i)
316{
317 Py_ssize_t s = DK_SIZE(keys);
Victor Stinner71211e32016-09-08 10:52:46 -0700318 Py_ssize_t ix;
319
Victor Stinner742da042016-09-07 17:40:12 -0700320 if (s <= 0xff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700321 int8_t *indices = keys->dk_indices.as_1;
Victor Stinner208857e2016-09-08 11:35:46 -0700322 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700323 }
324 else if (s <= 0xffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700325 int16_t *indices = keys->dk_indices.as_2;
Victor Stinner208857e2016-09-08 11:35:46 -0700326 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700327 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700328#if SIZEOF_VOID_P > 4
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300329 else if (s > 0xffffffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700330 int64_t *indices = keys->dk_indices.as_8;
Victor Stinner208857e2016-09-08 11:35:46 -0700331 ix = indices[i];
Victor Stinner742da042016-09-07 17:40:12 -0700332 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700333#endif
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300334 else {
335 int32_t *indices = keys->dk_indices.as_4;
336 ix = indices[i];
337 }
Victor Stinner71211e32016-09-08 10:52:46 -0700338 assert(ix >= DKIX_DUMMY);
339 return ix;
Victor Stinner742da042016-09-07 17:40:12 -0700340}
341
342/* write to indices. */
Benjamin Peterson73222252016-09-08 09:58:47 -0700343static inline void
Victor Stinner742da042016-09-07 17:40:12 -0700344dk_set_index(PyDictKeysObject *keys, Py_ssize_t i, Py_ssize_t ix)
345{
346 Py_ssize_t s = DK_SIZE(keys);
Victor Stinner71211e32016-09-08 10:52:46 -0700347
348 assert(ix >= DKIX_DUMMY);
349
Victor Stinner742da042016-09-07 17:40:12 -0700350 if (s <= 0xff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700351 int8_t *indices = keys->dk_indices.as_1;
Victor Stinner71211e32016-09-08 10:52:46 -0700352 assert(ix <= 0x7f);
Victor Stinner208857e2016-09-08 11:35:46 -0700353 indices[i] = (char)ix;
Victor Stinner742da042016-09-07 17:40:12 -0700354 }
355 else if (s <= 0xffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700356 int16_t *indices = keys->dk_indices.as_2;
Victor Stinner71211e32016-09-08 10:52:46 -0700357 assert(ix <= 0x7fff);
Victor Stinner208857e2016-09-08 11:35:46 -0700358 indices[i] = (int16_t)ix;
Victor Stinner742da042016-09-07 17:40:12 -0700359 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700360#if SIZEOF_VOID_P > 4
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300361 else if (s > 0xffffffff) {
Benjamin Peterson186122e2016-09-08 12:20:12 -0700362 int64_t *indices = keys->dk_indices.as_8;
Victor Stinner208857e2016-09-08 11:35:46 -0700363 indices[i] = ix;
Victor Stinner742da042016-09-07 17:40:12 -0700364 }
Benjamin Peterson3c569292016-09-08 13:16:41 -0700365#endif
Serhiy Storchaka473e0e42016-09-10 21:34:43 +0300366 else {
367 int32_t *indices = keys->dk_indices.as_4;
368 assert(ix <= 0x7fffffff);
369 indices[i] = (int32_t)ix;
370 }
Victor Stinner742da042016-09-07 17:40:12 -0700371}
372
373
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200374/* USABLE_FRACTION is the maximum dictionary load.
Victor Stinner742da042016-09-07 17:40:12 -0700375 * Increasing this ratio makes dictionaries more dense resulting in more
376 * collisions. Decreasing it improves sparseness at the expense of spreading
377 * indices over more cache lines and at the cost of total memory consumed.
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200378 *
379 * USABLE_FRACTION must obey the following:
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400380 * (0 < USABLE_FRACTION(n) < n) for all n >= 2
381 *
Victor Stinner742da042016-09-07 17:40:12 -0700382 * USABLE_FRACTION should be quick to calculate.
383 * Fractions around 1/2 to 2/3 seem to work well in practice.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400384 */
Victor Stinner742da042016-09-07 17:40:12 -0700385#define USABLE_FRACTION(n) (((n) << 1)/3)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400386
Victor Stinner742da042016-09-07 17:40:12 -0700387/* ESTIMATE_SIZE is reverse function of USABLE_FRACTION.
388 * This can be used to reserve enough size to insert n entries without
389 * resizing.
390 */
391#define ESTIMATE_SIZE(n) (((n)*3) >> 1)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400392
Victor Stinner742da042016-09-07 17:40:12 -0700393/* Alternative fraction that is otherwise close enough to 2n/3 to make
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400394 * little difference. 8 * 2/3 == 8 * 5/8 == 5. 16 * 2/3 == 16 * 5/8 == 10.
395 * 32 * 2/3 = 21, 32 * 5/8 = 20.
396 * Its advantage is that it is faster to compute on machines with slow division.
397 * #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
Victor Stinner742da042016-09-07 17:40:12 -0700398 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400399
Victor Stinnera9f61a52013-07-16 22:17:26 +0200400/* GROWTH_RATE. Growth rate upon hitting maximum load.
401 * Currently set to used*2 + capacity/2.
402 * This means that dicts double in size when growing without deletions,
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700403 * but have more head room when the number of deletions is on a par with the
404 * number of insertions.
405 * Raising this to used*4 doubles memory consumption depending on the size of
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200406 * the dictionary, but results in half the number of resizes, less effort to
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700407 * resize.
408 * GROWTH_RATE was set to used*4 up to version 3.2.
409 * GROWTH_RATE was set to used*2 in version 3.3.0
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200410 */
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700411#define GROWTH_RATE(d) (((d)->ma_used*2)+((d)->ma_keys->dk_size>>1))
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400412
413#define ENSURE_ALLOWS_DELETIONS(d) \
414 if ((d)->ma_keys->dk_lookup == lookdict_unicode_nodummy) { \
415 (d)->ma_keys->dk_lookup = lookdict_unicode; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400417
418/* This immutable, empty PyDictKeysObject is used for PyDict_Clear()
419 * (which cannot fail and thus can do no allocation).
420 */
421static PyDictKeysObject empty_keys_struct = {
422 2, /* dk_refcnt 1 for this struct, 1 for dummy_struct */
423 1, /* dk_size */
424 lookdict_split, /* dk_lookup */
425 0, /* dk_usable (immutable) */
Victor Stinner742da042016-09-07 17:40:12 -0700426 0, /* dk_nentries */
Benjamin Peterson186122e2016-09-08 12:20:12 -0700427 .dk_indices = { .as_1 = {DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY,
428 DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY}},
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400429};
430
431static PyObject *empty_values[1] = { NULL };
432
433#define Py_EMPTY_KEYS &empty_keys_struct
434
Victor Stinner611b0fa2016-09-14 15:02:01 +0200435/* Uncomment to check the dict content in _PyDict_CheckConsistency() */
436/* #define DEBUG_PYDICT */
437
438
439#ifdef Py_DEBUG
440static int
441_PyDict_CheckConsistency(PyDictObject *mp)
442{
443 PyDictKeysObject *keys = mp->ma_keys;
444 int splitted = _PyDict_HasSplitTable(mp);
445 Py_ssize_t usable = USABLE_FRACTION(keys->dk_size);
446#ifdef DEBUG_PYDICT
447 PyDictKeyEntry *entries = DK_ENTRIES(keys);
448 Py_ssize_t i;
449#endif
450
451 assert(0 <= mp->ma_used && mp->ma_used <= usable);
452 assert(IS_POWER_OF_2(keys->dk_size));
453 assert(0 <= keys->dk_usable
454 && keys->dk_usable <= usable);
455 assert(0 <= keys->dk_nentries
456 && keys->dk_nentries <= usable);
457 assert(keys->dk_usable + keys->dk_nentries <= usable);
458
459 if (!splitted) {
460 /* combined table */
461 assert(keys->dk_refcnt == 1);
462 }
463
464#ifdef DEBUG_PYDICT
465 for (i=0; i < keys->dk_size; i++) {
466 Py_ssize_t ix = dk_get_index(keys, i);
467 assert(DKIX_DUMMY <= ix && ix <= usable);
468 }
469
470 for (i=0; i < usable; i++) {
471 PyDictKeyEntry *entry = &entries[i];
472 PyObject *key = entry->me_key;
473
474 if (key != NULL) {
475 if (PyUnicode_CheckExact(key)) {
476 Py_hash_t hash = ((PyASCIIObject *)key)->hash;
477 assert(hash != -1);
478 assert(entry->me_hash == hash);
479 }
480 else {
481 /* test_dict fails if PyObject_Hash() is called again */
482 assert(entry->me_hash != -1);
483 }
484 if (!splitted) {
485 assert(entry->me_value != NULL);
486 }
487 }
488
489 if (splitted) {
490 assert(entry->me_value == NULL);
491 }
492 }
493
494 if (splitted) {
495 /* splitted table */
496 for (i=0; i < mp->ma_used; i++) {
497 assert(mp->ma_values[i] != NULL);
498 }
499 }
500#endif
501
502 return 1;
503}
504#endif
505
506
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400507static PyDictKeysObject *new_keys_object(Py_ssize_t size)
508{
509 PyDictKeysObject *dk;
Victor Stinner742da042016-09-07 17:40:12 -0700510 Py_ssize_t es, usable;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400511
Victor Stinner742da042016-09-07 17:40:12 -0700512 assert(size >= PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400513 assert(IS_POWER_OF_2(size));
Victor Stinner742da042016-09-07 17:40:12 -0700514
515 usable = USABLE_FRACTION(size);
516 if (size <= 0xff) {
517 es = 1;
518 }
519 else if (size <= 0xffff) {
520 es = 2;
521 }
522#if SIZEOF_VOID_P > 4
523 else if (size <= 0xffffffff) {
524 es = 4;
525 }
526#endif
527 else {
528 es = sizeof(Py_ssize_t);
529 }
530
531 if (size == PyDict_MINSIZE && numfreekeys > 0) {
532 dk = keys_free_list[--numfreekeys];
533 }
534 else {
Victor Stinner98ee9d52016-09-08 09:33:56 -0700535 dk = PyObject_MALLOC(sizeof(PyDictKeysObject)
536 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
537 + es * size
538 + sizeof(PyDictKeyEntry) * usable);
Victor Stinner742da042016-09-07 17:40:12 -0700539 if (dk == NULL) {
540 PyErr_NoMemory();
541 return NULL;
542 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400543 }
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200544 DK_DEBUG_INCREF dk->dk_refcnt = 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400545 dk->dk_size = size;
Victor Stinner742da042016-09-07 17:40:12 -0700546 dk->dk_usable = usable;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400547 dk->dk_lookup = lookdict_unicode_nodummy;
Victor Stinner742da042016-09-07 17:40:12 -0700548 dk->dk_nentries = 0;
Benjamin Peterson186122e2016-09-08 12:20:12 -0700549 memset(&dk->dk_indices.as_1[0], 0xff, es * size);
Victor Stinner742da042016-09-07 17:40:12 -0700550 memset(DK_ENTRIES(dk), 0, sizeof(PyDictKeyEntry) * usable);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400551 return dk;
552}
553
554static void
555free_keys_object(PyDictKeysObject *keys)
556{
Victor Stinner742da042016-09-07 17:40:12 -0700557 PyDictKeyEntry *entries = DK_ENTRIES(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400558 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -0700559 for (i = 0, n = keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400560 Py_XDECREF(entries[i].me_key);
561 Py_XDECREF(entries[i].me_value);
562 }
Victor Stinner742da042016-09-07 17:40:12 -0700563 if (keys->dk_size == PyDict_MINSIZE && numfreekeys < PyDict_MAXFREELIST) {
564 keys_free_list[numfreekeys++] = keys;
565 return;
566 }
Raymond Hettingerce5179f2016-01-31 08:56:21 -0800567 PyObject_FREE(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400568}
569
570#define new_values(size) PyMem_NEW(PyObject *, size)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400571#define free_values(values) PyMem_FREE(values)
572
573/* Consumes a reference to the keys object */
574static PyObject *
575new_dict(PyDictKeysObject *keys, PyObject **values)
576{
577 PyDictObject *mp;
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200578 assert(keys != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 if (numfree) {
580 mp = free_list[--numfree];
581 assert (mp != NULL);
582 assert (Py_TYPE(mp) == &PyDict_Type);
583 _Py_NewReference((PyObject *)mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400585 else {
586 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
587 if (mp == NULL) {
588 DK_DECREF(keys);
589 free_values(values);
590 return NULL;
591 }
592 }
593 mp->ma_keys = keys;
594 mp->ma_values = values;
595 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -0700596 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +0200597 assert(_PyDict_CheckConsistency(mp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000599}
600
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400601/* Consumes a reference to the keys object */
602static PyObject *
603new_dict_with_shared_keys(PyDictKeysObject *keys)
604{
605 PyObject **values;
606 Py_ssize_t i, size;
607
Victor Stinner742da042016-09-07 17:40:12 -0700608 size = USABLE_FRACTION(DK_SIZE(keys));
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400609 values = new_values(size);
610 if (values == NULL) {
611 DK_DECREF(keys);
612 return PyErr_NoMemory();
613 }
614 for (i = 0; i < size; i++) {
615 values[i] = NULL;
616 }
617 return new_dict(keys, values);
618}
619
620PyObject *
621PyDict_New(void)
622{
Victor Stinner742da042016-09-07 17:40:12 -0700623 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200624 if (keys == NULL)
625 return NULL;
626 return new_dict(keys, NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400627}
628
Victor Stinner742da042016-09-07 17:40:12 -0700629/* Search index of hash table from offset of entry table */
630static Py_ssize_t
631lookdict_index(PyDictKeysObject *k, Py_hash_t hash, Py_ssize_t index)
632{
633 size_t i, perturb;
634 size_t mask = DK_MASK(k);
635 Py_ssize_t ix;
636
637 i = (size_t)hash & mask;
638 ix = dk_get_index(k, i);
639 if (ix == index) {
640 return i;
641 }
642 if (ix == DKIX_EMPTY) {
643 return DKIX_EMPTY;
644 }
645
646 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
647 i = mask & ((i << 2) + i + perturb + 1);
648 ix = dk_get_index(k, i);
649 if (ix == index) {
650 return i;
651 }
652 if (ix == DKIX_EMPTY) {
653 return DKIX_EMPTY;
654 }
655 }
656 assert(0); /* NOT REACHED */
657 return DKIX_ERROR;
658}
659
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000660/*
661The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000662This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000663Open addressing is preferred over chaining since the link overhead for
664chaining would be substantial (100% with typical malloc overhead).
665
Tim Peterseb28ef22001-06-02 05:27:19 +0000666The initial probe index is computed as hash mod the table size. Subsequent
667probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000668
669All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000670
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000671The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000672contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000673Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000674
Victor Stinner742da042016-09-07 17:40:12 -0700675lookdict() is general-purpose, and may return DKIX_ERROR if (and only if) a
Victor Stinnera4348cc2016-09-08 12:01:25 -0700676comparison raises an exception.
Guido van Rossum89d8c602007-09-18 17:26:56 +0000677lookdict_unicode() below is specialized to string keys, comparison of which can
Victor Stinner742da042016-09-07 17:40:12 -0700678never raise an exception; that function can never return DKIX_ERROR.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400679lookdict_unicode_nodummy is further specialized for string keys that cannot be
680the <dummy> value.
Victor Stinner742da042016-09-07 17:40:12 -0700681For both, when the key isn't found a DKIX_EMPTY is returned. hashpos returns
682where the key index should be inserted.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000683*/
Victor Stinner742da042016-09-07 17:40:12 -0700684static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400685lookdict(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700686 Py_hash_t hash, PyObject ***value_addr, Py_ssize_t *hashpos)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000687{
Victor Stinner742da042016-09-07 17:40:12 -0700688 size_t i, perturb, mask;
689 Py_ssize_t ix, freeslot;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200690 int cmp;
Victor Stinner742da042016-09-07 17:40:12 -0700691 PyDictKeysObject *dk;
692 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000694
Antoine Pitrou9a234902012-05-13 20:48:01 +0200695top:
Victor Stinner742da042016-09-07 17:40:12 -0700696 dk = mp->ma_keys;
697 mask = DK_MASK(dk);
698 ep0 = DK_ENTRIES(dk);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700700
701 ix = dk_get_index(dk, i);
702 if (ix == DKIX_EMPTY) {
703 if (hashpos != NULL)
704 *hashpos = i;
705 *value_addr = NULL;
706 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400707 }
Victor Stinner742da042016-09-07 17:40:12 -0700708 if (ix == DKIX_DUMMY) {
709 freeslot = i;
710 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 else {
Victor Stinner742da042016-09-07 17:40:12 -0700712 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300713 assert(ep->me_key != NULL);
Victor Stinner742da042016-09-07 17:40:12 -0700714 if (ep->me_key == key) {
715 *value_addr = &ep->me_value;
716 if (hashpos != NULL)
717 *hashpos = i;
718 return ix;
719 }
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300720 if (ep->me_hash == hash) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 startkey = ep->me_key;
722 Py_INCREF(startkey);
723 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
724 Py_DECREF(startkey);
725 if (cmp < 0)
Victor Stinner742da042016-09-07 17:40:12 -0700726 return DKIX_ERROR;
727 if (dk == mp->ma_keys && ep->me_key == startkey) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400728 if (cmp > 0) {
729 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700730 if (hashpos != NULL)
731 *hashpos = i;
732 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400733 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 }
735 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200736 /* The dict was mutated, restart */
737 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 }
739 }
Victor Stinner742da042016-09-07 17:40:12 -0700740 freeslot = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 }
Tim Peters15d49292001-05-27 07:39:22 +0000742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
Victor Stinner742da042016-09-07 17:40:12 -0700744 i = ((i << 2) + i + perturb + 1) & mask;
745 ix = dk_get_index(dk, i);
746 if (ix == DKIX_EMPTY) {
747 if (hashpos != NULL) {
748 *hashpos = (freeslot == -1) ? (Py_ssize_t)i : freeslot;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400749 }
Victor Stinner742da042016-09-07 17:40:12 -0700750 *value_addr = NULL;
751 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400752 }
Victor Stinner742da042016-09-07 17:40:12 -0700753 if (ix == DKIX_DUMMY) {
754 if (freeslot == -1)
755 freeslot = i;
756 continue;
757 }
758 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300759 assert(ep->me_key != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400760 if (ep->me_key == key) {
Victor Stinner742da042016-09-07 17:40:12 -0700761 if (hashpos != NULL) {
762 *hashpos = i;
763 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400764 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700765 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400766 }
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300767 if (ep->me_hash == hash) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 startkey = ep->me_key;
769 Py_INCREF(startkey);
770 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
771 Py_DECREF(startkey);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400772 if (cmp < 0) {
773 *value_addr = NULL;
Victor Stinner742da042016-09-07 17:40:12 -0700774 return DKIX_ERROR;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400775 }
Victor Stinner742da042016-09-07 17:40:12 -0700776 if (dk == mp->ma_keys && ep->me_key == startkey) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400777 if (cmp > 0) {
Victor Stinner742da042016-09-07 17:40:12 -0700778 if (hashpos != NULL) {
779 *hashpos = i;
780 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400781 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700782 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400783 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 }
785 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200786 /* The dict was mutated, restart */
787 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 }
789 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 }
791 assert(0); /* NOT REACHED */
792 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000793}
794
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400795/* Specialized version for string-only keys */
Victor Stinner742da042016-09-07 17:40:12 -0700796static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400797lookdict_unicode(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700798 Py_hash_t hash, PyObject ***value_addr, Py_ssize_t *hashpos)
Fred Drake1bff34a2000-08-31 19:31:38 +0000799{
Victor Stinner742da042016-09-07 17:40:12 -0700800 size_t i, perturb;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200801 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700802 Py_ssize_t ix, freeslot;
803 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Fred Drake1bff34a2000-08-31 19:31:38 +0000804
Victor Stinner742da042016-09-07 17:40:12 -0700805 assert(mp->ma_values == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 /* Make sure this function doesn't have to handle non-unicode keys,
807 including subclasses of str; e.g., one reason to subclass
808 unicodes is to override __eq__, and for speed we don't cater to
809 that here. */
810 if (!PyUnicode_CheckExact(key)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400811 mp->ma_keys->dk_lookup = lookdict;
Victor Stinner742da042016-09-07 17:40:12 -0700812 return lookdict(mp, key, hash, value_addr, hashpos);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100814 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700815 ix = dk_get_index(mp->ma_keys, i);
816 if (ix == DKIX_EMPTY) {
817 if (hashpos != NULL)
818 *hashpos = i;
819 *value_addr = NULL;
820 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400821 }
Victor Stinner742da042016-09-07 17:40:12 -0700822 if (ix == DKIX_DUMMY) {
823 freeslot = i;
824 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 else {
Victor Stinner742da042016-09-07 17:40:12 -0700826 ep = &ep0[ix];
Victor Stinner742da042016-09-07 17:40:12 -0700827 assert(ep->me_key != NULL);
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300828 if (ep->me_key == key
829 || (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 }
Victor Stinner742da042016-09-07 17:40:12 -0700835 freeslot = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 }
Tim Peters15d49292001-05-27 07:39:22 +0000837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
Victor Stinner742da042016-09-07 17:40:12 -0700839 i = mask & ((i << 2) + i + perturb + 1);
840 ix = dk_get_index(mp->ma_keys, i);
841 if (ix == DKIX_EMPTY) {
842 if (hashpos != NULL) {
843 *hashpos = (freeslot == -1) ? (Py_ssize_t)i : freeslot;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400844 }
Victor Stinner742da042016-09-07 17:40:12 -0700845 *value_addr = NULL;
846 return DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400847 }
Victor Stinner742da042016-09-07 17:40:12 -0700848 if (ix == DKIX_DUMMY) {
849 if (freeslot == -1)
850 freeslot = i;
851 continue;
852 }
853 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300854 assert(ep->me_key != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 if (ep->me_key == key
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300856 || (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400857 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700858 if (hashpos != NULL) {
859 *hashpos = i;
860 }
861 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400862 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 }
864 assert(0); /* NOT REACHED */
865 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000866}
867
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400868/* Faster version of lookdict_unicode when it is known that no <dummy> keys
869 * will be present. */
Victor Stinner742da042016-09-07 17:40:12 -0700870static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400871lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700872 Py_hash_t hash, PyObject ***value_addr,
873 Py_ssize_t *hashpos)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400874{
Victor Stinner742da042016-09-07 17:40:12 -0700875 size_t i, perturb;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200876 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700877 Py_ssize_t ix;
878 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400879
Victor Stinner742da042016-09-07 17:40:12 -0700880 assert(mp->ma_values == NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400881 /* Make sure this function doesn't have to handle non-unicode keys,
882 including subclasses of str; e.g., one reason to subclass
883 unicodes is to override __eq__, and for speed we don't cater to
884 that here. */
885 if (!PyUnicode_CheckExact(key)) {
886 mp->ma_keys->dk_lookup = lookdict;
Victor Stinner742da042016-09-07 17:40:12 -0700887 return lookdict(mp, key, hash, value_addr, hashpos);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400888 }
889 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700890 ix = dk_get_index(mp->ma_keys, i);
891 assert (ix != DKIX_DUMMY);
892 if (ix == DKIX_EMPTY) {
893 if (hashpos != NULL)
894 *hashpos = i;
895 *value_addr = NULL;
896 return DKIX_EMPTY;
897 }
898 ep = &ep0[ix];
Victor Stinnerdee6e252016-09-08 11:16:07 -0700899 assert(ep->me_key != NULL);
900 assert(PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700901 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400902 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700903 if (hashpos != NULL)
904 *hashpos = i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400905 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700906 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400907 }
908 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
Victor Stinner742da042016-09-07 17:40:12 -0700909 i = mask & ((i << 2) + i + perturb + 1);
910 ix = dk_get_index(mp->ma_keys, i);
911 assert (ix != DKIX_DUMMY);
912 if (ix == DKIX_EMPTY) {
913 if (hashpos != NULL)
914 *hashpos = i;
915 *value_addr = NULL;
916 return DKIX_EMPTY;
917 }
918 ep = &ep0[ix];
919 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
920 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400921 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700922 if (hashpos != NULL)
923 *hashpos = i;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400924 *value_addr = &ep->me_value;
Victor Stinner742da042016-09-07 17:40:12 -0700925 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400926 }
927 }
928 assert(0); /* NOT REACHED */
929 return 0;
930}
931
932/* Version of lookdict for split tables.
933 * All split tables and only split tables use this lookup function.
934 * Split tables only contain unicode keys and no dummy keys,
935 * so algorithm is the same as lookdict_unicode_nodummy.
936 */
Victor Stinner742da042016-09-07 17:40:12 -0700937static Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400938lookdict_split(PyDictObject *mp, PyObject *key,
Victor Stinner742da042016-09-07 17:40:12 -0700939 Py_hash_t hash, PyObject ***value_addr, Py_ssize_t *hashpos)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400940{
Victor Stinner742da042016-09-07 17:40:12 -0700941 size_t i, perturb;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200942 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -0700943 Py_ssize_t ix;
944 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400945
Victor Stinner742da042016-09-07 17:40:12 -0700946 /* mp must split table */
947 assert(mp->ma_values != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400948 if (!PyUnicode_CheckExact(key)) {
Victor Stinner742da042016-09-07 17:40:12 -0700949 ix = lookdict(mp, key, hash, value_addr, hashpos);
950 if (ix >= 0) {
951 *value_addr = &mp->ma_values[ix];
952 }
953 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400954 }
Victor Stinner742da042016-09-07 17:40:12 -0700955
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400956 i = (size_t)hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -0700957 ix = dk_get_index(mp->ma_keys, i);
958 if (ix == DKIX_EMPTY) {
959 if (hashpos != NULL)
960 *hashpos = i;
961 *value_addr = NULL;
962 return DKIX_EMPTY;
963 }
964 assert(ix >= 0);
965 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300966 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700967 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400968 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700969 if (hashpos != NULL)
970 *hashpos = i;
971 *value_addr = &mp->ma_values[ix];
972 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400973 }
974 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
Victor Stinner742da042016-09-07 17:40:12 -0700975 i = mask & ((i << 2) + i + perturb + 1);
976 ix = dk_get_index(mp->ma_keys, i);
977 if (ix == DKIX_EMPTY) {
978 if (hashpos != NULL)
979 *hashpos = i;
980 *value_addr = NULL;
981 return DKIX_EMPTY;
982 }
983 assert(ix >= 0);
984 ep = &ep0[ix];
Serhiy Storchaka46825d22016-09-26 21:29:34 +0300985 assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
Victor Stinner742da042016-09-07 17:40:12 -0700986 if (ep->me_key == key ||
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400987 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
Victor Stinner742da042016-09-07 17:40:12 -0700988 if (hashpos != NULL)
989 *hashpos = i;
990 *value_addr = &mp->ma_values[ix];
991 return ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400992 }
993 }
994 assert(0); /* NOT REACHED */
995 return 0;
996}
997
Benjamin Petersonfb886362010-04-24 18:21:17 +0000998int
999_PyDict_HasOnlyStringKeys(PyObject *dict)
1000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 Py_ssize_t pos = 0;
1002 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +00001003 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 /* Shortcut */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001005 if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 return 1;
1007 while (PyDict_Next(dict, &pos, &key, &value))
1008 if (!PyUnicode_Check(key))
1009 return 0;
1010 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +00001011}
1012
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001013#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 do { \
1015 if (!_PyObject_GC_IS_TRACKED(mp)) { \
1016 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
1017 _PyObject_GC_MAY_BE_TRACKED(value)) { \
1018 _PyObject_GC_TRACK(mp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 } \
1020 } \
1021 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001022
1023void
1024_PyDict_MaybeUntrack(PyObject *op)
1025{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 PyDictObject *mp;
1027 PyObject *value;
Victor Stinner742da042016-09-07 17:40:12 -07001028 Py_ssize_t i, numentries;
1029 PyDictKeyEntry *ep0;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
1032 return;
1033
1034 mp = (PyDictObject *) op;
Victor Stinner742da042016-09-07 17:40:12 -07001035 ep0 = DK_ENTRIES(mp->ma_keys);
1036 numentries = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001037 if (_PyDict_HasSplitTable(mp)) {
Victor Stinner742da042016-09-07 17:40:12 -07001038 for (i = 0; i < numentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001039 if ((value = mp->ma_values[i]) == NULL)
1040 continue;
1041 if (_PyObject_GC_MAY_BE_TRACKED(value)) {
Victor Stinner742da042016-09-07 17:40:12 -07001042 assert(!_PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001043 return;
1044 }
1045 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001047 else {
Victor Stinner742da042016-09-07 17:40:12 -07001048 for (i = 0; i < numentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001049 if ((value = ep0[i].me_value) == NULL)
1050 continue;
1051 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
1052 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
1053 return;
1054 }
1055 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001057}
1058
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001059/* Internal function to find slot for an item from its hash
Victor Stinner3c336c52016-09-12 14:17:40 +02001060 when it is known that the key is not present in the dict.
1061
1062 The dict must be combined. */
Victor Stinner99264802016-09-13 09:38:29 +02001063static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001064find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Victor Stinner742da042016-09-07 17:40:12 -07001065 PyObject ***value_addr, Py_ssize_t *hashpos)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001066{
Victor Stinner742da042016-09-07 17:40:12 -07001067 size_t i, perturb;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001068 size_t mask = DK_MASK(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07001069 Py_ssize_t ix;
1070 PyDictKeyEntry *ep, *ep0 = DK_ENTRIES(mp->ma_keys);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001071
Victor Stinner3c336c52016-09-12 14:17:40 +02001072 assert(!_PyDict_HasSplitTable(mp));
Victor Stinner742da042016-09-07 17:40:12 -07001073 assert(hashpos != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001074 assert(key != NULL);
Victor Stinner3c336c52016-09-12 14:17:40 +02001075
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001076 if (!PyUnicode_CheckExact(key))
1077 mp->ma_keys->dk_lookup = lookdict;
1078 i = hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -07001079 ix = dk_get_index(mp->ma_keys, i);
1080 for (perturb = hash; ix != DKIX_EMPTY; perturb >>= PERTURB_SHIFT) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001081 i = (i << 2) + i + perturb + 1;
Victor Stinner742da042016-09-07 17:40:12 -07001082 ix = dk_get_index(mp->ma_keys, i & mask);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 }
Victor Stinner742da042016-09-07 17:40:12 -07001084 ep = &ep0[mp->ma_keys->dk_nentries];
1085 *hashpos = i & mask;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001086 assert(ep->me_value == NULL);
Victor Stinner99264802016-09-13 09:38:29 +02001087 *value_addr = &ep->me_value;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001088}
1089
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001090static int
1091insertion_resize(PyDictObject *mp)
1092{
Raymond Hettinger36f74aa2013-05-17 03:01:13 -07001093 return dictresize(mp, GROWTH_RATE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001094}
Antoine Pitroue965d972012-02-27 00:45:12 +01001095
1096/*
1097Internal routine to insert a new item into the table.
1098Used both by the internal resize routine and by the public insert routine.
Antoine Pitroue965d972012-02-27 00:45:12 +01001099Returns -1 if an error occurred, or 0 on success.
1100*/
1101static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001102insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001103{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001104 PyObject *old_value;
1105 PyObject **value_addr;
Victor Stinner742da042016-09-07 17:40:12 -07001106 PyDictKeyEntry *ep, *ep0;
1107 Py_ssize_t hashpos, ix;
Antoine Pitroue965d972012-02-27 00:45:12 +01001108
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001109 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
1110 if (insertion_resize(mp) < 0)
1111 return -1;
1112 }
1113
Victor Stinner742da042016-09-07 17:40:12 -07001114 ix = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr, &hashpos);
1115 if (ix == DKIX_ERROR) {
Antoine Pitroue965d972012-02-27 00:45:12 +01001116 return -1;
1117 }
Victor Stinner742da042016-09-07 17:40:12 -07001118
Antoine Pitroud6967322014-10-18 00:35:00 +02001119 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
Benjamin Petersona6f195e2012-04-30 10:23:40 -04001120 Py_INCREF(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001121 MAINTAIN_TRACKING(mp, key, value);
Victor Stinner742da042016-09-07 17:40:12 -07001122
1123 /* When insertion order is different from shared key, we can't share
1124 * the key anymore. Convert this instance to combine table.
1125 */
1126 if (_PyDict_HasSplitTable(mp) &&
1127 ((ix >= 0 && *value_addr == NULL && mp->ma_used != ix) ||
1128 (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {
1129 if (insertion_resize(mp) < 0) {
1130 Py_DECREF(value);
1131 return -1;
1132 }
1133 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
1134 ix = DKIX_EMPTY;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001135 }
Victor Stinner742da042016-09-07 17:40:12 -07001136
1137 if (ix == DKIX_EMPTY) {
1138 /* Insert into new slot. */
1139 if (mp->ma_keys->dk_usable <= 0) {
1140 /* Need to resize. */
1141 if (insertion_resize(mp) < 0) {
1142 Py_DECREF(value);
1143 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001144 }
Victor Stinner742da042016-09-07 17:40:12 -07001145 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
1146 }
1147 ep0 = DK_ENTRIES(mp->ma_keys);
1148 ep = &ep0[mp->ma_keys->dk_nentries];
1149 dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
1150 Py_INCREF(key);
1151 ep->me_key = key;
1152 ep->me_hash = hash;
1153 if (mp->ma_values) {
1154 assert (mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
1155 mp->ma_values[mp->ma_keys->dk_nentries] = value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001156 }
1157 else {
Victor Stinner742da042016-09-07 17:40:12 -07001158 ep->me_value = value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001159 }
1160 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001161 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07001162 mp->ma_keys->dk_usable--;
1163 mp->ma_keys->dk_nentries++;
1164 assert(mp->ma_keys->dk_usable >= 0);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001165 assert(_PyDict_CheckConsistency(mp));
Victor Stinner742da042016-09-07 17:40:12 -07001166 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001167 }
Victor Stinner742da042016-09-07 17:40:12 -07001168
1169 assert(value_addr != NULL);
1170
1171 old_value = *value_addr;
1172 if (old_value != NULL) {
1173 *value_addr = value;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001174 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02001175 assert(_PyDict_CheckConsistency(mp));
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001176
Victor Stinner742da042016-09-07 17:40:12 -07001177 Py_DECREF(old_value); /* which **CAN** re-enter (see issue #22653) */
1178 return 0;
1179 }
1180
1181 /* pending state */
1182 assert(_PyDict_HasSplitTable(mp));
1183 assert(ix == mp->ma_used);
1184 *value_addr = value;
1185 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001186 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02001187 assert(_PyDict_CheckConsistency(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001188 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +01001189}
1190
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001191/*
1192Internal routine used by dictresize() to insert an item which is
1193known to be absent from the dict. This routine also assumes that
1194the dict contains no deleted entries. Besides the performance benefit,
1195using insertdict() in dictresize() is dangerous (SF bug #1456209).
1196Note that no refcounts are changed by this routine; if needed, the caller
1197is responsible for incref'ing `key` and `value`.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001198Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
1199must set them correctly
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001200*/
1201static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001202insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001204{
Victor Stinner742da042016-09-07 17:40:12 -07001205 size_t i, perturb;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001206 PyDictKeysObject *k = mp->ma_keys;
1207 size_t mask = (size_t)DK_SIZE(k)-1;
Victor Stinner742da042016-09-07 17:40:12 -07001208 PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001209 PyDictKeyEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001210
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001211 assert(k->dk_lookup != NULL);
1212 assert(value != NULL);
1213 assert(key != NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001214 assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
1215 i = hash & mask;
Victor Stinner742da042016-09-07 17:40:12 -07001216 for (perturb = hash; dk_get_index(k, i) != DKIX_EMPTY;
1217 perturb >>= PERTURB_SHIFT) {
1218 i = mask & ((i << 2) + i + perturb + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 }
Victor Stinner742da042016-09-07 17:40:12 -07001220 ep = &ep0[k->dk_nentries];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 assert(ep->me_value == NULL);
Victor Stinner742da042016-09-07 17:40:12 -07001222 dk_set_index(k, i, k->dk_nentries);
1223 k->dk_nentries++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001225 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001227}
1228
1229/*
1230Restructure the table by allocating a new table and reinserting all
1231items again. When entries have been deleted, the new table may
1232actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001233If a table is split (its keys and hashes are shared, its values are not),
1234then the values are temporarily copied into the table, it is resized as
1235a combined table, then the me_value slots in the old table are NULLed out.
1236After resizing a table is always combined,
1237but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001238*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001239static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001240dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001241{
Victor Stinner742da042016-09-07 17:40:12 -07001242 Py_ssize_t i, newsize;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001243 PyDictKeysObject *oldkeys;
1244 PyObject **oldvalues;
Victor Stinner742da042016-09-07 17:40:12 -07001245 PyDictKeyEntry *ep0;
Tim Peters91a364d2001-05-19 07:04:38 +00001246
Victor Stinner742da042016-09-07 17:40:12 -07001247 /* Find the smallest table size > minused. */
1248 for (newsize = PyDict_MINSIZE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 newsize <= minused && newsize > 0;
1250 newsize <<= 1)
1251 ;
1252 if (newsize <= 0) {
1253 PyErr_NoMemory();
1254 return -1;
1255 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001256 oldkeys = mp->ma_keys;
1257 oldvalues = mp->ma_values;
1258 /* Allocate a new table. */
1259 mp->ma_keys = new_keys_object(newsize);
1260 if (mp->ma_keys == NULL) {
1261 mp->ma_keys = oldkeys;
1262 return -1;
1263 }
1264 if (oldkeys->dk_lookup == lookdict)
1265 mp->ma_keys->dk_lookup = lookdict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001266 mp->ma_values = NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001267 ep0 = DK_ENTRIES(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001268 /* Main loop below assumes we can transfer refcount to new keys
1269 * and that value is stored in me_value.
1270 * Increment ref-counts and copy values here to compensate
1271 * This (resizing a split table) should be relatively rare */
1272 if (oldvalues != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001273 for (i = 0; i < oldkeys->dk_nentries; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001274 if (oldvalues[i] != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001275 Py_INCREF(ep0[i].me_key);
1276 ep0[i].me_value = oldvalues[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 }
1279 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001280 /* Main loop */
Victor Stinner742da042016-09-07 17:40:12 -07001281 for (i = 0; i < oldkeys->dk_nentries; i++) {
1282 PyDictKeyEntry *ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001283 if (ep->me_value != NULL) {
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001284 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001287 mp->ma_keys->dk_usable -= mp->ma_used;
1288 if (oldvalues != NULL) {
1289 /* NULL out me_value slot in oldkeys, in case it was shared */
Victor Stinner742da042016-09-07 17:40:12 -07001290 for (i = 0; i < oldkeys->dk_nentries; i++)
1291 ep0[i].me_value = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001292 DK_DECREF(oldkeys);
Victor Stinner742da042016-09-07 17:40:12 -07001293 if (oldvalues != empty_values) {
1294 free_values(oldvalues);
1295 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001296 }
1297 else {
1298 assert(oldkeys->dk_lookup != lookdict_split);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001299 assert(oldkeys->dk_refcnt == 1);
Raymond Hettingerce5179f2016-01-31 08:56:21 -08001300 DK_DEBUG_DECREF PyObject_FREE(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001301 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001303}
1304
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001305/* Returns NULL if unable to split table.
1306 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001307static PyDictKeysObject *
1308make_keys_shared(PyObject *op)
1309{
1310 Py_ssize_t i;
1311 Py_ssize_t size;
1312 PyDictObject *mp = (PyDictObject *)op;
1313
Benjamin Peterson15ee8212012-04-24 14:44:18 -04001314 if (!PyDict_CheckExact(op))
1315 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001316 if (!_PyDict_HasSplitTable(mp)) {
1317 PyDictKeyEntry *ep0;
1318 PyObject **values;
1319 assert(mp->ma_keys->dk_refcnt == 1);
1320 if (mp->ma_keys->dk_lookup == lookdict) {
1321 return NULL;
1322 }
1323 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
1324 /* Remove dummy keys */
1325 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
1326 return NULL;
1327 }
1328 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
1329 /* Copy values into a new array */
Victor Stinner742da042016-09-07 17:40:12 -07001330 ep0 = DK_ENTRIES(mp->ma_keys);
1331 size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001332 values = new_values(size);
1333 if (values == NULL) {
1334 PyErr_SetString(PyExc_MemoryError,
1335 "Not enough memory to allocate new values array");
1336 return NULL;
1337 }
1338 for (i = 0; i < size; i++) {
1339 values[i] = ep0[i].me_value;
1340 ep0[i].me_value = NULL;
1341 }
1342 mp->ma_keys->dk_lookup = lookdict_split;
1343 mp->ma_values = values;
1344 }
1345 DK_INCREF(mp->ma_keys);
1346 return mp->ma_keys;
1347}
Christian Heimes99170a52007-12-19 02:07:34 +00001348
1349PyObject *
1350_PyDict_NewPresized(Py_ssize_t minused)
1351{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001352 Py_ssize_t newsize;
1353 PyDictKeysObject *new_keys;
Victor Stinner742da042016-09-07 17:40:12 -07001354 for (newsize = PyDict_MINSIZE;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001355 newsize <= minused && newsize > 0;
1356 newsize <<= 1)
1357 ;
1358 new_keys = new_keys_object(newsize);
1359 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001361 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001362}
1363
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001364/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1365 * that may occur (originally dicts supported only string keys, and exceptions
1366 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001367 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001368 * (suppressed) occurred while computing the key's hash, or that some error
1369 * (suppressed) occurred when comparing keys in the dict's internal probe
1370 * sequence. A nasty example of the latter is when a Python-coded comparison
1371 * function hits a stack-depth error, which can cause this to return NULL
1372 * even if the key is present.
1373 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001374PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001375PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001376{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001377 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001378 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 PyDictObject *mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001381 PyObject **value_addr;
1382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 if (!PyDict_Check(op))
1384 return NULL;
1385 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001386 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 {
1388 hash = PyObject_Hash(key);
1389 if (hash == -1) {
1390 PyErr_Clear();
1391 return NULL;
1392 }
1393 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 /* We can arrive here with a NULL tstate during initialization: try
1396 running "python -Wi" for an example related to string interning.
1397 Let's just hope that no exception occurs then... This must be
1398 _PyThreadState_Current and not PyThreadState_GET() because in debug
1399 mode, the latter complains if tstate is NULL. */
Victor Stinnerbfd316e2016-01-20 11:12:38 +01001400 tstate = _PyThreadState_UncheckedGet();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 if (tstate != NULL && tstate->curexc_type != NULL) {
1402 /* preserve the existing exception */
1403 PyObject *err_type, *err_value, *err_tb;
1404 PyErr_Fetch(&err_type, &err_value, &err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001405 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 /* ignore errors */
1407 PyErr_Restore(err_type, err_value, err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001408 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 return NULL;
1410 }
1411 else {
Victor Stinner742da042016-09-07 17:40:12 -07001412 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1413 if (ix < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 PyErr_Clear();
1415 return NULL;
1416 }
1417 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001418 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001419}
1420
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001421PyObject *
1422_PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1423{
Victor Stinner742da042016-09-07 17:40:12 -07001424 Py_ssize_t ix;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001425 PyDictObject *mp = (PyDictObject *)op;
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001426 PyThreadState *tstate;
1427 PyObject **value_addr;
1428
1429 if (!PyDict_Check(op))
1430 return NULL;
1431
1432 /* We can arrive here with a NULL tstate during initialization: try
1433 running "python -Wi" for an example related to string interning.
1434 Let's just hope that no exception occurs then... This must be
1435 _PyThreadState_Current and not PyThreadState_GET() because in debug
1436 mode, the latter complains if tstate is NULL. */
Victor Stinnerbfd316e2016-01-20 11:12:38 +01001437 tstate = _PyThreadState_UncheckedGet();
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001438 if (tstate != NULL && tstate->curexc_type != NULL) {
1439 /* preserve the existing exception */
1440 PyObject *err_type, *err_value, *err_tb;
1441 PyErr_Fetch(&err_type, &err_value, &err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001442 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001443 /* ignore errors */
1444 PyErr_Restore(err_type, err_value, err_tb);
Victor Stinner742da042016-09-07 17:40:12 -07001445 if (ix == DKIX_EMPTY)
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001446 return NULL;
1447 }
1448 else {
Victor Stinner742da042016-09-07 17:40:12 -07001449 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1450 if (ix == DKIX_EMPTY) {
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001451 PyErr_Clear();
1452 return NULL;
1453 }
1454 }
1455 return *value_addr;
1456}
1457
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001458/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1459 This returns NULL *with* an exception set if an exception occurred.
1460 It returns NULL *without* an exception set if the key wasn't present.
1461*/
1462PyObject *
1463PyDict_GetItemWithError(PyObject *op, PyObject *key)
1464{
Victor Stinner742da042016-09-07 17:40:12 -07001465 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001466 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001468 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 if (!PyDict_Check(op)) {
1471 PyErr_BadInternalCall();
1472 return NULL;
1473 }
1474 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001475 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 {
1477 hash = PyObject_Hash(key);
1478 if (hash == -1) {
1479 return NULL;
1480 }
1481 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001482
Victor Stinner742da042016-09-07 17:40:12 -07001483 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
1484 if (ix < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001486 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001487}
1488
Brett Cannonfd074152012-04-14 14:10:13 -04001489PyObject *
1490_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1491{
1492 PyObject *kv;
1493 kv = _PyUnicode_FromId(key); /* borrowed */
1494 if (kv == NULL)
1495 return NULL;
1496 return PyDict_GetItemWithError(dp, kv);
1497}
1498
Victor Stinnerb4efc962015-11-20 09:24:02 +01001499/* Fast version of global value lookup (LOAD_GLOBAL).
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001500 * Lookup in globals, then builtins.
Victor Stinnerb4efc962015-11-20 09:24:02 +01001501 *
1502 * Raise an exception and return NULL if an error occurred (ex: computing the
1503 * key hash failed, key comparison failed, ...). Return NULL if the key doesn't
1504 * exist. Return the value if the key exists.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001505 */
1506PyObject *
1507_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001508{
Victor Stinner742da042016-09-07 17:40:12 -07001509 Py_ssize_t ix;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001510 Py_hash_t hash;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001511 PyObject **value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001512
1513 if (!PyUnicode_CheckExact(key) ||
1514 (hash = ((PyASCIIObject *) key)->hash) == -1)
1515 {
1516 hash = PyObject_Hash(key);
1517 if (hash == -1)
1518 return NULL;
Antoine Pitroue965d972012-02-27 00:45:12 +01001519 }
Victor Stinnerb4efc962015-11-20 09:24:02 +01001520
1521 /* namespace 1: globals */
Victor Stinner742da042016-09-07 17:40:12 -07001522 ix = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr, NULL);
1523 if (ix == DKIX_ERROR)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001524 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07001525 if (ix != DKIX_EMPTY && *value_addr != NULL)
1526 return *value_addr;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001527
1528 /* namespace 2: builtins */
Victor Stinner742da042016-09-07 17:40:12 -07001529 ix = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr, NULL);
1530 if (ix < 0)
Victor Stinnerb4efc962015-11-20 09:24:02 +01001531 return NULL;
1532 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001533}
1534
Antoine Pitroue965d972012-02-27 00:45:12 +01001535/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1536 * dictionary if it's merely replacing the value for an existing key.
1537 * This means that it's safe to loop over a dictionary with PyDict_Next()
1538 * and occasionally replace a value -- but you can't insert new keys or
1539 * remove them.
1540 */
1541int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001542PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001543{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001544 PyDictObject *mp;
1545 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001546 if (!PyDict_Check(op)) {
1547 PyErr_BadInternalCall();
1548 return -1;
1549 }
1550 assert(key);
1551 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001552 mp = (PyDictObject *)op;
1553 if (!PyUnicode_CheckExact(key) ||
1554 (hash = ((PyASCIIObject *) key)->hash) == -1)
1555 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001556 hash = PyObject_Hash(key);
1557 if (hash == -1)
1558 return -1;
1559 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001560
1561 /* insertdict() handles any resizing that might be necessary */
1562 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001563}
1564
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001565int
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001566_PyDict_SetItem_KnownHash(PyObject *op, PyObject *key, PyObject *value,
1567 Py_hash_t hash)
1568{
1569 PyDictObject *mp;
1570
1571 if (!PyDict_Check(op)) {
1572 PyErr_BadInternalCall();
1573 return -1;
1574 }
1575 assert(key);
1576 assert(value);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001577 assert(hash != -1);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001578 mp = (PyDictObject *)op;
1579
1580 /* insertdict() handles any resizing that might be necessary */
1581 return insertdict(mp, key, hash, value);
1582}
1583
1584int
Tim Peters1f5871e2000-07-04 17:44:48 +00001585PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001586{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001587 Py_hash_t hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 assert(key);
1590 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001591 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 hash = PyObject_Hash(key);
1593 if (hash == -1)
1594 return -1;
1595 }
Victor Stinner742da042016-09-07 17:40:12 -07001596
1597 return _PyDict_DelItem_KnownHash(op, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001598}
1599
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001600int
1601_PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1602{
Victor Stinner742da042016-09-07 17:40:12 -07001603 Py_ssize_t hashpos, ix;
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001604 PyDictObject *mp;
1605 PyDictKeyEntry *ep;
1606 PyObject *old_key, *old_value;
1607 PyObject **value_addr;
1608
1609 if (!PyDict_Check(op)) {
1610 PyErr_BadInternalCall();
1611 return -1;
1612 }
1613 assert(key);
1614 assert(hash != -1);
1615 mp = (PyDictObject *)op;
Victor Stinner742da042016-09-07 17:40:12 -07001616 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1617 if (ix == DKIX_ERROR)
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001618 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07001619 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001620 _PyErr_SetKeyError(key);
1621 return -1;
1622 }
Victor Stinner742da042016-09-07 17:40:12 -07001623 assert(dk_get_index(mp->ma_keys, hashpos) == ix);
Victor Stinner78601a32016-09-09 19:28:36 -07001624
1625 // Split table doesn't allow deletion. Combine it.
1626 if (_PyDict_HasSplitTable(mp)) {
1627 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1628 return -1;
1629 }
1630 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1631 assert(ix >= 0);
1632 }
1633
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001634 old_value = *value_addr;
Victor Stinner78601a32016-09-09 19:28:36 -07001635 assert(old_value != NULL);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001636 *value_addr = NULL;
1637 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001638 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner78601a32016-09-09 19:28:36 -07001639 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1640 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1641 ENSURE_ALLOWS_DELETIONS(mp);
1642 old_key = ep->me_key;
1643 ep->me_key = NULL;
1644 Py_DECREF(old_key);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001645 Py_DECREF(old_value);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001646
1647 assert(_PyDict_CheckConsistency(mp));
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001648 return 0;
1649}
1650
Guido van Rossum25831651993-05-19 14:50:45 +00001651void
Tim Peters1f5871e2000-07-04 17:44:48 +00001652PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001655 PyDictKeysObject *oldkeys;
1656 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 if (!PyDict_Check(op))
1660 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001661 mp = ((PyDictObject *)op);
1662 oldkeys = mp->ma_keys;
1663 oldvalues = mp->ma_values;
1664 if (oldvalues == empty_values)
1665 return;
1666 /* Empty the dict... */
1667 DK_INCREF(Py_EMPTY_KEYS);
1668 mp->ma_keys = Py_EMPTY_KEYS;
1669 mp->ma_values = empty_values;
1670 mp->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001671 mp->ma_version_tag = DICT_NEXT_VERSION();
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001672 /* ...then clear the keys and values */
1673 if (oldvalues != NULL) {
Victor Stinner742da042016-09-07 17:40:12 -07001674 n = oldkeys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001675 for (i = 0; i < n; i++)
1676 Py_CLEAR(oldvalues[i]);
1677 free_values(oldvalues);
1678 DK_DECREF(oldkeys);
1679 }
1680 else {
1681 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001682 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001683 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02001684 assert(_PyDict_CheckConsistency(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001685}
1686
1687/* Returns -1 if no more items (or op is not a dict),
1688 * index of item otherwise. Stores value in pvalue
1689 */
Benjamin Peterson73222252016-09-08 09:58:47 -07001690static inline Py_ssize_t
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001691dict_next(PyObject *op, Py_ssize_t i, PyObject **pvalue)
1692{
Victor Stinner742da042016-09-07 17:40:12 -07001693 Py_ssize_t n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001694 PyDictObject *mp;
Victor Stinner742da042016-09-07 17:40:12 -07001695 PyObject **value_ptr = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001696
1697 if (!PyDict_Check(op))
1698 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001700 if (i < 0)
1701 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07001702
1703 n = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001704 if (mp->ma_values) {
Victor Stinner742da042016-09-07 17:40:12 -07001705 for (; i < n; i++) {
1706 value_ptr = &mp->ma_values[i];
1707 if (*value_ptr != NULL)
1708 break;
1709 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001711 else {
Victor Stinner742da042016-09-07 17:40:12 -07001712 PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys);
1713 for (; i < n; i++) {
1714 value_ptr = &ep0[i].me_value;
1715 if (*value_ptr != NULL)
1716 break;
1717 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 }
Victor Stinner742da042016-09-07 17:40:12 -07001719 if (i >= n)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001720 return -1;
1721 if (pvalue)
1722 *pvalue = *value_ptr;
1723 return i;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001724}
1725
Tim Peters080c88b2003-02-15 03:01:11 +00001726/*
1727 * Iterate over a dict. Use like so:
1728 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001729 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001730 * PyObject *key, *value;
1731 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001732 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +00001733 * Refer to borrowed references in key and value.
1734 * }
1735 *
1736 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001737 * mutates the dict. One exception: it is safe if the loop merely changes
1738 * the values associated with the keys (but doesn't insert new keys or
1739 * delete keys), via PyDict_SetItem().
1740 */
Guido van Rossum25831651993-05-19 14:50:45 +00001741int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001742PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001743{
Victor Stinner742da042016-09-07 17:40:12 -07001744 PyDictObject *mp = (PyDictObject*)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001745 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 if (i < 0)
1747 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001748 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 *ppos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 if (pkey)
Victor Stinner742da042016-09-07 17:40:12 -07001751 *pkey = DK_ENTRIES(mp->ma_keys)[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001753}
1754
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001755/* Internal version of PyDict_Next that returns a hash value in addition
1756 * to the key and value.
1757 */
Thomas Wouterscf297e42007-02-23 15:07:44 +00001758int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001759_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1760 PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001761{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001762 PyDictObject *mp;
Victor Stinner742da042016-09-07 17:40:12 -07001763 PyDictKeyEntry *ep0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001764 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 if (i < 0)
1766 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001767 mp = (PyDictObject *)op;
Victor Stinner742da042016-09-07 17:40:12 -07001768 ep0 = DK_ENTRIES(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 *ppos = i+1;
Victor Stinner742da042016-09-07 17:40:12 -07001770 *phash = ep0[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 if (pkey)
Victor Stinner742da042016-09-07 17:40:12 -07001772 *pkey = ep0[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001774}
1775
Eric Snow96c6af92015-05-29 22:21:39 -06001776/* Internal version of dict.pop(). */
1777PyObject *
1778_PyDict_Pop(PyDictObject *mp, PyObject *key, PyObject *deflt)
1779{
1780 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07001781 Py_ssize_t ix, hashpos;
Eric Snow96c6af92015-05-29 22:21:39 -06001782 PyObject *old_value, *old_key;
1783 PyDictKeyEntry *ep;
1784 PyObject **value_addr;
1785
1786 if (mp->ma_used == 0) {
1787 if (deflt) {
1788 Py_INCREF(deflt);
1789 return deflt;
1790 }
1791 _PyErr_SetKeyError(key);
1792 return NULL;
1793 }
1794 if (!PyUnicode_CheckExact(key) ||
1795 (hash = ((PyASCIIObject *) key)->hash) == -1) {
1796 hash = PyObject_Hash(key);
1797 if (hash == -1)
1798 return NULL;
1799 }
Victor Stinner742da042016-09-07 17:40:12 -07001800 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1801 if (ix == DKIX_ERROR)
Eric Snow96c6af92015-05-29 22:21:39 -06001802 return NULL;
Victor Stinnerd0ad11f2016-09-13 16:56:38 +02001803 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Eric Snow96c6af92015-05-29 22:21:39 -06001804 if (deflt) {
1805 Py_INCREF(deflt);
1806 return deflt;
1807 }
1808 _PyErr_SetKeyError(key);
1809 return NULL;
1810 }
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001811
Victor Stinner78601a32016-09-09 19:28:36 -07001812 // Split table doesn't allow deletion. Combine it.
1813 if (_PyDict_HasSplitTable(mp)) {
1814 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
1815 return NULL;
1816 }
1817 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
1818 assert(ix >= 0);
1819 }
1820
Victor Stinner742da042016-09-07 17:40:12 -07001821 old_value = *value_addr;
Victor Stinner78601a32016-09-09 19:28:36 -07001822 assert(old_value != NULL);
Eric Snow96c6af92015-05-29 22:21:39 -06001823 *value_addr = NULL;
1824 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07001825 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner78601a32016-09-09 19:28:36 -07001826 dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY);
1827 ep = &DK_ENTRIES(mp->ma_keys)[ix];
1828 ENSURE_ALLOWS_DELETIONS(mp);
1829 old_key = ep->me_key;
1830 ep->me_key = NULL;
1831 Py_DECREF(old_key);
Victor Stinner611b0fa2016-09-14 15:02:01 +02001832
1833 assert(_PyDict_CheckConsistency(mp));
Eric Snow96c6af92015-05-29 22:21:39 -06001834 return old_value;
1835}
1836
1837/* Internal version of dict.from_keys(). It is subclass-friendly. */
1838PyObject *
1839_PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
1840{
1841 PyObject *it; /* iter(iterable) */
1842 PyObject *key;
1843 PyObject *d;
1844 int status;
1845
1846 d = PyObject_CallObject(cls, NULL);
1847 if (d == NULL)
1848 return NULL;
1849
1850 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
1851 if (PyDict_CheckExact(iterable)) {
1852 PyDictObject *mp = (PyDictObject *)d;
1853 PyObject *oldvalue;
1854 Py_ssize_t pos = 0;
1855 PyObject *key;
1856 Py_hash_t hash;
1857
Victor Stinner742da042016-09-07 17:40:12 -07001858 if (dictresize(mp, ESTIMATE_SIZE(Py_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001859 Py_DECREF(d);
1860 return NULL;
1861 }
1862
1863 while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) {
1864 if (insertdict(mp, key, hash, value)) {
1865 Py_DECREF(d);
1866 return NULL;
1867 }
1868 }
1869 return d;
1870 }
1871 if (PyAnySet_CheckExact(iterable)) {
1872 PyDictObject *mp = (PyDictObject *)d;
1873 Py_ssize_t pos = 0;
1874 PyObject *key;
1875 Py_hash_t hash;
1876
Victor Stinner742da042016-09-07 17:40:12 -07001877 if (dictresize(mp, ESTIMATE_SIZE(PySet_GET_SIZE(iterable)))) {
Eric Snow96c6af92015-05-29 22:21:39 -06001878 Py_DECREF(d);
1879 return NULL;
1880 }
1881
1882 while (_PySet_NextEntry(iterable, &pos, &key, &hash)) {
1883 if (insertdict(mp, key, hash, value)) {
1884 Py_DECREF(d);
1885 return NULL;
1886 }
1887 }
1888 return d;
1889 }
1890 }
1891
1892 it = PyObject_GetIter(iterable);
1893 if (it == NULL){
1894 Py_DECREF(d);
1895 return NULL;
1896 }
1897
1898 if (PyDict_CheckExact(d)) {
1899 while ((key = PyIter_Next(it)) != NULL) {
1900 status = PyDict_SetItem(d, key, value);
1901 Py_DECREF(key);
1902 if (status < 0)
1903 goto Fail;
1904 }
1905 } else {
1906 while ((key = PyIter_Next(it)) != NULL) {
1907 status = PyObject_SetItem(d, key, value);
1908 Py_DECREF(key);
1909 if (status < 0)
1910 goto Fail;
1911 }
1912 }
1913
1914 if (PyErr_Occurred())
1915 goto Fail;
1916 Py_DECREF(it);
1917 return d;
1918
1919Fail:
1920 Py_DECREF(it);
1921 Py_DECREF(d);
1922 return NULL;
1923}
1924
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001925/* Methods */
1926
1927static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001928dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001929{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001930 PyObject **values = mp->ma_values;
1931 PyDictKeysObject *keys = mp->ma_keys;
1932 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 PyObject_GC_UnTrack(mp);
1934 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001935 if (values != NULL) {
1936 if (values != empty_values) {
Victor Stinner742da042016-09-07 17:40:12 -07001937 for (i = 0, n = mp->ma_keys->dk_nentries; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001938 Py_XDECREF(values[i]);
1939 }
1940 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001942 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02001944 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001945 assert(keys->dk_refcnt == 1);
1946 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001947 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1949 free_list[numfree++] = mp;
1950 else
1951 Py_TYPE(mp)->tp_free((PyObject *)mp);
1952 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001953}
1954
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001955
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001956static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001957dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001960 PyObject *key = NULL, *value = NULL;
1961 _PyUnicodeWriter writer;
1962 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00001963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 i = Py_ReprEnter((PyObject *)mp);
1965 if (i != 0) {
1966 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1967 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001970 Py_ReprLeave((PyObject *)mp);
1971 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 }
Tim Petersa7259592001-06-16 05:11:17 +00001973
Victor Stinnerf91929b2013-11-19 13:07:38 +01001974 _PyUnicodeWriter_Init(&writer);
1975 writer.overallocate = 1;
1976 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
1977 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00001978
Victor Stinnerf91929b2013-11-19 13:07:38 +01001979 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
1980 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 /* Do repr() on each key+value pair, and insert ": " between them.
1983 Note that repr may mutate the dict. */
1984 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001985 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001987 PyObject *s;
1988 int res;
1989
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001990 /* Prevent repr from deleting key or value during key format. */
1991 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02001993
Victor Stinnerf91929b2013-11-19 13:07:38 +01001994 if (!first) {
1995 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
1996 goto error;
1997 }
1998 first = 0;
1999
2000 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01002002 goto error;
2003 res = _PyUnicodeWriter_WriteStr(&writer, s);
2004 Py_DECREF(s);
2005 if (res < 0)
2006 goto error;
2007
2008 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
2009 goto error;
2010
2011 s = PyObject_Repr(value);
2012 if (s == NULL)
2013 goto error;
2014 res = _PyUnicodeWriter_WriteStr(&writer, s);
2015 Py_DECREF(s);
2016 if (res < 0)
2017 goto error;
2018
2019 Py_CLEAR(key);
2020 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 }
Tim Petersa7259592001-06-16 05:11:17 +00002022
Victor Stinnerf91929b2013-11-19 13:07:38 +01002023 writer.overallocate = 0;
2024 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
2025 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00002026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01002028
2029 return _PyUnicodeWriter_Finish(&writer);
2030
2031error:
2032 Py_ReprLeave((PyObject *)mp);
2033 _PyUnicodeWriter_Dealloc(&writer);
2034 Py_XDECREF(key);
2035 Py_XDECREF(value);
2036 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002037}
2038
Martin v. Löwis18e16552006-02-15 17:27:45 +00002039static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002040dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002043}
2044
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002045static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002046dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 PyObject *v;
Victor Stinner742da042016-09-07 17:40:12 -07002049 Py_ssize_t ix;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002050 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002051 PyObject **value_addr;
2052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002054 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 hash = PyObject_Hash(key);
2056 if (hash == -1)
2057 return NULL;
2058 }
Victor Stinner742da042016-09-07 17:40:12 -07002059 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2060 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002062 if (ix == DKIX_EMPTY || *value_addr == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 if (!PyDict_CheckExact(mp)) {
2064 /* Look up __missing__ method if we're a subclass. */
2065 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05002066 _Py_IDENTIFIER(__missing__);
2067 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 if (missing != NULL) {
2069 res = PyObject_CallFunctionObjArgs(missing,
2070 key, NULL);
2071 Py_DECREF(missing);
2072 return res;
2073 }
2074 else if (PyErr_Occurred())
2075 return NULL;
2076 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07002077 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 return NULL;
2079 }
Victor Stinner742da042016-09-07 17:40:12 -07002080 v = *value_addr;
2081 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002083}
2084
2085static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002086dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 if (w == NULL)
2089 return PyDict_DelItem((PyObject *)mp, v);
2090 else
2091 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002092}
2093
Guido van Rossuma9e7a811997-05-13 21:02:11 +00002094static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 (lenfunc)dict_length, /*mp_length*/
2096 (binaryfunc)dict_subscript, /*mp_subscript*/
2097 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002098};
2099
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002100static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002101dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002102{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002103 PyObject *v;
2104 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002105 PyDictKeyEntry *ep;
2106 Py_ssize_t size, n, offset;
2107 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002108
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002109 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 n = mp->ma_used;
2111 v = PyList_New(n);
2112 if (v == NULL)
2113 return NULL;
2114 if (n != mp->ma_used) {
2115 /* Durnit. The allocations caused the dict to resize.
2116 * Just start over, this shouldn't normally happen.
2117 */
2118 Py_DECREF(v);
2119 goto again;
2120 }
Victor Stinner742da042016-09-07 17:40:12 -07002121 ep = DK_ENTRIES(mp->ma_keys);
2122 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002123 if (mp->ma_values) {
2124 value_ptr = mp->ma_values;
2125 offset = sizeof(PyObject *);
2126 }
2127 else {
2128 value_ptr = &ep[0].me_value;
2129 offset = sizeof(PyDictKeyEntry);
2130 }
2131 for (i = 0, j = 0; i < size; i++) {
2132 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 PyObject *key = ep[i].me_key;
2134 Py_INCREF(key);
2135 PyList_SET_ITEM(v, j, key);
2136 j++;
2137 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002138 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 }
2140 assert(j == n);
2141 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002142}
2143
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002144static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002145dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002146{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002147 PyObject *v;
2148 Py_ssize_t i, j;
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002149 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002150 Py_ssize_t size, n, offset;
2151 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002152
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002153 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 n = mp->ma_used;
2155 v = PyList_New(n);
2156 if (v == NULL)
2157 return NULL;
2158 if (n != mp->ma_used) {
2159 /* Durnit. The allocations caused the dict to resize.
2160 * Just start over, this shouldn't normally happen.
2161 */
2162 Py_DECREF(v);
2163 goto again;
2164 }
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002165 ep = DK_ENTRIES(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002166 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002167 if (mp->ma_values) {
2168 value_ptr = mp->ma_values;
2169 offset = sizeof(PyObject *);
2170 }
2171 else {
Benjamin Petersonf0acae22016-09-08 09:50:08 -07002172 value_ptr = &ep[0].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002173 offset = sizeof(PyDictKeyEntry);
2174 }
2175 for (i = 0, j = 0; i < size; i++) {
2176 PyObject *value = *value_ptr;
2177 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2178 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 Py_INCREF(value);
2180 PyList_SET_ITEM(v, j, value);
2181 j++;
2182 }
2183 }
2184 assert(j == n);
2185 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002186}
2187
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002188static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002189dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002190{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002191 PyObject *v;
2192 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002193 Py_ssize_t size, offset;
2194 PyObject *item, *key;
2195 PyDictKeyEntry *ep;
2196 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 /* Preallocate the list of tuples, to avoid allocations during
2199 * the loop over the items, which could trigger GC, which
2200 * could resize the dict. :-(
2201 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002202 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002203 n = mp->ma_used;
2204 v = PyList_New(n);
2205 if (v == NULL)
2206 return NULL;
2207 for (i = 0; i < n; i++) {
2208 item = PyTuple_New(2);
2209 if (item == NULL) {
2210 Py_DECREF(v);
2211 return NULL;
2212 }
2213 PyList_SET_ITEM(v, i, item);
2214 }
2215 if (n != mp->ma_used) {
2216 /* Durnit. The allocations caused the dict to resize.
2217 * Just start over, this shouldn't normally happen.
2218 */
2219 Py_DECREF(v);
2220 goto again;
2221 }
2222 /* Nothing we do below makes any function calls. */
Victor Stinner742da042016-09-07 17:40:12 -07002223 ep = DK_ENTRIES(mp->ma_keys);
2224 size = mp->ma_keys->dk_nentries;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002225 if (mp->ma_values) {
2226 value_ptr = mp->ma_values;
2227 offset = sizeof(PyObject *);
2228 }
2229 else {
2230 value_ptr = &ep[0].me_value;
2231 offset = sizeof(PyDictKeyEntry);
2232 }
2233 for (i = 0, j = 0; i < size; i++) {
2234 PyObject *value = *value_ptr;
2235 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
2236 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 key = ep[i].me_key;
2238 item = PyList_GET_ITEM(v, j);
2239 Py_INCREF(key);
2240 PyTuple_SET_ITEM(item, 0, key);
2241 Py_INCREF(value);
2242 PyTuple_SET_ITEM(item, 1, value);
2243 j++;
2244 }
2245 }
2246 assert(j == n);
2247 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00002248}
2249
Larry Hastings5c661892014-01-24 06:17:25 -08002250/*[clinic input]
2251@classmethod
2252dict.fromkeys
Larry Hastings5c661892014-01-24 06:17:25 -08002253 iterable: object
2254 value: object=None
2255 /
2256
2257Returns a new dict with keys from iterable and values equal to value.
2258[clinic start generated code]*/
2259
Larry Hastings5c661892014-01-24 06:17:25 -08002260static PyObject *
2261dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002262/*[clinic end generated code: output=8fb98e4b10384999 input=b85a667f9bf4669d]*/
Larry Hastings5c661892014-01-24 06:17:25 -08002263{
Eric Snow96c6af92015-05-29 22:21:39 -06002264 return _PyDict_FromKeys((PyObject *)type, iterable, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002265}
2266
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002267static int
Victor Stinner742da042016-09-07 17:40:12 -07002268dict_update_common(PyObject *self, PyObject *args, PyObject *kwds,
2269 const char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 PyObject *arg = NULL;
2272 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
2275 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002278 _Py_IDENTIFIER(keys);
2279 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 result = PyDict_Merge(self, arg, 1);
2281 else
2282 result = PyDict_MergeFromSeq2(self, arg, 1);
2283 }
2284 if (result == 0 && kwds != NULL) {
2285 if (PyArg_ValidateKeywordArguments(kwds))
2286 result = PyDict_Merge(self, kwds, 1);
2287 else
2288 result = -1;
2289 }
2290 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002291}
2292
2293static PyObject *
2294dict_update(PyObject *self, PyObject *args, PyObject *kwds)
2295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 if (dict_update_common(self, args, kwds, "update") != -1)
2297 Py_RETURN_NONE;
2298 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002299}
2300
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002301/* Update unconditionally replaces existing items.
2302 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00002303 otherwise it leaves existing items unchanged.
2304
2305 PyDict_{Update,Merge} update/merge from a mapping object.
2306
Tim Petersf582b822001-12-11 18:51:08 +00002307 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00002308 producing iterable objects of length 2.
2309*/
2310
Tim Petersf582b822001-12-11 18:51:08 +00002311int
Tim Peters1fc240e2001-10-26 05:06:50 +00002312PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
2313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 PyObject *it; /* iter(seq2) */
2315 Py_ssize_t i; /* index into seq2 of current element */
2316 PyObject *item; /* seq2[i] */
2317 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00002318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 assert(d != NULL);
2320 assert(PyDict_Check(d));
2321 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00002322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 it = PyObject_GetIter(seq2);
2324 if (it == NULL)
2325 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 for (i = 0; ; ++i) {
2328 PyObject *key, *value;
2329 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00002330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 fast = NULL;
2332 item = PyIter_Next(it);
2333 if (item == NULL) {
2334 if (PyErr_Occurred())
2335 goto Fail;
2336 break;
2337 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 /* Convert item to sequence, and verify length 2. */
2340 fast = PySequence_Fast(item, "");
2341 if (fast == NULL) {
2342 if (PyErr_ExceptionMatches(PyExc_TypeError))
2343 PyErr_Format(PyExc_TypeError,
2344 "cannot convert dictionary update "
2345 "sequence element #%zd to a sequence",
2346 i);
2347 goto Fail;
2348 }
2349 n = PySequence_Fast_GET_SIZE(fast);
2350 if (n != 2) {
2351 PyErr_Format(PyExc_ValueError,
2352 "dictionary update sequence element #%zd "
2353 "has length %zd; 2 is required",
2354 i, n);
2355 goto Fail;
2356 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 /* Update/merge with this (key, value) pair. */
2359 key = PySequence_Fast_GET_ITEM(fast, 0);
2360 value = PySequence_Fast_GET_ITEM(fast, 1);
2361 if (override || PyDict_GetItem(d, key) == NULL) {
2362 int status = PyDict_SetItem(d, key, value);
2363 if (status < 0)
2364 goto Fail;
2365 }
2366 Py_DECREF(fast);
2367 Py_DECREF(item);
2368 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 i = 0;
Victor Stinner611b0fa2016-09-14 15:02:01 +02002371 assert(_PyDict_CheckConsistency((PyDictObject *)d));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00002373Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 Py_XDECREF(item);
2375 Py_XDECREF(fast);
2376 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002377Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 Py_DECREF(it);
2379 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00002380}
2381
Tim Peters6d6c1a32001-08-02 04:15:00 +00002382int
2383PyDict_Update(PyObject *a, PyObject *b)
2384{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002386}
2387
2388int
2389PyDict_Merge(PyObject *a, PyObject *b, int override)
2390{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002391 PyDictObject *mp, *other;
2392 Py_ssize_t i, n;
Victor Stinner742da042016-09-07 17:40:12 -07002393 PyDictKeyEntry *entry, *ep0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 /* We accept for the argument either a concrete dictionary object,
2396 * or an abstract "mapping" object. For the former, we can do
2397 * things quite efficiently. For the latter, we only require that
2398 * PyMapping_Keys() and PyObject_GetItem() be supported.
2399 */
2400 if (a == NULL || !PyDict_Check(a) || b == NULL) {
2401 PyErr_BadInternalCall();
2402 return -1;
2403 }
2404 mp = (PyDictObject*)a;
2405 if (PyDict_Check(b)) {
2406 other = (PyDictObject*)b;
2407 if (other == mp || other->ma_used == 0)
2408 /* a.update(a) or a.update({}); nothing to do */
2409 return 0;
2410 if (mp->ma_used == 0)
2411 /* Since the target dict is empty, PyDict_GetItem()
2412 * always returns NULL. Setting override to 1
2413 * skips the unnecessary test.
2414 */
2415 override = 1;
2416 /* Do one big resize at the start, rather than
2417 * incrementally resizing as we insert new items. Expect
2418 * that there will be no (or few) overlapping keys.
2419 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002420 if (mp->ma_keys->dk_usable * 3 < other->ma_used * 2)
2421 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 return -1;
Victor Stinner742da042016-09-07 17:40:12 -07002423 ep0 = DK_ENTRIES(other->ma_keys);
2424 for (i = 0, n = other->ma_keys->dk_nentries; i < n; i++) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002425 PyObject *key, *value;
2426 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002427 entry = &ep0[i];
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002428 key = entry->me_key;
2429 hash = entry->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002430 if (other->ma_values)
2431 value = other->ma_values[i];
2432 else
2433 value = entry->me_value;
2434
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002435 if (value != NULL) {
2436 int err = 0;
2437 Py_INCREF(key);
2438 Py_INCREF(value);
2439 if (override || PyDict_GetItem(a, key) == NULL)
2440 err = insertdict(mp, key, hash, value);
2441 Py_DECREF(value);
2442 Py_DECREF(key);
2443 if (err != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 return -1;
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002445
Victor Stinner742da042016-09-07 17:40:12 -07002446 if (n != other->ma_keys->dk_nentries) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002447 PyErr_SetString(PyExc_RuntimeError,
2448 "dict mutated during update");
2449 return -1;
2450 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 }
2452 }
2453 }
2454 else {
2455 /* Do it the generic, slower way */
2456 PyObject *keys = PyMapping_Keys(b);
2457 PyObject *iter;
2458 PyObject *key, *value;
2459 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 if (keys == NULL)
2462 /* Docstring says this is equivalent to E.keys() so
2463 * if E doesn't have a .keys() method we want
2464 * AttributeError to percolate up. Might as well
2465 * do the same for any other error.
2466 */
2467 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 iter = PyObject_GetIter(keys);
2470 Py_DECREF(keys);
2471 if (iter == NULL)
2472 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
2475 if (!override && PyDict_GetItem(a, key) != NULL) {
2476 Py_DECREF(key);
2477 continue;
2478 }
2479 value = PyObject_GetItem(b, key);
2480 if (value == NULL) {
2481 Py_DECREF(iter);
2482 Py_DECREF(key);
2483 return -1;
2484 }
2485 status = PyDict_SetItem(a, key, value);
2486 Py_DECREF(key);
2487 Py_DECREF(value);
2488 if (status < 0) {
2489 Py_DECREF(iter);
2490 return -1;
2491 }
2492 }
2493 Py_DECREF(iter);
2494 if (PyErr_Occurred())
2495 /* Iterator completed, via error */
2496 return -1;
2497 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02002498 assert(_PyDict_CheckConsistency((PyDictObject *)a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002500}
2501
2502static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002503dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002506}
2507
2508PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002509PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002512 PyDictObject *mp;
2513 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 if (o == NULL || !PyDict_Check(o)) {
2516 PyErr_BadInternalCall();
2517 return NULL;
2518 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002519 mp = (PyDictObject *)o;
2520 if (_PyDict_HasSplitTable(mp)) {
2521 PyDictObject *split_copy;
Victor Stinner742da042016-09-07 17:40:12 -07002522 Py_ssize_t size = USABLE_FRACTION(DK_SIZE(mp->ma_keys));
2523 PyObject **newvalues;
2524 newvalues = new_values(size);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002525 if (newvalues == NULL)
2526 return PyErr_NoMemory();
2527 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2528 if (split_copy == NULL) {
2529 free_values(newvalues);
2530 return NULL;
2531 }
2532 split_copy->ma_values = newvalues;
2533 split_copy->ma_keys = mp->ma_keys;
2534 split_copy->ma_used = mp->ma_used;
2535 DK_INCREF(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002536 for (i = 0, n = size; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002537 PyObject *value = mp->ma_values[i];
2538 Py_XINCREF(value);
2539 split_copy->ma_values[i] = value;
2540 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002541 if (_PyObject_GC_IS_TRACKED(mp))
2542 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002543 return (PyObject *)split_copy;
2544 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 copy = PyDict_New();
2546 if (copy == NULL)
2547 return NULL;
2548 if (PyDict_Merge(copy, o, 1) == 0)
2549 return copy;
2550 Py_DECREF(copy);
2551 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002552}
2553
Martin v. Löwis18e16552006-02-15 17:27:45 +00002554Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002555PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002556{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 if (mp == NULL || !PyDict_Check(mp)) {
2558 PyErr_BadInternalCall();
2559 return -1;
2560 }
2561 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002562}
2563
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002564PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002565PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002566{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 if (mp == NULL || !PyDict_Check(mp)) {
2568 PyErr_BadInternalCall();
2569 return NULL;
2570 }
2571 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002572}
2573
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002574PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002575PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002576{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002577 if (mp == NULL || !PyDict_Check(mp)) {
2578 PyErr_BadInternalCall();
2579 return NULL;
2580 }
2581 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002582}
2583
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002584PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002585PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 if (mp == NULL || !PyDict_Check(mp)) {
2588 PyErr_BadInternalCall();
2589 return NULL;
2590 }
2591 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002592}
2593
Tim Peterse63415e2001-05-08 04:38:29 +00002594/* Return 1 if dicts equal, 0 if not, -1 if error.
2595 * Gets out as soon as any difference is detected.
2596 * Uses only Py_EQ comparison.
2597 */
2598static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002599dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002600{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002601 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 if (a->ma_used != b->ma_used)
2604 /* can't be equal if # of entries differ */
2605 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Victor Stinner742da042016-09-07 17:40:12 -07002607 for (i = 0; i < a->ma_keys->dk_nentries; i++) {
2608 PyDictKeyEntry *ep = &DK_ENTRIES(a->ma_keys)[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002609 PyObject *aval;
2610 if (a->ma_values)
2611 aval = a->ma_values[i];
2612 else
2613 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 if (aval != NULL) {
2615 int cmp;
2616 PyObject *bval;
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002617 PyObject **vaddr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002618 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 /* temporarily bump aval's refcount to ensure it stays
2620 alive until we're done with it */
2621 Py_INCREF(aval);
2622 /* ditto for key */
2623 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002624 /* reuse the known hash value */
Victor Stinner742da042016-09-07 17:40:12 -07002625 if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr, NULL) < 0)
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002626 bval = NULL;
2627 else
2628 bval = *vaddr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 Py_DECREF(key);
2630 if (bval == NULL) {
2631 Py_DECREF(aval);
2632 if (PyErr_Occurred())
2633 return -1;
2634 return 0;
2635 }
2636 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2637 Py_DECREF(aval);
2638 if (cmp <= 0) /* error or not equal */
2639 return cmp;
2640 }
2641 }
2642 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002643}
Tim Peterse63415e2001-05-08 04:38:29 +00002644
2645static PyObject *
2646dict_richcompare(PyObject *v, PyObject *w, int op)
2647{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 int cmp;
2649 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2652 res = Py_NotImplemented;
2653 }
2654 else if (op == Py_EQ || op == Py_NE) {
2655 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2656 if (cmp < 0)
2657 return NULL;
2658 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2659 }
2660 else
2661 res = Py_NotImplemented;
2662 Py_INCREF(res);
2663 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002664}
Tim Peterse63415e2001-05-08 04:38:29 +00002665
Larry Hastings61272b72014-01-07 12:41:53 -08002666/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07002667
2668@coexist
2669dict.__contains__
2670
2671 key: object
2672 /
2673
Meador Ingee02de8c2014-01-14 16:48:31 -06002674True if D has a key k, else False.
Larry Hastings61272b72014-01-07 12:41:53 -08002675[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07002676
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002677static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08002678dict___contains__(PyDictObject *self, PyObject *key)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002679/*[clinic end generated code: output=a3d03db709ed6e6b input=b852b2a19b51ab24]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002680{
Larry Hastingsc2047262014-01-25 20:43:29 -08002681 register PyDictObject *mp = self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002682 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002683 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002684 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002687 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 hash = PyObject_Hash(key);
2689 if (hash == -1)
2690 return NULL;
2691 }
Victor Stinner742da042016-09-07 17:40:12 -07002692 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2693 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002695 if (ix == DKIX_EMPTY || *value_addr == NULL)
2696 Py_RETURN_FALSE;
2697 Py_RETURN_TRUE;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002698}
2699
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002700static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002701dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 PyObject *key;
2704 PyObject *failobj = Py_None;
2705 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002706 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002707 Py_ssize_t ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002708 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2711 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002714 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 hash = PyObject_Hash(key);
2716 if (hash == -1)
2717 return NULL;
2718 }
Victor Stinner742da042016-09-07 17:40:12 -07002719 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
2720 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002722 if (ix == DKIX_EMPTY || *value_addr == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 val = failobj;
Victor Stinner742da042016-09-07 17:40:12 -07002724 else
2725 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 Py_INCREF(val);
2727 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002728}
2729
Benjamin Peterson00e98862013-03-07 22:16:29 -05002730PyObject *
2731PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002732{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002733 PyDictObject *mp = (PyDictObject *)d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002735 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07002736 Py_ssize_t hashpos, ix;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002737 PyDictKeyEntry *ep;
2738 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002739
Benjamin Peterson00e98862013-03-07 22:16:29 -05002740 if (!PyDict_Check(d)) {
2741 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002743 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002745 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 hash = PyObject_Hash(key);
2747 if (hash == -1)
2748 return NULL;
2749 }
Victor Stinner742da042016-09-07 17:40:12 -07002750 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
2751 if (ix == DKIX_ERROR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 return NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002753 if (ix == DKIX_EMPTY || *value_addr == NULL) {
2754 val = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002755 if (mp->ma_keys->dk_usable <= 0) {
2756 /* Need to resize. */
Victor Stinner3c336c52016-09-12 14:17:40 +02002757 if (insertion_resize(mp) < 0) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002758 return NULL;
Victor Stinner3c336c52016-09-12 14:17:40 +02002759 }
Victor Stinner742da042016-09-07 17:40:12 -07002760 find_empty_slot(mp, key, hash, &value_addr, &hashpos);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002761 }
Victor Stinner742da042016-09-07 17:40:12 -07002762 ix = mp->ma_keys->dk_nentries;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002763 Py_INCREF(defaultobj);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002764 Py_INCREF(key);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002765 MAINTAIN_TRACKING(mp, key, defaultobj);
Victor Stinner742da042016-09-07 17:40:12 -07002766 dk_set_index(mp->ma_keys, hashpos, ix);
2767 ep = &DK_ENTRIES(mp->ma_keys)[ix];
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002768 ep->me_key = key;
2769 ep->me_hash = hash;
Victor Stinner742da042016-09-07 17:40:12 -07002770 if (mp->ma_values) {
2771 mp->ma_values[ix] = val;
2772 }
2773 else {
2774 ep->me_value = val;
2775 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002776 mp->ma_keys->dk_usable--;
Victor Stinner742da042016-09-07 17:40:12 -07002777 mp->ma_keys->dk_nentries++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002778 mp->ma_used++;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002779 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02002780 assert(_PyDict_CheckConsistency(mp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02002782 else {
Victor Stinner742da042016-09-07 17:40:12 -07002783 val = *value_addr;
Victor Stinner611b0fa2016-09-14 15:02:01 +02002784 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00002786}
2787
Benjamin Peterson00e98862013-03-07 22:16:29 -05002788static PyObject *
2789dict_setdefault(PyDictObject *mp, PyObject *args)
2790{
2791 PyObject *key, *val;
2792 PyObject *defaultobj = Py_None;
2793
2794 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2795 return NULL;
2796
Benjamin Peterson55898502013-03-08 08:36:49 -05002797 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002798 Py_XINCREF(val);
2799 return val;
2800}
Guido van Rossum164452c2000-08-08 16:12:54 +00002801
2802static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002803dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002804{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 PyDict_Clear((PyObject *)mp);
2806 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002807}
2808
Guido van Rossumba6ab842000-12-12 22:02:18 +00002809static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002810dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002811{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00002813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2815 return NULL;
Eric Snow96c6af92015-05-29 22:21:39 -06002816
2817 return _PyDict_Pop(mp, key, deflt);
Guido van Rossume027d982002-04-12 15:11:59 +00002818}
2819
2820static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002821dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002822{
Victor Stinner742da042016-09-07 17:40:12 -07002823 Py_ssize_t i, j;
2824 PyDictKeyEntry *ep0, *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 /* Allocate the result tuple before checking the size. Believe it
2828 * or not, this allocation could trigger a garbage collection which
2829 * could empty the dict, so if we checked the size first and that
2830 * happened, the result would be an infinite loop (searching for an
2831 * entry that no longer exists). Note that the usual popitem()
2832 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2833 * tuple away if the dict *is* empty isn't a significant
2834 * inefficiency -- possible, but unlikely in practice.
2835 */
2836 res = PyTuple_New(2);
2837 if (res == NULL)
2838 return NULL;
2839 if (mp->ma_used == 0) {
2840 Py_DECREF(res);
2841 PyErr_SetString(PyExc_KeyError,
2842 "popitem(): dictionary is empty");
2843 return NULL;
2844 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002845 /* Convert split table to combined table */
2846 if (mp->ma_keys->dk_lookup == lookdict_split) {
2847 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2848 Py_DECREF(res);
2849 return NULL;
2850 }
2851 }
2852 ENSURE_ALLOWS_DELETIONS(mp);
Victor Stinner742da042016-09-07 17:40:12 -07002853
2854 /* Pop last item */
2855 ep0 = DK_ENTRIES(mp->ma_keys);
2856 i = mp->ma_keys->dk_nentries - 1;
2857 while (i >= 0 && ep0[i].me_value == NULL) {
2858 i--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 }
Victor Stinner742da042016-09-07 17:40:12 -07002860 assert(i >= 0);
2861
2862 ep = &ep0[i];
2863 j = lookdict_index(mp->ma_keys, ep->me_hash, i);
2864 assert(j >= 0);
2865 assert(dk_get_index(mp->ma_keys, j) == i);
2866 dk_set_index(mp->ma_keys, j, DKIX_DUMMY);
2867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 PyTuple_SET_ITEM(res, 0, ep->me_key);
2869 PyTuple_SET_ITEM(res, 1, ep->me_value);
Victor Stinner742da042016-09-07 17:40:12 -07002870 ep->me_key = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002871 ep->me_value = NULL;
Victor Stinner742da042016-09-07 17:40:12 -07002872 /* We can't dk_usable++ since there is DKIX_DUMMY in indices */
2873 mp->ma_keys->dk_nentries = i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 mp->ma_used--;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07002875 mp->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner611b0fa2016-09-14 15:02:01 +02002876 assert(_PyDict_CheckConsistency(mp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002878}
2879
Jeremy Hylton8caad492000-06-23 14:18:11 +00002880static int
2881dict_traverse(PyObject *op, visitproc visit, void *arg)
2882{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002883 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson55f44522016-09-05 12:12:59 -07002884 PyDictKeysObject *keys = mp->ma_keys;
Serhiy Storchaka46825d22016-09-26 21:29:34 +03002885 PyDictKeyEntry *entries = DK_ENTRIES(keys);
Victor Stinner742da042016-09-07 17:40:12 -07002886 Py_ssize_t i, n = keys->dk_nentries;
2887
Benjamin Peterson55f44522016-09-05 12:12:59 -07002888 if (keys->dk_lookup == lookdict) {
2889 for (i = 0; i < n; i++) {
2890 if (entries[i].me_value != NULL) {
2891 Py_VISIT(entries[i].me_value);
2892 Py_VISIT(entries[i].me_key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002893 }
2894 }
Victor Stinner742da042016-09-07 17:40:12 -07002895 }
2896 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002897 if (mp->ma_values != NULL) {
Benjamin Peterson55f44522016-09-05 12:12:59 -07002898 for (i = 0; i < n; i++) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002899 Py_VISIT(mp->ma_values[i]);
2900 }
2901 }
2902 else {
Benjamin Peterson55f44522016-09-05 12:12:59 -07002903 for (i = 0; i < n; i++) {
2904 Py_VISIT(entries[i].me_value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002905 }
2906 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 }
2908 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002909}
2910
2911static int
2912dict_tp_clear(PyObject *op)
2913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 PyDict_Clear(op);
2915 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002916}
2917
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002918static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002919
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002920Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06002921_PyDict_SizeOf(PyDictObject *mp)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002922{
Victor Stinner742da042016-09-07 17:40:12 -07002923 Py_ssize_t size, usable, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002924
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002925 size = DK_SIZE(mp->ma_keys);
Victor Stinner742da042016-09-07 17:40:12 -07002926 usable = USABLE_FRACTION(size);
2927
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002928 res = _PyObject_SIZE(Py_TYPE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002929 if (mp->ma_values)
Victor Stinner742da042016-09-07 17:40:12 -07002930 res += usable * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002931 /* If the dictionary is split, the keys portion is accounted-for
2932 in the type object. */
2933 if (mp->ma_keys->dk_refcnt == 1)
Victor Stinner98ee9d52016-09-08 09:33:56 -07002934 res += (sizeof(PyDictKeysObject)
2935 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
2936 + DK_IXSIZE(mp->ma_keys) * size
2937 + sizeof(PyDictKeyEntry) * usable);
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002938 return res;
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002939}
2940
2941Py_ssize_t
2942_PyDict_KeysSize(PyDictKeysObject *keys)
2943{
Victor Stinner98ee9d52016-09-08 09:33:56 -07002944 return (sizeof(PyDictKeysObject)
2945 - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices)
2946 + DK_IXSIZE(keys) * DK_SIZE(keys)
2947 + USABLE_FRACTION(DK_SIZE(keys)) * sizeof(PyDictKeyEntry));
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002948}
2949
doko@ubuntu.com17210f52016-01-14 14:04:59 +01002950static PyObject *
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002951dict_sizeof(PyDictObject *mp)
2952{
2953 return PyLong_FromSsize_t(_PyDict_SizeOf(mp));
2954}
2955
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002956PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2957
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002958PyDoc_STRVAR(sizeof__doc__,
2959"D.__sizeof__() -> size of D in memory, in bytes");
2960
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002961PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002962"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002964PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002965"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 +00002966
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002967PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002968"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002969If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002971PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002972"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000029732-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002974
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002975PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04002976"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
2977If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
2978If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
2979In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002980
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002981PyDoc_STRVAR(clear__doc__,
2982"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002983
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002984PyDoc_STRVAR(copy__doc__,
2985"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002986
Guido van Rossumb90c8482007-02-10 01:11:45 +00002987/* Forward */
2988static PyObject *dictkeys_new(PyObject *);
2989static PyObject *dictitems_new(PyObject *);
2990static PyObject *dictvalues_new(PyObject *);
2991
Guido van Rossum45c85d12007-07-27 16:31:40 +00002992PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002994PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002996PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002998
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002999static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07003000 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003001 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
3002 getitem__doc__},
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02003003 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003004 sizeof__doc__},
3005 {"get", (PyCFunction)dict_get, METH_VARARGS,
3006 get__doc__},
3007 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
3008 setdefault_doc__},
3009 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
3010 pop__doc__},
3011 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
3012 popitem__doc__},
3013 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
3014 keys__doc__},
3015 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
3016 items__doc__},
3017 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
3018 values__doc__},
3019 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
3020 update__doc__},
Larry Hastings5c661892014-01-24 06:17:25 -08003021 DICT_FROMKEYS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003022 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
3023 clear__doc__},
3024 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
3025 copy__doc__},
3026 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003027};
3028
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003029/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00003030int
3031PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003032{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00003033 Py_hash_t hash;
Victor Stinner742da042016-09-07 17:40:12 -07003034 Py_ssize_t ix;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003036 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003039 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003040 hash = PyObject_Hash(key);
3041 if (hash == -1)
3042 return -1;
3043 }
Victor Stinner742da042016-09-07 17:40:12 -07003044 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
3045 if (ix == DKIX_ERROR)
3046 return -1;
3047 return (ix != DKIX_EMPTY && *value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003048}
3049
Thomas Wouterscf297e42007-02-23 15:07:44 +00003050/* Internal version of PyDict_Contains used when the hash value is already known */
3051int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00003052_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00003053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003055 PyObject **value_addr;
Victor Stinner742da042016-09-07 17:40:12 -07003056 Py_ssize_t ix;
Thomas Wouterscf297e42007-02-23 15:07:44 +00003057
Victor Stinner742da042016-09-07 17:40:12 -07003058 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, NULL);
3059 if (ix == DKIX_ERROR)
3060 return -1;
3061 return (ix != DKIX_EMPTY && *value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00003062}
3063
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003064/* Hack to implement "key in dict" */
3065static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 0, /* sq_length */
3067 0, /* sq_concat */
3068 0, /* sq_repeat */
3069 0, /* sq_item */
3070 0, /* sq_slice */
3071 0, /* sq_ass_item */
3072 0, /* sq_ass_slice */
3073 PyDict_Contains, /* sq_contains */
3074 0, /* sq_inplace_concat */
3075 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00003076};
3077
Guido van Rossum09e563a2001-05-01 12:10:21 +00003078static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003079dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003082 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 assert(type != NULL && type->tp_alloc != NULL);
3085 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02003086 if (self == NULL)
3087 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02003088 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003089
Victor Stinnera9f61a52013-07-16 22:17:26 +02003090 /* The object has been implicitly tracked by tp_alloc */
3091 if (type == &PyDict_Type)
3092 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003093
3094 d->ma_used = 0;
Victor Stinner3b6a6b42016-09-08 12:51:24 -07003095 d->ma_version_tag = DICT_NEXT_VERSION();
Victor Stinner742da042016-09-07 17:40:12 -07003096 d->ma_keys = new_keys_object(PyDict_MINSIZE);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02003097 if (d->ma_keys == NULL) {
3098 Py_DECREF(self);
3099 return NULL;
3100 }
Victor Stinner611b0fa2016-09-14 15:02:01 +02003101 assert(_PyDict_CheckConsistency(d));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003102 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003103}
3104
Tim Peters25786c02001-09-02 08:22:48 +00003105static int
3106dict_init(PyObject *self, PyObject *args, PyObject *kwds)
3107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003108 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00003109}
3110
Tim Peters6d6c1a32001-08-02 04:15:00 +00003111static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003112dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00003113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00003115}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003116
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003117PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00003118"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00003119"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003120" (key, value) pairs\n"
3121"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00003122" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00003123" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00003124" d[k] = v\n"
3125"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
3126" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00003127
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003128PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003129 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3130 "dict",
3131 sizeof(PyDictObject),
3132 0,
3133 (destructor)dict_dealloc, /* tp_dealloc */
3134 0, /* tp_print */
3135 0, /* tp_getattr */
3136 0, /* tp_setattr */
3137 0, /* tp_reserved */
3138 (reprfunc)dict_repr, /* tp_repr */
3139 0, /* tp_as_number */
3140 &dict_as_sequence, /* tp_as_sequence */
3141 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00003142 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 0, /* tp_call */
3144 0, /* tp_str */
3145 PyObject_GenericGetAttr, /* tp_getattro */
3146 0, /* tp_setattro */
3147 0, /* tp_as_buffer */
3148 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3149 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
3150 dictionary_doc, /* tp_doc */
3151 dict_traverse, /* tp_traverse */
3152 dict_tp_clear, /* tp_clear */
3153 dict_richcompare, /* tp_richcompare */
3154 0, /* tp_weaklistoffset */
3155 (getiterfunc)dict_iter, /* tp_iter */
3156 0, /* tp_iternext */
3157 mapp_methods, /* tp_methods */
3158 0, /* tp_members */
3159 0, /* tp_getset */
3160 0, /* tp_base */
3161 0, /* tp_dict */
3162 0, /* tp_descr_get */
3163 0, /* tp_descr_set */
3164 0, /* tp_dictoffset */
3165 dict_init, /* tp_init */
3166 PyType_GenericAlloc, /* tp_alloc */
3167 dict_new, /* tp_new */
3168 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003169};
3170
Victor Stinner3c1e4812012-03-26 22:10:51 +02003171PyObject *
3172_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
3173{
3174 PyObject *kv;
3175 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02003176 if (kv == NULL) {
3177 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003178 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02003179 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02003180 return PyDict_GetItem(dp, kv);
3181}
3182
Guido van Rossum3cca2451997-05-16 14:23:33 +00003183/* For backward compatibility with old dictionary interface */
3184
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003185PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003186PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003187{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 PyObject *kv, *rv;
3189 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003190 if (kv == NULL) {
3191 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02003193 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 rv = PyDict_GetItem(v, kv);
3195 Py_DECREF(kv);
3196 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003197}
3198
3199int
Victor Stinner3c1e4812012-03-26 22:10:51 +02003200_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
3201{
3202 PyObject *kv;
3203 kv = _PyUnicode_FromId(key); /* borrowed */
3204 if (kv == NULL)
3205 return -1;
3206 return PyDict_SetItem(v, kv, item);
3207}
3208
3209int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003210PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 PyObject *kv;
3213 int err;
3214 kv = PyUnicode_FromString(key);
3215 if (kv == NULL)
3216 return -1;
3217 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
3218 err = PyDict_SetItem(v, kv, item);
3219 Py_DECREF(kv);
3220 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003221}
3222
3223int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01003224_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
3225{
3226 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
3227 if (kv == NULL)
3228 return -1;
3229 return PyDict_DelItem(v, kv);
3230}
3231
3232int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00003233PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 PyObject *kv;
3236 int err;
3237 kv = PyUnicode_FromString(key);
3238 if (kv == NULL)
3239 return -1;
3240 err = PyDict_DelItem(v, kv);
3241 Py_DECREF(kv);
3242 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00003243}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003244
Raymond Hettinger019a1482004-03-18 02:41:19 +00003245/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003246
3247typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003248 PyObject_HEAD
3249 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
3250 Py_ssize_t di_used;
3251 Py_ssize_t di_pos;
3252 PyObject* di_result; /* reusable result tuple for iteritems */
3253 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003254} dictiterobject;
3255
3256static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003257dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003259 dictiterobject *di;
3260 di = PyObject_GC_New(dictiterobject, itertype);
3261 if (di == NULL)
3262 return NULL;
3263 Py_INCREF(dict);
3264 di->di_dict = dict;
3265 di->di_used = dict->ma_used;
3266 di->di_pos = 0;
3267 di->len = dict->ma_used;
3268 if (itertype == &PyDictIterItem_Type) {
3269 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
3270 if (di->di_result == NULL) {
3271 Py_DECREF(di);
3272 return NULL;
3273 }
3274 }
3275 else
3276 di->di_result = NULL;
3277 _PyObject_GC_TRACK(di);
3278 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003279}
3280
3281static void
3282dictiter_dealloc(dictiterobject *di)
3283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003284 Py_XDECREF(di->di_dict);
3285 Py_XDECREF(di->di_result);
3286 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003287}
3288
3289static int
3290dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
3291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 Py_VISIT(di->di_dict);
3293 Py_VISIT(di->di_result);
3294 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003295}
3296
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003297static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003298dictiter_len(dictiterobject *di)
3299{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 Py_ssize_t len = 0;
3301 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
3302 len = di->len;
3303 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003304}
3305
Guido van Rossumb90c8482007-02-10 01:11:45 +00003306PyDoc_STRVAR(length_hint_doc,
3307 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003308
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003309static PyObject *
3310dictiter_reduce(dictiterobject *di);
3311
3312PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3313
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00003314static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
3316 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003317 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
3318 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00003320};
3321
Raymond Hettinger019a1482004-03-18 02:41:19 +00003322static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00003323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 PyObject *key;
Victor Stinner742da042016-09-07 17:40:12 -07003325 Py_ssize_t i, n, offset;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003326 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003328 PyObject **value_ptr;
Guido van Rossum213c7a62001-04-23 14:08:49 +00003329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 if (d == NULL)
3331 return NULL;
3332 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00003333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 if (di->di_used != d->ma_used) {
3335 PyErr_SetString(PyExc_RuntimeError,
3336 "dictionary changed size during iteration");
3337 di->di_used = -1; /* Make this state sticky */
3338 return NULL;
3339 }
Guido van Rossum2147df72002-07-16 20:30:22 +00003340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 i = di->di_pos;
3342 if (i < 0)
3343 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003344 k = d->ma_keys;
3345 if (d->ma_values) {
3346 value_ptr = &d->ma_values[i];
3347 offset = sizeof(PyObject *);
3348 }
3349 else {
Victor Stinner742da042016-09-07 17:40:12 -07003350 value_ptr = &DK_ENTRIES(k)[i].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003351 offset = sizeof(PyDictKeyEntry);
3352 }
Victor Stinner742da042016-09-07 17:40:12 -07003353 n = k->dk_nentries - 1;
3354 while (i <= n && *value_ptr == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003355 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003357 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 di->di_pos = i+1;
Victor Stinner742da042016-09-07 17:40:12 -07003359 if (i > n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 goto fail;
3361 di->len--;
Victor Stinner742da042016-09-07 17:40:12 -07003362 key = DK_ENTRIES(k)[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 Py_INCREF(key);
3364 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003365
3366fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003367 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003368 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003370}
3371
Raymond Hettinger019a1482004-03-18 02:41:19 +00003372PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3374 "dict_keyiterator", /* tp_name */
3375 sizeof(dictiterobject), /* tp_basicsize */
3376 0, /* tp_itemsize */
3377 /* methods */
3378 (destructor)dictiter_dealloc, /* tp_dealloc */
3379 0, /* tp_print */
3380 0, /* tp_getattr */
3381 0, /* tp_setattr */
3382 0, /* tp_reserved */
3383 0, /* tp_repr */
3384 0, /* tp_as_number */
3385 0, /* tp_as_sequence */
3386 0, /* tp_as_mapping */
3387 0, /* tp_hash */
3388 0, /* tp_call */
3389 0, /* tp_str */
3390 PyObject_GenericGetAttr, /* tp_getattro */
3391 0, /* tp_setattro */
3392 0, /* tp_as_buffer */
3393 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3394 0, /* tp_doc */
3395 (traverseproc)dictiter_traverse, /* tp_traverse */
3396 0, /* tp_clear */
3397 0, /* tp_richcompare */
3398 0, /* tp_weaklistoffset */
3399 PyObject_SelfIter, /* tp_iter */
3400 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
3401 dictiter_methods, /* tp_methods */
3402 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003403};
3404
3405static PyObject *dictiter_iternextvalue(dictiterobject *di)
3406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003407 PyObject *value;
Victor Stinner742da042016-09-07 17:40:12 -07003408 Py_ssize_t i, n, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003409 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003410 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003412 if (d == NULL)
3413 return NULL;
3414 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003416 if (di->di_used != d->ma_used) {
3417 PyErr_SetString(PyExc_RuntimeError,
3418 "dictionary changed size during iteration");
3419 di->di_used = -1; /* Make this state sticky */
3420 return NULL;
3421 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003423 i = di->di_pos;
Victor Stinner742da042016-09-07 17:40:12 -07003424 n = d->ma_keys->dk_nentries - 1;
3425 if (i < 0 || i > n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003427 if (d->ma_values) {
3428 value_ptr = &d->ma_values[i];
3429 offset = sizeof(PyObject *);
3430 }
3431 else {
Victor Stinner742da042016-09-07 17:40:12 -07003432 value_ptr = &DK_ENTRIES(d->ma_keys)[i].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003433 offset = sizeof(PyDictKeyEntry);
3434 }
Victor Stinner742da042016-09-07 17:40:12 -07003435 while (i <= n && *value_ptr == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003436 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 i++;
Victor Stinner742da042016-09-07 17:40:12 -07003438 if (i > n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 goto fail;
3440 }
3441 di->di_pos = i+1;
3442 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003443 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003444 Py_INCREF(value);
3445 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003446
3447fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003448 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003449 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003450 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003451}
3452
3453PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003454 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3455 "dict_valueiterator", /* tp_name */
3456 sizeof(dictiterobject), /* tp_basicsize */
3457 0, /* tp_itemsize */
3458 /* methods */
3459 (destructor)dictiter_dealloc, /* tp_dealloc */
3460 0, /* tp_print */
3461 0, /* tp_getattr */
3462 0, /* tp_setattr */
3463 0, /* tp_reserved */
3464 0, /* tp_repr */
3465 0, /* tp_as_number */
3466 0, /* tp_as_sequence */
3467 0, /* tp_as_mapping */
3468 0, /* tp_hash */
3469 0, /* tp_call */
3470 0, /* tp_str */
3471 PyObject_GenericGetAttr, /* tp_getattro */
3472 0, /* tp_setattro */
3473 0, /* tp_as_buffer */
3474 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3475 0, /* tp_doc */
3476 (traverseproc)dictiter_traverse, /* tp_traverse */
3477 0, /* tp_clear */
3478 0, /* tp_richcompare */
3479 0, /* tp_weaklistoffset */
3480 PyObject_SelfIter, /* tp_iter */
3481 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
3482 dictiter_methods, /* tp_methods */
3483 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003484};
3485
3486static PyObject *dictiter_iternextitem(dictiterobject *di)
3487{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 PyObject *key, *value, *result = di->di_result;
Victor Stinner742da042016-09-07 17:40:12 -07003489 Py_ssize_t i, n, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003490 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003491 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 if (d == NULL)
3494 return NULL;
3495 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003497 if (di->di_used != d->ma_used) {
3498 PyErr_SetString(PyExc_RuntimeError,
3499 "dictionary changed size during iteration");
3500 di->di_used = -1; /* Make this state sticky */
3501 return NULL;
3502 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 i = di->di_pos;
3505 if (i < 0)
3506 goto fail;
Victor Stinner742da042016-09-07 17:40:12 -07003507 n = d->ma_keys->dk_nentries - 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003508 if (d->ma_values) {
3509 value_ptr = &d->ma_values[i];
3510 offset = sizeof(PyObject *);
3511 }
3512 else {
Victor Stinner742da042016-09-07 17:40:12 -07003513 value_ptr = &DK_ENTRIES(d->ma_keys)[i].me_value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003514 offset = sizeof(PyDictKeyEntry);
3515 }
Victor Stinner742da042016-09-07 17:40:12 -07003516 while (i <= n && *value_ptr == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003517 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003518 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003519 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003520 di->di_pos = i+1;
Victor Stinner742da042016-09-07 17:40:12 -07003521 if (i > n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003524 if (result->ob_refcnt == 1) {
3525 Py_INCREF(result);
3526 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3527 Py_DECREF(PyTuple_GET_ITEM(result, 1));
3528 } else {
3529 result = PyTuple_New(2);
3530 if (result == NULL)
3531 return NULL;
3532 }
3533 di->len--;
Victor Stinner742da042016-09-07 17:40:12 -07003534 key = DK_ENTRIES(d->ma_keys)[i].me_key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003535 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 Py_INCREF(key);
3537 Py_INCREF(value);
Eric Snow96c6af92015-05-29 22:21:39 -06003538 PyTuple_SET_ITEM(result, 0, key); /* steals reference */
3539 PyTuple_SET_ITEM(result, 1, value); /* steals reference */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003540 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003541
3542fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003543 di->di_dict = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003544 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003545 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003546}
3547
3548PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003549 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3550 "dict_itemiterator", /* tp_name */
3551 sizeof(dictiterobject), /* tp_basicsize */
3552 0, /* tp_itemsize */
3553 /* methods */
3554 (destructor)dictiter_dealloc, /* tp_dealloc */
3555 0, /* tp_print */
3556 0, /* tp_getattr */
3557 0, /* tp_setattr */
3558 0, /* tp_reserved */
3559 0, /* tp_repr */
3560 0, /* tp_as_number */
3561 0, /* tp_as_sequence */
3562 0, /* tp_as_mapping */
3563 0, /* tp_hash */
3564 0, /* tp_call */
3565 0, /* tp_str */
3566 PyObject_GenericGetAttr, /* tp_getattro */
3567 0, /* tp_setattro */
3568 0, /* tp_as_buffer */
3569 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3570 0, /* tp_doc */
3571 (traverseproc)dictiter_traverse, /* tp_traverse */
3572 0, /* tp_clear */
3573 0, /* tp_richcompare */
3574 0, /* tp_weaklistoffset */
3575 PyObject_SelfIter, /* tp_iter */
3576 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3577 dictiter_methods, /* tp_methods */
3578 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003579};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003580
3581
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003582static PyObject *
3583dictiter_reduce(dictiterobject *di)
3584{
3585 PyObject *list;
3586 dictiterobject tmp;
3587
3588 list = PyList_New(0);
3589 if (!list)
3590 return NULL;
3591
3592 /* copy the itertor state */
3593 tmp = *di;
3594 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003595
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003596 /* iterate the temporary into a list */
3597 for(;;) {
3598 PyObject *element = 0;
3599 if (Py_TYPE(di) == &PyDictIterItem_Type)
3600 element = dictiter_iternextitem(&tmp);
3601 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3602 element = dictiter_iternextkey(&tmp);
3603 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3604 element = dictiter_iternextvalue(&tmp);
3605 else
3606 assert(0);
3607 if (element) {
3608 if (PyList_Append(list, element)) {
3609 Py_DECREF(element);
3610 Py_DECREF(list);
3611 Py_XDECREF(tmp.di_dict);
3612 return NULL;
3613 }
3614 Py_DECREF(element);
3615 } else
3616 break;
3617 }
3618 Py_XDECREF(tmp.di_dict);
3619 /* check for error */
3620 if (tmp.di_dict != NULL) {
3621 /* we have an error */
3622 Py_DECREF(list);
3623 return NULL;
3624 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003625 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003626}
3627
Guido van Rossum3ac67412007-02-10 18:55:06 +00003628/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003629/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003630/***********************************************/
3631
Guido van Rossumb90c8482007-02-10 01:11:45 +00003632/* The instance lay-out is the same for all three; but the type differs. */
3633
Guido van Rossumb90c8482007-02-10 01:11:45 +00003634static void
Eric Snow96c6af92015-05-29 22:21:39 -06003635dictview_dealloc(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003637 Py_XDECREF(dv->dv_dict);
3638 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003639}
3640
3641static int
Eric Snow96c6af92015-05-29 22:21:39 -06003642dictview_traverse(_PyDictViewObject *dv, visitproc visit, void *arg)
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003644 Py_VISIT(dv->dv_dict);
3645 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003646}
3647
Guido van Rossum83825ac2007-02-10 04:54:19 +00003648static Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06003649dictview_len(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003650{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003651 Py_ssize_t len = 0;
3652 if (dv->dv_dict != NULL)
3653 len = dv->dv_dict->ma_used;
3654 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003655}
3656
Eric Snow96c6af92015-05-29 22:21:39 -06003657PyObject *
3658_PyDictView_New(PyObject *dict, PyTypeObject *type)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003659{
Eric Snow96c6af92015-05-29 22:21:39 -06003660 _PyDictViewObject *dv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003661 if (dict == NULL) {
3662 PyErr_BadInternalCall();
3663 return NULL;
3664 }
3665 if (!PyDict_Check(dict)) {
3666 /* XXX Get rid of this restriction later */
3667 PyErr_Format(PyExc_TypeError,
3668 "%s() requires a dict argument, not '%s'",
3669 type->tp_name, dict->ob_type->tp_name);
3670 return NULL;
3671 }
Eric Snow96c6af92015-05-29 22:21:39 -06003672 dv = PyObject_GC_New(_PyDictViewObject, type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003673 if (dv == NULL)
3674 return NULL;
3675 Py_INCREF(dict);
3676 dv->dv_dict = (PyDictObject *)dict;
3677 _PyObject_GC_TRACK(dv);
3678 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003679}
3680
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003681/* TODO(guido): The views objects are not complete:
3682
3683 * support more set operations
3684 * support arbitrary mappings?
3685 - either these should be static or exported in dictobject.h
3686 - if public then they should probably be in builtins
3687*/
3688
Guido van Rossumaac530c2007-08-24 22:33:45 +00003689/* Return 1 if self is a subset of other, iterating over self;
3690 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003691static int
3692all_contained_in(PyObject *self, PyObject *other)
3693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003694 PyObject *iter = PyObject_GetIter(self);
3695 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003697 if (iter == NULL)
3698 return -1;
3699 for (;;) {
3700 PyObject *next = PyIter_Next(iter);
3701 if (next == NULL) {
3702 if (PyErr_Occurred())
3703 ok = -1;
3704 break;
3705 }
3706 ok = PySequence_Contains(other, next);
3707 Py_DECREF(next);
3708 if (ok <= 0)
3709 break;
3710 }
3711 Py_DECREF(iter);
3712 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003713}
3714
3715static PyObject *
3716dictview_richcompare(PyObject *self, PyObject *other, int op)
3717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003718 Py_ssize_t len_self, len_other;
3719 int ok;
3720 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003722 assert(self != NULL);
3723 assert(PyDictViewSet_Check(self));
3724 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003725
Brian Curtindfc80e32011-08-10 20:28:54 -05003726 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3727 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003729 len_self = PyObject_Size(self);
3730 if (len_self < 0)
3731 return NULL;
3732 len_other = PyObject_Size(other);
3733 if (len_other < 0)
3734 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 ok = 0;
3737 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003739 case Py_NE:
3740 case Py_EQ:
3741 if (len_self == len_other)
3742 ok = all_contained_in(self, other);
3743 if (op == Py_NE && ok >= 0)
3744 ok = !ok;
3745 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003747 case Py_LT:
3748 if (len_self < len_other)
3749 ok = all_contained_in(self, other);
3750 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003752 case Py_LE:
3753 if (len_self <= len_other)
3754 ok = all_contained_in(self, other);
3755 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003757 case Py_GT:
3758 if (len_self > len_other)
3759 ok = all_contained_in(other, self);
3760 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 case Py_GE:
3763 if (len_self >= len_other)
3764 ok = all_contained_in(other, self);
3765 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003767 }
3768 if (ok < 0)
3769 return NULL;
3770 result = ok ? Py_True : Py_False;
3771 Py_INCREF(result);
3772 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003773}
3774
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003775static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003776dictview_repr(_PyDictViewObject *dv)
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003778 PyObject *seq;
3779 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003781 seq = PySequence_List((PyObject *)dv);
3782 if (seq == NULL)
3783 return NULL;
3784
3785 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3786 Py_DECREF(seq);
3787 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003788}
3789
Guido van Rossum3ac67412007-02-10 18:55:06 +00003790/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003791
3792static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003793dictkeys_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003795 if (dv->dv_dict == NULL) {
3796 Py_RETURN_NONE;
3797 }
3798 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003799}
3800
3801static int
Eric Snow96c6af92015-05-29 22:21:39 -06003802dictkeys_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003803{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003804 if (dv->dv_dict == NULL)
3805 return 0;
3806 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003807}
3808
Guido van Rossum83825ac2007-02-10 04:54:19 +00003809static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003810 (lenfunc)dictview_len, /* sq_length */
3811 0, /* sq_concat */
3812 0, /* sq_repeat */
3813 0, /* sq_item */
3814 0, /* sq_slice */
3815 0, /* sq_ass_item */
3816 0, /* sq_ass_slice */
3817 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003818};
3819
Guido van Rossum523259b2007-08-24 23:41:22 +00003820static PyObject*
3821dictviews_sub(PyObject* self, PyObject *other)
3822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 PyObject *result = PySet_New(self);
3824 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003825 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003827 if (result == NULL)
3828 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003829
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003830 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003831 if (tmp == NULL) {
3832 Py_DECREF(result);
3833 return NULL;
3834 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003836 Py_DECREF(tmp);
3837 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003838}
3839
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003840PyObject*
3841_PyDictView_Intersect(PyObject* self, PyObject *other)
Guido van Rossum523259b2007-08-24 23:41:22 +00003842{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003843 PyObject *result = PySet_New(self);
3844 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003845 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003847 if (result == NULL)
3848 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003849
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003850 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003851 if (tmp == NULL) {
3852 Py_DECREF(result);
3853 return NULL;
3854 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003856 Py_DECREF(tmp);
3857 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003858}
3859
3860static PyObject*
3861dictviews_or(PyObject* self, PyObject *other)
3862{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003863 PyObject *result = PySet_New(self);
3864 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003865 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003867 if (result == NULL)
3868 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003869
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003870 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 if (tmp == NULL) {
3872 Py_DECREF(result);
3873 return NULL;
3874 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003876 Py_DECREF(tmp);
3877 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003878}
3879
3880static PyObject*
3881dictviews_xor(PyObject* self, PyObject *other)
3882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003883 PyObject *result = PySet_New(self);
3884 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003885 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003887 if (result == NULL)
3888 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003889
Benjamin Petersonf11b25b2016-03-03 22:05:36 -08003890 tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003891 if (tmp == NULL) {
3892 Py_DECREF(result);
3893 return NULL;
3894 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003896 Py_DECREF(tmp);
3897 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003898}
3899
3900static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003901 0, /*nb_add*/
3902 (binaryfunc)dictviews_sub, /*nb_subtract*/
3903 0, /*nb_multiply*/
3904 0, /*nb_remainder*/
3905 0, /*nb_divmod*/
3906 0, /*nb_power*/
3907 0, /*nb_negative*/
3908 0, /*nb_positive*/
3909 0, /*nb_absolute*/
3910 0, /*nb_bool*/
3911 0, /*nb_invert*/
3912 0, /*nb_lshift*/
3913 0, /*nb_rshift*/
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003914 (binaryfunc)_PyDictView_Intersect, /*nb_and*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003915 (binaryfunc)dictviews_xor, /*nb_xor*/
3916 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003917};
3918
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003919static PyObject*
3920dictviews_isdisjoint(PyObject *self, PyObject *other)
3921{
3922 PyObject *it;
3923 PyObject *item = NULL;
3924
3925 if (self == other) {
Eric Snow96c6af92015-05-29 22:21:39 -06003926 if (dictview_len((_PyDictViewObject *)self) == 0)
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003927 Py_RETURN_TRUE;
3928 else
3929 Py_RETURN_FALSE;
3930 }
3931
3932 /* Iterate over the shorter object (only if other is a set,
3933 * because PySequence_Contains may be expensive otherwise): */
3934 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
Eric Snow96c6af92015-05-29 22:21:39 -06003935 Py_ssize_t len_self = dictview_len((_PyDictViewObject *)self);
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003936 Py_ssize_t len_other = PyObject_Size(other);
3937 if (len_other == -1)
3938 return NULL;
3939
3940 if ((len_other > len_self)) {
3941 PyObject *tmp = other;
3942 other = self;
3943 self = tmp;
3944 }
3945 }
3946
3947 it = PyObject_GetIter(other);
3948 if (it == NULL)
3949 return NULL;
3950
3951 while ((item = PyIter_Next(it)) != NULL) {
3952 int contains = PySequence_Contains(self, item);
3953 Py_DECREF(item);
3954 if (contains == -1) {
3955 Py_DECREF(it);
3956 return NULL;
3957 }
3958
3959 if (contains) {
3960 Py_DECREF(it);
3961 Py_RETURN_FALSE;
3962 }
3963 }
3964 Py_DECREF(it);
3965 if (PyErr_Occurred())
3966 return NULL; /* PyIter_Next raised an exception. */
3967 Py_RETURN_TRUE;
3968}
3969
3970PyDoc_STRVAR(isdisjoint_doc,
3971"Return True if the view and the given iterable have a null intersection.");
3972
Guido van Rossumb90c8482007-02-10 01:11:45 +00003973static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003974 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3975 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003976 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003977};
3978
3979PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003980 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3981 "dict_keys", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06003982 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 0, /* tp_itemsize */
3984 /* methods */
3985 (destructor)dictview_dealloc, /* tp_dealloc */
3986 0, /* tp_print */
3987 0, /* tp_getattr */
3988 0, /* tp_setattr */
3989 0, /* tp_reserved */
3990 (reprfunc)dictview_repr, /* tp_repr */
3991 &dictviews_as_number, /* tp_as_number */
3992 &dictkeys_as_sequence, /* tp_as_sequence */
3993 0, /* tp_as_mapping */
3994 0, /* tp_hash */
3995 0, /* tp_call */
3996 0, /* tp_str */
3997 PyObject_GenericGetAttr, /* tp_getattro */
3998 0, /* tp_setattro */
3999 0, /* tp_as_buffer */
4000 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4001 0, /* tp_doc */
4002 (traverseproc)dictview_traverse, /* tp_traverse */
4003 0, /* tp_clear */
4004 dictview_richcompare, /* tp_richcompare */
4005 0, /* tp_weaklistoffset */
4006 (getiterfunc)dictkeys_iter, /* tp_iter */
4007 0, /* tp_iternext */
4008 dictkeys_methods, /* tp_methods */
4009 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004010};
4011
4012static PyObject *
4013dictkeys_new(PyObject *dict)
4014{
Eric Snow96c6af92015-05-29 22:21:39 -06004015 return _PyDictView_New(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004016}
4017
Guido van Rossum3ac67412007-02-10 18:55:06 +00004018/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004019
4020static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004021dictitems_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004023 if (dv->dv_dict == NULL) {
4024 Py_RETURN_NONE;
4025 }
4026 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00004027}
4028
4029static int
Eric Snow96c6af92015-05-29 22:21:39 -06004030dictitems_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00004031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004032 PyObject *key, *value, *found;
4033 if (dv->dv_dict == NULL)
4034 return 0;
4035 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
4036 return 0;
4037 key = PyTuple_GET_ITEM(obj, 0);
4038 value = PyTuple_GET_ITEM(obj, 1);
Raymond Hettinger6692f012016-09-18 21:46:08 -07004039 found = PyDict_GetItemWithError((PyObject *)dv->dv_dict, key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004040 if (found == NULL) {
4041 if (PyErr_Occurred())
4042 return -1;
4043 return 0;
4044 }
4045 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004046}
4047
Guido van Rossum83825ac2007-02-10 04:54:19 +00004048static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004049 (lenfunc)dictview_len, /* sq_length */
4050 0, /* sq_concat */
4051 0, /* sq_repeat */
4052 0, /* sq_item */
4053 0, /* sq_slice */
4054 0, /* sq_ass_item */
4055 0, /* sq_ass_slice */
4056 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004057};
4058
Guido van Rossumb90c8482007-02-10 01:11:45 +00004059static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00004060 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
4061 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004063};
4064
4065PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004066 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4067 "dict_items", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004068 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004069 0, /* tp_itemsize */
4070 /* methods */
4071 (destructor)dictview_dealloc, /* tp_dealloc */
4072 0, /* tp_print */
4073 0, /* tp_getattr */
4074 0, /* tp_setattr */
4075 0, /* tp_reserved */
4076 (reprfunc)dictview_repr, /* tp_repr */
4077 &dictviews_as_number, /* tp_as_number */
4078 &dictitems_as_sequence, /* tp_as_sequence */
4079 0, /* tp_as_mapping */
4080 0, /* tp_hash */
4081 0, /* tp_call */
4082 0, /* tp_str */
4083 PyObject_GenericGetAttr, /* tp_getattro */
4084 0, /* tp_setattro */
4085 0, /* tp_as_buffer */
4086 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4087 0, /* tp_doc */
4088 (traverseproc)dictview_traverse, /* tp_traverse */
4089 0, /* tp_clear */
4090 dictview_richcompare, /* tp_richcompare */
4091 0, /* tp_weaklistoffset */
4092 (getiterfunc)dictitems_iter, /* tp_iter */
4093 0, /* tp_iternext */
4094 dictitems_methods, /* tp_methods */
4095 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004096};
4097
4098static PyObject *
4099dictitems_new(PyObject *dict)
4100{
Eric Snow96c6af92015-05-29 22:21:39 -06004101 return _PyDictView_New(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004102}
4103
Guido van Rossum3ac67412007-02-10 18:55:06 +00004104/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00004105
4106static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06004107dictvalues_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00004108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004109 if (dv->dv_dict == NULL) {
4110 Py_RETURN_NONE;
4111 }
4112 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004113}
4114
Guido van Rossum83825ac2007-02-10 04:54:19 +00004115static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004116 (lenfunc)dictview_len, /* sq_length */
4117 0, /* sq_concat */
4118 0, /* sq_repeat */
4119 0, /* sq_item */
4120 0, /* sq_slice */
4121 0, /* sq_ass_item */
4122 0, /* sq_ass_slice */
4123 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00004124};
4125
Guido van Rossumb90c8482007-02-10 01:11:45 +00004126static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004127 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00004128};
4129
4130PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004131 PyVarObject_HEAD_INIT(&PyType_Type, 0)
4132 "dict_values", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06004133 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004134 0, /* tp_itemsize */
4135 /* methods */
4136 (destructor)dictview_dealloc, /* tp_dealloc */
4137 0, /* tp_print */
4138 0, /* tp_getattr */
4139 0, /* tp_setattr */
4140 0, /* tp_reserved */
4141 (reprfunc)dictview_repr, /* tp_repr */
4142 0, /* tp_as_number */
4143 &dictvalues_as_sequence, /* tp_as_sequence */
4144 0, /* tp_as_mapping */
4145 0, /* tp_hash */
4146 0, /* tp_call */
4147 0, /* tp_str */
4148 PyObject_GenericGetAttr, /* tp_getattro */
4149 0, /* tp_setattro */
4150 0, /* tp_as_buffer */
4151 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
4152 0, /* tp_doc */
4153 (traverseproc)dictview_traverse, /* tp_traverse */
4154 0, /* tp_clear */
4155 0, /* tp_richcompare */
4156 0, /* tp_weaklistoffset */
4157 (getiterfunc)dictvalues_iter, /* tp_iter */
4158 0, /* tp_iternext */
4159 dictvalues_methods, /* tp_methods */
4160 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00004161};
4162
4163static PyObject *
4164dictvalues_new(PyObject *dict)
4165{
Eric Snow96c6af92015-05-29 22:21:39 -06004166 return _PyDictView_New(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00004167}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004168
4169/* Returns NULL if cannot allocate a new PyDictKeysObject,
4170 but does not set an error */
4171PyDictKeysObject *
4172_PyDict_NewKeysForClass(void)
4173{
Victor Stinner742da042016-09-07 17:40:12 -07004174 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004175 if (keys == NULL)
4176 PyErr_Clear();
4177 else
4178 keys->dk_lookup = lookdict_split;
4179 return keys;
4180}
4181
4182#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
4183
4184PyObject *
4185PyObject_GenericGetDict(PyObject *obj, void *context)
4186{
4187 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
4188 if (dictptr == NULL) {
4189 PyErr_SetString(PyExc_AttributeError,
4190 "This object has no __dict__");
4191 return NULL;
4192 }
4193 dict = *dictptr;
4194 if (dict == NULL) {
4195 PyTypeObject *tp = Py_TYPE(obj);
4196 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
4197 DK_INCREF(CACHED_KEYS(tp));
4198 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
4199 }
4200 else {
4201 *dictptr = dict = PyDict_New();
4202 }
4203 }
4204 Py_XINCREF(dict);
4205 return dict;
4206}
4207
4208int
4209_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
Victor Stinner742da042016-09-07 17:40:12 -07004210 PyObject *key, PyObject *value)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004211{
4212 PyObject *dict;
4213 int res;
4214 PyDictKeysObject *cached;
4215
4216 assert(dictptr != NULL);
4217 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
4218 assert(dictptr != NULL);
4219 dict = *dictptr;
4220 if (dict == NULL) {
4221 DK_INCREF(cached);
4222 dict = new_dict_with_shared_keys(cached);
4223 if (dict == NULL)
4224 return -1;
4225 *dictptr = dict;
4226 }
4227 if (value == NULL) {
4228 res = PyDict_DelItem(dict, key);
4229 if (cached != ((PyDictObject *)dict)->ma_keys) {
4230 CACHED_KEYS(tp) = NULL;
4231 DK_DECREF(cached);
4232 }
4233 } else {
4234 res = PyDict_SetItem(dict, key, value);
4235 if (cached != ((PyDictObject *)dict)->ma_keys) {
4236 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004237 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004238 CACHED_KEYS(tp) = make_keys_shared(dict);
Victor Stinner742da042016-09-07 17:40:12 -07004239 }
4240 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004241 CACHED_KEYS(tp) = NULL;
4242 }
4243 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04004244 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
4245 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04004246 }
4247 }
4248 } else {
4249 dict = *dictptr;
4250 if (dict == NULL) {
4251 dict = PyDict_New();
4252 if (dict == NULL)
4253 return -1;
4254 *dictptr = dict;
4255 }
4256 if (value == NULL) {
4257 res = PyDict_DelItem(dict, key);
4258 } else {
4259 res = PyDict_SetItem(dict, key, value);
4260 }
4261 }
4262 return res;
4263}
4264
4265void
4266_PyDictKeys_DecRef(PyDictKeysObject *keys)
4267{
4268 DK_DECREF(keys);
4269}