blob: 8eff9990cd6b2bdeffefb9551952d5ff96925ed2 [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"
Christian Heimes0ded5b52007-12-10 15:50:56 +000070#include "stringlib/eq.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000071
Larry Hastings61272b72014-01-07 12:41:53 -080072/*[clinic input]
Larry Hastings44e2eaa2013-11-23 15:37:55 -080073class dict
Larry Hastings61272b72014-01-07 12:41:53 -080074[clinic start generated code]*/
75/*[clinic end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -080076
Benjamin Peterson7d95e402012-04-23 11:24:50 -040077typedef struct {
78 /* Cached hash code of me_key. */
79 Py_hash_t me_hash;
80 PyObject *me_key;
81 PyObject *me_value; /* This field is only meaningful for combined tables */
82} PyDictKeyEntry;
83
84typedef PyDictKeyEntry *(*dict_lookup_func)
85(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject ***value_addr);
86
87struct _dictkeysobject {
88 Py_ssize_t dk_refcnt;
89 Py_ssize_t dk_size;
90 dict_lookup_func dk_lookup;
91 Py_ssize_t dk_usable;
92 PyDictKeyEntry dk_entries[1];
93};
94
95
96/*
97To ensure the lookup algorithm terminates, there must be at least one Unused
98slot (NULL key) in the table.
99To avoid slowing down lookups on a near-full table, we resize the table when
100it's USABLE_FRACTION (currently two-thirds) full.
101*/
Guido van Rossum16e93a81997-01-28 00:00:11 +0000102
Tim Peterseb28ef22001-06-02 05:27:19 +0000103#define PERTURB_SHIFT 5
104
Guido van Rossum16e93a81997-01-28 00:00:11 +0000105/*
Tim Peterseb28ef22001-06-02 05:27:19 +0000106Major subtleties ahead: Most hash schemes depend on having a "good" hash
107function, in the sense of simulating randomness. Python doesn't: its most
108important hash functions (for strings and ints) are very regular in common
109cases:
Tim Peters15d49292001-05-27 07:39:22 +0000110
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000111 >>> map(hash, (0, 1, 2, 3))
112 [0, 1, 2, 3]
113 >>> map(hash, ("namea", "nameb", "namec", "named"))
114 [-1658398457, -1658398460, -1658398459, -1658398462]
115 >>>
Tim Peters15d49292001-05-27 07:39:22 +0000116
Tim Peterseb28ef22001-06-02 05:27:19 +0000117This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
118the low-order i bits as the initial table index is extremely fast, and there
119are no collisions at all for dicts indexed by a contiguous range of ints.
120The same is approximately true when keys are "consecutive" strings. So this
121gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +0000122
Tim Peterseb28ef22001-06-02 05:27:19 +0000123OTOH, when collisions occur, the tendency to fill contiguous slices of the
124hash table makes a good collision resolution strategy crucial. Taking only
125the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000127their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
128 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +0000129
Tim Peterseb28ef22001-06-02 05:27:19 +0000130But catering to unusual cases should not slow the usual ones, so we just take
131the last i bits anyway. It's up to collision resolution to do the rest. If
132we *usually* find the key we're looking for on the first try (and, it turns
133out, we usually do -- the table load factor is kept under 2/3, so the odds
134are solidly in our favor), then it makes best sense to keep the initial index
135computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +0000136
Tim Peterseb28ef22001-06-02 05:27:19 +0000137The first half of collision resolution is to visit table indices via this
138recurrence:
Tim Peters15d49292001-05-27 07:39:22 +0000139
Tim Peterseb28ef22001-06-02 05:27:19 +0000140 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +0000141
Tim Peterseb28ef22001-06-02 05:27:19 +0000142For any initial j in range(2**i), repeating that 2**i times generates each
143int in range(2**i) exactly once (see any text on random-number generation for
144proof). By itself, this doesn't help much: like linear probing (setting
145j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
146order. This would be bad, except that's not the only thing we do, and it's
147actually *good* in the common cases where hash keys are consecutive. In an
148example that's really too small to make this entirely clear, for a table of
149size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +0000150
Tim Peterseb28ef22001-06-02 05:27:19 +0000151 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
152
153If two things come in at index 5, the first place we look after is index 2,
154not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
155Linear probing is deadly in this case because there the fixed probe order
156is the *same* as the order consecutive keys are likely to arrive. But it's
157extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
158and certain that consecutive hash codes do not.
159
160The other half of the strategy is to get the other bits of the hash code
161into play. This is done by initializing a (unsigned) vrbl "perturb" to the
162full hash code, and changing the recurrence to:
163
164 j = (5*j) + 1 + perturb;
165 perturb >>= PERTURB_SHIFT;
166 use j % 2**i as the next table index;
167
168Now the probe sequence depends (eventually) on every bit in the hash code,
169and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
170because it quickly magnifies small differences in the bits that didn't affect
171the initial index. Note that because perturb is unsigned, if the recurrence
172is executed often enough perturb eventually becomes and remains 0. At that
173point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
174that's certain to find an empty slot eventually (since it generates every int
175in range(2**i), and we make sure there's always at least one empty slot).
176
177Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
178small so that the high bits of the hash code continue to affect the probe
179sequence across iterations; but you want it large so that in really bad cases
180the high-order hash bits have an effect on early iterations. 5 was "the
181best" in minimizing total collisions across experiments Tim Peters ran (on
182both normal and pathological cases), but 4 and 6 weren't significantly worse.
183
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000184Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000185approach, using repeated multiplication by x in GF(2**n) where an irreducible
186polynomial for each table size was chosen such that x was a primitive root.
187Christian Tismer later extended that to use division by x instead, as an
188efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000189also gave excellent collision statistics, but was more expensive: two
190if-tests were required inside the loop; computing "the next" index took about
191the same number of operations but without as much potential parallelism
192(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
193above, and then shifting perturb can be done while the table index is being
194masked); and the PyDictObject struct required a member to hold the table's
195polynomial. In Tim's experiments the current scheme ran faster, produced
196equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000197
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000198*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000199
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400200/* Object used as dummy key to fill deleted entries
201 * This could be any unique object,
202 * use a custom type in order to minimise coupling.
203*/
204static PyObject _dummy_struct;
205
206#define dummy (&_dummy_struct)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000207
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000208#ifdef Py_REF_DEBUG
209PyObject *
210_PyDict_Dummy(void)
211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 return dummy;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000213}
214#endif
215
Fred Drake1bff34a2000-08-31 19:31:38 +0000216/* forward declarations */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400217static PyDictKeyEntry *lookdict(PyDictObject *mp, PyObject *key,
218 Py_hash_t hash, PyObject ***value_addr);
219static PyDictKeyEntry *lookdict_unicode(PyDictObject *mp, PyObject *key,
220 Py_hash_t hash, PyObject ***value_addr);
221static PyDictKeyEntry *
222lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
223 Py_hash_t hash, PyObject ***value_addr);
224static PyDictKeyEntry *lookdict_split(PyDictObject *mp, PyObject *key,
225 Py_hash_t hash, PyObject ***value_addr);
Fred Drake1bff34a2000-08-31 19:31:38 +0000226
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400227static int dictresize(PyDictObject *mp, Py_ssize_t minused);
Tim Petersdea48ec2001-05-22 20:40:22 +0000228
Raymond Hettinger43442782004-03-17 21:55:03 +0000229/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes2202f872008-02-06 14:31:34 +0000230#ifndef PyDict_MAXFREELIST
231#define PyDict_MAXFREELIST 80
232#endif
233static PyDictObject *free_list[PyDict_MAXFREELIST];
234static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000235
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100236int
237PyDict_ClearFreeList(void)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 PyDictObject *op;
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100240 int ret = numfree;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 while (numfree) {
242 op = free_list[--numfree];
243 assert(PyDict_CheckExact(op));
244 PyObject_GC_Del(op);
245 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100246 return ret;
247}
248
David Malcolm49526f42012-06-22 14:55:41 -0400249/* Print summary info about the state of the optimized allocator */
250void
251_PyDict_DebugMallocStats(FILE *out)
252{
253 _PyDebugAllocatorStats(out,
254 "free PyDictObject", numfree, sizeof(PyDictObject));
255}
256
257
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100258void
259PyDict_Fini(void)
260{
261 PyDict_ClearFreeList();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000262}
263
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200264#define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
265#define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
266
267#define DK_INCREF(dk) (DK_DEBUG_INCREF ++(dk)->dk_refcnt)
268#define DK_DECREF(dk) if (DK_DEBUG_DECREF (--(dk)->dk_refcnt) == 0) free_keys_object(dk)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400269#define DK_SIZE(dk) ((dk)->dk_size)
270#define DK_MASK(dk) (((dk)->dk_size)-1)
271#define IS_POWER_OF_2(x) (((x) & (x-1)) == 0)
272
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200273/* USABLE_FRACTION is the maximum dictionary load.
274 * Currently set to (2n+1)/3. Increasing this ratio makes dictionaries more
275 * dense resulting in more collisions. Decreasing it improves sparseness
276 * at the expense of spreading entries over more cache lines and at the
277 * cost of total memory consumed.
278 *
279 * USABLE_FRACTION must obey the following:
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400280 * (0 < USABLE_FRACTION(n) < n) for all n >= 2
281 *
282 * USABLE_FRACTION should be very quick to calculate.
283 * Fractions around 5/8 to 2/3 seem to work well in practice.
284 */
285
286/* Use (2n+1)/3 rather than 2n+3 because: it makes no difference for
287 * combined tables (the two fractions round to the same number n < ),
288 * but 2*4/3 is 2 whereas (2*4+1)/3 is 3 which potentially saves quite
289 * a lot of space for small, split tables */
290#define USABLE_FRACTION(n) ((((n) << 1)+1)/3)
291
292/* Alternative fraction that is otherwise close enough to (2n+1)/3 to make
293 * little difference. 8 * 2/3 == 8 * 5/8 == 5. 16 * 2/3 == 16 * 5/8 == 10.
294 * 32 * 2/3 = 21, 32 * 5/8 = 20.
295 * Its advantage is that it is faster to compute on machines with slow division.
296 * #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
297*/
298
Victor Stinnera9f61a52013-07-16 22:17:26 +0200299/* GROWTH_RATE. Growth rate upon hitting maximum load.
300 * Currently set to used*2 + capacity/2.
301 * This means that dicts double in size when growing without deletions,
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700302 * but have more head room when the number of deletions is on a par with the
303 * number of insertions.
304 * Raising this to used*4 doubles memory consumption depending on the size of
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200305 * the dictionary, but results in half the number of resizes, less effort to
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700306 * resize.
307 * GROWTH_RATE was set to used*4 up to version 3.2.
308 * GROWTH_RATE was set to used*2 in version 3.3.0
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200309 */
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700310#define GROWTH_RATE(d) (((d)->ma_used*2)+((d)->ma_keys->dk_size>>1))
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400311
312#define ENSURE_ALLOWS_DELETIONS(d) \
313 if ((d)->ma_keys->dk_lookup == lookdict_unicode_nodummy) { \
314 (d)->ma_keys->dk_lookup = lookdict_unicode; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400316
317/* This immutable, empty PyDictKeysObject is used for PyDict_Clear()
318 * (which cannot fail and thus can do no allocation).
319 */
320static PyDictKeysObject empty_keys_struct = {
321 2, /* dk_refcnt 1 for this struct, 1 for dummy_struct */
322 1, /* dk_size */
323 lookdict_split, /* dk_lookup */
324 0, /* dk_usable (immutable) */
325 {
326 { 0, 0, 0 } /* dk_entries (empty) */
327 }
328};
329
330static PyObject *empty_values[1] = { NULL };
331
332#define Py_EMPTY_KEYS &empty_keys_struct
333
334static PyDictKeysObject *new_keys_object(Py_ssize_t size)
335{
336 PyDictKeysObject *dk;
337 Py_ssize_t i;
338 PyDictKeyEntry *ep0;
339
340 assert(size >= PyDict_MINSIZE_SPLIT);
341 assert(IS_POWER_OF_2(size));
342 dk = PyMem_MALLOC(sizeof(PyDictKeysObject) +
343 sizeof(PyDictKeyEntry) * (size-1));
344 if (dk == NULL) {
345 PyErr_NoMemory();
346 return NULL;
347 }
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200348 DK_DEBUG_INCREF dk->dk_refcnt = 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400349 dk->dk_size = size;
350 dk->dk_usable = USABLE_FRACTION(size);
351 ep0 = &dk->dk_entries[0];
352 /* Hash value of slot 0 is used by popitem, so it must be initialized */
353 ep0->me_hash = 0;
354 for (i = 0; i < size; i++) {
355 ep0[i].me_key = NULL;
356 ep0[i].me_value = NULL;
357 }
358 dk->dk_lookup = lookdict_unicode_nodummy;
359 return dk;
360}
361
362static void
363free_keys_object(PyDictKeysObject *keys)
364{
365 PyDictKeyEntry *entries = &keys->dk_entries[0];
366 Py_ssize_t i, n;
367 for (i = 0, n = DK_SIZE(keys); i < n; i++) {
368 Py_XDECREF(entries[i].me_key);
369 Py_XDECREF(entries[i].me_value);
370 }
371 PyMem_FREE(keys);
372}
373
374#define new_values(size) PyMem_NEW(PyObject *, size)
375
376#define free_values(values) PyMem_FREE(values)
377
378/* Consumes a reference to the keys object */
379static PyObject *
380new_dict(PyDictKeysObject *keys, PyObject **values)
381{
382 PyDictObject *mp;
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200383 assert(keys != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 if (numfree) {
385 mp = free_list[--numfree];
386 assert (mp != NULL);
387 assert (Py_TYPE(mp) == &PyDict_Type);
388 _Py_NewReference((PyObject *)mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400390 else {
391 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
392 if (mp == NULL) {
393 DK_DECREF(keys);
394 free_values(values);
395 return NULL;
396 }
397 }
398 mp->ma_keys = keys;
399 mp->ma_values = values;
400 mp->ma_used = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000402}
403
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400404/* Consumes a reference to the keys object */
405static PyObject *
406new_dict_with_shared_keys(PyDictKeysObject *keys)
407{
408 PyObject **values;
409 Py_ssize_t i, size;
410
411 size = DK_SIZE(keys);
412 values = new_values(size);
413 if (values == NULL) {
414 DK_DECREF(keys);
415 return PyErr_NoMemory();
416 }
417 for (i = 0; i < size; i++) {
418 values[i] = NULL;
419 }
420 return new_dict(keys, values);
421}
422
423PyObject *
424PyDict_New(void)
425{
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200426 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_COMBINED);
427 if (keys == NULL)
428 return NULL;
429 return new_dict(keys, NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400430}
431
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000432/*
433The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000434This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000435Open addressing is preferred over chaining since the link overhead for
436chaining would be substantial (100% with typical malloc overhead).
437
Tim Peterseb28ef22001-06-02 05:27:19 +0000438The initial probe index is computed as hash mod the table size. Subsequent
439probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000440
441All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000442
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000443The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000444contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000445Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000446
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000447lookdict() is general-purpose, and may return NULL if (and only if) a
448comparison raises an exception (this was new in Python 2.5).
Guido van Rossum89d8c602007-09-18 17:26:56 +0000449lookdict_unicode() below is specialized to string keys, comparison of which can
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400450never raise an exception; that function can never return NULL.
451lookdict_unicode_nodummy is further specialized for string keys that cannot be
452the <dummy> value.
453For both, when the key isn't found a PyDictEntry* is returned
454where the key would have been found, *value_addr points to the matching value
455slot.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000456*/
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400457static PyDictKeyEntry *
458lookdict(PyDictObject *mp, PyObject *key,
459 Py_hash_t hash, PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000460{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200461 size_t i;
462 size_t perturb;
463 PyDictKeyEntry *freeslot;
464 size_t mask;
Antoine Pitrou9a234902012-05-13 20:48:01 +0200465 PyDictKeyEntry *ep0;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200466 PyDictKeyEntry *ep;
467 int cmp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000469
Antoine Pitrou9a234902012-05-13 20:48:01 +0200470top:
471 mask = DK_MASK(mp->ma_keys);
472 ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 i = (size_t)hash & mask;
474 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400475 if (ep->me_key == NULL || ep->me_key == key) {
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 if (ep->me_key == dummy)
480 freeslot = ep;
481 else {
482 if (ep->me_hash == hash) {
483 startkey = ep->me_key;
484 Py_INCREF(startkey);
485 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
486 Py_DECREF(startkey);
487 if (cmp < 0)
488 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400489 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
490 if (cmp > 0) {
491 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400493 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 }
495 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200496 /* The dict was mutated, restart */
497 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 }
499 }
500 freeslot = NULL;
501 }
Tim Peters15d49292001-05-27 07:39:22 +0000502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 /* In the loop, me_key == dummy is by far (factor of 100s) the
504 least likely outcome, so test for that last. */
505 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
506 i = (i << 2) + i + perturb + 1;
507 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400508 if (ep->me_key == NULL) {
509 if (freeslot == NULL) {
510 *value_addr = &ep->me_value;
511 return ep;
512 } else {
513 *value_addr = &freeslot->me_value;
514 return freeslot;
515 }
516 }
517 if (ep->me_key == key) {
518 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400520 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 if (ep->me_hash == hash && ep->me_key != dummy) {
522 startkey = ep->me_key;
523 Py_INCREF(startkey);
524 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
525 Py_DECREF(startkey);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400526 if (cmp < 0) {
527 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400529 }
530 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
531 if (cmp > 0) {
532 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400534 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 }
536 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200537 /* The dict was mutated, restart */
538 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 }
540 }
541 else if (ep->me_key == dummy && freeslot == NULL)
542 freeslot = ep;
543 }
544 assert(0); /* NOT REACHED */
545 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000546}
547
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400548/* Specialized version for string-only keys */
549static PyDictKeyEntry *
550lookdict_unicode(PyDictObject *mp, PyObject *key,
551 Py_hash_t hash, PyObject ***value_addr)
Fred Drake1bff34a2000-08-31 19:31:38 +0000552{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200553 size_t i;
554 size_t perturb;
555 PyDictKeyEntry *freeslot;
556 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400557 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200558 PyDictKeyEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 /* Make sure this function doesn't have to handle non-unicode keys,
561 including subclasses of str; e.g., one reason to subclass
562 unicodes is to override __eq__, and for speed we don't cater to
563 that here. */
564 if (!PyUnicode_CheckExact(key)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400565 mp->ma_keys->dk_lookup = lookdict;
566 return lookdict(mp, key, hash, value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100568 i = (size_t)hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400570 if (ep->me_key == NULL || ep->me_key == key) {
571 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400573 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 if (ep->me_key == dummy)
575 freeslot = ep;
576 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400577 if (ep->me_hash == hash && unicode_eq(ep->me_key, key)) {
578 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400580 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 freeslot = NULL;
582 }
Tim Peters15d49292001-05-27 07:39:22 +0000583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 /* In the loop, me_key == dummy is by far (factor of 100s) the
585 least likely outcome, so test for that last. */
586 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
587 i = (i << 2) + i + perturb + 1;
588 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400589 if (ep->me_key == NULL) {
590 if (freeslot == NULL) {
591 *value_addr = &ep->me_value;
592 return ep;
593 } else {
594 *value_addr = &freeslot->me_value;
595 return freeslot;
596 }
597 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 if (ep->me_key == key
599 || (ep->me_hash == hash
600 && ep->me_key != dummy
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400601 && unicode_eq(ep->me_key, key))) {
602 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400604 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 if (ep->me_key == dummy && freeslot == NULL)
606 freeslot = ep;
607 }
608 assert(0); /* NOT REACHED */
609 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000610}
611
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400612/* Faster version of lookdict_unicode when it is known that no <dummy> keys
613 * will be present. */
614static PyDictKeyEntry *
615lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
616 Py_hash_t hash, PyObject ***value_addr)
617{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200618 size_t i;
619 size_t perturb;
620 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400621 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200622 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400623
624 /* Make sure this function doesn't have to handle non-unicode keys,
625 including subclasses of str; e.g., one reason to subclass
626 unicodes is to override __eq__, and for speed we don't cater to
627 that here. */
628 if (!PyUnicode_CheckExact(key)) {
629 mp->ma_keys->dk_lookup = lookdict;
630 return lookdict(mp, key, hash, value_addr);
631 }
632 i = (size_t)hash & mask;
633 ep = &ep0[i];
634 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
635 if (ep->me_key == NULL || ep->me_key == key ||
636 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
637 *value_addr = &ep->me_value;
638 return ep;
639 }
640 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
641 i = (i << 2) + i + perturb + 1;
642 ep = &ep0[i & mask];
643 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
644 if (ep->me_key == NULL || ep->me_key == key ||
645 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
646 *value_addr = &ep->me_value;
647 return ep;
648 }
649 }
650 assert(0); /* NOT REACHED */
651 return 0;
652}
653
654/* Version of lookdict for split tables.
655 * All split tables and only split tables use this lookup function.
656 * Split tables only contain unicode keys and no dummy keys,
657 * so algorithm is the same as lookdict_unicode_nodummy.
658 */
659static PyDictKeyEntry *
660lookdict_split(PyDictObject *mp, PyObject *key,
661 Py_hash_t hash, PyObject ***value_addr)
662{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200663 size_t i;
664 size_t perturb;
665 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400666 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200667 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400668
669 if (!PyUnicode_CheckExact(key)) {
Benjamin Petersondb780d02012-04-23 13:44:32 -0400670 ep = lookdict(mp, key, hash, value_addr);
671 /* lookdict expects a combined-table, so fix value_addr */
672 i = ep - ep0;
673 *value_addr = &mp->ma_values[i];
674 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400675 }
676 i = (size_t)hash & mask;
677 ep = &ep0[i];
678 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
679 if (ep->me_key == NULL || ep->me_key == key ||
680 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
681 *value_addr = &mp->ma_values[i];
682 return ep;
683 }
684 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
685 i = (i << 2) + i + perturb + 1;
686 ep = &ep0[i & mask];
687 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
688 if (ep->me_key == NULL || ep->me_key == key ||
689 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
690 *value_addr = &mp->ma_values[i & mask];
691 return ep;
692 }
693 }
694 assert(0); /* NOT REACHED */
695 return 0;
696}
697
Benjamin Petersonfb886362010-04-24 18:21:17 +0000698int
699_PyDict_HasOnlyStringKeys(PyObject *dict)
700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 Py_ssize_t pos = 0;
702 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +0000703 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 /* Shortcut */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400705 if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 return 1;
707 while (PyDict_Next(dict, &pos, &key, &value))
708 if (!PyUnicode_Check(key))
709 return 0;
710 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +0000711}
712
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000713#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 do { \
715 if (!_PyObject_GC_IS_TRACKED(mp)) { \
716 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
717 _PyObject_GC_MAY_BE_TRACKED(value)) { \
718 _PyObject_GC_TRACK(mp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 } \
720 } \
721 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000722
723void
724_PyDict_MaybeUntrack(PyObject *op)
725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 PyDictObject *mp;
727 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400728 Py_ssize_t i, size;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
731 return;
732
733 mp = (PyDictObject *) op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400734 size = DK_SIZE(mp->ma_keys);
735 if (_PyDict_HasSplitTable(mp)) {
736 for (i = 0; i < size; i++) {
737 if ((value = mp->ma_values[i]) == NULL)
738 continue;
739 if (_PyObject_GC_MAY_BE_TRACKED(value)) {
740 assert(!_PyObject_GC_MAY_BE_TRACKED(
741 mp->ma_keys->dk_entries[i].me_key));
742 return;
743 }
744 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400746 else {
747 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
748 for (i = 0; i < size; i++) {
749 if ((value = ep0[i].me_value) == NULL)
750 continue;
751 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
752 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
753 return;
754 }
755 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000757}
758
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400759/* Internal function to find slot for an item from its hash
760 * when it is known that the key is not present in the dict.
761 */
762static PyDictKeyEntry *
763find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
764 PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000765{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400766 size_t i;
767 size_t perturb;
768 size_t mask = DK_MASK(mp->ma_keys);
769 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
770 PyDictKeyEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000771
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400772 assert(key != NULL);
773 if (!PyUnicode_CheckExact(key))
774 mp->ma_keys->dk_lookup = lookdict;
775 i = hash & mask;
776 ep = &ep0[i];
777 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
778 i = (i << 2) + i + perturb + 1;
779 ep = &ep0[i & mask];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400781 assert(ep->me_value == NULL);
782 if (mp->ma_values)
783 *value_addr = &mp->ma_values[i & mask];
784 else
785 *value_addr = &ep->me_value;
786 return ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000787}
788
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400789static int
790insertion_resize(PyDictObject *mp)
791{
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700792 return dictresize(mp, GROWTH_RATE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400793}
Antoine Pitroue965d972012-02-27 00:45:12 +0100794
795/*
796Internal routine to insert a new item into the table.
797Used both by the internal resize routine and by the public insert routine.
Antoine Pitroue965d972012-02-27 00:45:12 +0100798Returns -1 if an error occurred, or 0 on success.
799*/
800static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400801insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +0100802{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400803 PyObject *old_value;
804 PyObject **value_addr;
805 PyDictKeyEntry *ep;
806 assert(key != dummy);
Antoine Pitroue965d972012-02-27 00:45:12 +0100807
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400808 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
809 if (insertion_resize(mp) < 0)
810 return -1;
811 }
812
813 ep = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr);
Antoine Pitroue965d972012-02-27 00:45:12 +0100814 if (ep == NULL) {
Antoine Pitroue965d972012-02-27 00:45:12 +0100815 return -1;
816 }
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400817 Py_INCREF(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400818 MAINTAIN_TRACKING(mp, key, value);
819 old_value = *value_addr;
820 if (old_value != NULL) {
821 assert(ep->me_key != NULL && ep->me_key != dummy);
822 *value_addr = value;
823 Py_DECREF(old_value); /* which **CAN** re-enter */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400824 }
825 else {
826 if (ep->me_key == NULL) {
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400827 Py_INCREF(key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400828 if (mp->ma_keys->dk_usable <= 0) {
829 /* Need to resize. */
830 if (insertion_resize(mp) < 0) {
831 Py_DECREF(key);
832 Py_DECREF(value);
833 return -1;
834 }
835 ep = find_empty_slot(mp, key, hash, &value_addr);
836 }
837 mp->ma_keys->dk_usable--;
838 assert(mp->ma_keys->dk_usable >= 0);
839 ep->me_key = key;
840 ep->me_hash = hash;
841 }
842 else {
843 if (ep->me_key == dummy) {
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400844 Py_INCREF(key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400845 ep->me_key = key;
846 ep->me_hash = hash;
847 Py_DECREF(dummy);
848 } else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400849 assert(_PyDict_HasSplitTable(mp));
850 }
851 }
852 mp->ma_used++;
853 *value_addr = value;
854 }
855 assert(ep->me_key != NULL && ep->me_key != dummy);
856 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
857 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +0100858}
859
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000860/*
861Internal routine used by dictresize() to insert an item which is
862known to be absent from the dict. This routine also assumes that
863the dict contains no deleted entries. Besides the performance benefit,
864using insertdict() in dictresize() is dangerous (SF bug #1456209).
865Note that no refcounts are changed by this routine; if needed, the caller
866is responsible for incref'ing `key` and `value`.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400867Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
868must set them correctly
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000869*/
870static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400871insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000873{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400874 size_t i;
875 size_t perturb;
876 PyDictKeysObject *k = mp->ma_keys;
877 size_t mask = (size_t)DK_SIZE(k)-1;
878 PyDictKeyEntry *ep0 = &k->dk_entries[0];
879 PyDictKeyEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000880
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400881 assert(k->dk_lookup != NULL);
882 assert(value != NULL);
883 assert(key != NULL);
884 assert(key != dummy);
885 assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
886 i = hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 ep = &ep0[i];
888 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
889 i = (i << 2) + i + perturb + 1;
890 ep = &ep0[i & mask];
891 }
892 assert(ep->me_value == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000894 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000896}
897
898/*
899Restructure the table by allocating a new table and reinserting all
900items again. When entries have been deleted, the new table may
901actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400902If a table is split (its keys and hashes are shared, its values are not),
903then the values are temporarily copied into the table, it is resized as
904a combined table, then the me_value slots in the old table are NULLed out.
905After resizing a table is always combined,
906but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000907*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000908static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000909dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000910{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 Py_ssize_t newsize;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400912 PyDictKeysObject *oldkeys;
913 PyObject **oldvalues;
914 Py_ssize_t i, oldsize;
Tim Peters91a364d2001-05-19 07:04:38 +0000915
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400916/* Find the smallest table size > minused. */
917 for (newsize = PyDict_MINSIZE_COMBINED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 newsize <= minused && newsize > 0;
919 newsize <<= 1)
920 ;
921 if (newsize <= 0) {
922 PyErr_NoMemory();
923 return -1;
924 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400925 oldkeys = mp->ma_keys;
926 oldvalues = mp->ma_values;
927 /* Allocate a new table. */
928 mp->ma_keys = new_keys_object(newsize);
929 if (mp->ma_keys == NULL) {
930 mp->ma_keys = oldkeys;
931 return -1;
932 }
933 if (oldkeys->dk_lookup == lookdict)
934 mp->ma_keys->dk_lookup = lookdict;
935 oldsize = DK_SIZE(oldkeys);
936 mp->ma_values = NULL;
937 /* If empty then nothing to copy so just return */
938 if (oldsize == 1) {
939 assert(oldkeys == Py_EMPTY_KEYS);
940 DK_DECREF(oldkeys);
941 return 0;
942 }
943 /* Main loop below assumes we can transfer refcount to new keys
944 * and that value is stored in me_value.
945 * Increment ref-counts and copy values here to compensate
946 * This (resizing a split table) should be relatively rare */
947 if (oldvalues != NULL) {
948 for (i = 0; i < oldsize; i++) {
949 if (oldvalues[i] != NULL) {
950 Py_INCREF(oldkeys->dk_entries[i].me_key);
951 oldkeys->dk_entries[i].me_value = oldvalues[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 }
954 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400955 /* Main loop */
956 for (i = 0; i < oldsize; i++) {
957 PyDictKeyEntry *ep = &oldkeys->dk_entries[i];
958 if (ep->me_value != NULL) {
959 assert(ep->me_key != dummy);
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000960 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400963 mp->ma_keys->dk_usable -= mp->ma_used;
964 if (oldvalues != NULL) {
965 /* NULL out me_value slot in oldkeys, in case it was shared */
966 for (i = 0; i < oldsize; i++)
967 oldkeys->dk_entries[i].me_value = NULL;
968 assert(oldvalues != empty_values);
969 free_values(oldvalues);
970 DK_DECREF(oldkeys);
971 }
972 else {
973 assert(oldkeys->dk_lookup != lookdict_split);
974 if (oldkeys->dk_lookup != lookdict_unicode_nodummy) {
975 PyDictKeyEntry *ep0 = &oldkeys->dk_entries[0];
976 for (i = 0; i < oldsize; i++) {
977 if (ep0[i].me_key == dummy)
978 Py_DECREF(dummy);
979 }
980 }
981 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200982 DK_DEBUG_DECREF PyMem_FREE(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400983 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000985}
986
Benjamin Peterson15ee8212012-04-24 14:44:18 -0400987/* Returns NULL if unable to split table.
988 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400989static PyDictKeysObject *
990make_keys_shared(PyObject *op)
991{
992 Py_ssize_t i;
993 Py_ssize_t size;
994 PyDictObject *mp = (PyDictObject *)op;
995
Benjamin Peterson15ee8212012-04-24 14:44:18 -0400996 if (!PyDict_CheckExact(op))
997 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400998 if (!_PyDict_HasSplitTable(mp)) {
999 PyDictKeyEntry *ep0;
1000 PyObject **values;
1001 assert(mp->ma_keys->dk_refcnt == 1);
1002 if (mp->ma_keys->dk_lookup == lookdict) {
1003 return NULL;
1004 }
1005 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
1006 /* Remove dummy keys */
1007 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
1008 return NULL;
1009 }
1010 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
1011 /* Copy values into a new array */
1012 ep0 = &mp->ma_keys->dk_entries[0];
1013 size = DK_SIZE(mp->ma_keys);
1014 values = new_values(size);
1015 if (values == NULL) {
1016 PyErr_SetString(PyExc_MemoryError,
1017 "Not enough memory to allocate new values array");
1018 return NULL;
1019 }
1020 for (i = 0; i < size; i++) {
1021 values[i] = ep0[i].me_value;
1022 ep0[i].me_value = NULL;
1023 }
1024 mp->ma_keys->dk_lookup = lookdict_split;
1025 mp->ma_values = values;
1026 }
1027 DK_INCREF(mp->ma_keys);
1028 return mp->ma_keys;
1029}
Christian Heimes99170a52007-12-19 02:07:34 +00001030
1031PyObject *
1032_PyDict_NewPresized(Py_ssize_t minused)
1033{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001034 Py_ssize_t newsize;
1035 PyDictKeysObject *new_keys;
1036 for (newsize = PyDict_MINSIZE_COMBINED;
1037 newsize <= minused && newsize > 0;
1038 newsize <<= 1)
1039 ;
1040 new_keys = new_keys_object(newsize);
1041 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001043 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001044}
1045
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001046/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1047 * that may occur (originally dicts supported only string keys, and exceptions
1048 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001049 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001050 * (suppressed) occurred while computing the key's hash, or that some error
1051 * (suppressed) occurred when comparing keys in the dict's internal probe
1052 * sequence. A nasty example of the latter is when a Python-coded comparison
1053 * function hits a stack-depth error, which can cause this to return NULL
1054 * even if the key is present.
1055 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001057PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001058{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001059 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001061 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001063 PyObject **value_addr;
1064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 if (!PyDict_Check(op))
1066 return NULL;
1067 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001068 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 {
1070 hash = PyObject_Hash(key);
1071 if (hash == -1) {
1072 PyErr_Clear();
1073 return NULL;
1074 }
1075 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 /* We can arrive here with a NULL tstate during initialization: try
1078 running "python -Wi" for an example related to string interning.
1079 Let's just hope that no exception occurs then... This must be
1080 _PyThreadState_Current and not PyThreadState_GET() because in debug
1081 mode, the latter complains if tstate is NULL. */
1082 tstate = (PyThreadState*)_Py_atomic_load_relaxed(
1083 &_PyThreadState_Current);
1084 if (tstate != NULL && tstate->curexc_type != NULL) {
1085 /* preserve the existing exception */
1086 PyObject *err_type, *err_value, *err_tb;
1087 PyErr_Fetch(&err_type, &err_value, &err_tb);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001088 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 /* ignore errors */
1090 PyErr_Restore(err_type, err_value, err_tb);
1091 if (ep == NULL)
1092 return NULL;
1093 }
1094 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001095 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 if (ep == NULL) {
1097 PyErr_Clear();
1098 return NULL;
1099 }
1100 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001101 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001102}
1103
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001104/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1105 This returns NULL *with* an exception set if an exception occurred.
1106 It returns NULL *without* an exception set if the key wasn't present.
1107*/
1108PyObject *
1109PyDict_GetItemWithError(PyObject *op, PyObject *key)
1110{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001111 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001113 PyDictKeyEntry *ep;
1114 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 if (!PyDict_Check(op)) {
1117 PyErr_BadInternalCall();
1118 return NULL;
1119 }
1120 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001121 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 {
1123 hash = PyObject_Hash(key);
1124 if (hash == -1) {
1125 return NULL;
1126 }
1127 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001128
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001129 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 if (ep == NULL)
1131 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001132 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001133}
1134
Brett Cannonfd074152012-04-14 14:10:13 -04001135PyObject *
1136_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1137{
1138 PyObject *kv;
1139 kv = _PyUnicode_FromId(key); /* borrowed */
1140 if (kv == NULL)
1141 return NULL;
1142 return PyDict_GetItemWithError(dp, kv);
1143}
1144
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001145/* Fast version of global value lookup.
1146 * Lookup in globals, then builtins.
1147 */
1148PyObject *
1149_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001150{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001151 PyObject *x;
1152 if (PyUnicode_CheckExact(key)) {
1153 PyObject **value_addr;
1154 Py_hash_t hash = ((PyASCIIObject *)key)->hash;
1155 if (hash != -1) {
1156 PyDictKeyEntry *e;
1157 e = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr);
1158 if (e == NULL) {
1159 return NULL;
1160 }
1161 x = *value_addr;
1162 if (x != NULL)
1163 return x;
1164 e = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr);
1165 if (e == NULL) {
1166 return NULL;
1167 }
1168 x = *value_addr;
1169 return x;
1170 }
Antoine Pitroue965d972012-02-27 00:45:12 +01001171 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001172 x = PyDict_GetItemWithError((PyObject *)globals, key);
1173 if (x != NULL)
1174 return x;
1175 if (PyErr_Occurred())
1176 return NULL;
1177 return PyDict_GetItemWithError((PyObject *)builtins, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001178}
1179
Antoine Pitroue965d972012-02-27 00:45:12 +01001180/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1181 * dictionary if it's merely replacing the value for an existing key.
1182 * This means that it's safe to loop over a dictionary with PyDict_Next()
1183 * and occasionally replace a value -- but you can't insert new keys or
1184 * remove them.
1185 */
1186int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001187PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001188{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001189 PyDictObject *mp;
1190 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001191 if (!PyDict_Check(op)) {
1192 PyErr_BadInternalCall();
1193 return -1;
1194 }
1195 assert(key);
1196 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001197 mp = (PyDictObject *)op;
1198 if (!PyUnicode_CheckExact(key) ||
1199 (hash = ((PyASCIIObject *) key)->hash) == -1)
1200 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001201 hash = PyObject_Hash(key);
1202 if (hash == -1)
1203 return -1;
1204 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001205
1206 /* insertdict() handles any resizing that might be necessary */
1207 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001208}
1209
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001210int
Tim Peters1f5871e2000-07-04 17:44:48 +00001211PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001212{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001213 PyDictObject *mp;
1214 Py_hash_t hash;
1215 PyDictKeyEntry *ep;
1216 PyObject *old_key, *old_value;
1217 PyObject **value_addr;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 if (!PyDict_Check(op)) {
1220 PyErr_BadInternalCall();
1221 return -1;
1222 }
1223 assert(key);
1224 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001225 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 hash = PyObject_Hash(key);
1227 if (hash == -1)
1228 return -1;
1229 }
1230 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001231 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 if (ep == NULL)
1233 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001234 if (*value_addr == NULL) {
Raymond Hettinger69492da2013-09-02 15:59:26 -07001235 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 return -1;
1237 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001238 old_value = *value_addr;
1239 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001241 if (!_PyDict_HasSplitTable(mp)) {
1242 ENSURE_ALLOWS_DELETIONS(mp);
1243 old_key = ep->me_key;
1244 Py_INCREF(dummy);
1245 ep->me_key = dummy;
1246 Py_DECREF(old_key);
1247 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001250}
1251
Guido van Rossum25831651993-05-19 14:50:45 +00001252void
Tim Peters1f5871e2000-07-04 17:44:48 +00001253PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001254{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001256 PyDictKeysObject *oldkeys;
1257 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 if (!PyDict_Check(op))
1261 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001262 mp = ((PyDictObject *)op);
1263 oldkeys = mp->ma_keys;
1264 oldvalues = mp->ma_values;
1265 if (oldvalues == empty_values)
1266 return;
1267 /* Empty the dict... */
1268 DK_INCREF(Py_EMPTY_KEYS);
1269 mp->ma_keys = Py_EMPTY_KEYS;
1270 mp->ma_values = empty_values;
1271 mp->ma_used = 0;
1272 /* ...then clear the keys and values */
1273 if (oldvalues != NULL) {
1274 n = DK_SIZE(oldkeys);
1275 for (i = 0; i < n; i++)
1276 Py_CLEAR(oldvalues[i]);
1277 free_values(oldvalues);
1278 DK_DECREF(oldkeys);
1279 }
1280 else {
1281 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001282 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001283 }
1284}
1285
1286/* Returns -1 if no more items (or op is not a dict),
1287 * index of item otherwise. Stores value in pvalue
1288 */
1289Py_LOCAL_INLINE(Py_ssize_t)
1290dict_next(PyObject *op, Py_ssize_t i, PyObject **pvalue)
1291{
1292 Py_ssize_t mask, offset;
1293 PyDictObject *mp;
1294 PyObject **value_ptr;
1295
1296
1297 if (!PyDict_Check(op))
1298 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001300 if (i < 0)
1301 return -1;
1302 if (mp->ma_values) {
1303 value_ptr = &mp->ma_values[i];
1304 offset = sizeof(PyObject *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001306 else {
1307 value_ptr = &mp->ma_keys->dk_entries[i].me_value;
1308 offset = sizeof(PyDictKeyEntry);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001310 mask = DK_MASK(mp->ma_keys);
1311 while (i <= mask && *value_ptr == NULL) {
1312 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1313 i++;
1314 }
1315 if (i > mask)
1316 return -1;
1317 if (pvalue)
1318 *pvalue = *value_ptr;
1319 return i;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001320}
1321
Tim Peters080c88b2003-02-15 03:01:11 +00001322/*
1323 * Iterate over a dict. Use like so:
1324 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001325 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001326 * PyObject *key, *value;
1327 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001328 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +00001329 * Refer to borrowed references in key and value.
1330 * }
1331 *
1332 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001333 * mutates the dict. One exception: it is safe if the loop merely changes
1334 * the values associated with the keys (but doesn't insert new keys or
1335 * delete keys), via PyDict_SetItem().
1336 */
Guido van Rossum25831651993-05-19 14:50:45 +00001337int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001338PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001339{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001340 PyDictObject *mp;
1341 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 if (i < 0)
1343 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001344 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 *ppos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001347 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001349}
1350
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001351/* Internal version of PyDict_Next that returns a hash value in addition
1352 * to the key and value.
1353 */
Thomas Wouterscf297e42007-02-23 15:07:44 +00001354int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001355_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1356 PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001357{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001358 PyDictObject *mp;
1359 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 if (i < 0)
1361 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001362 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 *ppos = i+1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001364 *phash = mp->ma_keys->dk_entries[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001366 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001368}
1369
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001370/* Methods */
1371
1372static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001373dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001374{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001375 PyObject **values = mp->ma_values;
1376 PyDictKeysObject *keys = mp->ma_keys;
1377 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 PyObject_GC_UnTrack(mp);
1379 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001380 if (values != NULL) {
1381 if (values != empty_values) {
1382 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
1383 Py_XDECREF(values[i]);
1384 }
1385 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001387 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02001389 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001390 assert(keys->dk_refcnt == 1);
1391 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001392 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1394 free_list[numfree++] = mp;
1395 else
1396 Py_TYPE(mp)->tp_free((PyObject *)mp);
1397 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001398}
1399
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001400
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001401static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001402dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001405 PyObject *key = NULL, *value = NULL;
1406 _PyUnicodeWriter writer;
1407 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 i = Py_ReprEnter((PyObject *)mp);
1410 if (i != 0) {
1411 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1412 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001415 Py_ReprLeave((PyObject *)mp);
1416 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 }
Tim Petersa7259592001-06-16 05:11:17 +00001418
Victor Stinnerf91929b2013-11-19 13:07:38 +01001419 _PyUnicodeWriter_Init(&writer);
1420 writer.overallocate = 1;
1421 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
1422 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00001423
Victor Stinnerf91929b2013-11-19 13:07:38 +01001424 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
1425 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 /* Do repr() on each key+value pair, and insert ": " between them.
1428 Note that repr may mutate the dict. */
1429 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001430 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001432 PyObject *s;
1433 int res;
1434
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001435 /* Prevent repr from deleting key or value during key format. */
1436 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02001438
Victor Stinnerf91929b2013-11-19 13:07:38 +01001439 if (!first) {
1440 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
1441 goto error;
1442 }
1443 first = 0;
1444
1445 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01001447 goto error;
1448 res = _PyUnicodeWriter_WriteStr(&writer, s);
1449 Py_DECREF(s);
1450 if (res < 0)
1451 goto error;
1452
1453 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
1454 goto error;
1455
1456 s = PyObject_Repr(value);
1457 if (s == NULL)
1458 goto error;
1459 res = _PyUnicodeWriter_WriteStr(&writer, s);
1460 Py_DECREF(s);
1461 if (res < 0)
1462 goto error;
1463
1464 Py_CLEAR(key);
1465 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 }
Tim Petersa7259592001-06-16 05:11:17 +00001467
Victor Stinnerf91929b2013-11-19 13:07:38 +01001468 writer.overallocate = 0;
1469 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
1470 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01001473
1474 return _PyUnicodeWriter_Finish(&writer);
1475
1476error:
1477 Py_ReprLeave((PyObject *)mp);
1478 _PyUnicodeWriter_Dealloc(&writer);
1479 Py_XDECREF(key);
1480 Py_XDECREF(value);
1481 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001482}
1483
Martin v. Löwis18e16552006-02-15 17:27:45 +00001484static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001485dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001488}
1489
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001490static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001491dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001492{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 PyObject *v;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001494 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001495 PyDictKeyEntry *ep;
1496 PyObject **value_addr;
1497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001499 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 hash = PyObject_Hash(key);
1501 if (hash == -1)
1502 return NULL;
1503 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001504 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 if (ep == NULL)
1506 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001507 v = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 if (v == NULL) {
1509 if (!PyDict_CheckExact(mp)) {
1510 /* Look up __missing__ method if we're a subclass. */
1511 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05001512 _Py_IDENTIFIER(__missing__);
1513 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 if (missing != NULL) {
1515 res = PyObject_CallFunctionObjArgs(missing,
1516 key, NULL);
1517 Py_DECREF(missing);
1518 return res;
1519 }
1520 else if (PyErr_Occurred())
1521 return NULL;
1522 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07001523 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 return NULL;
1525 }
1526 else
1527 Py_INCREF(v);
1528 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001529}
1530
1531static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001532dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 if (w == NULL)
1535 return PyDict_DelItem((PyObject *)mp, v);
1536 else
1537 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001538}
1539
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001540static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 (lenfunc)dict_length, /*mp_length*/
1542 (binaryfunc)dict_subscript, /*mp_subscript*/
1543 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001544};
1545
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001547dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001548{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001549 PyObject *v;
1550 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001551 PyDictKeyEntry *ep;
1552 Py_ssize_t size, n, offset;
1553 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001554
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001555 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 n = mp->ma_used;
1557 v = PyList_New(n);
1558 if (v == NULL)
1559 return NULL;
1560 if (n != mp->ma_used) {
1561 /* Durnit. The allocations caused the dict to resize.
1562 * Just start over, this shouldn't normally happen.
1563 */
1564 Py_DECREF(v);
1565 goto again;
1566 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001567 ep = &mp->ma_keys->dk_entries[0];
1568 size = DK_SIZE(mp->ma_keys);
1569 if (mp->ma_values) {
1570 value_ptr = mp->ma_values;
1571 offset = sizeof(PyObject *);
1572 }
1573 else {
1574 value_ptr = &ep[0].me_value;
1575 offset = sizeof(PyDictKeyEntry);
1576 }
1577 for (i = 0, j = 0; i < size; i++) {
1578 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 PyObject *key = ep[i].me_key;
1580 Py_INCREF(key);
1581 PyList_SET_ITEM(v, j, key);
1582 j++;
1583 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001584 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 }
1586 assert(j == n);
1587 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001588}
1589
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001590static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001591dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001592{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001593 PyObject *v;
1594 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001595 Py_ssize_t size, n, offset;
1596 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001597
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001598 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 n = mp->ma_used;
1600 v = PyList_New(n);
1601 if (v == NULL)
1602 return NULL;
1603 if (n != mp->ma_used) {
1604 /* Durnit. The allocations caused the dict to resize.
1605 * Just start over, this shouldn't normally happen.
1606 */
1607 Py_DECREF(v);
1608 goto again;
1609 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001610 size = DK_SIZE(mp->ma_keys);
1611 if (mp->ma_values) {
1612 value_ptr = mp->ma_values;
1613 offset = sizeof(PyObject *);
1614 }
1615 else {
1616 value_ptr = &mp->ma_keys->dk_entries[0].me_value;
1617 offset = sizeof(PyDictKeyEntry);
1618 }
1619 for (i = 0, j = 0; i < size; i++) {
1620 PyObject *value = *value_ptr;
1621 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1622 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 Py_INCREF(value);
1624 PyList_SET_ITEM(v, j, value);
1625 j++;
1626 }
1627 }
1628 assert(j == n);
1629 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001630}
1631
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001633dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001634{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001635 PyObject *v;
1636 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001637 Py_ssize_t size, offset;
1638 PyObject *item, *key;
1639 PyDictKeyEntry *ep;
1640 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 /* Preallocate the list of tuples, to avoid allocations during
1643 * the loop over the items, which could trigger GC, which
1644 * could resize the dict. :-(
1645 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001646 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 n = mp->ma_used;
1648 v = PyList_New(n);
1649 if (v == NULL)
1650 return NULL;
1651 for (i = 0; i < n; i++) {
1652 item = PyTuple_New(2);
1653 if (item == NULL) {
1654 Py_DECREF(v);
1655 return NULL;
1656 }
1657 PyList_SET_ITEM(v, i, item);
1658 }
1659 if (n != mp->ma_used) {
1660 /* Durnit. The allocations caused the dict to resize.
1661 * Just start over, this shouldn't normally happen.
1662 */
1663 Py_DECREF(v);
1664 goto again;
1665 }
1666 /* Nothing we do below makes any function calls. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001667 ep = mp->ma_keys->dk_entries;
1668 size = DK_SIZE(mp->ma_keys);
1669 if (mp->ma_values) {
1670 value_ptr = mp->ma_values;
1671 offset = sizeof(PyObject *);
1672 }
1673 else {
1674 value_ptr = &ep[0].me_value;
1675 offset = sizeof(PyDictKeyEntry);
1676 }
1677 for (i = 0, j = 0; i < size; i++) {
1678 PyObject *value = *value_ptr;
1679 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1680 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 key = ep[i].me_key;
1682 item = PyList_GET_ITEM(v, j);
1683 Py_INCREF(key);
1684 PyTuple_SET_ITEM(item, 0, key);
1685 Py_INCREF(value);
1686 PyTuple_SET_ITEM(item, 1, value);
1687 j++;
1688 }
1689 }
1690 assert(j == n);
1691 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001692}
1693
Larry Hastings5c661892014-01-24 06:17:25 -08001694/*[clinic input]
1695@classmethod
1696dict.fromkeys
1697
1698 iterable: object
1699 value: object=None
1700 /
1701
1702Returns a new dict with keys from iterable and values equal to value.
1703[clinic start generated code]*/
1704
1705PyDoc_STRVAR(dict_fromkeys__doc__,
1706"fromkeys(type, iterable, value=None)\n"
1707"Returns a new dict with keys from iterable and values equal to value.");
1708
1709#define DICT_FROMKEYS_METHODDEF \
1710 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS|METH_CLASS, dict_fromkeys__doc__},
1711
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001712static PyObject *
Larry Hastings5c661892014-01-24 06:17:25 -08001713dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value);
1714
1715static PyObject *
1716dict_fromkeys(PyTypeObject *type, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001717{
Larry Hastings5c661892014-01-24 06:17:25 -08001718 PyObject *return_value = NULL;
1719 PyObject *iterable;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 PyObject *value = Py_None;
Larry Hastings5c661892014-01-24 06:17:25 -08001721
1722 if (!PyArg_UnpackTuple(args, "fromkeys",
1723 1, 2,
1724 &iterable, &value))
1725 goto exit;
1726 return_value = dict_fromkeys_impl(type, iterable, value);
1727
1728exit:
1729 return return_value;
1730}
1731
1732static PyObject *
1733dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value)
1734/*[clinic end generated code: checksum=008269e1774a379b356841548c04061fd78a9542]*/
1735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 PyObject *it; /* iter(seq) */
1737 PyObject *key;
1738 PyObject *d;
1739 int status;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001740
Larry Hastings5c661892014-01-24 06:17:25 -08001741 d = PyObject_CallObject((PyObject *)type, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 if (d == NULL)
1743 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001744
Benjamin Peterson9892f522012-10-31 14:22:12 -04001745 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
Larry Hastings5c661892014-01-24 06:17:25 -08001746 if (PyDict_CheckExact(iterable)) {
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001747 PyDictObject *mp = (PyDictObject *)d;
1748 PyObject *oldvalue;
1749 Py_ssize_t pos = 0;
1750 PyObject *key;
1751 Py_hash_t hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001752
Larry Hastings5c661892014-01-24 06:17:25 -08001753 if (dictresize(mp, Py_SIZE(iterable))) {
Petri Lehtinena94200e2011-10-24 21:12:58 +03001754 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001756 }
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001757
Larry Hastings5c661892014-01-24 06:17:25 -08001758 while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) {
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001759 if (insertdict(mp, key, hash, value)) {
1760 Py_DECREF(d);
1761 return NULL;
1762 }
1763 }
1764 return d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 }
Larry Hastings5c661892014-01-24 06:17:25 -08001766 if (PyAnySet_CheckExact(iterable)) {
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001767 PyDictObject *mp = (PyDictObject *)d;
1768 Py_ssize_t pos = 0;
1769 PyObject *key;
1770 Py_hash_t hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001771
Larry Hastings5c661892014-01-24 06:17:25 -08001772 if (dictresize(mp, PySet_GET_SIZE(iterable))) {
Petri Lehtinena94200e2011-10-24 21:12:58 +03001773 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001775 }
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001776
Larry Hastings5c661892014-01-24 06:17:25 -08001777 while (_PySet_NextEntry(iterable, &pos, &key, &hash)) {
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001778 if (insertdict(mp, key, hash, value)) {
1779 Py_DECREF(d);
1780 return NULL;
1781 }
1782 }
1783 return d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001786
Larry Hastings5c661892014-01-24 06:17:25 -08001787 it = PyObject_GetIter(iterable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 if (it == NULL){
1789 Py_DECREF(d);
1790 return NULL;
1791 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 if (PyDict_CheckExact(d)) {
1794 while ((key = PyIter_Next(it)) != NULL) {
1795 status = PyDict_SetItem(d, key, value);
1796 Py_DECREF(key);
1797 if (status < 0)
1798 goto Fail;
1799 }
1800 } else {
1801 while ((key = PyIter_Next(it)) != NULL) {
1802 status = PyObject_SetItem(d, key, value);
1803 Py_DECREF(key);
1804 if (status < 0)
1805 goto Fail;
1806 }
1807 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 if (PyErr_Occurred())
1810 goto Fail;
1811 Py_DECREF(it);
1812 return d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001813
1814Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 Py_DECREF(it);
1816 Py_DECREF(d);
1817 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001818}
1819
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001820static int
1821dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 PyObject *arg = NULL;
1824 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1827 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001830 _Py_IDENTIFIER(keys);
1831 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 result = PyDict_Merge(self, arg, 1);
1833 else
1834 result = PyDict_MergeFromSeq2(self, arg, 1);
1835 }
1836 if (result == 0 && kwds != NULL) {
1837 if (PyArg_ValidateKeywordArguments(kwds))
1838 result = PyDict_Merge(self, kwds, 1);
1839 else
1840 result = -1;
1841 }
1842 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001843}
1844
1845static PyObject *
1846dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 if (dict_update_common(self, args, kwds, "update") != -1)
1849 Py_RETURN_NONE;
1850 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001851}
1852
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001853/* Update unconditionally replaces existing items.
1854 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001855 otherwise it leaves existing items unchanged.
1856
1857 PyDict_{Update,Merge} update/merge from a mapping object.
1858
Tim Petersf582b822001-12-11 18:51:08 +00001859 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001860 producing iterable objects of length 2.
1861*/
1862
Tim Petersf582b822001-12-11 18:51:08 +00001863int
Tim Peters1fc240e2001-10-26 05:06:50 +00001864PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 PyObject *it; /* iter(seq2) */
1867 Py_ssize_t i; /* index into seq2 of current element */
1868 PyObject *item; /* seq2[i] */
1869 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 assert(d != NULL);
1872 assert(PyDict_Check(d));
1873 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 it = PyObject_GetIter(seq2);
1876 if (it == NULL)
1877 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 for (i = 0; ; ++i) {
1880 PyObject *key, *value;
1881 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 fast = NULL;
1884 item = PyIter_Next(it);
1885 if (item == NULL) {
1886 if (PyErr_Occurred())
1887 goto Fail;
1888 break;
1889 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 /* Convert item to sequence, and verify length 2. */
1892 fast = PySequence_Fast(item, "");
1893 if (fast == NULL) {
1894 if (PyErr_ExceptionMatches(PyExc_TypeError))
1895 PyErr_Format(PyExc_TypeError,
1896 "cannot convert dictionary update "
1897 "sequence element #%zd to a sequence",
1898 i);
1899 goto Fail;
1900 }
1901 n = PySequence_Fast_GET_SIZE(fast);
1902 if (n != 2) {
1903 PyErr_Format(PyExc_ValueError,
1904 "dictionary update sequence element #%zd "
1905 "has length %zd; 2 is required",
1906 i, n);
1907 goto Fail;
1908 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 /* Update/merge with this (key, value) pair. */
1911 key = PySequence_Fast_GET_ITEM(fast, 0);
1912 value = PySequence_Fast_GET_ITEM(fast, 1);
1913 if (override || PyDict_GetItem(d, key) == NULL) {
1914 int status = PyDict_SetItem(d, key, value);
1915 if (status < 0)
1916 goto Fail;
1917 }
1918 Py_DECREF(fast);
1919 Py_DECREF(item);
1920 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 i = 0;
1923 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00001924Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 Py_XDECREF(item);
1926 Py_XDECREF(fast);
1927 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001928Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 Py_DECREF(it);
1930 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001931}
1932
Tim Peters6d6c1a32001-08-02 04:15:00 +00001933int
1934PyDict_Update(PyObject *a, PyObject *b)
1935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001937}
1938
1939int
1940PyDict_Merge(PyObject *a, PyObject *b, int override)
1941{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001942 PyDictObject *mp, *other;
1943 Py_ssize_t i, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001944 PyDictKeyEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 /* We accept for the argument either a concrete dictionary object,
1947 * or an abstract "mapping" object. For the former, we can do
1948 * things quite efficiently. For the latter, we only require that
1949 * PyMapping_Keys() and PyObject_GetItem() be supported.
1950 */
1951 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1952 PyErr_BadInternalCall();
1953 return -1;
1954 }
1955 mp = (PyDictObject*)a;
1956 if (PyDict_Check(b)) {
1957 other = (PyDictObject*)b;
1958 if (other == mp || other->ma_used == 0)
1959 /* a.update(a) or a.update({}); nothing to do */
1960 return 0;
1961 if (mp->ma_used == 0)
1962 /* Since the target dict is empty, PyDict_GetItem()
1963 * always returns NULL. Setting override to 1
1964 * skips the unnecessary test.
1965 */
1966 override = 1;
1967 /* Do one big resize at the start, rather than
1968 * incrementally resizing as we insert new items. Expect
1969 * that there will be no (or few) overlapping keys.
1970 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001971 if (mp->ma_keys->dk_usable * 3 < other->ma_used * 2)
1972 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001974 for (i = 0, n = DK_SIZE(other->ma_keys); i < n; i++) {
1975 PyObject *value;
1976 entry = &other->ma_keys->dk_entries[i];
1977 if (other->ma_values)
1978 value = other->ma_values[i];
1979 else
1980 value = entry->me_value;
1981
1982 if (value != NULL &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 (override ||
1984 PyDict_GetItem(a, entry->me_key) == NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 if (insertdict(mp, entry->me_key,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001986 entry->me_hash,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001987 value) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 return -1;
1989 }
1990 }
1991 }
1992 else {
1993 /* Do it the generic, slower way */
1994 PyObject *keys = PyMapping_Keys(b);
1995 PyObject *iter;
1996 PyObject *key, *value;
1997 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999 if (keys == NULL)
2000 /* Docstring says this is equivalent to E.keys() so
2001 * if E doesn't have a .keys() method we want
2002 * AttributeError to percolate up. Might as well
2003 * do the same for any other error.
2004 */
2005 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002007 iter = PyObject_GetIter(keys);
2008 Py_DECREF(keys);
2009 if (iter == NULL)
2010 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00002011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
2013 if (!override && PyDict_GetItem(a, key) != NULL) {
2014 Py_DECREF(key);
2015 continue;
2016 }
2017 value = PyObject_GetItem(b, key);
2018 if (value == NULL) {
2019 Py_DECREF(iter);
2020 Py_DECREF(key);
2021 return -1;
2022 }
2023 status = PyDict_SetItem(a, key, value);
2024 Py_DECREF(key);
2025 Py_DECREF(value);
2026 if (status < 0) {
2027 Py_DECREF(iter);
2028 return -1;
2029 }
2030 }
2031 Py_DECREF(iter);
2032 if (PyErr_Occurred())
2033 /* Iterator completed, via error */
2034 return -1;
2035 }
2036 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002037}
2038
2039static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002040dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002043}
2044
2045PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002046PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002049 PyDictObject *mp;
2050 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 if (o == NULL || !PyDict_Check(o)) {
2053 PyErr_BadInternalCall();
2054 return NULL;
2055 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002056 mp = (PyDictObject *)o;
2057 if (_PyDict_HasSplitTable(mp)) {
2058 PyDictObject *split_copy;
2059 PyObject **newvalues = new_values(DK_SIZE(mp->ma_keys));
2060 if (newvalues == NULL)
2061 return PyErr_NoMemory();
2062 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2063 if (split_copy == NULL) {
2064 free_values(newvalues);
2065 return NULL;
2066 }
2067 split_copy->ma_values = newvalues;
2068 split_copy->ma_keys = mp->ma_keys;
2069 split_copy->ma_used = mp->ma_used;
2070 DK_INCREF(mp->ma_keys);
2071 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2072 PyObject *value = mp->ma_values[i];
2073 Py_XINCREF(value);
2074 split_copy->ma_values[i] = value;
2075 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002076 if (_PyObject_GC_IS_TRACKED(mp))
2077 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002078 return (PyObject *)split_copy;
2079 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 copy = PyDict_New();
2081 if (copy == NULL)
2082 return NULL;
2083 if (PyDict_Merge(copy, o, 1) == 0)
2084 return copy;
2085 Py_DECREF(copy);
2086 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002087}
2088
Martin v. Löwis18e16552006-02-15 17:27:45 +00002089Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002090PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 if (mp == NULL || !PyDict_Check(mp)) {
2093 PyErr_BadInternalCall();
2094 return -1;
2095 }
2096 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002097}
2098
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002099PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002100PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 if (mp == NULL || !PyDict_Check(mp)) {
2103 PyErr_BadInternalCall();
2104 return NULL;
2105 }
2106 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002107}
2108
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002109PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002110PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 if (mp == NULL || !PyDict_Check(mp)) {
2113 PyErr_BadInternalCall();
2114 return NULL;
2115 }
2116 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002117}
2118
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002119PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002120PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 if (mp == NULL || !PyDict_Check(mp)) {
2123 PyErr_BadInternalCall();
2124 return NULL;
2125 }
2126 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002127}
2128
Tim Peterse63415e2001-05-08 04:38:29 +00002129/* Return 1 if dicts equal, 0 if not, -1 if error.
2130 * Gets out as soon as any difference is detected.
2131 * Uses only Py_EQ comparison.
2132 */
2133static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002134dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 if (a->ma_used != b->ma_used)
2139 /* can't be equal if # of entries differ */
2140 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002141 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002142 for (i = 0; i < DK_SIZE(a->ma_keys); i++) {
2143 PyDictKeyEntry *ep = &a->ma_keys->dk_entries[i];
2144 PyObject *aval;
2145 if (a->ma_values)
2146 aval = a->ma_values[i];
2147 else
2148 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 if (aval != NULL) {
2150 int cmp;
2151 PyObject *bval;
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002152 PyObject **vaddr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002153 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 /* temporarily bump aval's refcount to ensure it stays
2155 alive until we're done with it */
2156 Py_INCREF(aval);
2157 /* ditto for key */
2158 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002159 /* reuse the known hash value */
2160 if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr) == NULL)
2161 bval = NULL;
2162 else
2163 bval = *vaddr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 Py_DECREF(key);
2165 if (bval == NULL) {
2166 Py_DECREF(aval);
2167 if (PyErr_Occurred())
2168 return -1;
2169 return 0;
2170 }
2171 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2172 Py_DECREF(aval);
2173 if (cmp <= 0) /* error or not equal */
2174 return cmp;
2175 }
2176 }
2177 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002178}
Tim Peterse63415e2001-05-08 04:38:29 +00002179
2180static PyObject *
2181dict_richcompare(PyObject *v, PyObject *w, int op)
2182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 int cmp;
2184 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2187 res = Py_NotImplemented;
2188 }
2189 else if (op == Py_EQ || op == Py_NE) {
2190 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2191 if (cmp < 0)
2192 return NULL;
2193 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2194 }
2195 else
2196 res = Py_NotImplemented;
2197 Py_INCREF(res);
2198 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002199}
Tim Peterse63415e2001-05-08 04:38:29 +00002200
Larry Hastings61272b72014-01-07 12:41:53 -08002201/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07002202
2203@coexist
2204dict.__contains__
2205
2206 key: object
2207 /
2208
Meador Ingee02de8c2014-01-14 16:48:31 -06002209True if D has a key k, else False.
Larry Hastings61272b72014-01-07 12:41:53 -08002210[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07002211
2212PyDoc_STRVAR(dict___contains____doc__,
Larry Hastings5c661892014-01-24 06:17:25 -08002213"__contains__(self, key)\n"
Meador Ingee02de8c2014-01-14 16:48:31 -06002214"True if D has a key k, else False.");
Larry Hastings31826802013-10-19 00:09:25 -07002215
2216#define DICT___CONTAINS___METHODDEF \
2217 {"__contains__", (PyCFunction)dict___contains__, METH_O|METH_COEXIST, dict___contains____doc__},
2218
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002219static PyObject *
Larry Hastings31826802013-10-19 00:09:25 -07002220dict___contains__(PyObject *self, PyObject *key)
Larry Hastings5c661892014-01-24 06:17:25 -08002221/*[clinic end generated code: checksum=c4f85a39baac4776c4275ad5f072f7732c5f0806]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002222{
Larry Hastings31826802013-10-19 00:09:25 -07002223 register PyDictObject *mp = (PyDictObject *)self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002224 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002225 PyDictKeyEntry *ep;
2226 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002229 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 hash = PyObject_Hash(key);
2231 if (hash == -1)
2232 return NULL;
2233 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002234 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002235 if (ep == NULL)
2236 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002237 return PyBool_FromLong(*value_addr != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002238}
2239
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002240static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002241dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 PyObject *key;
2244 PyObject *failobj = Py_None;
2245 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002246 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002247 PyDictKeyEntry *ep;
2248 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2251 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002254 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 hash = PyObject_Hash(key);
2256 if (hash == -1)
2257 return NULL;
2258 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002259 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 if (ep == NULL)
2261 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002262 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 if (val == NULL)
2264 val = failobj;
2265 Py_INCREF(val);
2266 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002267}
2268
Benjamin Peterson00e98862013-03-07 22:16:29 -05002269PyObject *
2270PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002271{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002272 PyDictObject *mp = (PyDictObject *)d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002274 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002275 PyDictKeyEntry *ep;
2276 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002277
Benjamin Peterson00e98862013-03-07 22:16:29 -05002278 if (!PyDict_Check(d)) {
2279 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002281 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002283 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002284 hash = PyObject_Hash(key);
2285 if (hash == -1)
2286 return NULL;
2287 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002288 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 if (ep == NULL)
2290 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002291 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 if (val == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002293 if (mp->ma_keys->dk_usable <= 0) {
2294 /* Need to resize. */
2295 if (insertion_resize(mp) < 0)
2296 return NULL;
2297 ep = find_empty_slot(mp, key, hash, &value_addr);
2298 }
Benjamin Peterson00e98862013-03-07 22:16:29 -05002299 Py_INCREF(defaultobj);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002300 Py_INCREF(key);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002301 MAINTAIN_TRACKING(mp, key, defaultobj);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002302 ep->me_key = key;
2303 ep->me_hash = hash;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002304 *value_addr = defaultobj;
2305 val = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002306 mp->ma_keys->dk_usable--;
2307 mp->ma_used++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00002310}
2311
Benjamin Peterson00e98862013-03-07 22:16:29 -05002312static PyObject *
2313dict_setdefault(PyDictObject *mp, PyObject *args)
2314{
2315 PyObject *key, *val;
2316 PyObject *defaultobj = Py_None;
2317
2318 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2319 return NULL;
2320
Benjamin Peterson55898502013-03-08 08:36:49 -05002321 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002322 Py_XINCREF(val);
2323 return val;
2324}
Guido van Rossum164452c2000-08-08 16:12:54 +00002325
2326static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002327dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 PyDict_Clear((PyObject *)mp);
2330 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002331}
2332
Guido van Rossumba6ab842000-12-12 22:02:18 +00002333static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002334dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002335{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002336 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 PyObject *old_value, *old_key;
2338 PyObject *key, *deflt = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002339 PyDictKeyEntry *ep;
2340 PyObject **value_addr;
Guido van Rossume027d982002-04-12 15:11:59 +00002341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2343 return NULL;
2344 if (mp->ma_used == 0) {
2345 if (deflt) {
2346 Py_INCREF(deflt);
2347 return deflt;
2348 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07002349 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 return NULL;
2351 }
2352 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002353 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 hash = PyObject_Hash(key);
2355 if (hash == -1)
2356 return NULL;
2357 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002358 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 if (ep == NULL)
2360 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002361 old_value = *value_addr;
2362 if (old_value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 if (deflt) {
2364 Py_INCREF(deflt);
2365 return deflt;
2366 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07002367 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 return NULL;
2369 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002370 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002372 if (!_PyDict_HasSplitTable(mp)) {
2373 ENSURE_ALLOWS_DELETIONS(mp);
2374 old_key = ep->me_key;
2375 Py_INCREF(dummy);
2376 ep->me_key = dummy;
2377 Py_DECREF(old_key);
2378 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 return old_value;
Guido van Rossume027d982002-04-12 15:11:59 +00002380}
2381
2382static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002383dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002384{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002385 Py_hash_t i = 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002386 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002388
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 /* Allocate the result tuple before checking the size. Believe it
2391 * or not, this allocation could trigger a garbage collection which
2392 * could empty the dict, so if we checked the size first and that
2393 * happened, the result would be an infinite loop (searching for an
2394 * entry that no longer exists). Note that the usual popitem()
2395 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2396 * tuple away if the dict *is* empty isn't a significant
2397 * inefficiency -- possible, but unlikely in practice.
2398 */
2399 res = PyTuple_New(2);
2400 if (res == NULL)
2401 return NULL;
2402 if (mp->ma_used == 0) {
2403 Py_DECREF(res);
2404 PyErr_SetString(PyExc_KeyError,
2405 "popitem(): dictionary is empty");
2406 return NULL;
2407 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002408 /* Convert split table to combined table */
2409 if (mp->ma_keys->dk_lookup == lookdict_split) {
2410 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2411 Py_DECREF(res);
2412 return NULL;
2413 }
2414 }
2415 ENSURE_ALLOWS_DELETIONS(mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 /* Set ep to "the first" dict entry with a value. We abuse the hash
2417 * field of slot 0 to hold a search finger:
2418 * If slot 0 has a value, use slot 0.
2419 * Else slot 0 is being used to hold a search finger,
2420 * and we use its hash value as the first index to look.
2421 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002422 ep = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 if (ep->me_value == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002424 Py_ssize_t mask = DK_MASK(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 i = ep->me_hash;
2426 /* The hash field may be a real hash value, or it may be a
2427 * legit search finger, or it may be a once-legit search
2428 * finger that's out of bounds now because it wrapped around
2429 * or the table shrunk -- simply make sure it's in bounds now.
2430 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002431 if (i > mask || i < 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 i = 1; /* skip slot 0 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002433 while ((ep = &mp->ma_keys->dk_entries[i])->me_value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002435 if (i > mask)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 i = 1;
2437 }
2438 }
2439 PyTuple_SET_ITEM(res, 0, ep->me_key);
2440 PyTuple_SET_ITEM(res, 1, ep->me_value);
2441 Py_INCREF(dummy);
2442 ep->me_key = dummy;
2443 ep->me_value = NULL;
2444 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002445 assert(mp->ma_keys->dk_entries[0].me_value == NULL);
2446 mp->ma_keys->dk_entries[0].me_hash = i + 1; /* next place to start */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002448}
2449
Jeremy Hylton8caad492000-06-23 14:18:11 +00002450static int
2451dict_traverse(PyObject *op, visitproc visit, void *arg)
2452{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002453 Py_ssize_t i, n;
2454 PyDictObject *mp = (PyDictObject *)op;
2455 if (mp->ma_keys->dk_lookup == lookdict) {
2456 for (i = 0; i < DK_SIZE(mp->ma_keys); i++) {
2457 if (mp->ma_keys->dk_entries[i].me_value != NULL) {
2458 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2459 Py_VISIT(mp->ma_keys->dk_entries[i].me_key);
2460 }
2461 }
2462 } else {
2463 if (mp->ma_values != NULL) {
2464 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2465 Py_VISIT(mp->ma_values[i]);
2466 }
2467 }
2468 else {
2469 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2470 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2471 }
2472 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 }
2474 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002475}
2476
2477static int
2478dict_tp_clear(PyObject *op)
2479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 PyDict_Clear(op);
2481 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002482}
2483
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002484static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002485
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002486static PyObject *
2487dict_sizeof(PyDictObject *mp)
2488{
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002489 Py_ssize_t size, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002490
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002491 size = DK_SIZE(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 res = sizeof(PyDictObject);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002493 if (mp->ma_values)
2494 res += size * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002495 /* If the dictionary is split, the keys portion is accounted-for
2496 in the type object. */
2497 if (mp->ma_keys->dk_refcnt == 1)
2498 res += sizeof(PyDictKeysObject) + (size-1) * sizeof(PyDictKeyEntry);
2499 return PyLong_FromSsize_t(res);
2500}
2501
2502Py_ssize_t
2503_PyDict_KeysSize(PyDictKeysObject *keys)
2504{
2505 return sizeof(PyDictKeysObject) + (DK_SIZE(keys)-1) * sizeof(PyDictKeyEntry);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002506}
2507
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002508PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2509
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002510PyDoc_STRVAR(sizeof__doc__,
2511"D.__sizeof__() -> size of D in memory, in bytes");
2512
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002513PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002514"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002516PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002517"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 +00002518
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002519PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002520"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002521If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002522
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002523PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002524"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000025252-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002526
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002527PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04002528"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
2529If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
2530If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
2531In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002532
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002533PyDoc_STRVAR(clear__doc__,
2534"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002535
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002536PyDoc_STRVAR(copy__doc__,
2537"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002538
Guido van Rossumb90c8482007-02-10 01:11:45 +00002539/* Forward */
2540static PyObject *dictkeys_new(PyObject *);
2541static PyObject *dictitems_new(PyObject *);
2542static PyObject *dictvalues_new(PyObject *);
2543
Guido van Rossum45c85d12007-07-27 16:31:40 +00002544PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002546PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002547 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002548PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002550
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002551static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002552 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2554 getitem__doc__},
2555 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2556 sizeof__doc__},
2557 {"get", (PyCFunction)dict_get, METH_VARARGS,
2558 get__doc__},
2559 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2560 setdefault_doc__},
2561 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2562 pop__doc__},
2563 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2564 popitem__doc__},
2565 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2566 keys__doc__},
2567 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2568 items__doc__},
2569 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2570 values__doc__},
2571 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2572 update__doc__},
Larry Hastings5c661892014-01-24 06:17:25 -08002573 DICT_FROMKEYS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2575 clear__doc__},
2576 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2577 copy__doc__},
2578 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002579};
2580
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002581/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002582int
2583PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002584{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002585 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002587 PyDictKeyEntry *ep;
2588 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002591 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 hash = PyObject_Hash(key);
2593 if (hash == -1)
2594 return -1;
2595 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002596 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2597 return (ep == NULL) ? -1 : (*value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002598}
2599
Thomas Wouterscf297e42007-02-23 15:07:44 +00002600/* Internal version of PyDict_Contains used when the hash value is already known */
2601int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002602_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002605 PyDictKeyEntry *ep;
2606 PyObject **value_addr;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002607
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002608 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2609 return (ep == NULL) ? -1 : (*value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002610}
2611
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002612/* Hack to implement "key in dict" */
2613static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 0, /* sq_length */
2615 0, /* sq_concat */
2616 0, /* sq_repeat */
2617 0, /* sq_item */
2618 0, /* sq_slice */
2619 0, /* sq_ass_item */
2620 0, /* sq_ass_slice */
2621 PyDict_Contains, /* sq_contains */
2622 0, /* sq_inplace_concat */
2623 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002624};
2625
Guido van Rossum09e563a2001-05-01 12:10:21 +00002626static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002627dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002630 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 assert(type != NULL && type->tp_alloc != NULL);
2633 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02002634 if (self == NULL)
2635 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002636 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002637
Victor Stinnera9f61a52013-07-16 22:17:26 +02002638 /* The object has been implicitly tracked by tp_alloc */
2639 if (type == &PyDict_Type)
2640 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002641
2642 d->ma_used = 0;
2643 d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
2644 if (d->ma_keys == NULL) {
2645 Py_DECREF(self);
2646 return NULL;
2647 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002649}
2650
Tim Peters25786c02001-09-02 08:22:48 +00002651static int
2652dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002655}
2656
Tim Peters6d6c1a32001-08-02 04:15:00 +00002657static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002658dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002659{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002661}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002662
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002663PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002664"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002665"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002666" (key, value) pairs\n"
2667"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002668" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002669" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002670" d[k] = v\n"
2671"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2672" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002673
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002674PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2676 "dict",
2677 sizeof(PyDictObject),
2678 0,
2679 (destructor)dict_dealloc, /* tp_dealloc */
2680 0, /* tp_print */
2681 0, /* tp_getattr */
2682 0, /* tp_setattr */
2683 0, /* tp_reserved */
2684 (reprfunc)dict_repr, /* tp_repr */
2685 0, /* tp_as_number */
2686 &dict_as_sequence, /* tp_as_sequence */
2687 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002688 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 0, /* tp_call */
2690 0, /* tp_str */
2691 PyObject_GenericGetAttr, /* tp_getattro */
2692 0, /* tp_setattro */
2693 0, /* tp_as_buffer */
2694 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2695 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2696 dictionary_doc, /* tp_doc */
2697 dict_traverse, /* tp_traverse */
2698 dict_tp_clear, /* tp_clear */
2699 dict_richcompare, /* tp_richcompare */
2700 0, /* tp_weaklistoffset */
2701 (getiterfunc)dict_iter, /* tp_iter */
2702 0, /* tp_iternext */
2703 mapp_methods, /* tp_methods */
2704 0, /* tp_members */
2705 0, /* tp_getset */
2706 0, /* tp_base */
2707 0, /* tp_dict */
2708 0, /* tp_descr_get */
2709 0, /* tp_descr_set */
2710 0, /* tp_dictoffset */
2711 dict_init, /* tp_init */
2712 PyType_GenericAlloc, /* tp_alloc */
2713 dict_new, /* tp_new */
2714 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002715};
2716
Victor Stinner3c1e4812012-03-26 22:10:51 +02002717PyObject *
2718_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
2719{
2720 PyObject *kv;
2721 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02002722 if (kv == NULL) {
2723 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002724 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02002725 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02002726 return PyDict_GetItem(dp, kv);
2727}
2728
Guido van Rossum3cca2451997-05-16 14:23:33 +00002729/* For backward compatibility with old dictionary interface */
2730
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002731PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002732PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002733{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 PyObject *kv, *rv;
2735 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02002736 if (kv == NULL) {
2737 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02002739 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 rv = PyDict_GetItem(v, kv);
2741 Py_DECREF(kv);
2742 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002743}
2744
2745int
Victor Stinner3c1e4812012-03-26 22:10:51 +02002746_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
2747{
2748 PyObject *kv;
2749 kv = _PyUnicode_FromId(key); /* borrowed */
2750 if (kv == NULL)
2751 return -1;
2752 return PyDict_SetItem(v, kv, item);
2753}
2754
2755int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002756PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 PyObject *kv;
2759 int err;
2760 kv = PyUnicode_FromString(key);
2761 if (kv == NULL)
2762 return -1;
2763 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2764 err = PyDict_SetItem(v, kv, item);
2765 Py_DECREF(kv);
2766 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002767}
2768
2769int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01002770_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
2771{
2772 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
2773 if (kv == NULL)
2774 return -1;
2775 return PyDict_DelItem(v, kv);
2776}
2777
2778int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002779PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002780{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 PyObject *kv;
2782 int err;
2783 kv = PyUnicode_FromString(key);
2784 if (kv == NULL)
2785 return -1;
2786 err = PyDict_DelItem(v, kv);
2787 Py_DECREF(kv);
2788 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002789}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002790
Raymond Hettinger019a1482004-03-18 02:41:19 +00002791/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002792
2793typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 PyObject_HEAD
2795 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2796 Py_ssize_t di_used;
2797 Py_ssize_t di_pos;
2798 PyObject* di_result; /* reusable result tuple for iteritems */
2799 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002800} dictiterobject;
2801
2802static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002803dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002804{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 dictiterobject *di;
2806 di = PyObject_GC_New(dictiterobject, itertype);
2807 if (di == NULL)
2808 return NULL;
2809 Py_INCREF(dict);
2810 di->di_dict = dict;
2811 di->di_used = dict->ma_used;
2812 di->di_pos = 0;
2813 di->len = dict->ma_used;
2814 if (itertype == &PyDictIterItem_Type) {
2815 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2816 if (di->di_result == NULL) {
2817 Py_DECREF(di);
2818 return NULL;
2819 }
2820 }
2821 else
2822 di->di_result = NULL;
2823 _PyObject_GC_TRACK(di);
2824 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002825}
2826
2827static void
2828dictiter_dealloc(dictiterobject *di)
2829{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 Py_XDECREF(di->di_dict);
2831 Py_XDECREF(di->di_result);
2832 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002833}
2834
2835static int
2836dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2837{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002838 Py_VISIT(di->di_dict);
2839 Py_VISIT(di->di_result);
2840 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002841}
2842
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002843static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002844dictiter_len(dictiterobject *di)
2845{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 Py_ssize_t len = 0;
2847 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2848 len = di->len;
2849 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002850}
2851
Guido van Rossumb90c8482007-02-10 01:11:45 +00002852PyDoc_STRVAR(length_hint_doc,
2853 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002854
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002855static PyObject *
2856dictiter_reduce(dictiterobject *di);
2857
2858PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2859
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002860static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002861 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2862 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002863 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
2864 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002866};
2867
Raymond Hettinger019a1482004-03-18 02:41:19 +00002868static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002869{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 PyObject *key;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002871 Py_ssize_t i, mask, offset;
2872 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002874 PyObject **value_ptr;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 if (d == NULL)
2877 return NULL;
2878 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 if (di->di_used != d->ma_used) {
2881 PyErr_SetString(PyExc_RuntimeError,
2882 "dictionary changed size during iteration");
2883 di->di_used = -1; /* Make this state sticky */
2884 return NULL;
2885 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 i = di->di_pos;
2888 if (i < 0)
2889 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002890 k = d->ma_keys;
2891 if (d->ma_values) {
2892 value_ptr = &d->ma_values[i];
2893 offset = sizeof(PyObject *);
2894 }
2895 else {
2896 value_ptr = &k->dk_entries[i].me_value;
2897 offset = sizeof(PyDictKeyEntry);
2898 }
2899 mask = DK_SIZE(k)-1;
2900 while (i <= mask && *value_ptr == NULL) {
2901 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002903 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904 di->di_pos = i+1;
2905 if (i > mask)
2906 goto fail;
2907 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002908 key = k->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 Py_INCREF(key);
2910 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002911
2912fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 Py_DECREF(d);
2914 di->di_dict = NULL;
2915 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002916}
2917
Raymond Hettinger019a1482004-03-18 02:41:19 +00002918PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2920 "dict_keyiterator", /* tp_name */
2921 sizeof(dictiterobject), /* tp_basicsize */
2922 0, /* tp_itemsize */
2923 /* methods */
2924 (destructor)dictiter_dealloc, /* tp_dealloc */
2925 0, /* tp_print */
2926 0, /* tp_getattr */
2927 0, /* tp_setattr */
2928 0, /* tp_reserved */
2929 0, /* tp_repr */
2930 0, /* tp_as_number */
2931 0, /* tp_as_sequence */
2932 0, /* tp_as_mapping */
2933 0, /* tp_hash */
2934 0, /* tp_call */
2935 0, /* tp_str */
2936 PyObject_GenericGetAttr, /* tp_getattro */
2937 0, /* tp_setattro */
2938 0, /* tp_as_buffer */
2939 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2940 0, /* tp_doc */
2941 (traverseproc)dictiter_traverse, /* tp_traverse */
2942 0, /* tp_clear */
2943 0, /* tp_richcompare */
2944 0, /* tp_weaklistoffset */
2945 PyObject_SelfIter, /* tp_iter */
2946 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2947 dictiter_methods, /* tp_methods */
2948 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002949};
2950
2951static PyObject *dictiter_iternextvalue(dictiterobject *di)
2952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 PyObject *value;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002954 Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002956 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 if (d == NULL)
2959 return NULL;
2960 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002962 if (di->di_used != d->ma_used) {
2963 PyErr_SetString(PyExc_RuntimeError,
2964 "dictionary changed size during iteration");
2965 di->di_used = -1; /* Make this state sticky */
2966 return NULL;
2967 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002970 mask = DK_SIZE(d->ma_keys)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 if (i < 0 || i > mask)
2972 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002973 if (d->ma_values) {
2974 value_ptr = &d->ma_values[i];
2975 offset = sizeof(PyObject *);
2976 }
2977 else {
2978 value_ptr = &d->ma_keys->dk_entries[i].me_value;
2979 offset = sizeof(PyDictKeyEntry);
2980 }
2981 while (i <= mask && *value_ptr == NULL) {
2982 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002983 i++;
2984 if (i > mask)
2985 goto fail;
2986 }
2987 di->di_pos = i+1;
2988 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002989 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 Py_INCREF(value);
2991 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002992
2993fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002994 Py_DECREF(d);
2995 di->di_dict = NULL;
2996 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002997}
2998
2999PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003000 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3001 "dict_valueiterator", /* tp_name */
3002 sizeof(dictiterobject), /* tp_basicsize */
3003 0, /* tp_itemsize */
3004 /* methods */
3005 (destructor)dictiter_dealloc, /* tp_dealloc */
3006 0, /* tp_print */
3007 0, /* tp_getattr */
3008 0, /* tp_setattr */
3009 0, /* tp_reserved */
3010 0, /* tp_repr */
3011 0, /* tp_as_number */
3012 0, /* tp_as_sequence */
3013 0, /* tp_as_mapping */
3014 0, /* tp_hash */
3015 0, /* tp_call */
3016 0, /* tp_str */
3017 PyObject_GenericGetAttr, /* tp_getattro */
3018 0, /* tp_setattro */
3019 0, /* tp_as_buffer */
3020 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3021 0, /* tp_doc */
3022 (traverseproc)dictiter_traverse, /* tp_traverse */
3023 0, /* tp_clear */
3024 0, /* tp_richcompare */
3025 0, /* tp_weaklistoffset */
3026 PyObject_SelfIter, /* tp_iter */
3027 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
3028 dictiter_methods, /* tp_methods */
3029 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00003030};
3031
3032static PyObject *dictiter_iternextitem(dictiterobject *di)
3033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034 PyObject *key, *value, *result = di->di_result;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003035 Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003037 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 if (d == NULL)
3040 return NULL;
3041 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 if (di->di_used != d->ma_used) {
3044 PyErr_SetString(PyExc_RuntimeError,
3045 "dictionary changed size during iteration");
3046 di->di_used = -1; /* Make this state sticky */
3047 return NULL;
3048 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003050 i = di->di_pos;
3051 if (i < 0)
3052 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003053 mask = DK_SIZE(d->ma_keys)-1;
3054 if (d->ma_values) {
3055 value_ptr = &d->ma_values[i];
3056 offset = sizeof(PyObject *);
3057 }
3058 else {
3059 value_ptr = &d->ma_keys->dk_entries[i].me_value;
3060 offset = sizeof(PyDictKeyEntry);
3061 }
3062 while (i <= mask && *value_ptr == NULL) {
3063 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003064 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003065 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 di->di_pos = i+1;
3067 if (i > mask)
3068 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 if (result->ob_refcnt == 1) {
3071 Py_INCREF(result);
3072 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3073 Py_DECREF(PyTuple_GET_ITEM(result, 1));
3074 } else {
3075 result = PyTuple_New(2);
3076 if (result == NULL)
3077 return NULL;
3078 }
3079 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003080 key = d->ma_keys->dk_entries[i].me_key;
3081 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 Py_INCREF(key);
3083 Py_INCREF(value);
3084 PyTuple_SET_ITEM(result, 0, key);
3085 PyTuple_SET_ITEM(result, 1, value);
3086 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003087
3088fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 Py_DECREF(d);
3090 di->di_dict = NULL;
3091 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003092}
3093
3094PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3096 "dict_itemiterator", /* tp_name */
3097 sizeof(dictiterobject), /* tp_basicsize */
3098 0, /* tp_itemsize */
3099 /* methods */
3100 (destructor)dictiter_dealloc, /* tp_dealloc */
3101 0, /* tp_print */
3102 0, /* tp_getattr */
3103 0, /* tp_setattr */
3104 0, /* tp_reserved */
3105 0, /* tp_repr */
3106 0, /* tp_as_number */
3107 0, /* tp_as_sequence */
3108 0, /* tp_as_mapping */
3109 0, /* tp_hash */
3110 0, /* tp_call */
3111 0, /* tp_str */
3112 PyObject_GenericGetAttr, /* tp_getattro */
3113 0, /* tp_setattro */
3114 0, /* tp_as_buffer */
3115 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3116 0, /* tp_doc */
3117 (traverseproc)dictiter_traverse, /* tp_traverse */
3118 0, /* tp_clear */
3119 0, /* tp_richcompare */
3120 0, /* tp_weaklistoffset */
3121 PyObject_SelfIter, /* tp_iter */
3122 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3123 dictiter_methods, /* tp_methods */
3124 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003125};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003126
3127
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003128static PyObject *
3129dictiter_reduce(dictiterobject *di)
3130{
3131 PyObject *list;
3132 dictiterobject tmp;
3133
3134 list = PyList_New(0);
3135 if (!list)
3136 return NULL;
3137
3138 /* copy the itertor state */
3139 tmp = *di;
3140 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003141
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003142 /* iterate the temporary into a list */
3143 for(;;) {
3144 PyObject *element = 0;
3145 if (Py_TYPE(di) == &PyDictIterItem_Type)
3146 element = dictiter_iternextitem(&tmp);
3147 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3148 element = dictiter_iternextkey(&tmp);
3149 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3150 element = dictiter_iternextvalue(&tmp);
3151 else
3152 assert(0);
3153 if (element) {
3154 if (PyList_Append(list, element)) {
3155 Py_DECREF(element);
3156 Py_DECREF(list);
3157 Py_XDECREF(tmp.di_dict);
3158 return NULL;
3159 }
3160 Py_DECREF(element);
3161 } else
3162 break;
3163 }
3164 Py_XDECREF(tmp.di_dict);
3165 /* check for error */
3166 if (tmp.di_dict != NULL) {
3167 /* we have an error */
3168 Py_DECREF(list);
3169 return NULL;
3170 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003171 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003172}
3173
Guido van Rossum3ac67412007-02-10 18:55:06 +00003174/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003175/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003176/***********************************************/
3177
Guido van Rossumb90c8482007-02-10 01:11:45 +00003178/* The instance lay-out is the same for all three; but the type differs. */
3179
3180typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 PyObject_HEAD
3182 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003183} dictviewobject;
3184
3185
3186static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00003187dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003189 Py_XDECREF(dv->dv_dict);
3190 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003191}
3192
3193static int
3194dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
3195{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003196 Py_VISIT(dv->dv_dict);
3197 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003198}
3199
Guido van Rossum83825ac2007-02-10 04:54:19 +00003200static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00003201dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003203 Py_ssize_t len = 0;
3204 if (dv->dv_dict != NULL)
3205 len = dv->dv_dict->ma_used;
3206 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003207}
3208
3209static PyObject *
3210dictview_new(PyObject *dict, PyTypeObject *type)
3211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 dictviewobject *dv;
3213 if (dict == NULL) {
3214 PyErr_BadInternalCall();
3215 return NULL;
3216 }
3217 if (!PyDict_Check(dict)) {
3218 /* XXX Get rid of this restriction later */
3219 PyErr_Format(PyExc_TypeError,
3220 "%s() requires a dict argument, not '%s'",
3221 type->tp_name, dict->ob_type->tp_name);
3222 return NULL;
3223 }
3224 dv = PyObject_GC_New(dictviewobject, type);
3225 if (dv == NULL)
3226 return NULL;
3227 Py_INCREF(dict);
3228 dv->dv_dict = (PyDictObject *)dict;
3229 _PyObject_GC_TRACK(dv);
3230 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003231}
3232
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003233/* TODO(guido): The views objects are not complete:
3234
3235 * support more set operations
3236 * support arbitrary mappings?
3237 - either these should be static or exported in dictobject.h
3238 - if public then they should probably be in builtins
3239*/
3240
Guido van Rossumaac530c2007-08-24 22:33:45 +00003241/* Return 1 if self is a subset of other, iterating over self;
3242 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003243static int
3244all_contained_in(PyObject *self, PyObject *other)
3245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 PyObject *iter = PyObject_GetIter(self);
3247 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 if (iter == NULL)
3250 return -1;
3251 for (;;) {
3252 PyObject *next = PyIter_Next(iter);
3253 if (next == NULL) {
3254 if (PyErr_Occurred())
3255 ok = -1;
3256 break;
3257 }
3258 ok = PySequence_Contains(other, next);
3259 Py_DECREF(next);
3260 if (ok <= 0)
3261 break;
3262 }
3263 Py_DECREF(iter);
3264 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003265}
3266
3267static PyObject *
3268dictview_richcompare(PyObject *self, PyObject *other, int op)
3269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 Py_ssize_t len_self, len_other;
3271 int ok;
3272 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003274 assert(self != NULL);
3275 assert(PyDictViewSet_Check(self));
3276 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003277
Brian Curtindfc80e32011-08-10 20:28:54 -05003278 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3279 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 len_self = PyObject_Size(self);
3282 if (len_self < 0)
3283 return NULL;
3284 len_other = PyObject_Size(other);
3285 if (len_other < 0)
3286 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 ok = 0;
3289 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 case Py_NE:
3292 case Py_EQ:
3293 if (len_self == len_other)
3294 ok = all_contained_in(self, other);
3295 if (op == Py_NE && ok >= 0)
3296 ok = !ok;
3297 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 case Py_LT:
3300 if (len_self < len_other)
3301 ok = all_contained_in(self, other);
3302 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 case Py_LE:
3305 if (len_self <= len_other)
3306 ok = all_contained_in(self, other);
3307 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 case Py_GT:
3310 if (len_self > len_other)
3311 ok = all_contained_in(other, self);
3312 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 case Py_GE:
3315 if (len_self >= len_other)
3316 ok = all_contained_in(other, self);
3317 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 }
3320 if (ok < 0)
3321 return NULL;
3322 result = ok ? Py_True : Py_False;
3323 Py_INCREF(result);
3324 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003325}
3326
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003327static PyObject *
3328dictview_repr(dictviewobject *dv)
3329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 PyObject *seq;
3331 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 seq = PySequence_List((PyObject *)dv);
3334 if (seq == NULL)
3335 return NULL;
3336
3337 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3338 Py_DECREF(seq);
3339 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003340}
3341
Guido van Rossum3ac67412007-02-10 18:55:06 +00003342/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003343
3344static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003345dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003346{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 if (dv->dv_dict == NULL) {
3348 Py_RETURN_NONE;
3349 }
3350 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003351}
3352
3353static int
3354dictkeys_contains(dictviewobject *dv, PyObject *obj)
3355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 if (dv->dv_dict == NULL)
3357 return 0;
3358 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003359}
3360
Guido van Rossum83825ac2007-02-10 04:54:19 +00003361static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 (lenfunc)dictview_len, /* sq_length */
3363 0, /* sq_concat */
3364 0, /* sq_repeat */
3365 0, /* sq_item */
3366 0, /* sq_slice */
3367 0, /* sq_ass_item */
3368 0, /* sq_ass_slice */
3369 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003370};
3371
Guido van Rossum523259b2007-08-24 23:41:22 +00003372static PyObject*
3373dictviews_sub(PyObject* self, PyObject *other)
3374{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 PyObject *result = PySet_New(self);
3376 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003377 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 if (result == NULL)
3380 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003381
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003382 tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 if (tmp == NULL) {
3384 Py_DECREF(result);
3385 return NULL;
3386 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003388 Py_DECREF(tmp);
3389 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003390}
3391
3392static PyObject*
3393dictviews_and(PyObject* self, PyObject *other)
3394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003395 PyObject *result = PySet_New(self);
3396 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003397 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 if (result == NULL)
3400 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003401
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003402 tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 if (tmp == NULL) {
3404 Py_DECREF(result);
3405 return NULL;
3406 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003408 Py_DECREF(tmp);
3409 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003410}
3411
3412static PyObject*
3413dictviews_or(PyObject* self, PyObject *other)
3414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003415 PyObject *result = PySet_New(self);
3416 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003417 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 if (result == NULL)
3420 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003421
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003422 tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003423 if (tmp == NULL) {
3424 Py_DECREF(result);
3425 return NULL;
3426 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003428 Py_DECREF(tmp);
3429 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003430}
3431
3432static PyObject*
3433dictviews_xor(PyObject* self, PyObject *other)
3434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435 PyObject *result = PySet_New(self);
3436 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003437 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 if (result == NULL)
3440 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003441
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003442 tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 other);
3444 if (tmp == NULL) {
3445 Py_DECREF(result);
3446 return NULL;
3447 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 Py_DECREF(tmp);
3450 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003451}
3452
3453static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003454 0, /*nb_add*/
3455 (binaryfunc)dictviews_sub, /*nb_subtract*/
3456 0, /*nb_multiply*/
3457 0, /*nb_remainder*/
3458 0, /*nb_divmod*/
3459 0, /*nb_power*/
3460 0, /*nb_negative*/
3461 0, /*nb_positive*/
3462 0, /*nb_absolute*/
3463 0, /*nb_bool*/
3464 0, /*nb_invert*/
3465 0, /*nb_lshift*/
3466 0, /*nb_rshift*/
3467 (binaryfunc)dictviews_and, /*nb_and*/
3468 (binaryfunc)dictviews_xor, /*nb_xor*/
3469 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003470};
3471
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003472static PyObject*
3473dictviews_isdisjoint(PyObject *self, PyObject *other)
3474{
3475 PyObject *it;
3476 PyObject *item = NULL;
3477
3478 if (self == other) {
3479 if (dictview_len((dictviewobject *)self) == 0)
3480 Py_RETURN_TRUE;
3481 else
3482 Py_RETURN_FALSE;
3483 }
3484
3485 /* Iterate over the shorter object (only if other is a set,
3486 * because PySequence_Contains may be expensive otherwise): */
3487 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
3488 Py_ssize_t len_self = dictview_len((dictviewobject *)self);
3489 Py_ssize_t len_other = PyObject_Size(other);
3490 if (len_other == -1)
3491 return NULL;
3492
3493 if ((len_other > len_self)) {
3494 PyObject *tmp = other;
3495 other = self;
3496 self = tmp;
3497 }
3498 }
3499
3500 it = PyObject_GetIter(other);
3501 if (it == NULL)
3502 return NULL;
3503
3504 while ((item = PyIter_Next(it)) != NULL) {
3505 int contains = PySequence_Contains(self, item);
3506 Py_DECREF(item);
3507 if (contains == -1) {
3508 Py_DECREF(it);
3509 return NULL;
3510 }
3511
3512 if (contains) {
3513 Py_DECREF(it);
3514 Py_RETURN_FALSE;
3515 }
3516 }
3517 Py_DECREF(it);
3518 if (PyErr_Occurred())
3519 return NULL; /* PyIter_Next raised an exception. */
3520 Py_RETURN_TRUE;
3521}
3522
3523PyDoc_STRVAR(isdisjoint_doc,
3524"Return True if the view and the given iterable have a null intersection.");
3525
Guido van Rossumb90c8482007-02-10 01:11:45 +00003526static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003527 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3528 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003529 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003530};
3531
3532PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003533 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3534 "dict_keys", /* tp_name */
3535 sizeof(dictviewobject), /* tp_basicsize */
3536 0, /* tp_itemsize */
3537 /* methods */
3538 (destructor)dictview_dealloc, /* tp_dealloc */
3539 0, /* tp_print */
3540 0, /* tp_getattr */
3541 0, /* tp_setattr */
3542 0, /* tp_reserved */
3543 (reprfunc)dictview_repr, /* tp_repr */
3544 &dictviews_as_number, /* tp_as_number */
3545 &dictkeys_as_sequence, /* tp_as_sequence */
3546 0, /* tp_as_mapping */
3547 0, /* tp_hash */
3548 0, /* tp_call */
3549 0, /* tp_str */
3550 PyObject_GenericGetAttr, /* tp_getattro */
3551 0, /* tp_setattro */
3552 0, /* tp_as_buffer */
3553 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3554 0, /* tp_doc */
3555 (traverseproc)dictview_traverse, /* tp_traverse */
3556 0, /* tp_clear */
3557 dictview_richcompare, /* tp_richcompare */
3558 0, /* tp_weaklistoffset */
3559 (getiterfunc)dictkeys_iter, /* tp_iter */
3560 0, /* tp_iternext */
3561 dictkeys_methods, /* tp_methods */
3562 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003563};
3564
3565static PyObject *
3566dictkeys_new(PyObject *dict)
3567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003568 return dictview_new(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003569}
3570
Guido van Rossum3ac67412007-02-10 18:55:06 +00003571/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003572
3573static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003574dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003576 if (dv->dv_dict == NULL) {
3577 Py_RETURN_NONE;
3578 }
3579 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003580}
3581
3582static int
3583dictitems_contains(dictviewobject *dv, PyObject *obj)
3584{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003585 PyObject *key, *value, *found;
3586 if (dv->dv_dict == NULL)
3587 return 0;
3588 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3589 return 0;
3590 key = PyTuple_GET_ITEM(obj, 0);
3591 value = PyTuple_GET_ITEM(obj, 1);
3592 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3593 if (found == NULL) {
3594 if (PyErr_Occurred())
3595 return -1;
3596 return 0;
3597 }
3598 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003599}
3600
Guido van Rossum83825ac2007-02-10 04:54:19 +00003601static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 (lenfunc)dictview_len, /* sq_length */
3603 0, /* sq_concat */
3604 0, /* sq_repeat */
3605 0, /* sq_item */
3606 0, /* sq_slice */
3607 0, /* sq_ass_item */
3608 0, /* sq_ass_slice */
3609 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003610};
3611
Guido van Rossumb90c8482007-02-10 01:11:45 +00003612static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003613 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3614 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003615 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003616};
3617
3618PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003619 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3620 "dict_items", /* tp_name */
3621 sizeof(dictviewobject), /* tp_basicsize */
3622 0, /* tp_itemsize */
3623 /* methods */
3624 (destructor)dictview_dealloc, /* tp_dealloc */
3625 0, /* tp_print */
3626 0, /* tp_getattr */
3627 0, /* tp_setattr */
3628 0, /* tp_reserved */
3629 (reprfunc)dictview_repr, /* tp_repr */
3630 &dictviews_as_number, /* tp_as_number */
3631 &dictitems_as_sequence, /* tp_as_sequence */
3632 0, /* tp_as_mapping */
3633 0, /* tp_hash */
3634 0, /* tp_call */
3635 0, /* tp_str */
3636 PyObject_GenericGetAttr, /* tp_getattro */
3637 0, /* tp_setattro */
3638 0, /* tp_as_buffer */
3639 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3640 0, /* tp_doc */
3641 (traverseproc)dictview_traverse, /* tp_traverse */
3642 0, /* tp_clear */
3643 dictview_richcompare, /* tp_richcompare */
3644 0, /* tp_weaklistoffset */
3645 (getiterfunc)dictitems_iter, /* tp_iter */
3646 0, /* tp_iternext */
3647 dictitems_methods, /* tp_methods */
3648 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003649};
3650
3651static PyObject *
3652dictitems_new(PyObject *dict)
3653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003654 return dictview_new(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003655}
3656
Guido van Rossum3ac67412007-02-10 18:55:06 +00003657/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003658
3659static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003660dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003662 if (dv->dv_dict == NULL) {
3663 Py_RETURN_NONE;
3664 }
3665 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003666}
3667
Guido van Rossum83825ac2007-02-10 04:54:19 +00003668static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003669 (lenfunc)dictview_len, /* sq_length */
3670 0, /* sq_concat */
3671 0, /* sq_repeat */
3672 0, /* sq_item */
3673 0, /* sq_slice */
3674 0, /* sq_ass_item */
3675 0, /* sq_ass_slice */
3676 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003677};
3678
Guido van Rossumb90c8482007-02-10 01:11:45 +00003679static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003681};
3682
3683PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003684 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3685 "dict_values", /* tp_name */
3686 sizeof(dictviewobject), /* tp_basicsize */
3687 0, /* tp_itemsize */
3688 /* methods */
3689 (destructor)dictview_dealloc, /* tp_dealloc */
3690 0, /* tp_print */
3691 0, /* tp_getattr */
3692 0, /* tp_setattr */
3693 0, /* tp_reserved */
3694 (reprfunc)dictview_repr, /* tp_repr */
3695 0, /* tp_as_number */
3696 &dictvalues_as_sequence, /* tp_as_sequence */
3697 0, /* tp_as_mapping */
3698 0, /* tp_hash */
3699 0, /* tp_call */
3700 0, /* tp_str */
3701 PyObject_GenericGetAttr, /* tp_getattro */
3702 0, /* tp_setattro */
3703 0, /* tp_as_buffer */
3704 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3705 0, /* tp_doc */
3706 (traverseproc)dictview_traverse, /* tp_traverse */
3707 0, /* tp_clear */
3708 0, /* tp_richcompare */
3709 0, /* tp_weaklistoffset */
3710 (getiterfunc)dictvalues_iter, /* tp_iter */
3711 0, /* tp_iternext */
3712 dictvalues_methods, /* tp_methods */
3713 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003714};
3715
3716static PyObject *
3717dictvalues_new(PyObject *dict)
3718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003719 return dictview_new(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003720}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003721
3722/* Returns NULL if cannot allocate a new PyDictKeysObject,
3723 but does not set an error */
3724PyDictKeysObject *
3725_PyDict_NewKeysForClass(void)
3726{
3727 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_SPLIT);
3728 if (keys == NULL)
3729 PyErr_Clear();
3730 else
3731 keys->dk_lookup = lookdict_split;
3732 return keys;
3733}
3734
3735#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
3736
3737PyObject *
3738PyObject_GenericGetDict(PyObject *obj, void *context)
3739{
3740 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
3741 if (dictptr == NULL) {
3742 PyErr_SetString(PyExc_AttributeError,
3743 "This object has no __dict__");
3744 return NULL;
3745 }
3746 dict = *dictptr;
3747 if (dict == NULL) {
3748 PyTypeObject *tp = Py_TYPE(obj);
3749 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
3750 DK_INCREF(CACHED_KEYS(tp));
3751 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
3752 }
3753 else {
3754 *dictptr = dict = PyDict_New();
3755 }
3756 }
3757 Py_XINCREF(dict);
3758 return dict;
3759}
3760
3761int
3762_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
3763 PyObject *key, PyObject *value)
3764{
3765 PyObject *dict;
3766 int res;
3767 PyDictKeysObject *cached;
3768
3769 assert(dictptr != NULL);
3770 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
3771 assert(dictptr != NULL);
3772 dict = *dictptr;
3773 if (dict == NULL) {
3774 DK_INCREF(cached);
3775 dict = new_dict_with_shared_keys(cached);
3776 if (dict == NULL)
3777 return -1;
3778 *dictptr = dict;
3779 }
3780 if (value == NULL) {
3781 res = PyDict_DelItem(dict, key);
3782 if (cached != ((PyDictObject *)dict)->ma_keys) {
3783 CACHED_KEYS(tp) = NULL;
3784 DK_DECREF(cached);
3785 }
3786 } else {
3787 res = PyDict_SetItem(dict, key, value);
3788 if (cached != ((PyDictObject *)dict)->ma_keys) {
3789 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04003790 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003791 CACHED_KEYS(tp) = make_keys_shared(dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003792 } else {
3793 CACHED_KEYS(tp) = NULL;
3794 }
3795 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04003796 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
3797 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003798 }
3799 }
3800 } else {
3801 dict = *dictptr;
3802 if (dict == NULL) {
3803 dict = PyDict_New();
3804 if (dict == NULL)
3805 return -1;
3806 *dictptr = dict;
3807 }
3808 if (value == NULL) {
3809 res = PyDict_DelItem(dict, key);
3810 } else {
3811 res = PyDict_SetItem(dict, key, value);
3812 }
3813 }
3814 return res;
3815}
3816
3817void
3818_PyDictKeys_DecRef(PyDictKeysObject *keys)
3819{
3820 DK_DECREF(keys);
3821}
3822
3823
3824/* ARGSUSED */
3825static PyObject *
3826dummy_repr(PyObject *op)
3827{
3828 return PyUnicode_FromString("<dummy key>");
3829}
3830
3831/* ARGUSED */
3832static void
3833dummy_dealloc(PyObject* ignore)
3834{
3835 /* This should never get called, but we also don't want to SEGV if
3836 * we accidentally decref dummy-key out of existence.
3837 */
3838 Py_FatalError("deallocating <dummy key>");
3839}
3840
3841static PyTypeObject PyDictDummy_Type = {
3842 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3843 "<dummy key> type",
3844 0,
3845 0,
3846 dummy_dealloc, /*tp_dealloc*/ /*never called*/
3847 0, /*tp_print*/
3848 0, /*tp_getattr*/
3849 0, /*tp_setattr*/
3850 0, /*tp_reserved*/
3851 dummy_repr, /*tp_repr*/
3852 0, /*tp_as_number*/
3853 0, /*tp_as_sequence*/
3854 0, /*tp_as_mapping*/
3855 0, /*tp_hash */
3856 0, /*tp_call */
3857 0, /*tp_str */
3858 0, /*tp_getattro */
3859 0, /*tp_setattro */
3860 0, /*tp_as_buffer */
3861 Py_TPFLAGS_DEFAULT, /*tp_flags */
3862};
3863
3864static PyObject _dummy_struct = {
3865 _PyObject_EXTRA_INIT
3866 2, &PyDictDummy_Type
3867};
3868