blob: 31a6322a4f9ea5e33f6dd941de8e252397987ab2 [file] [log] [blame]
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001
Guido van Rossum2bc13791999-03-24 19:06:42 +00002/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003
Raymond Hettinger930427b2003-05-03 06:51:59 +00004/* The distribution includes a separate file, Objects/dictnotes.txt,
Tim Peters60b29962006-01-01 01:19:23 +00005 describing explorations into dictionary design and optimization.
Raymond Hettinger930427b2003-05-03 06:51:59 +00006 It covers typical dictionary use patterns, the parameters for
7 tuning dictionaries, and several ideas for possible optimizations.
8*/
9
Benjamin Peterson7d95e402012-04-23 11:24:50 -040010
11/*
12There are four kinds of slots in the table:
13
141. Unused. me_key == me_value == NULL
15 Does not hold an active (key, value) pair now and never did. Unused can
16 transition to Active upon key insertion. This is the only case in which
17 me_key is NULL, and is each slot's initial state.
18
192. Active. me_key != NULL and me_key != dummy and me_value != NULL
20 Holds an active (key, value) pair. Active can transition to Dummy or
21 Pending upon key deletion (for combined and split tables respectively).
22 This is the only case in which me_value != NULL.
23
243. Dummy. me_key == dummy and me_value == NULL
25 Previously held an active (key, value) pair, but that was deleted and an
26 active pair has not yet overwritten the slot. Dummy can transition to
27 Active upon key insertion. Dummy slots cannot be made Unused again
28 (cannot have me_key set to NULL), else the probe sequence in case of
29 collision would have no way to know they were once active.
30
314. Pending. Not yet inserted or deleted from a split-table.
32 key != NULL, key != dummy and value == NULL
33
34The DictObject can be in one of two forms.
35Either:
36 A combined table:
37 ma_values == NULL, dk_refcnt == 1.
38 Values are stored in the me_value field of the PyDictKeysObject.
39 Slot kind 4 is not allowed i.e.
40 key != NULL, key != dummy and value == NULL is illegal.
41Or:
42 A split table:
43 ma_values != NULL, dk_refcnt >= 1
44 Values are stored in the ma_values array.
45 Only string (unicode) keys are allowed, no <dummy> keys are present.
46
47Note: .popitem() abuses the me_hash field of an Unused or Dummy slot to
48hold a search finger. The me_hash field of Unused or Dummy slots has no
49meaning otherwise. As a consequence of this popitem always converts the dict
50to the combined-table form.
51*/
52
53/* PyDict_MINSIZE_SPLIT is the minimum size of a split dictionary.
54 * It must be a power of 2, and at least 4.
55 * Resizing of split dictionaries is very rare, so the saving memory is more
56 * important than the cost of resizing.
57 */
58#define PyDict_MINSIZE_SPLIT 4
59
60/* PyDict_MINSIZE_COMBINED is the starting size for any new, non-split dict.
61 * 8 allows dicts with no more than 5 active entries; experiments suggested
62 * this suffices for the majority of dicts (consisting mostly of usually-small
63 * dicts created to pass keyword arguments).
64 * Making this 8, rather than 4 reduces the number of resizes for most
65 * dictionaries, without any significant extra memory use.
66 */
67#define PyDict_MINSIZE_COMBINED 8
68
Guido van Rossumc0b618a1997-05-02 03:12:38 +000069#include "Python.h"
Eric Snow96c6af92015-05-29 22:21:39 -060070#include "dict-common.h"
Christian Heimes0ded5b52007-12-10 15:50:56 +000071#include "stringlib/eq.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000072
Larry Hastings61272b72014-01-07 12:41:53 -080073/*[clinic input]
Larry Hastingsc2047262014-01-25 20:43:29 -080074class dict "PyDictObject *" "&PyDict_Type"
Larry Hastings61272b72014-01-07 12:41:53 -080075[clinic start generated code]*/
Larry Hastings581ee362014-01-28 05:00:08 -080076/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f157a5a0ce9589d6]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -080077
Benjamin Peterson7d95e402012-04-23 11:24:50 -040078
79/*
80To ensure the lookup algorithm terminates, there must be at least one Unused
81slot (NULL key) in the table.
82To avoid slowing down lookups on a near-full table, we resize the table when
83it's USABLE_FRACTION (currently two-thirds) full.
84*/
Guido van Rossum16e93a81997-01-28 00:00:11 +000085
Tim Peterseb28ef22001-06-02 05:27:19 +000086#define PERTURB_SHIFT 5
87
Guido van Rossum16e93a81997-01-28 00:00:11 +000088/*
Tim Peterseb28ef22001-06-02 05:27:19 +000089Major subtleties ahead: Most hash schemes depend on having a "good" hash
90function, in the sense of simulating randomness. Python doesn't: its most
91important hash functions (for strings and ints) are very regular in common
92cases:
Tim Peters15d49292001-05-27 07:39:22 +000093
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000094 >>> map(hash, (0, 1, 2, 3))
95 [0, 1, 2, 3]
96 >>> map(hash, ("namea", "nameb", "namec", "named"))
97 [-1658398457, -1658398460, -1658398459, -1658398462]
98 >>>
Tim Peters15d49292001-05-27 07:39:22 +000099
Tim Peterseb28ef22001-06-02 05:27:19 +0000100This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
101the low-order i bits as the initial table index is extremely fast, and there
102are no collisions at all for dicts indexed by a contiguous range of ints.
103The same is approximately true when keys are "consecutive" strings. So this
104gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +0000105
Tim Peterseb28ef22001-06-02 05:27:19 +0000106OTOH, when collisions occur, the tendency to fill contiguous slices of the
107hash table makes a good collision resolution strategy crucial. Taking only
108the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000110their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
111 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +0000112
Tim Peterseb28ef22001-06-02 05:27:19 +0000113But catering to unusual cases should not slow the usual ones, so we just take
114the last i bits anyway. It's up to collision resolution to do the rest. If
115we *usually* find the key we're looking for on the first try (and, it turns
116out, we usually do -- the table load factor is kept under 2/3, so the odds
117are solidly in our favor), then it makes best sense to keep the initial index
118computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +0000119
Tim Peterseb28ef22001-06-02 05:27:19 +0000120The first half of collision resolution is to visit table indices via this
121recurrence:
Tim Peters15d49292001-05-27 07:39:22 +0000122
Tim Peterseb28ef22001-06-02 05:27:19 +0000123 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +0000124
Tim Peterseb28ef22001-06-02 05:27:19 +0000125For any initial j in range(2**i), repeating that 2**i times generates each
126int in range(2**i) exactly once (see any text on random-number generation for
127proof). By itself, this doesn't help much: like linear probing (setting
128j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
129order. This would be bad, except that's not the only thing we do, and it's
130actually *good* in the common cases where hash keys are consecutive. In an
131example that's really too small to make this entirely clear, for a table of
132size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +0000133
Tim Peterseb28ef22001-06-02 05:27:19 +0000134 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
135
136If two things come in at index 5, the first place we look after is index 2,
137not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
138Linear probing is deadly in this case because there the fixed probe order
139is the *same* as the order consecutive keys are likely to arrive. But it's
140extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
141and certain that consecutive hash codes do not.
142
143The other half of the strategy is to get the other bits of the hash code
144into play. This is done by initializing a (unsigned) vrbl "perturb" to the
145full hash code, and changing the recurrence to:
146
147 j = (5*j) + 1 + perturb;
148 perturb >>= PERTURB_SHIFT;
149 use j % 2**i as the next table index;
150
151Now the probe sequence depends (eventually) on every bit in the hash code,
152and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
153because it quickly magnifies small differences in the bits that didn't affect
154the initial index. Note that because perturb is unsigned, if the recurrence
155is executed often enough perturb eventually becomes and remains 0. At that
156point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
157that's certain to find an empty slot eventually (since it generates every int
158in range(2**i), and we make sure there's always at least one empty slot).
159
160Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
161small so that the high bits of the hash code continue to affect the probe
162sequence across iterations; but you want it large so that in really bad cases
163the high-order hash bits have an effect on early iterations. 5 was "the
164best" in minimizing total collisions across experiments Tim Peters ran (on
165both normal and pathological cases), but 4 and 6 weren't significantly worse.
166
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000167Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000168approach, using repeated multiplication by x in GF(2**n) where an irreducible
169polynomial for each table size was chosen such that x was a primitive root.
170Christian Tismer later extended that to use division by x instead, as an
171efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000172also gave excellent collision statistics, but was more expensive: two
173if-tests were required inside the loop; computing "the next" index took about
174the same number of operations but without as much potential parallelism
175(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
176above, and then shifting perturb can be done while the table index is being
177masked); and the PyDictObject struct required a member to hold the table's
178polynomial. In Tim's experiments the current scheme ran faster, produced
179equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000180
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000181*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000182
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400183/* Object used as dummy key to fill deleted entries
184 * This could be any unique object,
185 * use a custom type in order to minimise coupling.
186*/
187static PyObject _dummy_struct;
188
189#define dummy (&_dummy_struct)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000190
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000191#ifdef Py_REF_DEBUG
192PyObject *
193_PyDict_Dummy(void)
194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 return dummy;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000196}
197#endif
198
Fred Drake1bff34a2000-08-31 19:31:38 +0000199/* forward declarations */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400200static PyDictKeyEntry *lookdict(PyDictObject *mp, PyObject *key,
201 Py_hash_t hash, PyObject ***value_addr);
202static PyDictKeyEntry *lookdict_unicode(PyDictObject *mp, PyObject *key,
203 Py_hash_t hash, PyObject ***value_addr);
204static PyDictKeyEntry *
205lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
206 Py_hash_t hash, PyObject ***value_addr);
207static PyDictKeyEntry *lookdict_split(PyDictObject *mp, PyObject *key,
208 Py_hash_t hash, PyObject ***value_addr);
Fred Drake1bff34a2000-08-31 19:31:38 +0000209
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400210static int dictresize(PyDictObject *mp, Py_ssize_t minused);
Tim Petersdea48ec2001-05-22 20:40:22 +0000211
Raymond Hettinger43442782004-03-17 21:55:03 +0000212/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes2202f872008-02-06 14:31:34 +0000213#ifndef PyDict_MAXFREELIST
214#define PyDict_MAXFREELIST 80
215#endif
216static PyDictObject *free_list[PyDict_MAXFREELIST];
217static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000218
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300219#include "clinic/dictobject.c.h"
220
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100221int
222PyDict_ClearFreeList(void)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 PyDictObject *op;
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100225 int ret = numfree;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 while (numfree) {
227 op = free_list[--numfree];
228 assert(PyDict_CheckExact(op));
229 PyObject_GC_Del(op);
230 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100231 return ret;
232}
233
David Malcolm49526f42012-06-22 14:55:41 -0400234/* Print summary info about the state of the optimized allocator */
235void
236_PyDict_DebugMallocStats(FILE *out)
237{
238 _PyDebugAllocatorStats(out,
239 "free PyDictObject", numfree, sizeof(PyDictObject));
240}
241
242
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100243void
244PyDict_Fini(void)
245{
246 PyDict_ClearFreeList();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000247}
248
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200249#define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
250#define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
251
252#define DK_INCREF(dk) (DK_DEBUG_INCREF ++(dk)->dk_refcnt)
253#define DK_DECREF(dk) if (DK_DEBUG_DECREF (--(dk)->dk_refcnt) == 0) free_keys_object(dk)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400254#define DK_SIZE(dk) ((dk)->dk_size)
255#define DK_MASK(dk) (((dk)->dk_size)-1)
256#define IS_POWER_OF_2(x) (((x) & (x-1)) == 0)
257
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200258/* USABLE_FRACTION is the maximum dictionary load.
259 * Currently set to (2n+1)/3. Increasing this ratio makes dictionaries more
260 * dense resulting in more collisions. Decreasing it improves sparseness
261 * at the expense of spreading entries over more cache lines and at the
262 * cost of total memory consumed.
263 *
264 * USABLE_FRACTION must obey the following:
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400265 * (0 < USABLE_FRACTION(n) < n) for all n >= 2
266 *
267 * USABLE_FRACTION should be very quick to calculate.
268 * Fractions around 5/8 to 2/3 seem to work well in practice.
269 */
270
271/* Use (2n+1)/3 rather than 2n+3 because: it makes no difference for
272 * combined tables (the two fractions round to the same number n < ),
273 * but 2*4/3 is 2 whereas (2*4+1)/3 is 3 which potentially saves quite
274 * a lot of space for small, split tables */
275#define USABLE_FRACTION(n) ((((n) << 1)+1)/3)
276
277/* Alternative fraction that is otherwise close enough to (2n+1)/3 to make
278 * little difference. 8 * 2/3 == 8 * 5/8 == 5. 16 * 2/3 == 16 * 5/8 == 10.
279 * 32 * 2/3 = 21, 32 * 5/8 = 20.
280 * Its advantage is that it is faster to compute on machines with slow division.
281 * #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
282*/
283
Victor Stinnera9f61a52013-07-16 22:17:26 +0200284/* GROWTH_RATE. Growth rate upon hitting maximum load.
285 * Currently set to used*2 + capacity/2.
286 * This means that dicts double in size when growing without deletions,
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700287 * but have more head room when the number of deletions is on a par with the
288 * number of insertions.
289 * Raising this to used*4 doubles memory consumption depending on the size of
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200290 * the dictionary, but results in half the number of resizes, less effort to
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700291 * resize.
292 * GROWTH_RATE was set to used*4 up to version 3.2.
293 * GROWTH_RATE was set to used*2 in version 3.3.0
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200294 */
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700295#define GROWTH_RATE(d) (((d)->ma_used*2)+((d)->ma_keys->dk_size>>1))
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400296
297#define ENSURE_ALLOWS_DELETIONS(d) \
298 if ((d)->ma_keys->dk_lookup == lookdict_unicode_nodummy) { \
299 (d)->ma_keys->dk_lookup = lookdict_unicode; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000300 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400301
302/* This immutable, empty PyDictKeysObject is used for PyDict_Clear()
303 * (which cannot fail and thus can do no allocation).
304 */
305static PyDictKeysObject empty_keys_struct = {
306 2, /* dk_refcnt 1 for this struct, 1 for dummy_struct */
307 1, /* dk_size */
308 lookdict_split, /* dk_lookup */
309 0, /* dk_usable (immutable) */
310 {
311 { 0, 0, 0 } /* dk_entries (empty) */
312 }
313};
314
315static PyObject *empty_values[1] = { NULL };
316
317#define Py_EMPTY_KEYS &empty_keys_struct
318
319static PyDictKeysObject *new_keys_object(Py_ssize_t size)
320{
321 PyDictKeysObject *dk;
322 Py_ssize_t i;
323 PyDictKeyEntry *ep0;
324
325 assert(size >= PyDict_MINSIZE_SPLIT);
326 assert(IS_POWER_OF_2(size));
Raymond Hettingerce5179f2016-01-31 08:56:21 -0800327 dk = PyObject_MALLOC(sizeof(PyDictKeysObject) +
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400328 sizeof(PyDictKeyEntry) * (size-1));
329 if (dk == NULL) {
330 PyErr_NoMemory();
331 return NULL;
332 }
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200333 DK_DEBUG_INCREF dk->dk_refcnt = 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400334 dk->dk_size = size;
335 dk->dk_usable = USABLE_FRACTION(size);
336 ep0 = &dk->dk_entries[0];
337 /* Hash value of slot 0 is used by popitem, so it must be initialized */
338 ep0->me_hash = 0;
339 for (i = 0; i < size; i++) {
340 ep0[i].me_key = NULL;
341 ep0[i].me_value = NULL;
342 }
343 dk->dk_lookup = lookdict_unicode_nodummy;
344 return dk;
345}
346
347static void
348free_keys_object(PyDictKeysObject *keys)
349{
350 PyDictKeyEntry *entries = &keys->dk_entries[0];
351 Py_ssize_t i, n;
352 for (i = 0, n = DK_SIZE(keys); i < n; i++) {
353 Py_XDECREF(entries[i].me_key);
354 Py_XDECREF(entries[i].me_value);
355 }
Raymond Hettingerce5179f2016-01-31 08:56:21 -0800356 PyObject_FREE(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400357}
358
359#define new_values(size) PyMem_NEW(PyObject *, size)
360
361#define free_values(values) PyMem_FREE(values)
362
363/* Consumes a reference to the keys object */
364static PyObject *
365new_dict(PyDictKeysObject *keys, PyObject **values)
366{
367 PyDictObject *mp;
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200368 assert(keys != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 if (numfree) {
370 mp = free_list[--numfree];
371 assert (mp != NULL);
372 assert (Py_TYPE(mp) == &PyDict_Type);
373 _Py_NewReference((PyObject *)mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400375 else {
376 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
377 if (mp == NULL) {
378 DK_DECREF(keys);
379 free_values(values);
380 return NULL;
381 }
382 }
383 mp->ma_keys = keys;
384 mp->ma_values = values;
385 mp->ma_used = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000387}
388
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400389/* Consumes a reference to the keys object */
390static PyObject *
391new_dict_with_shared_keys(PyDictKeysObject *keys)
392{
393 PyObject **values;
394 Py_ssize_t i, size;
395
396 size = DK_SIZE(keys);
397 values = new_values(size);
398 if (values == NULL) {
399 DK_DECREF(keys);
400 return PyErr_NoMemory();
401 }
402 for (i = 0; i < size; i++) {
403 values[i] = NULL;
404 }
405 return new_dict(keys, values);
406}
407
408PyObject *
409PyDict_New(void)
410{
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200411 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_COMBINED);
412 if (keys == NULL)
413 return NULL;
414 return new_dict(keys, NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400415}
416
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000417/*
418The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000419This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000420Open addressing is preferred over chaining since the link overhead for
421chaining would be substantial (100% with typical malloc overhead).
422
Tim Peterseb28ef22001-06-02 05:27:19 +0000423The initial probe index is computed as hash mod the table size. Subsequent
424probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000425
426All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000427
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000428The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000429contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000430Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000431
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000432lookdict() is general-purpose, and may return NULL if (and only if) a
433comparison raises an exception (this was new in Python 2.5).
Guido van Rossum89d8c602007-09-18 17:26:56 +0000434lookdict_unicode() below is specialized to string keys, comparison of which can
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400435never raise an exception; that function can never return NULL.
436lookdict_unicode_nodummy is further specialized for string keys that cannot be
437the <dummy> value.
438For both, when the key isn't found a PyDictEntry* is returned
439where the key would have been found, *value_addr points to the matching value
440slot.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000441*/
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400442static PyDictKeyEntry *
443lookdict(PyDictObject *mp, PyObject *key,
444 Py_hash_t hash, PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000445{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200446 size_t i;
447 size_t perturb;
448 PyDictKeyEntry *freeslot;
449 size_t mask;
Antoine Pitrou9a234902012-05-13 20:48:01 +0200450 PyDictKeyEntry *ep0;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200451 PyDictKeyEntry *ep;
452 int cmp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000454
Antoine Pitrou9a234902012-05-13 20:48:01 +0200455top:
456 mask = DK_MASK(mp->ma_keys);
457 ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 i = (size_t)hash & mask;
459 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400460 if (ep->me_key == NULL || ep->me_key == key) {
461 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400463 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 if (ep->me_key == dummy)
465 freeslot = ep;
466 else {
467 if (ep->me_hash == hash) {
468 startkey = ep->me_key;
469 Py_INCREF(startkey);
470 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
471 Py_DECREF(startkey);
472 if (cmp < 0)
473 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400474 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
475 if (cmp > 0) {
476 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400478 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 }
480 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200481 /* The dict was mutated, restart */
482 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 }
484 }
485 freeslot = NULL;
486 }
Tim Peters15d49292001-05-27 07:39:22 +0000487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 /* In the loop, me_key == dummy is by far (factor of 100s) the
489 least likely outcome, so test for that last. */
490 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
491 i = (i << 2) + i + perturb + 1;
492 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400493 if (ep->me_key == NULL) {
494 if (freeslot == NULL) {
495 *value_addr = &ep->me_value;
496 return ep;
497 } else {
498 *value_addr = &freeslot->me_value;
499 return freeslot;
500 }
501 }
502 if (ep->me_key == key) {
503 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400505 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 if (ep->me_hash == hash && ep->me_key != dummy) {
507 startkey = ep->me_key;
508 Py_INCREF(startkey);
509 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
510 Py_DECREF(startkey);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400511 if (cmp < 0) {
512 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400514 }
515 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
516 if (cmp > 0) {
517 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400519 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 }
521 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200522 /* The dict was mutated, restart */
523 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 }
525 }
526 else if (ep->me_key == dummy && freeslot == NULL)
527 freeslot = ep;
528 }
529 assert(0); /* NOT REACHED */
530 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000531}
532
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400533/* Specialized version for string-only keys */
534static PyDictKeyEntry *
535lookdict_unicode(PyDictObject *mp, PyObject *key,
536 Py_hash_t hash, PyObject ***value_addr)
Fred Drake1bff34a2000-08-31 19:31:38 +0000537{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200538 size_t i;
539 size_t perturb;
540 PyDictKeyEntry *freeslot;
541 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400542 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200543 PyDictKeyEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 /* Make sure this function doesn't have to handle non-unicode keys,
546 including subclasses of str; e.g., one reason to subclass
547 unicodes is to override __eq__, and for speed we don't cater to
548 that here. */
549 if (!PyUnicode_CheckExact(key)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400550 mp->ma_keys->dk_lookup = lookdict;
551 return lookdict(mp, key, hash, value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100553 i = (size_t)hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400555 if (ep->me_key == NULL || ep->me_key == key) {
556 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400558 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 if (ep->me_key == dummy)
560 freeslot = ep;
561 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400562 if (ep->me_hash == hash && unicode_eq(ep->me_key, key)) {
563 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400565 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 freeslot = NULL;
567 }
Tim Peters15d49292001-05-27 07:39:22 +0000568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 /* In the loop, me_key == dummy is by far (factor of 100s) the
570 least likely outcome, so test for that last. */
571 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
572 i = (i << 2) + i + perturb + 1;
573 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400574 if (ep->me_key == NULL) {
575 if (freeslot == NULL) {
576 *value_addr = &ep->me_value;
577 return ep;
578 } else {
579 *value_addr = &freeslot->me_value;
580 return freeslot;
581 }
582 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 if (ep->me_key == key
584 || (ep->me_hash == hash
585 && ep->me_key != dummy
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400586 && unicode_eq(ep->me_key, key))) {
587 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400589 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 if (ep->me_key == dummy && freeslot == NULL)
591 freeslot = ep;
592 }
593 assert(0); /* NOT REACHED */
594 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000595}
596
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400597/* Faster version of lookdict_unicode when it is known that no <dummy> keys
598 * will be present. */
599static PyDictKeyEntry *
600lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
601 Py_hash_t hash, PyObject ***value_addr)
602{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200603 size_t i;
604 size_t perturb;
605 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400606 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200607 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400608
609 /* Make sure this function doesn't have to handle non-unicode keys,
610 including subclasses of str; e.g., one reason to subclass
611 unicodes is to override __eq__, and for speed we don't cater to
612 that here. */
613 if (!PyUnicode_CheckExact(key)) {
614 mp->ma_keys->dk_lookup = lookdict;
615 return lookdict(mp, key, hash, value_addr);
616 }
617 i = (size_t)hash & mask;
618 ep = &ep0[i];
619 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
620 if (ep->me_key == NULL || ep->me_key == key ||
621 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
622 *value_addr = &ep->me_value;
623 return ep;
624 }
625 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
626 i = (i << 2) + i + perturb + 1;
627 ep = &ep0[i & mask];
628 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
629 if (ep->me_key == NULL || ep->me_key == key ||
630 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
631 *value_addr = &ep->me_value;
632 return ep;
633 }
634 }
635 assert(0); /* NOT REACHED */
636 return 0;
637}
638
639/* Version of lookdict for split tables.
640 * All split tables and only split tables use this lookup function.
641 * Split tables only contain unicode keys and no dummy keys,
642 * so algorithm is the same as lookdict_unicode_nodummy.
643 */
644static PyDictKeyEntry *
645lookdict_split(PyDictObject *mp, PyObject *key,
646 Py_hash_t hash, PyObject ***value_addr)
647{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200648 size_t i;
649 size_t perturb;
650 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400651 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200652 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400653
654 if (!PyUnicode_CheckExact(key)) {
Benjamin Petersondb780d02012-04-23 13:44:32 -0400655 ep = lookdict(mp, key, hash, value_addr);
656 /* lookdict expects a combined-table, so fix value_addr */
657 i = ep - ep0;
658 *value_addr = &mp->ma_values[i];
659 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400660 }
661 i = (size_t)hash & mask;
662 ep = &ep0[i];
663 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
664 if (ep->me_key == NULL || ep->me_key == key ||
665 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
666 *value_addr = &mp->ma_values[i];
667 return ep;
668 }
669 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
670 i = (i << 2) + i + perturb + 1;
671 ep = &ep0[i & mask];
672 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
673 if (ep->me_key == NULL || ep->me_key == key ||
674 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
675 *value_addr = &mp->ma_values[i & mask];
676 return ep;
677 }
678 }
679 assert(0); /* NOT REACHED */
680 return 0;
681}
682
Benjamin Petersonfb886362010-04-24 18:21:17 +0000683int
684_PyDict_HasOnlyStringKeys(PyObject *dict)
685{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 Py_ssize_t pos = 0;
687 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +0000688 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 /* Shortcut */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400690 if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 return 1;
692 while (PyDict_Next(dict, &pos, &key, &value))
693 if (!PyUnicode_Check(key))
694 return 0;
695 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +0000696}
697
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000698#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 do { \
700 if (!_PyObject_GC_IS_TRACKED(mp)) { \
701 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
702 _PyObject_GC_MAY_BE_TRACKED(value)) { \
703 _PyObject_GC_TRACK(mp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 } \
705 } \
706 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000707
708void
709_PyDict_MaybeUntrack(PyObject *op)
710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 PyDictObject *mp;
712 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400713 Py_ssize_t i, size;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
716 return;
717
718 mp = (PyDictObject *) op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400719 size = DK_SIZE(mp->ma_keys);
720 if (_PyDict_HasSplitTable(mp)) {
721 for (i = 0; i < size; i++) {
722 if ((value = mp->ma_values[i]) == NULL)
723 continue;
724 if (_PyObject_GC_MAY_BE_TRACKED(value)) {
725 assert(!_PyObject_GC_MAY_BE_TRACKED(
726 mp->ma_keys->dk_entries[i].me_key));
727 return;
728 }
729 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400731 else {
732 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
733 for (i = 0; i < size; i++) {
734 if ((value = ep0[i].me_value) == NULL)
735 continue;
736 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
737 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
738 return;
739 }
740 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000742}
743
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400744/* Internal function to find slot for an item from its hash
745 * when it is known that the key is not present in the dict.
746 */
747static PyDictKeyEntry *
748find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
749 PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000750{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400751 size_t i;
752 size_t perturb;
753 size_t mask = DK_MASK(mp->ma_keys);
754 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
755 PyDictKeyEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000756
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400757 assert(key != NULL);
758 if (!PyUnicode_CheckExact(key))
759 mp->ma_keys->dk_lookup = lookdict;
760 i = hash & mask;
761 ep = &ep0[i];
762 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
763 i = (i << 2) + i + perturb + 1;
764 ep = &ep0[i & mask];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400766 assert(ep->me_value == NULL);
767 if (mp->ma_values)
768 *value_addr = &mp->ma_values[i & mask];
769 else
770 *value_addr = &ep->me_value;
771 return ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000772}
773
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400774static int
775insertion_resize(PyDictObject *mp)
776{
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700777 return dictresize(mp, GROWTH_RATE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400778}
Antoine Pitroue965d972012-02-27 00:45:12 +0100779
780/*
781Internal routine to insert a new item into the table.
782Used both by the internal resize routine and by the public insert routine.
Antoine Pitroue965d972012-02-27 00:45:12 +0100783Returns -1 if an error occurred, or 0 on success.
784*/
785static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400786insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +0100787{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400788 PyObject *old_value;
789 PyObject **value_addr;
790 PyDictKeyEntry *ep;
791 assert(key != dummy);
Antoine Pitroue965d972012-02-27 00:45:12 +0100792
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400793 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
794 if (insertion_resize(mp) < 0)
795 return -1;
796 }
797
798 ep = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr);
Antoine Pitroue965d972012-02-27 00:45:12 +0100799 if (ep == NULL) {
Antoine Pitroue965d972012-02-27 00:45:12 +0100800 return -1;
801 }
Antoine Pitroud6967322014-10-18 00:35:00 +0200802 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400803 Py_INCREF(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400804 MAINTAIN_TRACKING(mp, key, value);
805 old_value = *value_addr;
806 if (old_value != NULL) {
807 assert(ep->me_key != NULL && ep->me_key != dummy);
808 *value_addr = value;
Antoine Pitroud6967322014-10-18 00:35:00 +0200809 Py_DECREF(old_value); /* which **CAN** re-enter (see issue #22653) */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400810 }
811 else {
812 if (ep->me_key == NULL) {
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400813 Py_INCREF(key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400814 if (mp->ma_keys->dk_usable <= 0) {
815 /* Need to resize. */
816 if (insertion_resize(mp) < 0) {
817 Py_DECREF(key);
818 Py_DECREF(value);
819 return -1;
820 }
821 ep = find_empty_slot(mp, key, hash, &value_addr);
822 }
823 mp->ma_keys->dk_usable--;
824 assert(mp->ma_keys->dk_usable >= 0);
825 ep->me_key = key;
826 ep->me_hash = hash;
827 }
828 else {
829 if (ep->me_key == dummy) {
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400830 Py_INCREF(key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400831 ep->me_key = key;
832 ep->me_hash = hash;
833 Py_DECREF(dummy);
834 } else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400835 assert(_PyDict_HasSplitTable(mp));
836 }
837 }
838 mp->ma_used++;
839 *value_addr = value;
Antoine Pitroud6967322014-10-18 00:35:00 +0200840 assert(ep->me_key != NULL && ep->me_key != dummy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400841 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400842 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +0100843}
844
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000845/*
846Internal routine used by dictresize() to insert an item which is
847known to be absent from the dict. This routine also assumes that
848the dict contains no deleted entries. Besides the performance benefit,
849using insertdict() in dictresize() is dangerous (SF bug #1456209).
850Note that no refcounts are changed by this routine; if needed, the caller
851is responsible for incref'ing `key` and `value`.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400852Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
853must set them correctly
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000854*/
855static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400856insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000858{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400859 size_t i;
860 size_t perturb;
861 PyDictKeysObject *k = mp->ma_keys;
862 size_t mask = (size_t)DK_SIZE(k)-1;
863 PyDictKeyEntry *ep0 = &k->dk_entries[0];
864 PyDictKeyEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000865
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400866 assert(k->dk_lookup != NULL);
867 assert(value != NULL);
868 assert(key != NULL);
869 assert(key != dummy);
870 assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
871 i = hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 ep = &ep0[i];
873 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
874 i = (i << 2) + i + perturb + 1;
875 ep = &ep0[i & mask];
876 }
877 assert(ep->me_value == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000879 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000881}
882
883/*
884Restructure the table by allocating a new table and reinserting all
885items again. When entries have been deleted, the new table may
886actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400887If a table is split (its keys and hashes are shared, its values are not),
888then the values are temporarily copied into the table, it is resized as
889a combined table, then the me_value slots in the old table are NULLed out.
890After resizing a table is always combined,
891but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000892*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000893static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000894dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000895{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 Py_ssize_t newsize;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400897 PyDictKeysObject *oldkeys;
898 PyObject **oldvalues;
899 Py_ssize_t i, oldsize;
Tim Peters91a364d2001-05-19 07:04:38 +0000900
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400901/* Find the smallest table size > minused. */
902 for (newsize = PyDict_MINSIZE_COMBINED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 newsize <= minused && newsize > 0;
904 newsize <<= 1)
905 ;
906 if (newsize <= 0) {
907 PyErr_NoMemory();
908 return -1;
909 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400910 oldkeys = mp->ma_keys;
911 oldvalues = mp->ma_values;
912 /* Allocate a new table. */
913 mp->ma_keys = new_keys_object(newsize);
914 if (mp->ma_keys == NULL) {
915 mp->ma_keys = oldkeys;
916 return -1;
917 }
918 if (oldkeys->dk_lookup == lookdict)
919 mp->ma_keys->dk_lookup = lookdict;
920 oldsize = DK_SIZE(oldkeys);
921 mp->ma_values = NULL;
922 /* If empty then nothing to copy so just return */
923 if (oldsize == 1) {
924 assert(oldkeys == Py_EMPTY_KEYS);
925 DK_DECREF(oldkeys);
926 return 0;
927 }
928 /* Main loop below assumes we can transfer refcount to new keys
929 * and that value is stored in me_value.
930 * Increment ref-counts and copy values here to compensate
931 * This (resizing a split table) should be relatively rare */
932 if (oldvalues != NULL) {
933 for (i = 0; i < oldsize; i++) {
934 if (oldvalues[i] != NULL) {
935 Py_INCREF(oldkeys->dk_entries[i].me_key);
936 oldkeys->dk_entries[i].me_value = oldvalues[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 }
939 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400940 /* Main loop */
941 for (i = 0; i < oldsize; i++) {
942 PyDictKeyEntry *ep = &oldkeys->dk_entries[i];
943 if (ep->me_value != NULL) {
944 assert(ep->me_key != dummy);
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000945 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400948 mp->ma_keys->dk_usable -= mp->ma_used;
949 if (oldvalues != NULL) {
950 /* NULL out me_value slot in oldkeys, in case it was shared */
951 for (i = 0; i < oldsize; i++)
952 oldkeys->dk_entries[i].me_value = NULL;
953 assert(oldvalues != empty_values);
954 free_values(oldvalues);
955 DK_DECREF(oldkeys);
956 }
957 else {
958 assert(oldkeys->dk_lookup != lookdict_split);
959 if (oldkeys->dk_lookup != lookdict_unicode_nodummy) {
960 PyDictKeyEntry *ep0 = &oldkeys->dk_entries[0];
961 for (i = 0; i < oldsize; i++) {
962 if (ep0[i].me_key == dummy)
963 Py_DECREF(dummy);
964 }
965 }
966 assert(oldkeys->dk_refcnt == 1);
Raymond Hettingerce5179f2016-01-31 08:56:21 -0800967 DK_DEBUG_DECREF PyObject_FREE(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400968 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000970}
971
Benjamin Peterson15ee8212012-04-24 14:44:18 -0400972/* Returns NULL if unable to split table.
973 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400974static PyDictKeysObject *
975make_keys_shared(PyObject *op)
976{
977 Py_ssize_t i;
978 Py_ssize_t size;
979 PyDictObject *mp = (PyDictObject *)op;
980
Benjamin Peterson15ee8212012-04-24 14:44:18 -0400981 if (!PyDict_CheckExact(op))
982 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400983 if (!_PyDict_HasSplitTable(mp)) {
984 PyDictKeyEntry *ep0;
985 PyObject **values;
986 assert(mp->ma_keys->dk_refcnt == 1);
987 if (mp->ma_keys->dk_lookup == lookdict) {
988 return NULL;
989 }
990 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
991 /* Remove dummy keys */
992 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
993 return NULL;
994 }
995 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
996 /* Copy values into a new array */
997 ep0 = &mp->ma_keys->dk_entries[0];
998 size = DK_SIZE(mp->ma_keys);
999 values = new_values(size);
1000 if (values == NULL) {
1001 PyErr_SetString(PyExc_MemoryError,
1002 "Not enough memory to allocate new values array");
1003 return NULL;
1004 }
1005 for (i = 0; i < size; i++) {
1006 values[i] = ep0[i].me_value;
1007 ep0[i].me_value = NULL;
1008 }
1009 mp->ma_keys->dk_lookup = lookdict_split;
1010 mp->ma_values = values;
1011 }
1012 DK_INCREF(mp->ma_keys);
1013 return mp->ma_keys;
1014}
Christian Heimes99170a52007-12-19 02:07:34 +00001015
1016PyObject *
1017_PyDict_NewPresized(Py_ssize_t minused)
1018{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001019 Py_ssize_t newsize;
1020 PyDictKeysObject *new_keys;
1021 for (newsize = PyDict_MINSIZE_COMBINED;
1022 newsize <= minused && newsize > 0;
1023 newsize <<= 1)
1024 ;
1025 new_keys = new_keys_object(newsize);
1026 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001028 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001029}
1030
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001031/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1032 * that may occur (originally dicts supported only string keys, and exceptions
1033 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001034 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001035 * (suppressed) occurred while computing the key's hash, or that some error
1036 * (suppressed) occurred when comparing keys in the dict's internal probe
1037 * sequence. A nasty example of the latter is when a Python-coded comparison
1038 * function hits a stack-depth error, which can cause this to return NULL
1039 * even if the key is present.
1040 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001042PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001043{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001044 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001046 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001048 PyObject **value_addr;
1049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 if (!PyDict_Check(op))
1051 return NULL;
1052 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001053 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 {
1055 hash = PyObject_Hash(key);
1056 if (hash == -1) {
1057 PyErr_Clear();
1058 return NULL;
1059 }
1060 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 /* We can arrive here with a NULL tstate during initialization: try
1063 running "python -Wi" for an example related to string interning.
1064 Let's just hope that no exception occurs then... This must be
1065 _PyThreadState_Current and not PyThreadState_GET() because in debug
1066 mode, the latter complains if tstate is NULL. */
Victor Stinnerbfd316e2016-01-20 11:12:38 +01001067 tstate = _PyThreadState_UncheckedGet();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 if (tstate != NULL && tstate->curexc_type != NULL) {
1069 /* preserve the existing exception */
1070 PyObject *err_type, *err_value, *err_tb;
1071 PyErr_Fetch(&err_type, &err_value, &err_tb);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001072 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 /* ignore errors */
1074 PyErr_Restore(err_type, err_value, err_tb);
1075 if (ep == NULL)
1076 return NULL;
1077 }
1078 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001079 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 if (ep == NULL) {
1081 PyErr_Clear();
1082 return NULL;
1083 }
1084 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001085 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001086}
1087
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001088PyObject *
1089_PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1090{
1091 PyDictObject *mp = (PyDictObject *)op;
1092 PyDictKeyEntry *ep;
1093 PyThreadState *tstate;
1094 PyObject **value_addr;
1095
1096 if (!PyDict_Check(op))
1097 return NULL;
1098
1099 /* We can arrive here with a NULL tstate during initialization: try
1100 running "python -Wi" for an example related to string interning.
1101 Let's just hope that no exception occurs then... This must be
1102 _PyThreadState_Current and not PyThreadState_GET() because in debug
1103 mode, the latter complains if tstate is NULL. */
Victor Stinnerbfd316e2016-01-20 11:12:38 +01001104 tstate = _PyThreadState_UncheckedGet();
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001105 if (tstate != NULL && tstate->curexc_type != NULL) {
1106 /* preserve the existing exception */
1107 PyObject *err_type, *err_value, *err_tb;
1108 PyErr_Fetch(&err_type, &err_value, &err_tb);
1109 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
1110 /* ignore errors */
1111 PyErr_Restore(err_type, err_value, err_tb);
1112 if (ep == NULL)
1113 return NULL;
1114 }
1115 else {
1116 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
1117 if (ep == NULL) {
1118 PyErr_Clear();
1119 return NULL;
1120 }
1121 }
1122 return *value_addr;
1123}
1124
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001125/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1126 This returns NULL *with* an exception set if an exception occurred.
1127 It returns NULL *without* an exception set if the key wasn't present.
1128*/
1129PyObject *
1130PyDict_GetItemWithError(PyObject *op, PyObject *key)
1131{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001132 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001134 PyDictKeyEntry *ep;
1135 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 if (!PyDict_Check(op)) {
1138 PyErr_BadInternalCall();
1139 return NULL;
1140 }
1141 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001142 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 {
1144 hash = PyObject_Hash(key);
1145 if (hash == -1) {
1146 return NULL;
1147 }
1148 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001149
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001150 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 if (ep == NULL)
1152 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001153 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001154}
1155
Brett Cannonfd074152012-04-14 14:10:13 -04001156PyObject *
1157_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1158{
1159 PyObject *kv;
1160 kv = _PyUnicode_FromId(key); /* borrowed */
1161 if (kv == NULL)
1162 return NULL;
1163 return PyDict_GetItemWithError(dp, kv);
1164}
1165
Victor Stinnerb4efc962015-11-20 09:24:02 +01001166/* Fast version of global value lookup (LOAD_GLOBAL).
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001167 * Lookup in globals, then builtins.
Victor Stinnerb4efc962015-11-20 09:24:02 +01001168 *
1169 * Raise an exception and return NULL if an error occurred (ex: computing the
1170 * key hash failed, key comparison failed, ...). Return NULL if the key doesn't
1171 * exist. Return the value if the key exists.
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001172 */
1173PyObject *
1174_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001175{
Victor Stinnerb4efc962015-11-20 09:24:02 +01001176 Py_hash_t hash;
1177 PyDictKeyEntry *entry;
1178 PyObject **value_addr;
1179 PyObject *value;
1180
1181 if (!PyUnicode_CheckExact(key) ||
1182 (hash = ((PyASCIIObject *) key)->hash) == -1)
1183 {
1184 hash = PyObject_Hash(key);
1185 if (hash == -1)
1186 return NULL;
Antoine Pitroue965d972012-02-27 00:45:12 +01001187 }
Victor Stinnerb4efc962015-11-20 09:24:02 +01001188
1189 /* namespace 1: globals */
1190 entry = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr);
1191 if (entry == NULL)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001192 return NULL;
Victor Stinnerb4efc962015-11-20 09:24:02 +01001193 value = *value_addr;
1194 if (value != NULL)
1195 return value;
1196
1197 /* namespace 2: builtins */
1198 entry = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr);
1199 if (entry == NULL)
1200 return NULL;
1201 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001202}
1203
Antoine Pitroue965d972012-02-27 00:45:12 +01001204/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1205 * dictionary if it's merely replacing the value for an existing key.
1206 * This means that it's safe to loop over a dictionary with PyDict_Next()
1207 * and occasionally replace a value -- but you can't insert new keys or
1208 * remove them.
1209 */
1210int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001211PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001212{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001213 PyDictObject *mp;
1214 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001215 if (!PyDict_Check(op)) {
1216 PyErr_BadInternalCall();
1217 return -1;
1218 }
1219 assert(key);
1220 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001221 mp = (PyDictObject *)op;
1222 if (!PyUnicode_CheckExact(key) ||
1223 (hash = ((PyASCIIObject *) key)->hash) == -1)
1224 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001225 hash = PyObject_Hash(key);
1226 if (hash == -1)
1227 return -1;
1228 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001229
1230 /* insertdict() handles any resizing that might be necessary */
1231 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001232}
1233
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001234int
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001235_PyDict_SetItem_KnownHash(PyObject *op, PyObject *key, PyObject *value,
1236 Py_hash_t hash)
1237{
1238 PyDictObject *mp;
1239
1240 if (!PyDict_Check(op)) {
1241 PyErr_BadInternalCall();
1242 return -1;
1243 }
1244 assert(key);
1245 assert(value);
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001246 assert(hash != -1);
Raymond Hettinger4b74fba2014-05-03 16:32:11 -07001247 mp = (PyDictObject *)op;
1248
1249 /* insertdict() handles any resizing that might be necessary */
1250 return insertdict(mp, key, hash, value);
1251}
1252
1253int
Tim Peters1f5871e2000-07-04 17:44:48 +00001254PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001255{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001256 PyDictObject *mp;
1257 Py_hash_t hash;
1258 PyDictKeyEntry *ep;
1259 PyObject *old_key, *old_value;
1260 PyObject **value_addr;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 if (!PyDict_Check(op)) {
1263 PyErr_BadInternalCall();
1264 return -1;
1265 }
1266 assert(key);
1267 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001268 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 hash = PyObject_Hash(key);
1270 if (hash == -1)
1271 return -1;
1272 }
1273 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001274 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 if (ep == NULL)
1276 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001277 if (*value_addr == NULL) {
Raymond Hettinger69492da2013-09-02 15:59:26 -07001278 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 return -1;
1280 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001281 old_value = *value_addr;
1282 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001284 if (!_PyDict_HasSplitTable(mp)) {
1285 ENSURE_ALLOWS_DELETIONS(mp);
1286 old_key = ep->me_key;
1287 Py_INCREF(dummy);
1288 ep->me_key = dummy;
1289 Py_DECREF(old_key);
1290 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001293}
1294
Serhiy Storchakab9d98d52015-10-02 12:47:11 +03001295int
1296_PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
1297{
1298 PyDictObject *mp;
1299 PyDictKeyEntry *ep;
1300 PyObject *old_key, *old_value;
1301 PyObject **value_addr;
1302
1303 if (!PyDict_Check(op)) {
1304 PyErr_BadInternalCall();
1305 return -1;
1306 }
1307 assert(key);
1308 assert(hash != -1);
1309 mp = (PyDictObject *)op;
1310 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
1311 if (ep == NULL)
1312 return -1;
1313 if (*value_addr == NULL) {
1314 _PyErr_SetKeyError(key);
1315 return -1;
1316 }
1317 old_value = *value_addr;
1318 *value_addr = NULL;
1319 mp->ma_used--;
1320 if (!_PyDict_HasSplitTable(mp)) {
1321 ENSURE_ALLOWS_DELETIONS(mp);
1322 old_key = ep->me_key;
1323 Py_INCREF(dummy);
1324 ep->me_key = dummy;
1325 Py_DECREF(old_key);
1326 }
1327 Py_DECREF(old_value);
1328 return 0;
1329}
1330
Guido van Rossum25831651993-05-19 14:50:45 +00001331void
Tim Peters1f5871e2000-07-04 17:44:48 +00001332PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001335 PyDictKeysObject *oldkeys;
1336 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 if (!PyDict_Check(op))
1340 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001341 mp = ((PyDictObject *)op);
1342 oldkeys = mp->ma_keys;
1343 oldvalues = mp->ma_values;
1344 if (oldvalues == empty_values)
1345 return;
1346 /* Empty the dict... */
1347 DK_INCREF(Py_EMPTY_KEYS);
1348 mp->ma_keys = Py_EMPTY_KEYS;
1349 mp->ma_values = empty_values;
1350 mp->ma_used = 0;
1351 /* ...then clear the keys and values */
1352 if (oldvalues != NULL) {
1353 n = DK_SIZE(oldkeys);
1354 for (i = 0; i < n; i++)
1355 Py_CLEAR(oldvalues[i]);
1356 free_values(oldvalues);
1357 DK_DECREF(oldkeys);
1358 }
1359 else {
1360 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001361 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001362 }
1363}
1364
1365/* Returns -1 if no more items (or op is not a dict),
1366 * index of item otherwise. Stores value in pvalue
1367 */
1368Py_LOCAL_INLINE(Py_ssize_t)
1369dict_next(PyObject *op, Py_ssize_t i, PyObject **pvalue)
1370{
1371 Py_ssize_t mask, offset;
1372 PyDictObject *mp;
1373 PyObject **value_ptr;
1374
1375
1376 if (!PyDict_Check(op))
1377 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001379 if (i < 0)
1380 return -1;
1381 if (mp->ma_values) {
1382 value_ptr = &mp->ma_values[i];
1383 offset = sizeof(PyObject *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001385 else {
1386 value_ptr = &mp->ma_keys->dk_entries[i].me_value;
1387 offset = sizeof(PyDictKeyEntry);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001389 mask = DK_MASK(mp->ma_keys);
1390 while (i <= mask && *value_ptr == NULL) {
1391 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1392 i++;
1393 }
1394 if (i > mask)
1395 return -1;
1396 if (pvalue)
1397 *pvalue = *value_ptr;
1398 return i;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001399}
1400
Tim Peters080c88b2003-02-15 03:01:11 +00001401/*
1402 * Iterate over a dict. Use like so:
1403 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001404 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001405 * PyObject *key, *value;
1406 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001407 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +00001408 * Refer to borrowed references in key and value.
1409 * }
1410 *
1411 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001412 * mutates the dict. One exception: it is safe if the loop merely changes
1413 * the values associated with the keys (but doesn't insert new keys or
1414 * delete keys), via PyDict_SetItem().
1415 */
Guido van Rossum25831651993-05-19 14:50:45 +00001416int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001417PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001418{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001419 PyDictObject *mp;
1420 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 if (i < 0)
1422 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001423 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 *ppos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001426 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001428}
1429
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001430/* Internal version of PyDict_Next that returns a hash value in addition
1431 * to the key and value.
1432 */
Thomas Wouterscf297e42007-02-23 15:07:44 +00001433int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001434_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1435 PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001436{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001437 PyDictObject *mp;
1438 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 if (i < 0)
1440 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001441 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 *ppos = i+1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001443 *phash = mp->ma_keys->dk_entries[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001445 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001447}
1448
Eric Snow96c6af92015-05-29 22:21:39 -06001449/* Internal version of dict.pop(). */
1450PyObject *
1451_PyDict_Pop(PyDictObject *mp, PyObject *key, PyObject *deflt)
1452{
1453 Py_hash_t hash;
1454 PyObject *old_value, *old_key;
1455 PyDictKeyEntry *ep;
1456 PyObject **value_addr;
1457
1458 if (mp->ma_used == 0) {
1459 if (deflt) {
1460 Py_INCREF(deflt);
1461 return deflt;
1462 }
1463 _PyErr_SetKeyError(key);
1464 return NULL;
1465 }
1466 if (!PyUnicode_CheckExact(key) ||
1467 (hash = ((PyASCIIObject *) key)->hash) == -1) {
1468 hash = PyObject_Hash(key);
1469 if (hash == -1)
1470 return NULL;
1471 }
1472 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
1473 if (ep == NULL)
1474 return NULL;
1475 old_value = *value_addr;
1476 if (old_value == NULL) {
1477 if (deflt) {
1478 Py_INCREF(deflt);
1479 return deflt;
1480 }
1481 _PyErr_SetKeyError(key);
1482 return NULL;
1483 }
1484 *value_addr = NULL;
1485 mp->ma_used--;
1486 if (!_PyDict_HasSplitTable(mp)) {
1487 ENSURE_ALLOWS_DELETIONS(mp);
1488 old_key = ep->me_key;
1489 Py_INCREF(dummy);
1490 ep->me_key = dummy;
1491 Py_DECREF(old_key);
1492 }
1493 return old_value;
1494}
1495
1496/* Internal version of dict.from_keys(). It is subclass-friendly. */
1497PyObject *
1498_PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
1499{
1500 PyObject *it; /* iter(iterable) */
1501 PyObject *key;
1502 PyObject *d;
1503 int status;
1504
1505 d = PyObject_CallObject(cls, NULL);
1506 if (d == NULL)
1507 return NULL;
1508
1509 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
1510 if (PyDict_CheckExact(iterable)) {
1511 PyDictObject *mp = (PyDictObject *)d;
1512 PyObject *oldvalue;
1513 Py_ssize_t pos = 0;
1514 PyObject *key;
1515 Py_hash_t hash;
1516
1517 if (dictresize(mp, Py_SIZE(iterable))) {
1518 Py_DECREF(d);
1519 return NULL;
1520 }
1521
1522 while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) {
1523 if (insertdict(mp, key, hash, value)) {
1524 Py_DECREF(d);
1525 return NULL;
1526 }
1527 }
1528 return d;
1529 }
1530 if (PyAnySet_CheckExact(iterable)) {
1531 PyDictObject *mp = (PyDictObject *)d;
1532 Py_ssize_t pos = 0;
1533 PyObject *key;
1534 Py_hash_t hash;
1535
1536 if (dictresize(mp, PySet_GET_SIZE(iterable))) {
1537 Py_DECREF(d);
1538 return NULL;
1539 }
1540
1541 while (_PySet_NextEntry(iterable, &pos, &key, &hash)) {
1542 if (insertdict(mp, key, hash, value)) {
1543 Py_DECREF(d);
1544 return NULL;
1545 }
1546 }
1547 return d;
1548 }
1549 }
1550
1551 it = PyObject_GetIter(iterable);
1552 if (it == NULL){
1553 Py_DECREF(d);
1554 return NULL;
1555 }
1556
1557 if (PyDict_CheckExact(d)) {
1558 while ((key = PyIter_Next(it)) != NULL) {
1559 status = PyDict_SetItem(d, key, value);
1560 Py_DECREF(key);
1561 if (status < 0)
1562 goto Fail;
1563 }
1564 } else {
1565 while ((key = PyIter_Next(it)) != NULL) {
1566 status = PyObject_SetItem(d, key, value);
1567 Py_DECREF(key);
1568 if (status < 0)
1569 goto Fail;
1570 }
1571 }
1572
1573 if (PyErr_Occurred())
1574 goto Fail;
1575 Py_DECREF(it);
1576 return d;
1577
1578Fail:
1579 Py_DECREF(it);
1580 Py_DECREF(d);
1581 return NULL;
1582}
1583
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001584/* Methods */
1585
1586static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001587dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001588{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001589 PyObject **values = mp->ma_values;
1590 PyDictKeysObject *keys = mp->ma_keys;
1591 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 PyObject_GC_UnTrack(mp);
1593 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001594 if (values != NULL) {
1595 if (values != empty_values) {
1596 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
1597 Py_XDECREF(values[i]);
1598 }
1599 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001601 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02001603 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001604 assert(keys->dk_refcnt == 1);
1605 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001606 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1608 free_list[numfree++] = mp;
1609 else
1610 Py_TYPE(mp)->tp_free((PyObject *)mp);
1611 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001612}
1613
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001614
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001615static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001616dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001619 PyObject *key = NULL, *value = NULL;
1620 _PyUnicodeWriter writer;
1621 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00001622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 i = Py_ReprEnter((PyObject *)mp);
1624 if (i != 0) {
1625 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1626 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001629 Py_ReprLeave((PyObject *)mp);
1630 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 }
Tim Petersa7259592001-06-16 05:11:17 +00001632
Victor Stinnerf91929b2013-11-19 13:07:38 +01001633 _PyUnicodeWriter_Init(&writer);
1634 writer.overallocate = 1;
1635 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
1636 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00001637
Victor Stinnerf91929b2013-11-19 13:07:38 +01001638 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
1639 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 /* Do repr() on each key+value pair, and insert ": " between them.
1642 Note that repr may mutate the dict. */
1643 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001644 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001646 PyObject *s;
1647 int res;
1648
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001649 /* Prevent repr from deleting key or value during key format. */
1650 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02001652
Victor Stinnerf91929b2013-11-19 13:07:38 +01001653 if (!first) {
1654 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
1655 goto error;
1656 }
1657 first = 0;
1658
1659 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01001661 goto error;
1662 res = _PyUnicodeWriter_WriteStr(&writer, s);
1663 Py_DECREF(s);
1664 if (res < 0)
1665 goto error;
1666
1667 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
1668 goto error;
1669
1670 s = PyObject_Repr(value);
1671 if (s == NULL)
1672 goto error;
1673 res = _PyUnicodeWriter_WriteStr(&writer, s);
1674 Py_DECREF(s);
1675 if (res < 0)
1676 goto error;
1677
1678 Py_CLEAR(key);
1679 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 }
Tim Petersa7259592001-06-16 05:11:17 +00001681
Victor Stinnerf91929b2013-11-19 13:07:38 +01001682 writer.overallocate = 0;
1683 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
1684 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01001687
1688 return _PyUnicodeWriter_Finish(&writer);
1689
1690error:
1691 Py_ReprLeave((PyObject *)mp);
1692 _PyUnicodeWriter_Dealloc(&writer);
1693 Py_XDECREF(key);
1694 Py_XDECREF(value);
1695 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001696}
1697
Martin v. Löwis18e16552006-02-15 17:27:45 +00001698static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001699dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001702}
1703
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001704static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001705dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 PyObject *v;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001708 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001709 PyDictKeyEntry *ep;
1710 PyObject **value_addr;
1711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001713 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 hash = PyObject_Hash(key);
1715 if (hash == -1)
1716 return NULL;
1717 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001718 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 if (ep == NULL)
1720 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001721 v = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 if (v == NULL) {
1723 if (!PyDict_CheckExact(mp)) {
1724 /* Look up __missing__ method if we're a subclass. */
1725 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05001726 _Py_IDENTIFIER(__missing__);
1727 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 if (missing != NULL) {
1729 res = PyObject_CallFunctionObjArgs(missing,
1730 key, NULL);
1731 Py_DECREF(missing);
1732 return res;
1733 }
1734 else if (PyErr_Occurred())
1735 return NULL;
1736 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07001737 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 return NULL;
1739 }
1740 else
1741 Py_INCREF(v);
1742 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001743}
1744
1745static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001746dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001747{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 if (w == NULL)
1749 return PyDict_DelItem((PyObject *)mp, v);
1750 else
1751 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001752}
1753
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001754static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 (lenfunc)dict_length, /*mp_length*/
1756 (binaryfunc)dict_subscript, /*mp_subscript*/
1757 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001758};
1759
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001760static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001761dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001762{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001763 PyObject *v;
1764 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001765 PyDictKeyEntry *ep;
1766 Py_ssize_t size, n, offset;
1767 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001768
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001769 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 n = mp->ma_used;
1771 v = PyList_New(n);
1772 if (v == NULL)
1773 return NULL;
1774 if (n != mp->ma_used) {
1775 /* Durnit. The allocations caused the dict to resize.
1776 * Just start over, this shouldn't normally happen.
1777 */
1778 Py_DECREF(v);
1779 goto again;
1780 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001781 ep = &mp->ma_keys->dk_entries[0];
1782 size = DK_SIZE(mp->ma_keys);
1783 if (mp->ma_values) {
1784 value_ptr = mp->ma_values;
1785 offset = sizeof(PyObject *);
1786 }
1787 else {
1788 value_ptr = &ep[0].me_value;
1789 offset = sizeof(PyDictKeyEntry);
1790 }
1791 for (i = 0, j = 0; i < size; i++) {
1792 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 PyObject *key = ep[i].me_key;
1794 Py_INCREF(key);
1795 PyList_SET_ITEM(v, j, key);
1796 j++;
1797 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001798 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 }
1800 assert(j == n);
1801 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001802}
1803
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001804static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001805dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001806{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001807 PyObject *v;
1808 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001809 Py_ssize_t size, n, offset;
1810 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001811
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001812 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 n = mp->ma_used;
1814 v = PyList_New(n);
1815 if (v == NULL)
1816 return NULL;
1817 if (n != mp->ma_used) {
1818 /* Durnit. The allocations caused the dict to resize.
1819 * Just start over, this shouldn't normally happen.
1820 */
1821 Py_DECREF(v);
1822 goto again;
1823 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001824 size = DK_SIZE(mp->ma_keys);
1825 if (mp->ma_values) {
1826 value_ptr = mp->ma_values;
1827 offset = sizeof(PyObject *);
1828 }
1829 else {
1830 value_ptr = &mp->ma_keys->dk_entries[0].me_value;
1831 offset = sizeof(PyDictKeyEntry);
1832 }
1833 for (i = 0, j = 0; i < size; i++) {
1834 PyObject *value = *value_ptr;
1835 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1836 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 Py_INCREF(value);
1838 PyList_SET_ITEM(v, j, value);
1839 j++;
1840 }
1841 }
1842 assert(j == n);
1843 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001844}
1845
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001846static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001847dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001848{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001849 PyObject *v;
1850 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001851 Py_ssize_t size, offset;
1852 PyObject *item, *key;
1853 PyDictKeyEntry *ep;
1854 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 /* Preallocate the list of tuples, to avoid allocations during
1857 * the loop over the items, which could trigger GC, which
1858 * could resize the dict. :-(
1859 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001860 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 n = mp->ma_used;
1862 v = PyList_New(n);
1863 if (v == NULL)
1864 return NULL;
1865 for (i = 0; i < n; i++) {
1866 item = PyTuple_New(2);
1867 if (item == NULL) {
1868 Py_DECREF(v);
1869 return NULL;
1870 }
1871 PyList_SET_ITEM(v, i, item);
1872 }
1873 if (n != mp->ma_used) {
1874 /* Durnit. The allocations caused the dict to resize.
1875 * Just start over, this shouldn't normally happen.
1876 */
1877 Py_DECREF(v);
1878 goto again;
1879 }
1880 /* Nothing we do below makes any function calls. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001881 ep = mp->ma_keys->dk_entries;
1882 size = DK_SIZE(mp->ma_keys);
1883 if (mp->ma_values) {
1884 value_ptr = mp->ma_values;
1885 offset = sizeof(PyObject *);
1886 }
1887 else {
1888 value_ptr = &ep[0].me_value;
1889 offset = sizeof(PyDictKeyEntry);
1890 }
1891 for (i = 0, j = 0; i < size; i++) {
1892 PyObject *value = *value_ptr;
1893 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1894 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 key = ep[i].me_key;
1896 item = PyList_GET_ITEM(v, j);
1897 Py_INCREF(key);
1898 PyTuple_SET_ITEM(item, 0, key);
1899 Py_INCREF(value);
1900 PyTuple_SET_ITEM(item, 1, value);
1901 j++;
1902 }
1903 }
1904 assert(j == n);
1905 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001906}
1907
Larry Hastings5c661892014-01-24 06:17:25 -08001908/*[clinic input]
1909@classmethod
1910dict.fromkeys
Larry Hastings5c661892014-01-24 06:17:25 -08001911 iterable: object
1912 value: object=None
1913 /
1914
1915Returns a new dict with keys from iterable and values equal to value.
1916[clinic start generated code]*/
1917
Larry Hastings5c661892014-01-24 06:17:25 -08001918static PyObject *
1919dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001920/*[clinic end generated code: output=8fb98e4b10384999 input=b85a667f9bf4669d]*/
Larry Hastings5c661892014-01-24 06:17:25 -08001921{
Eric Snow96c6af92015-05-29 22:21:39 -06001922 return _PyDict_FromKeys((PyObject *)type, iterable, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001923}
1924
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001925static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001926dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, const char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 PyObject *arg = NULL;
1929 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1932 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001935 _Py_IDENTIFIER(keys);
1936 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 result = PyDict_Merge(self, arg, 1);
1938 else
1939 result = PyDict_MergeFromSeq2(self, arg, 1);
1940 }
1941 if (result == 0 && kwds != NULL) {
1942 if (PyArg_ValidateKeywordArguments(kwds))
1943 result = PyDict_Merge(self, kwds, 1);
1944 else
1945 result = -1;
1946 }
1947 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001948}
1949
1950static PyObject *
1951dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 if (dict_update_common(self, args, kwds, "update") != -1)
1954 Py_RETURN_NONE;
1955 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001956}
1957
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001958/* Update unconditionally replaces existing items.
1959 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001960 otherwise it leaves existing items unchanged.
1961
1962 PyDict_{Update,Merge} update/merge from a mapping object.
1963
Tim Petersf582b822001-12-11 18:51:08 +00001964 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001965 producing iterable objects of length 2.
1966*/
1967
Tim Petersf582b822001-12-11 18:51:08 +00001968int
Tim Peters1fc240e2001-10-26 05:06:50 +00001969PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1970{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 PyObject *it; /* iter(seq2) */
1972 Py_ssize_t i; /* index into seq2 of current element */
1973 PyObject *item; /* seq2[i] */
1974 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 assert(d != NULL);
1977 assert(PyDict_Check(d));
1978 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 it = PyObject_GetIter(seq2);
1981 if (it == NULL)
1982 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 for (i = 0; ; ++i) {
1985 PyObject *key, *value;
1986 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 fast = NULL;
1989 item = PyIter_Next(it);
1990 if (item == NULL) {
1991 if (PyErr_Occurred())
1992 goto Fail;
1993 break;
1994 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 /* Convert item to sequence, and verify length 2. */
1997 fast = PySequence_Fast(item, "");
1998 if (fast == NULL) {
1999 if (PyErr_ExceptionMatches(PyExc_TypeError))
2000 PyErr_Format(PyExc_TypeError,
2001 "cannot convert dictionary update "
2002 "sequence element #%zd to a sequence",
2003 i);
2004 goto Fail;
2005 }
2006 n = PySequence_Fast_GET_SIZE(fast);
2007 if (n != 2) {
2008 PyErr_Format(PyExc_ValueError,
2009 "dictionary update sequence element #%zd "
2010 "has length %zd; 2 is required",
2011 i, n);
2012 goto Fail;
2013 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 /* Update/merge with this (key, value) pair. */
2016 key = PySequence_Fast_GET_ITEM(fast, 0);
2017 value = PySequence_Fast_GET_ITEM(fast, 1);
2018 if (override || PyDict_GetItem(d, key) == NULL) {
2019 int status = PyDict_SetItem(d, key, value);
2020 if (status < 0)
2021 goto Fail;
2022 }
2023 Py_DECREF(fast);
2024 Py_DECREF(item);
2025 }
Tim Peters1fc240e2001-10-26 05:06:50 +00002026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 i = 0;
2028 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00002029Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 Py_XDECREF(item);
2031 Py_XDECREF(fast);
2032 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00002033Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 Py_DECREF(it);
2035 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00002036}
2037
Tim Peters6d6c1a32001-08-02 04:15:00 +00002038int
2039PyDict_Update(PyObject *a, PyObject *b)
2040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00002042}
2043
2044int
2045PyDict_Merge(PyObject *a, PyObject *b, int override)
2046{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002047 PyDictObject *mp, *other;
2048 Py_ssize_t i, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002049 PyDictKeyEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 /* We accept for the argument either a concrete dictionary object,
2052 * or an abstract "mapping" object. For the former, we can do
2053 * things quite efficiently. For the latter, we only require that
2054 * PyMapping_Keys() and PyObject_GetItem() be supported.
2055 */
2056 if (a == NULL || !PyDict_Check(a) || b == NULL) {
2057 PyErr_BadInternalCall();
2058 return -1;
2059 }
2060 mp = (PyDictObject*)a;
2061 if (PyDict_Check(b)) {
2062 other = (PyDictObject*)b;
2063 if (other == mp || other->ma_used == 0)
2064 /* a.update(a) or a.update({}); nothing to do */
2065 return 0;
2066 if (mp->ma_used == 0)
2067 /* Since the target dict is empty, PyDict_GetItem()
2068 * always returns NULL. Setting override to 1
2069 * skips the unnecessary test.
2070 */
2071 override = 1;
2072 /* Do one big resize at the start, rather than
2073 * incrementally resizing as we insert new items. Expect
2074 * that there will be no (or few) overlapping keys.
2075 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002076 if (mp->ma_keys->dk_usable * 3 < other->ma_used * 2)
2077 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002079 for (i = 0, n = DK_SIZE(other->ma_keys); i < n; i++) {
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002080 PyObject *key, *value;
2081 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002082 entry = &other->ma_keys->dk_entries[i];
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002083 key = entry->me_key;
2084 hash = entry->me_hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002085 if (other->ma_values)
2086 value = other->ma_values[i];
2087 else
2088 value = entry->me_value;
2089
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002090 if (value != NULL) {
2091 int err = 0;
2092 Py_INCREF(key);
2093 Py_INCREF(value);
2094 if (override || PyDict_GetItem(a, key) == NULL)
2095 err = insertdict(mp, key, hash, value);
2096 Py_DECREF(value);
2097 Py_DECREF(key);
2098 if (err != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 return -1;
Benjamin Petersona82f77f2015-07-04 19:55:16 -05002100
2101 if (n != DK_SIZE(other->ma_keys)) {
2102 PyErr_SetString(PyExc_RuntimeError,
2103 "dict mutated during update");
2104 return -1;
2105 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 }
2107 }
2108 }
2109 else {
2110 /* Do it the generic, slower way */
2111 PyObject *keys = PyMapping_Keys(b);
2112 PyObject *iter;
2113 PyObject *key, *value;
2114 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 if (keys == NULL)
2117 /* Docstring says this is equivalent to E.keys() so
2118 * if E doesn't have a .keys() method we want
2119 * AttributeError to percolate up. Might as well
2120 * do the same for any other error.
2121 */
2122 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 iter = PyObject_GetIter(keys);
2125 Py_DECREF(keys);
2126 if (iter == NULL)
2127 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
2130 if (!override && PyDict_GetItem(a, key) != NULL) {
2131 Py_DECREF(key);
2132 continue;
2133 }
2134 value = PyObject_GetItem(b, key);
2135 if (value == NULL) {
2136 Py_DECREF(iter);
2137 Py_DECREF(key);
2138 return -1;
2139 }
2140 status = PyDict_SetItem(a, key, value);
2141 Py_DECREF(key);
2142 Py_DECREF(value);
2143 if (status < 0) {
2144 Py_DECREF(iter);
2145 return -1;
2146 }
2147 }
2148 Py_DECREF(iter);
2149 if (PyErr_Occurred())
2150 /* Iterator completed, via error */
2151 return -1;
2152 }
2153 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002154}
2155
2156static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002157dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002160}
2161
2162PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002163PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002166 PyDictObject *mp;
2167 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 if (o == NULL || !PyDict_Check(o)) {
2170 PyErr_BadInternalCall();
2171 return NULL;
2172 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002173 mp = (PyDictObject *)o;
2174 if (_PyDict_HasSplitTable(mp)) {
2175 PyDictObject *split_copy;
2176 PyObject **newvalues = new_values(DK_SIZE(mp->ma_keys));
2177 if (newvalues == NULL)
2178 return PyErr_NoMemory();
2179 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2180 if (split_copy == NULL) {
2181 free_values(newvalues);
2182 return NULL;
2183 }
2184 split_copy->ma_values = newvalues;
2185 split_copy->ma_keys = mp->ma_keys;
2186 split_copy->ma_used = mp->ma_used;
2187 DK_INCREF(mp->ma_keys);
2188 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2189 PyObject *value = mp->ma_values[i];
2190 Py_XINCREF(value);
2191 split_copy->ma_values[i] = value;
2192 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002193 if (_PyObject_GC_IS_TRACKED(mp))
2194 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002195 return (PyObject *)split_copy;
2196 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 copy = PyDict_New();
2198 if (copy == NULL)
2199 return NULL;
2200 if (PyDict_Merge(copy, o, 1) == 0)
2201 return copy;
2202 Py_DECREF(copy);
2203 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002204}
2205
Martin v. Löwis18e16552006-02-15 17:27:45 +00002206Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002207PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 if (mp == NULL || !PyDict_Check(mp)) {
2210 PyErr_BadInternalCall();
2211 return -1;
2212 }
2213 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002214}
2215
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002216PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002217PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 if (mp == NULL || !PyDict_Check(mp)) {
2220 PyErr_BadInternalCall();
2221 return NULL;
2222 }
2223 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002224}
2225
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002226PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002227PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 if (mp == NULL || !PyDict_Check(mp)) {
2230 PyErr_BadInternalCall();
2231 return NULL;
2232 }
2233 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002234}
2235
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002236PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002237PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002239 if (mp == NULL || !PyDict_Check(mp)) {
2240 PyErr_BadInternalCall();
2241 return NULL;
2242 }
2243 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002244}
2245
Tim Peterse63415e2001-05-08 04:38:29 +00002246/* Return 1 if dicts equal, 0 if not, -1 if error.
2247 * Gets out as soon as any difference is detected.
2248 * Uses only Py_EQ comparison.
2249 */
2250static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002251dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 if (a->ma_used != b->ma_used)
2256 /* can't be equal if # of entries differ */
2257 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002259 for (i = 0; i < DK_SIZE(a->ma_keys); i++) {
2260 PyDictKeyEntry *ep = &a->ma_keys->dk_entries[i];
2261 PyObject *aval;
2262 if (a->ma_values)
2263 aval = a->ma_values[i];
2264 else
2265 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 if (aval != NULL) {
2267 int cmp;
2268 PyObject *bval;
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002269 PyObject **vaddr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002270 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 /* temporarily bump aval's refcount to ensure it stays
2272 alive until we're done with it */
2273 Py_INCREF(aval);
2274 /* ditto for key */
2275 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002276 /* reuse the known hash value */
2277 if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr) == NULL)
2278 bval = NULL;
2279 else
2280 bval = *vaddr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 Py_DECREF(key);
2282 if (bval == NULL) {
2283 Py_DECREF(aval);
2284 if (PyErr_Occurred())
2285 return -1;
2286 return 0;
2287 }
2288 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2289 Py_DECREF(aval);
2290 if (cmp <= 0) /* error or not equal */
2291 return cmp;
2292 }
2293 }
2294 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002295}
Tim Peterse63415e2001-05-08 04:38:29 +00002296
2297static PyObject *
2298dict_richcompare(PyObject *v, PyObject *w, int op)
2299{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 int cmp;
2301 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2304 res = Py_NotImplemented;
2305 }
2306 else if (op == Py_EQ || op == Py_NE) {
2307 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2308 if (cmp < 0)
2309 return NULL;
2310 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2311 }
2312 else
2313 res = Py_NotImplemented;
2314 Py_INCREF(res);
2315 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002316}
Tim Peterse63415e2001-05-08 04:38:29 +00002317
Larry Hastings61272b72014-01-07 12:41:53 -08002318/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07002319
2320@coexist
2321dict.__contains__
2322
2323 key: object
2324 /
2325
Meador Ingee02de8c2014-01-14 16:48:31 -06002326True if D has a key k, else False.
Larry Hastings61272b72014-01-07 12:41:53 -08002327[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07002328
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002329static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08002330dict___contains__(PyDictObject *self, PyObject *key)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002331/*[clinic end generated code: output=a3d03db709ed6e6b input=b852b2a19b51ab24]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002332{
Larry Hastingsc2047262014-01-25 20:43:29 -08002333 register PyDictObject *mp = self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002334 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002335 PyDictKeyEntry *ep;
2336 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002339 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 hash = PyObject_Hash(key);
2341 if (hash == -1)
2342 return NULL;
2343 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002344 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 if (ep == NULL)
2346 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002347 return PyBool_FromLong(*value_addr != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002348}
2349
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002350static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002351dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002352{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 PyObject *key;
2354 PyObject *failobj = Py_None;
2355 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002356 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002357 PyDictKeyEntry *ep;
2358 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2361 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002364 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 hash = PyObject_Hash(key);
2366 if (hash == -1)
2367 return NULL;
2368 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002369 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 if (ep == NULL)
2371 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002372 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 if (val == NULL)
2374 val = failobj;
2375 Py_INCREF(val);
2376 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002377}
2378
Benjamin Peterson00e98862013-03-07 22:16:29 -05002379PyObject *
2380PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002381{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002382 PyDictObject *mp = (PyDictObject *)d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002384 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002385 PyDictKeyEntry *ep;
2386 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002387
Benjamin Peterson00e98862013-03-07 22:16:29 -05002388 if (!PyDict_Check(d)) {
2389 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002391 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002393 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002394 hash = PyObject_Hash(key);
2395 if (hash == -1)
2396 return NULL;
2397 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002398 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 if (ep == NULL)
2400 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002401 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 if (val == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002403 if (mp->ma_keys->dk_usable <= 0) {
2404 /* Need to resize. */
2405 if (insertion_resize(mp) < 0)
2406 return NULL;
2407 ep = find_empty_slot(mp, key, hash, &value_addr);
2408 }
Benjamin Peterson00e98862013-03-07 22:16:29 -05002409 Py_INCREF(defaultobj);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002410 Py_INCREF(key);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002411 MAINTAIN_TRACKING(mp, key, defaultobj);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002412 ep->me_key = key;
2413 ep->me_hash = hash;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002414 *value_addr = defaultobj;
2415 val = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002416 mp->ma_keys->dk_usable--;
2417 mp->ma_used++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00002420}
2421
Benjamin Peterson00e98862013-03-07 22:16:29 -05002422static PyObject *
2423dict_setdefault(PyDictObject *mp, PyObject *args)
2424{
2425 PyObject *key, *val;
2426 PyObject *defaultobj = Py_None;
2427
2428 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2429 return NULL;
2430
Benjamin Peterson55898502013-03-08 08:36:49 -05002431 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002432 Py_XINCREF(val);
2433 return val;
2434}
Guido van Rossum164452c2000-08-08 16:12:54 +00002435
2436static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002437dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 PyDict_Clear((PyObject *)mp);
2440 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002441}
2442
Guido van Rossumba6ab842000-12-12 22:02:18 +00002443static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002444dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00002447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2449 return NULL;
Eric Snow96c6af92015-05-29 22:21:39 -06002450
2451 return _PyDict_Pop(mp, key, deflt);
Guido van Rossume027d982002-04-12 15:11:59 +00002452}
2453
2454static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002455dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002456{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002457 Py_hash_t i = 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002458 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002460
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 /* Allocate the result tuple before checking the size. Believe it
2463 * or not, this allocation could trigger a garbage collection which
2464 * could empty the dict, so if we checked the size first and that
2465 * happened, the result would be an infinite loop (searching for an
2466 * entry that no longer exists). Note that the usual popitem()
2467 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2468 * tuple away if the dict *is* empty isn't a significant
2469 * inefficiency -- possible, but unlikely in practice.
2470 */
2471 res = PyTuple_New(2);
2472 if (res == NULL)
2473 return NULL;
2474 if (mp->ma_used == 0) {
2475 Py_DECREF(res);
2476 PyErr_SetString(PyExc_KeyError,
2477 "popitem(): dictionary is empty");
2478 return NULL;
2479 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002480 /* Convert split table to combined table */
2481 if (mp->ma_keys->dk_lookup == lookdict_split) {
2482 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2483 Py_DECREF(res);
2484 return NULL;
2485 }
2486 }
2487 ENSURE_ALLOWS_DELETIONS(mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488 /* Set ep to "the first" dict entry with a value. We abuse the hash
2489 * field of slot 0 to hold a search finger:
2490 * If slot 0 has a value, use slot 0.
2491 * Else slot 0 is being used to hold a search finger,
2492 * and we use its hash value as the first index to look.
2493 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002494 ep = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 if (ep->me_value == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002496 Py_ssize_t mask = DK_MASK(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 i = ep->me_hash;
2498 /* The hash field may be a real hash value, or it may be a
2499 * legit search finger, or it may be a once-legit search
2500 * finger that's out of bounds now because it wrapped around
2501 * or the table shrunk -- simply make sure it's in bounds now.
2502 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002503 if (i > mask || i < 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 i = 1; /* skip slot 0 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002505 while ((ep = &mp->ma_keys->dk_entries[i])->me_value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002507 if (i > mask)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 i = 1;
2509 }
2510 }
2511 PyTuple_SET_ITEM(res, 0, ep->me_key);
2512 PyTuple_SET_ITEM(res, 1, ep->me_value);
2513 Py_INCREF(dummy);
2514 ep->me_key = dummy;
2515 ep->me_value = NULL;
2516 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002517 assert(mp->ma_keys->dk_entries[0].me_value == NULL);
2518 mp->ma_keys->dk_entries[0].me_hash = i + 1; /* next place to start */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002520}
2521
Jeremy Hylton8caad492000-06-23 14:18:11 +00002522static int
2523dict_traverse(PyObject *op, visitproc visit, void *arg)
2524{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002525 Py_ssize_t i, n;
2526 PyDictObject *mp = (PyDictObject *)op;
2527 if (mp->ma_keys->dk_lookup == lookdict) {
2528 for (i = 0; i < DK_SIZE(mp->ma_keys); i++) {
2529 if (mp->ma_keys->dk_entries[i].me_value != NULL) {
2530 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2531 Py_VISIT(mp->ma_keys->dk_entries[i].me_key);
2532 }
2533 }
2534 } else {
2535 if (mp->ma_values != NULL) {
2536 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2537 Py_VISIT(mp->ma_values[i]);
2538 }
2539 }
2540 else {
2541 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2542 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2543 }
2544 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 }
2546 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002547}
2548
2549static int
2550dict_tp_clear(PyObject *op)
2551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 PyDict_Clear(op);
2553 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002554}
2555
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002556static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002557
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002558Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06002559_PyDict_SizeOf(PyDictObject *mp)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002560{
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002561 Py_ssize_t size, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002562
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002563 size = DK_SIZE(mp->ma_keys);
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002564 res = _PyObject_SIZE(Py_TYPE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002565 if (mp->ma_values)
2566 res += size * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002567 /* If the dictionary is split, the keys portion is accounted-for
2568 in the type object. */
2569 if (mp->ma_keys->dk_refcnt == 1)
2570 res += sizeof(PyDictKeysObject) + (size-1) * sizeof(PyDictKeyEntry);
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002571 return res;
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002572}
2573
2574Py_ssize_t
2575_PyDict_KeysSize(PyDictKeysObject *keys)
2576{
2577 return sizeof(PyDictKeysObject) + (DK_SIZE(keys)-1) * sizeof(PyDictKeyEntry);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002578}
2579
doko@ubuntu.com17210f52016-01-14 14:04:59 +01002580static PyObject *
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002581dict_sizeof(PyDictObject *mp)
2582{
2583 return PyLong_FromSsize_t(_PyDict_SizeOf(mp));
2584}
2585
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002586PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2587
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002588PyDoc_STRVAR(sizeof__doc__,
2589"D.__sizeof__() -> size of D in memory, in bytes");
2590
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002591PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002592"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002593
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002594PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002595"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 +00002596
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002597PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002598"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002599If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002600
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002601PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002602"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000026032-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002604
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002605PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04002606"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
2607If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
2608If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
2609In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002610
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002611PyDoc_STRVAR(clear__doc__,
2612"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002613
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002614PyDoc_STRVAR(copy__doc__,
2615"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002616
Guido van Rossumb90c8482007-02-10 01:11:45 +00002617/* Forward */
2618static PyObject *dictkeys_new(PyObject *);
2619static PyObject *dictitems_new(PyObject *);
2620static PyObject *dictvalues_new(PyObject *);
2621
Guido van Rossum45c85d12007-07-27 16:31:40 +00002622PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002624PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002626PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002628
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002629static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002630 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2632 getitem__doc__},
Serhiy Storchaka0ce7a3a2015-12-22 08:16:18 +02002633 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 sizeof__doc__},
2635 {"get", (PyCFunction)dict_get, METH_VARARGS,
2636 get__doc__},
2637 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2638 setdefault_doc__},
2639 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2640 pop__doc__},
2641 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2642 popitem__doc__},
2643 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2644 keys__doc__},
2645 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2646 items__doc__},
2647 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2648 values__doc__},
2649 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2650 update__doc__},
Larry Hastings5c661892014-01-24 06:17:25 -08002651 DICT_FROMKEYS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2653 clear__doc__},
2654 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2655 copy__doc__},
2656 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002657};
2658
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002659/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002660int
2661PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002662{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002663 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002665 PyDictKeyEntry *ep;
2666 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002669 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 hash = PyObject_Hash(key);
2671 if (hash == -1)
2672 return -1;
2673 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002674 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2675 return (ep == NULL) ? -1 : (*value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002676}
2677
Thomas Wouterscf297e42007-02-23 15:07:44 +00002678/* Internal version of PyDict_Contains used when the hash value is already known */
2679int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002680_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002681{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002683 PyDictKeyEntry *ep;
2684 PyObject **value_addr;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002685
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002686 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2687 return (ep == NULL) ? -1 : (*value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002688}
2689
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002690/* Hack to implement "key in dict" */
2691static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 0, /* sq_length */
2693 0, /* sq_concat */
2694 0, /* sq_repeat */
2695 0, /* sq_item */
2696 0, /* sq_slice */
2697 0, /* sq_ass_item */
2698 0, /* sq_ass_slice */
2699 PyDict_Contains, /* sq_contains */
2700 0, /* sq_inplace_concat */
2701 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002702};
2703
Guido van Rossum09e563a2001-05-01 12:10:21 +00002704static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002705dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002708 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 assert(type != NULL && type->tp_alloc != NULL);
2711 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02002712 if (self == NULL)
2713 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002714 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002715
Victor Stinnera9f61a52013-07-16 22:17:26 +02002716 /* The object has been implicitly tracked by tp_alloc */
2717 if (type == &PyDict_Type)
2718 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002719
2720 d->ma_used = 0;
2721 d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
2722 if (d->ma_keys == NULL) {
2723 Py_DECREF(self);
2724 return NULL;
2725 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002727}
2728
Tim Peters25786c02001-09-02 08:22:48 +00002729static int
2730dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002733}
2734
Tim Peters6d6c1a32001-08-02 04:15:00 +00002735static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002736dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002737{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002739}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002740
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002741PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002742"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002743"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002744" (key, value) pairs\n"
2745"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002746" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002747" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002748" d[k] = v\n"
2749"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2750" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002751
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002752PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2754 "dict",
2755 sizeof(PyDictObject),
2756 0,
2757 (destructor)dict_dealloc, /* tp_dealloc */
2758 0, /* tp_print */
2759 0, /* tp_getattr */
2760 0, /* tp_setattr */
2761 0, /* tp_reserved */
2762 (reprfunc)dict_repr, /* tp_repr */
2763 0, /* tp_as_number */
2764 &dict_as_sequence, /* tp_as_sequence */
2765 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002766 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 0, /* tp_call */
2768 0, /* tp_str */
2769 PyObject_GenericGetAttr, /* tp_getattro */
2770 0, /* tp_setattro */
2771 0, /* tp_as_buffer */
2772 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2773 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2774 dictionary_doc, /* tp_doc */
2775 dict_traverse, /* tp_traverse */
2776 dict_tp_clear, /* tp_clear */
2777 dict_richcompare, /* tp_richcompare */
2778 0, /* tp_weaklistoffset */
2779 (getiterfunc)dict_iter, /* tp_iter */
2780 0, /* tp_iternext */
2781 mapp_methods, /* tp_methods */
2782 0, /* tp_members */
2783 0, /* tp_getset */
2784 0, /* tp_base */
2785 0, /* tp_dict */
2786 0, /* tp_descr_get */
2787 0, /* tp_descr_set */
2788 0, /* tp_dictoffset */
2789 dict_init, /* tp_init */
2790 PyType_GenericAlloc, /* tp_alloc */
2791 dict_new, /* tp_new */
2792 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002793};
2794
Victor Stinner3c1e4812012-03-26 22:10:51 +02002795PyObject *
2796_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
2797{
2798 PyObject *kv;
2799 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02002800 if (kv == NULL) {
2801 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002802 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02002803 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02002804 return PyDict_GetItem(dp, kv);
2805}
2806
Guido van Rossum3cca2451997-05-16 14:23:33 +00002807/* For backward compatibility with old dictionary interface */
2808
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002809PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002810PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002811{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 PyObject *kv, *rv;
2813 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02002814 if (kv == NULL) {
2815 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02002817 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 rv = PyDict_GetItem(v, kv);
2819 Py_DECREF(kv);
2820 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002821}
2822
2823int
Victor Stinner3c1e4812012-03-26 22:10:51 +02002824_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
2825{
2826 PyObject *kv;
2827 kv = _PyUnicode_FromId(key); /* borrowed */
2828 if (kv == NULL)
2829 return -1;
2830 return PyDict_SetItem(v, kv, item);
2831}
2832
2833int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002834PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 PyObject *kv;
2837 int err;
2838 kv = PyUnicode_FromString(key);
2839 if (kv == NULL)
2840 return -1;
2841 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2842 err = PyDict_SetItem(v, kv, item);
2843 Py_DECREF(kv);
2844 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002845}
2846
2847int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01002848_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
2849{
2850 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
2851 if (kv == NULL)
2852 return -1;
2853 return PyDict_DelItem(v, kv);
2854}
2855
2856int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002857PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 PyObject *kv;
2860 int err;
2861 kv = PyUnicode_FromString(key);
2862 if (kv == NULL)
2863 return -1;
2864 err = PyDict_DelItem(v, kv);
2865 Py_DECREF(kv);
2866 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002867}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002868
Raymond Hettinger019a1482004-03-18 02:41:19 +00002869/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002870
2871typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 PyObject_HEAD
2873 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2874 Py_ssize_t di_used;
2875 Py_ssize_t di_pos;
2876 PyObject* di_result; /* reusable result tuple for iteritems */
2877 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002878} dictiterobject;
2879
2880static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002881dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 dictiterobject *di;
2884 di = PyObject_GC_New(dictiterobject, itertype);
2885 if (di == NULL)
2886 return NULL;
2887 Py_INCREF(dict);
2888 di->di_dict = dict;
2889 di->di_used = dict->ma_used;
2890 di->di_pos = 0;
2891 di->len = dict->ma_used;
2892 if (itertype == &PyDictIterItem_Type) {
2893 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2894 if (di->di_result == NULL) {
2895 Py_DECREF(di);
2896 return NULL;
2897 }
2898 }
2899 else
2900 di->di_result = NULL;
2901 _PyObject_GC_TRACK(di);
2902 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002903}
2904
2905static void
2906dictiter_dealloc(dictiterobject *di)
2907{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 Py_XDECREF(di->di_dict);
2909 Py_XDECREF(di->di_result);
2910 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002911}
2912
2913static int
2914dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002916 Py_VISIT(di->di_dict);
2917 Py_VISIT(di->di_result);
2918 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002919}
2920
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002921static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002922dictiter_len(dictiterobject *di)
2923{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002924 Py_ssize_t len = 0;
2925 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2926 len = di->len;
2927 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002928}
2929
Guido van Rossumb90c8482007-02-10 01:11:45 +00002930PyDoc_STRVAR(length_hint_doc,
2931 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002932
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002933static PyObject *
2934dictiter_reduce(dictiterobject *di);
2935
2936PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2937
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002938static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2940 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002941 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
2942 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002944};
2945
Raymond Hettinger019a1482004-03-18 02:41:19 +00002946static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 PyObject *key;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002949 Py_ssize_t i, mask, offset;
2950 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002952 PyObject **value_ptr;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 if (d == NULL)
2955 return NULL;
2956 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 if (di->di_used != d->ma_used) {
2959 PyErr_SetString(PyExc_RuntimeError,
2960 "dictionary changed size during iteration");
2961 di->di_used = -1; /* Make this state sticky */
2962 return NULL;
2963 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002965 i = di->di_pos;
2966 if (i < 0)
2967 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002968 k = d->ma_keys;
2969 if (d->ma_values) {
2970 value_ptr = &d->ma_values[i];
2971 offset = sizeof(PyObject *);
2972 }
2973 else {
2974 value_ptr = &k->dk_entries[i].me_value;
2975 offset = sizeof(PyDictKeyEntry);
2976 }
2977 mask = DK_SIZE(k)-1;
2978 while (i <= mask && *value_ptr == NULL) {
2979 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002980 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002981 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002982 di->di_pos = i+1;
2983 if (i > mask)
2984 goto fail;
2985 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002986 key = k->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002987 Py_INCREF(key);
2988 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002989
2990fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002991 Py_DECREF(d);
2992 di->di_dict = NULL;
2993 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002994}
2995
Raymond Hettinger019a1482004-03-18 02:41:19 +00002996PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2998 "dict_keyiterator", /* tp_name */
2999 sizeof(dictiterobject), /* tp_basicsize */
3000 0, /* tp_itemsize */
3001 /* methods */
3002 (destructor)dictiter_dealloc, /* tp_dealloc */
3003 0, /* tp_print */
3004 0, /* tp_getattr */
3005 0, /* tp_setattr */
3006 0, /* tp_reserved */
3007 0, /* tp_repr */
3008 0, /* tp_as_number */
3009 0, /* tp_as_sequence */
3010 0, /* tp_as_mapping */
3011 0, /* tp_hash */
3012 0, /* tp_call */
3013 0, /* tp_str */
3014 PyObject_GenericGetAttr, /* tp_getattro */
3015 0, /* tp_setattro */
3016 0, /* tp_as_buffer */
3017 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3018 0, /* tp_doc */
3019 (traverseproc)dictiter_traverse, /* tp_traverse */
3020 0, /* tp_clear */
3021 0, /* tp_richcompare */
3022 0, /* tp_weaklistoffset */
3023 PyObject_SelfIter, /* tp_iter */
3024 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
3025 dictiter_methods, /* tp_methods */
3026 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003027};
3028
3029static PyObject *dictiter_iternextvalue(dictiterobject *di)
3030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 PyObject *value;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003032 Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003033 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003034 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 if (d == NULL)
3037 return NULL;
3038 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003040 if (di->di_used != d->ma_used) {
3041 PyErr_SetString(PyExc_RuntimeError,
3042 "dictionary changed size during iteration");
3043 di->di_used = -1; /* Make this state sticky */
3044 return NULL;
3045 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003048 mask = DK_SIZE(d->ma_keys)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003049 if (i < 0 || i > mask)
3050 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003051 if (d->ma_values) {
3052 value_ptr = &d->ma_values[i];
3053 offset = sizeof(PyObject *);
3054 }
3055 else {
3056 value_ptr = &d->ma_keys->dk_entries[i].me_value;
3057 offset = sizeof(PyDictKeyEntry);
3058 }
3059 while (i <= mask && *value_ptr == NULL) {
3060 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 i++;
3062 if (i > mask)
3063 goto fail;
3064 }
3065 di->di_pos = i+1;
3066 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003067 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 Py_INCREF(value);
3069 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003070
3071fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 Py_DECREF(d);
3073 di->di_dict = NULL;
3074 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003075}
3076
3077PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003078 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3079 "dict_valueiterator", /* tp_name */
3080 sizeof(dictiterobject), /* tp_basicsize */
3081 0, /* tp_itemsize */
3082 /* methods */
3083 (destructor)dictiter_dealloc, /* tp_dealloc */
3084 0, /* tp_print */
3085 0, /* tp_getattr */
3086 0, /* tp_setattr */
3087 0, /* tp_reserved */
3088 0, /* tp_repr */
3089 0, /* tp_as_number */
3090 0, /* tp_as_sequence */
3091 0, /* tp_as_mapping */
3092 0, /* tp_hash */
3093 0, /* tp_call */
3094 0, /* tp_str */
3095 PyObject_GenericGetAttr, /* tp_getattro */
3096 0, /* tp_setattro */
3097 0, /* tp_as_buffer */
3098 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3099 0, /* tp_doc */
3100 (traverseproc)dictiter_traverse, /* tp_traverse */
3101 0, /* tp_clear */
3102 0, /* tp_richcompare */
3103 0, /* tp_weaklistoffset */
3104 PyObject_SelfIter, /* tp_iter */
3105 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
3106 dictiter_methods, /* tp_methods */
3107 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003108};
3109
3110static PyObject *dictiter_iternextitem(dictiterobject *di)
3111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 PyObject *key, *value, *result = di->di_result;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003113 Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003115 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003117 if (d == NULL)
3118 return NULL;
3119 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003121 if (di->di_used != d->ma_used) {
3122 PyErr_SetString(PyExc_RuntimeError,
3123 "dictionary changed size during iteration");
3124 di->di_used = -1; /* Make this state sticky */
3125 return NULL;
3126 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128 i = di->di_pos;
3129 if (i < 0)
3130 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003131 mask = DK_SIZE(d->ma_keys)-1;
3132 if (d->ma_values) {
3133 value_ptr = &d->ma_values[i];
3134 offset = sizeof(PyObject *);
3135 }
3136 else {
3137 value_ptr = &d->ma_keys->dk_entries[i].me_value;
3138 offset = sizeof(PyDictKeyEntry);
3139 }
3140 while (i <= mask && *value_ptr == NULL) {
3141 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003142 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003143 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 di->di_pos = i+1;
3145 if (i > mask)
3146 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 if (result->ob_refcnt == 1) {
3149 Py_INCREF(result);
3150 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3151 Py_DECREF(PyTuple_GET_ITEM(result, 1));
3152 } else {
3153 result = PyTuple_New(2);
3154 if (result == NULL)
3155 return NULL;
3156 }
3157 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003158 key = d->ma_keys->dk_entries[i].me_key;
3159 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003160 Py_INCREF(key);
3161 Py_INCREF(value);
Eric Snow96c6af92015-05-29 22:21:39 -06003162 PyTuple_SET_ITEM(result, 0, key); /* steals reference */
3163 PyTuple_SET_ITEM(result, 1, value); /* steals reference */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003164 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003165
3166fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003167 Py_DECREF(d);
3168 di->di_dict = NULL;
3169 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003170}
3171
3172PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3174 "dict_itemiterator", /* tp_name */
3175 sizeof(dictiterobject), /* tp_basicsize */
3176 0, /* tp_itemsize */
3177 /* methods */
3178 (destructor)dictiter_dealloc, /* tp_dealloc */
3179 0, /* tp_print */
3180 0, /* tp_getattr */
3181 0, /* tp_setattr */
3182 0, /* tp_reserved */
3183 0, /* tp_repr */
3184 0, /* tp_as_number */
3185 0, /* tp_as_sequence */
3186 0, /* tp_as_mapping */
3187 0, /* tp_hash */
3188 0, /* tp_call */
3189 0, /* tp_str */
3190 PyObject_GenericGetAttr, /* tp_getattro */
3191 0, /* tp_setattro */
3192 0, /* tp_as_buffer */
3193 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3194 0, /* tp_doc */
3195 (traverseproc)dictiter_traverse, /* tp_traverse */
3196 0, /* tp_clear */
3197 0, /* tp_richcompare */
3198 0, /* tp_weaklistoffset */
3199 PyObject_SelfIter, /* tp_iter */
3200 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3201 dictiter_methods, /* tp_methods */
3202 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003203};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003204
3205
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003206static PyObject *
3207dictiter_reduce(dictiterobject *di)
3208{
3209 PyObject *list;
3210 dictiterobject tmp;
3211
3212 list = PyList_New(0);
3213 if (!list)
3214 return NULL;
3215
3216 /* copy the itertor state */
3217 tmp = *di;
3218 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003219
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003220 /* iterate the temporary into a list */
3221 for(;;) {
3222 PyObject *element = 0;
3223 if (Py_TYPE(di) == &PyDictIterItem_Type)
3224 element = dictiter_iternextitem(&tmp);
3225 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3226 element = dictiter_iternextkey(&tmp);
3227 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3228 element = dictiter_iternextvalue(&tmp);
3229 else
3230 assert(0);
3231 if (element) {
3232 if (PyList_Append(list, element)) {
3233 Py_DECREF(element);
3234 Py_DECREF(list);
3235 Py_XDECREF(tmp.di_dict);
3236 return NULL;
3237 }
3238 Py_DECREF(element);
3239 } else
3240 break;
3241 }
3242 Py_XDECREF(tmp.di_dict);
3243 /* check for error */
3244 if (tmp.di_dict != NULL) {
3245 /* we have an error */
3246 Py_DECREF(list);
3247 return NULL;
3248 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003249 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003250}
3251
Guido van Rossum3ac67412007-02-10 18:55:06 +00003252/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003253/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003254/***********************************************/
3255
Guido van Rossumb90c8482007-02-10 01:11:45 +00003256/* The instance lay-out is the same for all three; but the type differs. */
3257
Guido van Rossumb90c8482007-02-10 01:11:45 +00003258static void
Eric Snow96c6af92015-05-29 22:21:39 -06003259dictview_dealloc(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003260{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003261 Py_XDECREF(dv->dv_dict);
3262 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003263}
3264
3265static int
Eric Snow96c6af92015-05-29 22:21:39 -06003266dictview_traverse(_PyDictViewObject *dv, visitproc visit, void *arg)
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 Py_VISIT(dv->dv_dict);
3269 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003270}
3271
Guido van Rossum83825ac2007-02-10 04:54:19 +00003272static Py_ssize_t
Eric Snow96c6af92015-05-29 22:21:39 -06003273dictview_len(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 Py_ssize_t len = 0;
3276 if (dv->dv_dict != NULL)
3277 len = dv->dv_dict->ma_used;
3278 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003279}
3280
Eric Snow96c6af92015-05-29 22:21:39 -06003281PyObject *
3282_PyDictView_New(PyObject *dict, PyTypeObject *type)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003283{
Eric Snow96c6af92015-05-29 22:21:39 -06003284 _PyDictViewObject *dv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 if (dict == NULL) {
3286 PyErr_BadInternalCall();
3287 return NULL;
3288 }
3289 if (!PyDict_Check(dict)) {
3290 /* XXX Get rid of this restriction later */
3291 PyErr_Format(PyExc_TypeError,
3292 "%s() requires a dict argument, not '%s'",
3293 type->tp_name, dict->ob_type->tp_name);
3294 return NULL;
3295 }
Eric Snow96c6af92015-05-29 22:21:39 -06003296 dv = PyObject_GC_New(_PyDictViewObject, type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 if (dv == NULL)
3298 return NULL;
3299 Py_INCREF(dict);
3300 dv->dv_dict = (PyDictObject *)dict;
3301 _PyObject_GC_TRACK(dv);
3302 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003303}
3304
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003305/* TODO(guido): The views objects are not complete:
3306
3307 * support more set operations
3308 * support arbitrary mappings?
3309 - either these should be static or exported in dictobject.h
3310 - if public then they should probably be in builtins
3311*/
3312
Guido van Rossumaac530c2007-08-24 22:33:45 +00003313/* Return 1 if self is a subset of other, iterating over self;
3314 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003315static int
3316all_contained_in(PyObject *self, PyObject *other)
3317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 PyObject *iter = PyObject_GetIter(self);
3319 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 if (iter == NULL)
3322 return -1;
3323 for (;;) {
3324 PyObject *next = PyIter_Next(iter);
3325 if (next == NULL) {
3326 if (PyErr_Occurred())
3327 ok = -1;
3328 break;
3329 }
3330 ok = PySequence_Contains(other, next);
3331 Py_DECREF(next);
3332 if (ok <= 0)
3333 break;
3334 }
3335 Py_DECREF(iter);
3336 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003337}
3338
3339static PyObject *
3340dictview_richcompare(PyObject *self, PyObject *other, int op)
3341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 Py_ssize_t len_self, len_other;
3343 int ok;
3344 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 assert(self != NULL);
3347 assert(PyDictViewSet_Check(self));
3348 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003349
Brian Curtindfc80e32011-08-10 20:28:54 -05003350 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3351 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 len_self = PyObject_Size(self);
3354 if (len_self < 0)
3355 return NULL;
3356 len_other = PyObject_Size(other);
3357 if (len_other < 0)
3358 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 ok = 0;
3361 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 case Py_NE:
3364 case Py_EQ:
3365 if (len_self == len_other)
3366 ok = all_contained_in(self, other);
3367 if (op == Py_NE && ok >= 0)
3368 ok = !ok;
3369 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003371 case Py_LT:
3372 if (len_self < len_other)
3373 ok = all_contained_in(self, other);
3374 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003376 case Py_LE:
3377 if (len_self <= len_other)
3378 ok = all_contained_in(self, other);
3379 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003381 case Py_GT:
3382 if (len_self > len_other)
3383 ok = all_contained_in(other, self);
3384 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003386 case Py_GE:
3387 if (len_self >= len_other)
3388 ok = all_contained_in(other, self);
3389 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 }
3392 if (ok < 0)
3393 return NULL;
3394 result = ok ? Py_True : Py_False;
3395 Py_INCREF(result);
3396 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003397}
3398
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003399static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003400dictview_repr(_PyDictViewObject *dv)
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003402 PyObject *seq;
3403 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 seq = PySequence_List((PyObject *)dv);
3406 if (seq == NULL)
3407 return NULL;
3408
3409 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3410 Py_DECREF(seq);
3411 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003412}
3413
Guido van Rossum3ac67412007-02-10 18:55:06 +00003414/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003415
3416static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003417dictkeys_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003418{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 if (dv->dv_dict == NULL) {
3420 Py_RETURN_NONE;
3421 }
3422 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003423}
3424
3425static int
Eric Snow96c6af92015-05-29 22:21:39 -06003426dictkeys_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003427{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003428 if (dv->dv_dict == NULL)
3429 return 0;
3430 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003431}
3432
Guido van Rossum83825ac2007-02-10 04:54:19 +00003433static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 (lenfunc)dictview_len, /* sq_length */
3435 0, /* sq_concat */
3436 0, /* sq_repeat */
3437 0, /* sq_item */
3438 0, /* sq_slice */
3439 0, /* sq_ass_item */
3440 0, /* sq_ass_slice */
3441 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003442};
3443
Guido van Rossum523259b2007-08-24 23:41:22 +00003444static PyObject*
3445dictviews_sub(PyObject* self, PyObject *other)
3446{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003447 PyObject *result = PySet_New(self);
3448 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003449 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003451 if (result == NULL)
3452 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003453
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003454 tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003455 if (tmp == NULL) {
3456 Py_DECREF(result);
3457 return NULL;
3458 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003460 Py_DECREF(tmp);
3461 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003462}
3463
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003464PyObject*
3465_PyDictView_Intersect(PyObject* self, PyObject *other)
Guido van Rossum523259b2007-08-24 23:41:22 +00003466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003467 PyObject *result = PySet_New(self);
3468 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003469 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003471 if (result == NULL)
3472 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003473
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003474 tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003475 if (tmp == NULL) {
3476 Py_DECREF(result);
3477 return NULL;
3478 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003480 Py_DECREF(tmp);
3481 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003482}
3483
3484static PyObject*
3485dictviews_or(PyObject* self, PyObject *other)
3486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003487 PyObject *result = PySet_New(self);
3488 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003489 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003491 if (result == NULL)
3492 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003493
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003494 tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003495 if (tmp == NULL) {
3496 Py_DECREF(result);
3497 return NULL;
3498 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003500 Py_DECREF(tmp);
3501 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003502}
3503
3504static PyObject*
3505dictviews_xor(PyObject* self, PyObject *other)
3506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003507 PyObject *result = PySet_New(self);
3508 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003509 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003511 if (result == NULL)
3512 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003513
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003514 tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003515 other);
3516 if (tmp == NULL) {
3517 Py_DECREF(result);
3518 return NULL;
3519 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003521 Py_DECREF(tmp);
3522 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003523}
3524
3525static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003526 0, /*nb_add*/
3527 (binaryfunc)dictviews_sub, /*nb_subtract*/
3528 0, /*nb_multiply*/
3529 0, /*nb_remainder*/
3530 0, /*nb_divmod*/
3531 0, /*nb_power*/
3532 0, /*nb_negative*/
3533 0, /*nb_positive*/
3534 0, /*nb_absolute*/
3535 0, /*nb_bool*/
3536 0, /*nb_invert*/
3537 0, /*nb_lshift*/
3538 0, /*nb_rshift*/
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003539 (binaryfunc)_PyDictView_Intersect, /*nb_and*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003540 (binaryfunc)dictviews_xor, /*nb_xor*/
3541 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003542};
3543
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003544static PyObject*
3545dictviews_isdisjoint(PyObject *self, PyObject *other)
3546{
3547 PyObject *it;
3548 PyObject *item = NULL;
3549
3550 if (self == other) {
Eric Snow96c6af92015-05-29 22:21:39 -06003551 if (dictview_len((_PyDictViewObject *)self) == 0)
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003552 Py_RETURN_TRUE;
3553 else
3554 Py_RETURN_FALSE;
3555 }
3556
3557 /* Iterate over the shorter object (only if other is a set,
3558 * because PySequence_Contains may be expensive otherwise): */
3559 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
Eric Snow96c6af92015-05-29 22:21:39 -06003560 Py_ssize_t len_self = dictview_len((_PyDictViewObject *)self);
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003561 Py_ssize_t len_other = PyObject_Size(other);
3562 if (len_other == -1)
3563 return NULL;
3564
3565 if ((len_other > len_self)) {
3566 PyObject *tmp = other;
3567 other = self;
3568 self = tmp;
3569 }
3570 }
3571
3572 it = PyObject_GetIter(other);
3573 if (it == NULL)
3574 return NULL;
3575
3576 while ((item = PyIter_Next(it)) != NULL) {
3577 int contains = PySequence_Contains(self, item);
3578 Py_DECREF(item);
3579 if (contains == -1) {
3580 Py_DECREF(it);
3581 return NULL;
3582 }
3583
3584 if (contains) {
3585 Py_DECREF(it);
3586 Py_RETURN_FALSE;
3587 }
3588 }
3589 Py_DECREF(it);
3590 if (PyErr_Occurred())
3591 return NULL; /* PyIter_Next raised an exception. */
3592 Py_RETURN_TRUE;
3593}
3594
3595PyDoc_STRVAR(isdisjoint_doc,
3596"Return True if the view and the given iterable have a null intersection.");
3597
Guido van Rossumb90c8482007-02-10 01:11:45 +00003598static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003599 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3600 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003601 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003602};
3603
3604PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003605 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3606 "dict_keys", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06003607 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003608 0, /* tp_itemsize */
3609 /* methods */
3610 (destructor)dictview_dealloc, /* tp_dealloc */
3611 0, /* tp_print */
3612 0, /* tp_getattr */
3613 0, /* tp_setattr */
3614 0, /* tp_reserved */
3615 (reprfunc)dictview_repr, /* tp_repr */
3616 &dictviews_as_number, /* tp_as_number */
3617 &dictkeys_as_sequence, /* tp_as_sequence */
3618 0, /* tp_as_mapping */
3619 0, /* tp_hash */
3620 0, /* tp_call */
3621 0, /* tp_str */
3622 PyObject_GenericGetAttr, /* tp_getattro */
3623 0, /* tp_setattro */
3624 0, /* tp_as_buffer */
3625 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3626 0, /* tp_doc */
3627 (traverseproc)dictview_traverse, /* tp_traverse */
3628 0, /* tp_clear */
3629 dictview_richcompare, /* tp_richcompare */
3630 0, /* tp_weaklistoffset */
3631 (getiterfunc)dictkeys_iter, /* tp_iter */
3632 0, /* tp_iternext */
3633 dictkeys_methods, /* tp_methods */
3634 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003635};
3636
3637static PyObject *
3638dictkeys_new(PyObject *dict)
3639{
Eric Snow96c6af92015-05-29 22:21:39 -06003640 return _PyDictView_New(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003641}
3642
Guido van Rossum3ac67412007-02-10 18:55:06 +00003643/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003644
3645static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003646dictitems_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003647{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003648 if (dv->dv_dict == NULL) {
3649 Py_RETURN_NONE;
3650 }
3651 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003652}
3653
3654static int
Eric Snow96c6af92015-05-29 22:21:39 -06003655dictitems_contains(_PyDictViewObject *dv, PyObject *obj)
Guido van Rossum3ac67412007-02-10 18:55:06 +00003656{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003657 PyObject *key, *value, *found;
3658 if (dv->dv_dict == NULL)
3659 return 0;
3660 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3661 return 0;
3662 key = PyTuple_GET_ITEM(obj, 0);
3663 value = PyTuple_GET_ITEM(obj, 1);
3664 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3665 if (found == NULL) {
3666 if (PyErr_Occurred())
3667 return -1;
3668 return 0;
3669 }
3670 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003671}
3672
Guido van Rossum83825ac2007-02-10 04:54:19 +00003673static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003674 (lenfunc)dictview_len, /* sq_length */
3675 0, /* sq_concat */
3676 0, /* sq_repeat */
3677 0, /* sq_item */
3678 0, /* sq_slice */
3679 0, /* sq_ass_item */
3680 0, /* sq_ass_slice */
3681 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003682};
3683
Guido van Rossumb90c8482007-02-10 01:11:45 +00003684static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003685 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3686 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003688};
3689
3690PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3692 "dict_items", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06003693 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003694 0, /* tp_itemsize */
3695 /* methods */
3696 (destructor)dictview_dealloc, /* tp_dealloc */
3697 0, /* tp_print */
3698 0, /* tp_getattr */
3699 0, /* tp_setattr */
3700 0, /* tp_reserved */
3701 (reprfunc)dictview_repr, /* tp_repr */
3702 &dictviews_as_number, /* tp_as_number */
3703 &dictitems_as_sequence, /* tp_as_sequence */
3704 0, /* tp_as_mapping */
3705 0, /* tp_hash */
3706 0, /* tp_call */
3707 0, /* tp_str */
3708 PyObject_GenericGetAttr, /* tp_getattro */
3709 0, /* tp_setattro */
3710 0, /* tp_as_buffer */
3711 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3712 0, /* tp_doc */
3713 (traverseproc)dictview_traverse, /* tp_traverse */
3714 0, /* tp_clear */
3715 dictview_richcompare, /* tp_richcompare */
3716 0, /* tp_weaklistoffset */
3717 (getiterfunc)dictitems_iter, /* tp_iter */
3718 0, /* tp_iternext */
3719 dictitems_methods, /* tp_methods */
3720 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003721};
3722
3723static PyObject *
3724dictitems_new(PyObject *dict)
3725{
Eric Snow96c6af92015-05-29 22:21:39 -06003726 return _PyDictView_New(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003727}
3728
Guido van Rossum3ac67412007-02-10 18:55:06 +00003729/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003730
3731static PyObject *
Eric Snow96c6af92015-05-29 22:21:39 -06003732dictvalues_iter(_PyDictViewObject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003733{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003734 if (dv->dv_dict == NULL) {
3735 Py_RETURN_NONE;
3736 }
3737 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003738}
3739
Guido van Rossum83825ac2007-02-10 04:54:19 +00003740static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003741 (lenfunc)dictview_len, /* sq_length */
3742 0, /* sq_concat */
3743 0, /* sq_repeat */
3744 0, /* sq_item */
3745 0, /* sq_slice */
3746 0, /* sq_ass_item */
3747 0, /* sq_ass_slice */
3748 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003749};
3750
Guido van Rossumb90c8482007-02-10 01:11:45 +00003751static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003752 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003753};
3754
3755PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003756 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3757 "dict_values", /* tp_name */
Eric Snow96c6af92015-05-29 22:21:39 -06003758 sizeof(_PyDictViewObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003759 0, /* tp_itemsize */
3760 /* methods */
3761 (destructor)dictview_dealloc, /* tp_dealloc */
3762 0, /* tp_print */
3763 0, /* tp_getattr */
3764 0, /* tp_setattr */
3765 0, /* tp_reserved */
3766 (reprfunc)dictview_repr, /* tp_repr */
3767 0, /* tp_as_number */
3768 &dictvalues_as_sequence, /* tp_as_sequence */
3769 0, /* tp_as_mapping */
3770 0, /* tp_hash */
3771 0, /* tp_call */
3772 0, /* tp_str */
3773 PyObject_GenericGetAttr, /* tp_getattro */
3774 0, /* tp_setattro */
3775 0, /* tp_as_buffer */
3776 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3777 0, /* tp_doc */
3778 (traverseproc)dictview_traverse, /* tp_traverse */
3779 0, /* tp_clear */
3780 0, /* tp_richcompare */
3781 0, /* tp_weaklistoffset */
3782 (getiterfunc)dictvalues_iter, /* tp_iter */
3783 0, /* tp_iternext */
3784 dictvalues_methods, /* tp_methods */
3785 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003786};
3787
3788static PyObject *
3789dictvalues_new(PyObject *dict)
3790{
Eric Snow96c6af92015-05-29 22:21:39 -06003791 return _PyDictView_New(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003792}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003793
3794/* Returns NULL if cannot allocate a new PyDictKeysObject,
3795 but does not set an error */
3796PyDictKeysObject *
3797_PyDict_NewKeysForClass(void)
3798{
3799 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_SPLIT);
3800 if (keys == NULL)
3801 PyErr_Clear();
3802 else
3803 keys->dk_lookup = lookdict_split;
3804 return keys;
3805}
3806
3807#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
3808
3809PyObject *
3810PyObject_GenericGetDict(PyObject *obj, void *context)
3811{
3812 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
3813 if (dictptr == NULL) {
3814 PyErr_SetString(PyExc_AttributeError,
3815 "This object has no __dict__");
3816 return NULL;
3817 }
3818 dict = *dictptr;
3819 if (dict == NULL) {
3820 PyTypeObject *tp = Py_TYPE(obj);
3821 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
3822 DK_INCREF(CACHED_KEYS(tp));
3823 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
3824 }
3825 else {
3826 *dictptr = dict = PyDict_New();
3827 }
3828 }
3829 Py_XINCREF(dict);
3830 return dict;
3831}
3832
3833int
3834_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
3835 PyObject *key, PyObject *value)
3836{
3837 PyObject *dict;
3838 int res;
3839 PyDictKeysObject *cached;
3840
3841 assert(dictptr != NULL);
3842 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
3843 assert(dictptr != NULL);
3844 dict = *dictptr;
3845 if (dict == NULL) {
3846 DK_INCREF(cached);
3847 dict = new_dict_with_shared_keys(cached);
3848 if (dict == NULL)
3849 return -1;
3850 *dictptr = dict;
3851 }
3852 if (value == NULL) {
3853 res = PyDict_DelItem(dict, key);
3854 if (cached != ((PyDictObject *)dict)->ma_keys) {
3855 CACHED_KEYS(tp) = NULL;
3856 DK_DECREF(cached);
3857 }
3858 } else {
3859 res = PyDict_SetItem(dict, key, value);
3860 if (cached != ((PyDictObject *)dict)->ma_keys) {
3861 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04003862 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003863 CACHED_KEYS(tp) = make_keys_shared(dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003864 } else {
3865 CACHED_KEYS(tp) = NULL;
3866 }
3867 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04003868 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
3869 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003870 }
3871 }
3872 } else {
3873 dict = *dictptr;
3874 if (dict == NULL) {
3875 dict = PyDict_New();
3876 if (dict == NULL)
3877 return -1;
3878 *dictptr = dict;
3879 }
3880 if (value == NULL) {
3881 res = PyDict_DelItem(dict, key);
3882 } else {
3883 res = PyDict_SetItem(dict, key, value);
3884 }
3885 }
3886 return res;
3887}
3888
3889void
3890_PyDictKeys_DecRef(PyDictKeysObject *keys)
3891{
3892 DK_DECREF(keys);
3893}
3894
3895
3896/* ARGSUSED */
3897static PyObject *
3898dummy_repr(PyObject *op)
3899{
3900 return PyUnicode_FromString("<dummy key>");
3901}
3902
3903/* ARGUSED */
3904static void
3905dummy_dealloc(PyObject* ignore)
3906{
3907 /* This should never get called, but we also don't want to SEGV if
3908 * we accidentally decref dummy-key out of existence.
3909 */
3910 Py_FatalError("deallocating <dummy key>");
3911}
3912
3913static PyTypeObject PyDictDummy_Type = {
3914 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3915 "<dummy key> type",
3916 0,
3917 0,
3918 dummy_dealloc, /*tp_dealloc*/ /*never called*/
3919 0, /*tp_print*/
3920 0, /*tp_getattr*/
3921 0, /*tp_setattr*/
3922 0, /*tp_reserved*/
3923 dummy_repr, /*tp_repr*/
3924 0, /*tp_as_number*/
3925 0, /*tp_as_sequence*/
3926 0, /*tp_as_mapping*/
3927 0, /*tp_hash */
3928 0, /*tp_call */
3929 0, /*tp_str */
3930 0, /*tp_getattro */
3931 0, /*tp_setattro */
3932 0, /*tp_as_buffer */
3933 Py_TPFLAGS_DEFAULT, /*tp_flags */
3934};
3935
3936static PyObject _dummy_struct = {
3937 _PyObject_EXTRA_INIT
3938 2, &PyDictDummy_Type
3939};
3940