blob: 3c1b3bba8ca3c997dd2b770120168b79ba7fcd6a [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
Benjamin Peterson7d95e402012-04-23 11:24:50 -040072typedef struct {
73 /* Cached hash code of me_key. */
74 Py_hash_t me_hash;
75 PyObject *me_key;
76 PyObject *me_value; /* This field is only meaningful for combined tables */
77} PyDictKeyEntry;
78
79typedef PyDictKeyEntry *(*dict_lookup_func)
80(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject ***value_addr);
81
82struct _dictkeysobject {
83 Py_ssize_t dk_refcnt;
84 Py_ssize_t dk_size;
85 dict_lookup_func dk_lookup;
86 Py_ssize_t dk_usable;
87 PyDictKeyEntry dk_entries[1];
88};
89
90
91/*
92To ensure the lookup algorithm terminates, there must be at least one Unused
93slot (NULL key) in the table.
94To avoid slowing down lookups on a near-full table, we resize the table when
95it's USABLE_FRACTION (currently two-thirds) full.
96*/
Guido van Rossum16e93a81997-01-28 00:00:11 +000097
Tim Peterseb28ef22001-06-02 05:27:19 +000098#define PERTURB_SHIFT 5
99
Guido van Rossum16e93a81997-01-28 00:00:11 +0000100/*
Tim Peterseb28ef22001-06-02 05:27:19 +0000101Major subtleties ahead: Most hash schemes depend on having a "good" hash
102function, in the sense of simulating randomness. Python doesn't: its most
103important hash functions (for strings and ints) are very regular in common
104cases:
Tim Peters15d49292001-05-27 07:39:22 +0000105
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000106 >>> map(hash, (0, 1, 2, 3))
107 [0, 1, 2, 3]
108 >>> map(hash, ("namea", "nameb", "namec", "named"))
109 [-1658398457, -1658398460, -1658398459, -1658398462]
110 >>>
Tim Peters15d49292001-05-27 07:39:22 +0000111
Tim Peterseb28ef22001-06-02 05:27:19 +0000112This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
113the low-order i bits as the initial table index is extremely fast, and there
114are no collisions at all for dicts indexed by a contiguous range of ints.
115The same is approximately true when keys are "consecutive" strings. So this
116gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +0000117
Tim Peterseb28ef22001-06-02 05:27:19 +0000118OTOH, when collisions occur, the tendency to fill contiguous slices of the
119hash table makes a good collision resolution strategy crucial. Taking only
120the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000122their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
123 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +0000124
Tim Peterseb28ef22001-06-02 05:27:19 +0000125But catering to unusual cases should not slow the usual ones, so we just take
126the last i bits anyway. It's up to collision resolution to do the rest. If
127we *usually* find the key we're looking for on the first try (and, it turns
128out, we usually do -- the table load factor is kept under 2/3, so the odds
129are solidly in our favor), then it makes best sense to keep the initial index
130computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +0000131
Tim Peterseb28ef22001-06-02 05:27:19 +0000132The first half of collision resolution is to visit table indices via this
133recurrence:
Tim Peters15d49292001-05-27 07:39:22 +0000134
Tim Peterseb28ef22001-06-02 05:27:19 +0000135 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +0000136
Tim Peterseb28ef22001-06-02 05:27:19 +0000137For any initial j in range(2**i), repeating that 2**i times generates each
138int in range(2**i) exactly once (see any text on random-number generation for
139proof). By itself, this doesn't help much: like linear probing (setting
140j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
141order. This would be bad, except that's not the only thing we do, and it's
142actually *good* in the common cases where hash keys are consecutive. In an
143example that's really too small to make this entirely clear, for a table of
144size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +0000145
Tim Peterseb28ef22001-06-02 05:27:19 +0000146 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
147
148If two things come in at index 5, the first place we look after is index 2,
149not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
150Linear probing is deadly in this case because there the fixed probe order
151is the *same* as the order consecutive keys are likely to arrive. But it's
152extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
153and certain that consecutive hash codes do not.
154
155The other half of the strategy is to get the other bits of the hash code
156into play. This is done by initializing a (unsigned) vrbl "perturb" to the
157full hash code, and changing the recurrence to:
158
159 j = (5*j) + 1 + perturb;
160 perturb >>= PERTURB_SHIFT;
161 use j % 2**i as the next table index;
162
163Now the probe sequence depends (eventually) on every bit in the hash code,
164and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
165because it quickly magnifies small differences in the bits that didn't affect
166the initial index. Note that because perturb is unsigned, if the recurrence
167is executed often enough perturb eventually becomes and remains 0. At that
168point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
169that's certain to find an empty slot eventually (since it generates every int
170in range(2**i), and we make sure there's always at least one empty slot).
171
172Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
173small so that the high bits of the hash code continue to affect the probe
174sequence across iterations; but you want it large so that in really bad cases
175the high-order hash bits have an effect on early iterations. 5 was "the
176best" in minimizing total collisions across experiments Tim Peters ran (on
177both normal and pathological cases), but 4 and 6 weren't significantly worse.
178
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000179Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000180approach, using repeated multiplication by x in GF(2**n) where an irreducible
181polynomial for each table size was chosen such that x was a primitive root.
182Christian Tismer later extended that to use division by x instead, as an
183efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000184also gave excellent collision statistics, but was more expensive: two
185if-tests were required inside the loop; computing "the next" index took about
186the same number of operations but without as much potential parallelism
187(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
188above, and then shifting perturb can be done while the table index is being
189masked); and the PyDictObject struct required a member to hold the table's
190polynomial. In Tim's experiments the current scheme ran faster, produced
191equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000192
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000193*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000194
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400195/* Object used as dummy key to fill deleted entries
196 * This could be any unique object,
197 * use a custom type in order to minimise coupling.
198*/
199static PyObject _dummy_struct;
200
201#define dummy (&_dummy_struct)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000202
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000203#ifdef Py_REF_DEBUG
204PyObject *
205_PyDict_Dummy(void)
206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 return dummy;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000208}
209#endif
210
Fred Drake1bff34a2000-08-31 19:31:38 +0000211/* forward declarations */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400212static PyDictKeyEntry *lookdict(PyDictObject *mp, PyObject *key,
213 Py_hash_t hash, PyObject ***value_addr);
214static PyDictKeyEntry *lookdict_unicode(PyDictObject *mp, PyObject *key,
215 Py_hash_t hash, PyObject ***value_addr);
216static PyDictKeyEntry *
217lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
218 Py_hash_t hash, PyObject ***value_addr);
219static PyDictKeyEntry *lookdict_split(PyDictObject *mp, PyObject *key,
220 Py_hash_t hash, PyObject ***value_addr);
Fred Drake1bff34a2000-08-31 19:31:38 +0000221
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400222static int dictresize(PyDictObject *mp, Py_ssize_t minused);
Tim Petersdea48ec2001-05-22 20:40:22 +0000223
Raymond Hettinger43442782004-03-17 21:55:03 +0000224/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes2202f872008-02-06 14:31:34 +0000225#ifndef PyDict_MAXFREELIST
226#define PyDict_MAXFREELIST 80
227#endif
228static PyDictObject *free_list[PyDict_MAXFREELIST];
229static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000230
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100231int
232PyDict_ClearFreeList(void)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 PyDictObject *op;
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100235 int ret = numfree;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 while (numfree) {
237 op = free_list[--numfree];
238 assert(PyDict_CheckExact(op));
239 PyObject_GC_Del(op);
240 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100241 return ret;
242}
243
David Malcolm49526f42012-06-22 14:55:41 -0400244/* Print summary info about the state of the optimized allocator */
245void
246_PyDict_DebugMallocStats(FILE *out)
247{
248 _PyDebugAllocatorStats(out,
249 "free PyDictObject", numfree, sizeof(PyDictObject));
250}
251
252
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100253void
254PyDict_Fini(void)
255{
256 PyDict_ClearFreeList();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000257}
258
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200259#define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
260#define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
261
262#define DK_INCREF(dk) (DK_DEBUG_INCREF ++(dk)->dk_refcnt)
263#define DK_DECREF(dk) if (DK_DEBUG_DECREF (--(dk)->dk_refcnt) == 0) free_keys_object(dk)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400264#define DK_SIZE(dk) ((dk)->dk_size)
265#define DK_MASK(dk) (((dk)->dk_size)-1)
266#define IS_POWER_OF_2(x) (((x) & (x-1)) == 0)
267
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200268/* USABLE_FRACTION is the maximum dictionary load.
269 * Currently set to (2n+1)/3. Increasing this ratio makes dictionaries more
270 * dense resulting in more collisions. Decreasing it improves sparseness
271 * at the expense of spreading entries over more cache lines and at the
272 * cost of total memory consumed.
273 *
274 * USABLE_FRACTION must obey the following:
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400275 * (0 < USABLE_FRACTION(n) < n) for all n >= 2
276 *
277 * USABLE_FRACTION should be very quick to calculate.
278 * Fractions around 5/8 to 2/3 seem to work well in practice.
279 */
280
281/* Use (2n+1)/3 rather than 2n+3 because: it makes no difference for
282 * combined tables (the two fractions round to the same number n < ),
283 * but 2*4/3 is 2 whereas (2*4+1)/3 is 3 which potentially saves quite
284 * a lot of space for small, split tables */
285#define USABLE_FRACTION(n) ((((n) << 1)+1)/3)
286
287/* Alternative fraction that is otherwise close enough to (2n+1)/3 to make
288 * little difference. 8 * 2/3 == 8 * 5/8 == 5. 16 * 2/3 == 16 * 5/8 == 10.
289 * 32 * 2/3 = 21, 32 * 5/8 = 20.
290 * Its advantage is that it is faster to compute on machines with slow division.
291 * #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
292*/
293
Victor Stinnera9f61a52013-07-16 22:17:26 +0200294/* GROWTH_RATE. Growth rate upon hitting maximum load.
295 * Currently set to used*2 + capacity/2.
296 * This means that dicts double in size when growing without deletions,
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700297 * but have more head room when the number of deletions is on a par with the
298 * number of insertions.
299 * Raising this to used*4 doubles memory consumption depending on the size of
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200300 * the dictionary, but results in half the number of resizes, less effort to
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700301 * resize.
302 * GROWTH_RATE was set to used*4 up to version 3.2.
303 * GROWTH_RATE was set to used*2 in version 3.3.0
Antoine Pitroua504a7a2012-06-24 21:03:45 +0200304 */
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700305#define GROWTH_RATE(d) (((d)->ma_used*2)+((d)->ma_keys->dk_size>>1))
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400306
307#define ENSURE_ALLOWS_DELETIONS(d) \
308 if ((d)->ma_keys->dk_lookup == lookdict_unicode_nodummy) { \
309 (d)->ma_keys->dk_lookup = lookdict_unicode; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400311
312/* This immutable, empty PyDictKeysObject is used for PyDict_Clear()
313 * (which cannot fail and thus can do no allocation).
314 */
315static PyDictKeysObject empty_keys_struct = {
316 2, /* dk_refcnt 1 for this struct, 1 for dummy_struct */
317 1, /* dk_size */
318 lookdict_split, /* dk_lookup */
319 0, /* dk_usable (immutable) */
320 {
321 { 0, 0, 0 } /* dk_entries (empty) */
322 }
323};
324
325static PyObject *empty_values[1] = { NULL };
326
327#define Py_EMPTY_KEYS &empty_keys_struct
328
329static PyDictKeysObject *new_keys_object(Py_ssize_t size)
330{
331 PyDictKeysObject *dk;
332 Py_ssize_t i;
333 PyDictKeyEntry *ep0;
334
335 assert(size >= PyDict_MINSIZE_SPLIT);
336 assert(IS_POWER_OF_2(size));
337 dk = PyMem_MALLOC(sizeof(PyDictKeysObject) +
338 sizeof(PyDictKeyEntry) * (size-1));
339 if (dk == NULL) {
340 PyErr_NoMemory();
341 return NULL;
342 }
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200343 DK_DEBUG_INCREF dk->dk_refcnt = 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400344 dk->dk_size = size;
345 dk->dk_usable = USABLE_FRACTION(size);
346 ep0 = &dk->dk_entries[0];
347 /* Hash value of slot 0 is used by popitem, so it must be initialized */
348 ep0->me_hash = 0;
349 for (i = 0; i < size; i++) {
350 ep0[i].me_key = NULL;
351 ep0[i].me_value = NULL;
352 }
353 dk->dk_lookup = lookdict_unicode_nodummy;
354 return dk;
355}
356
357static void
358free_keys_object(PyDictKeysObject *keys)
359{
360 PyDictKeyEntry *entries = &keys->dk_entries[0];
361 Py_ssize_t i, n;
362 for (i = 0, n = DK_SIZE(keys); i < n; i++) {
363 Py_XDECREF(entries[i].me_key);
364 Py_XDECREF(entries[i].me_value);
365 }
366 PyMem_FREE(keys);
367}
368
369#define new_values(size) PyMem_NEW(PyObject *, size)
370
371#define free_values(values) PyMem_FREE(values)
372
373/* Consumes a reference to the keys object */
374static PyObject *
375new_dict(PyDictKeysObject *keys, PyObject **values)
376{
377 PyDictObject *mp;
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200378 assert(keys != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 if (numfree) {
380 mp = free_list[--numfree];
381 assert (mp != NULL);
382 assert (Py_TYPE(mp) == &PyDict_Type);
383 _Py_NewReference((PyObject *)mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400385 else {
386 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
387 if (mp == NULL) {
388 DK_DECREF(keys);
389 free_values(values);
390 return NULL;
391 }
392 }
393 mp->ma_keys = keys;
394 mp->ma_values = values;
395 mp->ma_used = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000397}
398
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400399/* Consumes a reference to the keys object */
400static PyObject *
401new_dict_with_shared_keys(PyDictKeysObject *keys)
402{
403 PyObject **values;
404 Py_ssize_t i, size;
405
406 size = DK_SIZE(keys);
407 values = new_values(size);
408 if (values == NULL) {
409 DK_DECREF(keys);
410 return PyErr_NoMemory();
411 }
412 for (i = 0; i < size; i++) {
413 values[i] = NULL;
414 }
415 return new_dict(keys, values);
416}
417
418PyObject *
419PyDict_New(void)
420{
Victor Stinnerc9b7f512013-07-08 22:19:20 +0200421 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_COMBINED);
422 if (keys == NULL)
423 return NULL;
424 return new_dict(keys, NULL);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400425}
426
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000427/*
428The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000429This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000430Open addressing is preferred over chaining since the link overhead for
431chaining would be substantial (100% with typical malloc overhead).
432
Tim Peterseb28ef22001-06-02 05:27:19 +0000433The initial probe index is computed as hash mod the table size. Subsequent
434probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000435
436All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000437
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000438The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000439contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000440Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000441
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000442lookdict() is general-purpose, and may return NULL if (and only if) a
443comparison raises an exception (this was new in Python 2.5).
Guido van Rossum89d8c602007-09-18 17:26:56 +0000444lookdict_unicode() below is specialized to string keys, comparison of which can
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400445never raise an exception; that function can never return NULL.
446lookdict_unicode_nodummy is further specialized for string keys that cannot be
447the <dummy> value.
448For both, when the key isn't found a PyDictEntry* is returned
449where the key would have been found, *value_addr points to the matching value
450slot.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000451*/
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400452static PyDictKeyEntry *
453lookdict(PyDictObject *mp, PyObject *key,
454 Py_hash_t hash, PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000455{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200456 size_t i;
457 size_t perturb;
458 PyDictKeyEntry *freeslot;
459 size_t mask;
Antoine Pitrou9a234902012-05-13 20:48:01 +0200460 PyDictKeyEntry *ep0;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200461 PyDictKeyEntry *ep;
462 int cmp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000464
Antoine Pitrou9a234902012-05-13 20:48:01 +0200465top:
466 mask = DK_MASK(mp->ma_keys);
467 ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 i = (size_t)hash & mask;
469 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400470 if (ep->me_key == NULL || ep->me_key == key) {
471 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400473 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 if (ep->me_key == dummy)
475 freeslot = ep;
476 else {
477 if (ep->me_hash == hash) {
478 startkey = ep->me_key;
479 Py_INCREF(startkey);
480 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
481 Py_DECREF(startkey);
482 if (cmp < 0)
483 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400484 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
485 if (cmp > 0) {
486 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400488 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 }
490 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200491 /* The dict was mutated, restart */
492 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 }
494 }
495 freeslot = NULL;
496 }
Tim Peters15d49292001-05-27 07:39:22 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 /* In the loop, me_key == dummy is by far (factor of 100s) the
499 least likely outcome, so test for that last. */
500 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
501 i = (i << 2) + i + perturb + 1;
502 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400503 if (ep->me_key == NULL) {
504 if (freeslot == NULL) {
505 *value_addr = &ep->me_value;
506 return ep;
507 } else {
508 *value_addr = &freeslot->me_value;
509 return freeslot;
510 }
511 }
512 if (ep->me_key == key) {
513 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400515 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 if (ep->me_hash == hash && ep->me_key != dummy) {
517 startkey = ep->me_key;
518 Py_INCREF(startkey);
519 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
520 Py_DECREF(startkey);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400521 if (cmp < 0) {
522 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400524 }
525 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
526 if (cmp > 0) {
527 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400529 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 }
531 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200532 /* The dict was mutated, restart */
533 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 }
535 }
536 else if (ep->me_key == dummy && freeslot == NULL)
537 freeslot = ep;
538 }
539 assert(0); /* NOT REACHED */
540 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000541}
542
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400543/* Specialized version for string-only keys */
544static PyDictKeyEntry *
545lookdict_unicode(PyDictObject *mp, PyObject *key,
546 Py_hash_t hash, PyObject ***value_addr)
Fred Drake1bff34a2000-08-31 19:31:38 +0000547{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200548 size_t i;
549 size_t perturb;
550 PyDictKeyEntry *freeslot;
551 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400552 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200553 PyDictKeyEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 /* Make sure this function doesn't have to handle non-unicode keys,
556 including subclasses of str; e.g., one reason to subclass
557 unicodes is to override __eq__, and for speed we don't cater to
558 that here. */
559 if (!PyUnicode_CheckExact(key)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400560 mp->ma_keys->dk_lookup = lookdict;
561 return lookdict(mp, key, hash, value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100563 i = (size_t)hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400565 if (ep->me_key == NULL || ep->me_key == key) {
566 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400568 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 if (ep->me_key == dummy)
570 freeslot = ep;
571 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400572 if (ep->me_hash == hash && unicode_eq(ep->me_key, key)) {
573 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400575 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 freeslot = NULL;
577 }
Tim Peters15d49292001-05-27 07:39:22 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 /* In the loop, me_key == dummy is by far (factor of 100s) the
580 least likely outcome, so test for that last. */
581 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
582 i = (i << 2) + i + perturb + 1;
583 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400584 if (ep->me_key == NULL) {
585 if (freeslot == NULL) {
586 *value_addr = &ep->me_value;
587 return ep;
588 } else {
589 *value_addr = &freeslot->me_value;
590 return freeslot;
591 }
592 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 if (ep->me_key == key
594 || (ep->me_hash == hash
595 && ep->me_key != dummy
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400596 && unicode_eq(ep->me_key, key))) {
597 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400599 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 if (ep->me_key == dummy && freeslot == NULL)
601 freeslot = ep;
602 }
603 assert(0); /* NOT REACHED */
604 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000605}
606
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400607/* Faster version of lookdict_unicode when it is known that no <dummy> keys
608 * will be present. */
609static PyDictKeyEntry *
610lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
611 Py_hash_t hash, PyObject ***value_addr)
612{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200613 size_t i;
614 size_t perturb;
615 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400616 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200617 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400618
619 /* Make sure this function doesn't have to handle non-unicode keys,
620 including subclasses of str; e.g., one reason to subclass
621 unicodes is to override __eq__, and for speed we don't cater to
622 that here. */
623 if (!PyUnicode_CheckExact(key)) {
624 mp->ma_keys->dk_lookup = lookdict;
625 return lookdict(mp, key, hash, value_addr);
626 }
627 i = (size_t)hash & mask;
628 ep = &ep0[i];
629 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
630 if (ep->me_key == NULL || ep->me_key == key ||
631 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
632 *value_addr = &ep->me_value;
633 return ep;
634 }
635 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
636 i = (i << 2) + i + perturb + 1;
637 ep = &ep0[i & mask];
638 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
639 if (ep->me_key == NULL || ep->me_key == key ||
640 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
641 *value_addr = &ep->me_value;
642 return ep;
643 }
644 }
645 assert(0); /* NOT REACHED */
646 return 0;
647}
648
649/* Version of lookdict for split tables.
650 * All split tables and only split tables use this lookup function.
651 * Split tables only contain unicode keys and no dummy keys,
652 * so algorithm is the same as lookdict_unicode_nodummy.
653 */
654static PyDictKeyEntry *
655lookdict_split(PyDictObject *mp, PyObject *key,
656 Py_hash_t hash, PyObject ***value_addr)
657{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200658 size_t i;
659 size_t perturb;
660 size_t mask = DK_MASK(mp->ma_keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400661 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200662 PyDictKeyEntry *ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400663
664 if (!PyUnicode_CheckExact(key)) {
Benjamin Petersondb780d02012-04-23 13:44:32 -0400665 ep = lookdict(mp, key, hash, value_addr);
666 /* lookdict expects a combined-table, so fix value_addr */
667 i = ep - ep0;
668 *value_addr = &mp->ma_values[i];
669 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400670 }
671 i = (size_t)hash & mask;
672 ep = &ep0[i];
673 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
674 if (ep->me_key == NULL || ep->me_key == key ||
675 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
676 *value_addr = &mp->ma_values[i];
677 return ep;
678 }
679 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
680 i = (i << 2) + i + perturb + 1;
681 ep = &ep0[i & mask];
682 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
683 if (ep->me_key == NULL || ep->me_key == key ||
684 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
685 *value_addr = &mp->ma_values[i & mask];
686 return ep;
687 }
688 }
689 assert(0); /* NOT REACHED */
690 return 0;
691}
692
Benjamin Petersonfb886362010-04-24 18:21:17 +0000693int
694_PyDict_HasOnlyStringKeys(PyObject *dict)
695{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 Py_ssize_t pos = 0;
697 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +0000698 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 /* Shortcut */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400700 if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 return 1;
702 while (PyDict_Next(dict, &pos, &key, &value))
703 if (!PyUnicode_Check(key))
704 return 0;
705 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +0000706}
707
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000708#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 do { \
710 if (!_PyObject_GC_IS_TRACKED(mp)) { \
711 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
712 _PyObject_GC_MAY_BE_TRACKED(value)) { \
713 _PyObject_GC_TRACK(mp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 } \
715 } \
716 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000717
718void
719_PyDict_MaybeUntrack(PyObject *op)
720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 PyDictObject *mp;
722 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400723 Py_ssize_t i, size;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
726 return;
727
728 mp = (PyDictObject *) op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400729 size = DK_SIZE(mp->ma_keys);
730 if (_PyDict_HasSplitTable(mp)) {
731 for (i = 0; i < size; i++) {
732 if ((value = mp->ma_values[i]) == NULL)
733 continue;
734 if (_PyObject_GC_MAY_BE_TRACKED(value)) {
735 assert(!_PyObject_GC_MAY_BE_TRACKED(
736 mp->ma_keys->dk_entries[i].me_key));
737 return;
738 }
739 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400741 else {
742 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
743 for (i = 0; i < size; i++) {
744 if ((value = ep0[i].me_value) == NULL)
745 continue;
746 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
747 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
748 return;
749 }
750 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000752}
753
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400754/* Internal function to find slot for an item from its hash
755 * when it is known that the key is not present in the dict.
756 */
757static PyDictKeyEntry *
758find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
759 PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000760{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400761 size_t i;
762 size_t perturb;
763 size_t mask = DK_MASK(mp->ma_keys);
764 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
765 PyDictKeyEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000766
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400767 assert(key != NULL);
768 if (!PyUnicode_CheckExact(key))
769 mp->ma_keys->dk_lookup = lookdict;
770 i = hash & mask;
771 ep = &ep0[i];
772 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
773 i = (i << 2) + i + perturb + 1;
774 ep = &ep0[i & mask];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400776 assert(ep->me_value == NULL);
777 if (mp->ma_values)
778 *value_addr = &mp->ma_values[i & mask];
779 else
780 *value_addr = &ep->me_value;
781 return ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000782}
783
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400784static int
785insertion_resize(PyDictObject *mp)
786{
Raymond Hettinger36f74aa2013-05-17 03:01:13 -0700787 return dictresize(mp, GROWTH_RATE(mp));
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400788}
Antoine Pitroue965d972012-02-27 00:45:12 +0100789
790/*
791Internal routine to insert a new item into the table.
792Used both by the internal resize routine and by the public insert routine.
Antoine Pitroue965d972012-02-27 00:45:12 +0100793Returns -1 if an error occurred, or 0 on success.
794*/
795static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400796insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +0100797{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400798 PyObject *old_value;
799 PyObject **value_addr;
800 PyDictKeyEntry *ep;
801 assert(key != dummy);
Antoine Pitroue965d972012-02-27 00:45:12 +0100802
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400803 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
804 if (insertion_resize(mp) < 0)
805 return -1;
806 }
807
808 ep = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr);
Antoine Pitroue965d972012-02-27 00:45:12 +0100809 if (ep == NULL) {
Antoine Pitroue965d972012-02-27 00:45:12 +0100810 return -1;
811 }
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400812 Py_INCREF(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400813 MAINTAIN_TRACKING(mp, key, value);
814 old_value = *value_addr;
815 if (old_value != NULL) {
816 assert(ep->me_key != NULL && ep->me_key != dummy);
817 *value_addr = value;
818 Py_DECREF(old_value); /* which **CAN** re-enter */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400819 }
820 else {
821 if (ep->me_key == NULL) {
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400822 Py_INCREF(key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400823 if (mp->ma_keys->dk_usable <= 0) {
824 /* Need to resize. */
825 if (insertion_resize(mp) < 0) {
826 Py_DECREF(key);
827 Py_DECREF(value);
828 return -1;
829 }
830 ep = find_empty_slot(mp, key, hash, &value_addr);
831 }
832 mp->ma_keys->dk_usable--;
833 assert(mp->ma_keys->dk_usable >= 0);
834 ep->me_key = key;
835 ep->me_hash = hash;
836 }
837 else {
838 if (ep->me_key == dummy) {
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400839 Py_INCREF(key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400840 ep->me_key = key;
841 ep->me_hash = hash;
842 Py_DECREF(dummy);
843 } else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400844 assert(_PyDict_HasSplitTable(mp));
845 }
846 }
847 mp->ma_used++;
848 *value_addr = value;
849 }
850 assert(ep->me_key != NULL && ep->me_key != dummy);
851 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
852 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +0100853}
854
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000855/*
856Internal routine used by dictresize() to insert an item which is
857known to be absent from the dict. This routine also assumes that
858the dict contains no deleted entries. Besides the performance benefit,
859using insertdict() in dictresize() is dangerous (SF bug #1456209).
860Note that no refcounts are changed by this routine; if needed, the caller
861is responsible for incref'ing `key` and `value`.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400862Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
863must set them correctly
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000864*/
865static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400866insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000868{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400869 size_t i;
870 size_t perturb;
871 PyDictKeysObject *k = mp->ma_keys;
872 size_t mask = (size_t)DK_SIZE(k)-1;
873 PyDictKeyEntry *ep0 = &k->dk_entries[0];
874 PyDictKeyEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000875
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400876 assert(k->dk_lookup != NULL);
877 assert(value != NULL);
878 assert(key != NULL);
879 assert(key != dummy);
880 assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
881 i = hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 ep = &ep0[i];
883 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
884 i = (i << 2) + i + perturb + 1;
885 ep = &ep0[i & mask];
886 }
887 assert(ep->me_value == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000889 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000891}
892
893/*
894Restructure the table by allocating a new table and reinserting all
895items again. When entries have been deleted, the new table may
896actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400897If a table is split (its keys and hashes are shared, its values are not),
898then the values are temporarily copied into the table, it is resized as
899a combined table, then the me_value slots in the old table are NULLed out.
900After resizing a table is always combined,
901but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000902*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000903static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000904dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 Py_ssize_t newsize;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400907 PyDictKeysObject *oldkeys;
908 PyObject **oldvalues;
909 Py_ssize_t i, oldsize;
Tim Peters91a364d2001-05-19 07:04:38 +0000910
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400911/* Find the smallest table size > minused. */
912 for (newsize = PyDict_MINSIZE_COMBINED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 newsize <= minused && newsize > 0;
914 newsize <<= 1)
915 ;
916 if (newsize <= 0) {
917 PyErr_NoMemory();
918 return -1;
919 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400920 oldkeys = mp->ma_keys;
921 oldvalues = mp->ma_values;
922 /* Allocate a new table. */
923 mp->ma_keys = new_keys_object(newsize);
924 if (mp->ma_keys == NULL) {
925 mp->ma_keys = oldkeys;
926 return -1;
927 }
928 if (oldkeys->dk_lookup == lookdict)
929 mp->ma_keys->dk_lookup = lookdict;
930 oldsize = DK_SIZE(oldkeys);
931 mp->ma_values = NULL;
932 /* If empty then nothing to copy so just return */
933 if (oldsize == 1) {
934 assert(oldkeys == Py_EMPTY_KEYS);
935 DK_DECREF(oldkeys);
936 return 0;
937 }
938 /* Main loop below assumes we can transfer refcount to new keys
939 * and that value is stored in me_value.
940 * Increment ref-counts and copy values here to compensate
941 * This (resizing a split table) should be relatively rare */
942 if (oldvalues != NULL) {
943 for (i = 0; i < oldsize; i++) {
944 if (oldvalues[i] != NULL) {
945 Py_INCREF(oldkeys->dk_entries[i].me_key);
946 oldkeys->dk_entries[i].me_value = oldvalues[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 }
949 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400950 /* Main loop */
951 for (i = 0; i < oldsize; i++) {
952 PyDictKeyEntry *ep = &oldkeys->dk_entries[i];
953 if (ep->me_value != NULL) {
954 assert(ep->me_key != dummy);
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000955 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400958 mp->ma_keys->dk_usable -= mp->ma_used;
959 if (oldvalues != NULL) {
960 /* NULL out me_value slot in oldkeys, in case it was shared */
961 for (i = 0; i < oldsize; i++)
962 oldkeys->dk_entries[i].me_value = NULL;
963 assert(oldvalues != empty_values);
964 free_values(oldvalues);
965 DK_DECREF(oldkeys);
966 }
967 else {
968 assert(oldkeys->dk_lookup != lookdict_split);
969 if (oldkeys->dk_lookup != lookdict_unicode_nodummy) {
970 PyDictKeyEntry *ep0 = &oldkeys->dk_entries[0];
971 for (i = 0; i < oldsize; i++) {
972 if (ep0[i].me_key == dummy)
973 Py_DECREF(dummy);
974 }
975 }
976 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200977 DK_DEBUG_DECREF PyMem_FREE(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400978 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000980}
981
Benjamin Peterson15ee8212012-04-24 14:44:18 -0400982/* Returns NULL if unable to split table.
983 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400984static PyDictKeysObject *
985make_keys_shared(PyObject *op)
986{
987 Py_ssize_t i;
988 Py_ssize_t size;
989 PyDictObject *mp = (PyDictObject *)op;
990
Benjamin Peterson15ee8212012-04-24 14:44:18 -0400991 if (!PyDict_CheckExact(op))
992 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400993 if (!_PyDict_HasSplitTable(mp)) {
994 PyDictKeyEntry *ep0;
995 PyObject **values;
996 assert(mp->ma_keys->dk_refcnt == 1);
997 if (mp->ma_keys->dk_lookup == lookdict) {
998 return NULL;
999 }
1000 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
1001 /* Remove dummy keys */
1002 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
1003 return NULL;
1004 }
1005 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
1006 /* Copy values into a new array */
1007 ep0 = &mp->ma_keys->dk_entries[0];
1008 size = DK_SIZE(mp->ma_keys);
1009 values = new_values(size);
1010 if (values == NULL) {
1011 PyErr_SetString(PyExc_MemoryError,
1012 "Not enough memory to allocate new values array");
1013 return NULL;
1014 }
1015 for (i = 0; i < size; i++) {
1016 values[i] = ep0[i].me_value;
1017 ep0[i].me_value = NULL;
1018 }
1019 mp->ma_keys->dk_lookup = lookdict_split;
1020 mp->ma_values = values;
1021 }
1022 DK_INCREF(mp->ma_keys);
1023 return mp->ma_keys;
1024}
Christian Heimes99170a52007-12-19 02:07:34 +00001025
1026PyObject *
1027_PyDict_NewPresized(Py_ssize_t minused)
1028{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001029 Py_ssize_t newsize;
1030 PyDictKeysObject *new_keys;
1031 for (newsize = PyDict_MINSIZE_COMBINED;
1032 newsize <= minused && newsize > 0;
1033 newsize <<= 1)
1034 ;
1035 new_keys = new_keys_object(newsize);
1036 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001038 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001039}
1040
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001041/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1042 * that may occur (originally dicts supported only string keys, and exceptions
1043 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001044 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001045 * (suppressed) occurred while computing the key's hash, or that some error
1046 * (suppressed) occurred when comparing keys in the dict's internal probe
1047 * sequence. A nasty example of the latter is when a Python-coded comparison
1048 * function hits a stack-depth error, which can cause this to return NULL
1049 * even if the key is present.
1050 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001051PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001052PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001053{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001054 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001056 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001058 PyObject **value_addr;
1059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 if (!PyDict_Check(op))
1061 return NULL;
1062 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001063 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 {
1065 hash = PyObject_Hash(key);
1066 if (hash == -1) {
1067 PyErr_Clear();
1068 return NULL;
1069 }
1070 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 /* We can arrive here with a NULL tstate during initialization: try
1073 running "python -Wi" for an example related to string interning.
1074 Let's just hope that no exception occurs then... This must be
1075 _PyThreadState_Current and not PyThreadState_GET() because in debug
1076 mode, the latter complains if tstate is NULL. */
1077 tstate = (PyThreadState*)_Py_atomic_load_relaxed(
1078 &_PyThreadState_Current);
1079 if (tstate != NULL && tstate->curexc_type != NULL) {
1080 /* preserve the existing exception */
1081 PyObject *err_type, *err_value, *err_tb;
1082 PyErr_Fetch(&err_type, &err_value, &err_tb);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001083 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 /* ignore errors */
1085 PyErr_Restore(err_type, err_value, err_tb);
1086 if (ep == NULL)
1087 return NULL;
1088 }
1089 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001090 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 if (ep == NULL) {
1092 PyErr_Clear();
1093 return NULL;
1094 }
1095 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001096 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001097}
1098
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001099/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1100 This returns NULL *with* an exception set if an exception occurred.
1101 It returns NULL *without* an exception set if the key wasn't present.
1102*/
1103PyObject *
1104PyDict_GetItemWithError(PyObject *op, PyObject *key)
1105{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001106 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001108 PyDictKeyEntry *ep;
1109 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 if (!PyDict_Check(op)) {
1112 PyErr_BadInternalCall();
1113 return NULL;
1114 }
1115 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001116 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 {
1118 hash = PyObject_Hash(key);
1119 if (hash == -1) {
1120 return NULL;
1121 }
1122 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001123
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001124 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 if (ep == NULL)
1126 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001127 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001128}
1129
Brett Cannonfd074152012-04-14 14:10:13 -04001130PyObject *
1131_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1132{
1133 PyObject *kv;
1134 kv = _PyUnicode_FromId(key); /* borrowed */
1135 if (kv == NULL)
1136 return NULL;
1137 return PyDict_GetItemWithError(dp, kv);
1138}
1139
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001140/* Fast version of global value lookup.
1141 * Lookup in globals, then builtins.
1142 */
1143PyObject *
1144_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001145{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001146 PyObject *x;
1147 if (PyUnicode_CheckExact(key)) {
1148 PyObject **value_addr;
1149 Py_hash_t hash = ((PyASCIIObject *)key)->hash;
1150 if (hash != -1) {
1151 PyDictKeyEntry *e;
1152 e = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr);
1153 if (e == NULL) {
1154 return NULL;
1155 }
1156 x = *value_addr;
1157 if (x != NULL)
1158 return x;
1159 e = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr);
1160 if (e == NULL) {
1161 return NULL;
1162 }
1163 x = *value_addr;
1164 return x;
1165 }
Antoine Pitroue965d972012-02-27 00:45:12 +01001166 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001167 x = PyDict_GetItemWithError((PyObject *)globals, key);
1168 if (x != NULL)
1169 return x;
1170 if (PyErr_Occurred())
1171 return NULL;
1172 return PyDict_GetItemWithError((PyObject *)builtins, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001173}
1174
Antoine Pitroue965d972012-02-27 00:45:12 +01001175/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1176 * dictionary if it's merely replacing the value for an existing key.
1177 * This means that it's safe to loop over a dictionary with PyDict_Next()
1178 * and occasionally replace a value -- but you can't insert new keys or
1179 * remove them.
1180 */
1181int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001182PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001183{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001184 PyDictObject *mp;
1185 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001186 if (!PyDict_Check(op)) {
1187 PyErr_BadInternalCall();
1188 return -1;
1189 }
1190 assert(key);
1191 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001192 mp = (PyDictObject *)op;
1193 if (!PyUnicode_CheckExact(key) ||
1194 (hash = ((PyASCIIObject *) key)->hash) == -1)
1195 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001196 hash = PyObject_Hash(key);
1197 if (hash == -1)
1198 return -1;
1199 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001200
1201 /* insertdict() handles any resizing that might be necessary */
1202 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001203}
1204
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001205int
Tim Peters1f5871e2000-07-04 17:44:48 +00001206PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001207{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001208 PyDictObject *mp;
1209 Py_hash_t hash;
1210 PyDictKeyEntry *ep;
1211 PyObject *old_key, *old_value;
1212 PyObject **value_addr;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 if (!PyDict_Check(op)) {
1215 PyErr_BadInternalCall();
1216 return -1;
1217 }
1218 assert(key);
1219 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001220 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 hash = PyObject_Hash(key);
1222 if (hash == -1)
1223 return -1;
1224 }
1225 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001226 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 if (ep == NULL)
1228 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001229 if (*value_addr == NULL) {
Raymond Hettinger69492da2013-09-02 15:59:26 -07001230 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 return -1;
1232 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001233 old_value = *value_addr;
1234 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001236 if (!_PyDict_HasSplitTable(mp)) {
1237 ENSURE_ALLOWS_DELETIONS(mp);
1238 old_key = ep->me_key;
1239 Py_INCREF(dummy);
1240 ep->me_key = dummy;
1241 Py_DECREF(old_key);
1242 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001245}
1246
Guido van Rossum25831651993-05-19 14:50:45 +00001247void
Tim Peters1f5871e2000-07-04 17:44:48 +00001248PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001251 PyDictKeysObject *oldkeys;
1252 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 if (!PyDict_Check(op))
1256 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001257 mp = ((PyDictObject *)op);
1258 oldkeys = mp->ma_keys;
1259 oldvalues = mp->ma_values;
1260 if (oldvalues == empty_values)
1261 return;
1262 /* Empty the dict... */
1263 DK_INCREF(Py_EMPTY_KEYS);
1264 mp->ma_keys = Py_EMPTY_KEYS;
1265 mp->ma_values = empty_values;
1266 mp->ma_used = 0;
1267 /* ...then clear the keys and values */
1268 if (oldvalues != NULL) {
1269 n = DK_SIZE(oldkeys);
1270 for (i = 0; i < n; i++)
1271 Py_CLEAR(oldvalues[i]);
1272 free_values(oldvalues);
1273 DK_DECREF(oldkeys);
1274 }
1275 else {
1276 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001277 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001278 }
1279}
1280
1281/* Returns -1 if no more items (or op is not a dict),
1282 * index of item otherwise. Stores value in pvalue
1283 */
1284Py_LOCAL_INLINE(Py_ssize_t)
1285dict_next(PyObject *op, Py_ssize_t i, PyObject **pvalue)
1286{
1287 Py_ssize_t mask, offset;
1288 PyDictObject *mp;
1289 PyObject **value_ptr;
1290
1291
1292 if (!PyDict_Check(op))
1293 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001295 if (i < 0)
1296 return -1;
1297 if (mp->ma_values) {
1298 value_ptr = &mp->ma_values[i];
1299 offset = sizeof(PyObject *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001301 else {
1302 value_ptr = &mp->ma_keys->dk_entries[i].me_value;
1303 offset = sizeof(PyDictKeyEntry);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001305 mask = DK_MASK(mp->ma_keys);
1306 while (i <= mask && *value_ptr == NULL) {
1307 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1308 i++;
1309 }
1310 if (i > mask)
1311 return -1;
1312 if (pvalue)
1313 *pvalue = *value_ptr;
1314 return i;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001315}
1316
Tim Peters080c88b2003-02-15 03:01:11 +00001317/*
1318 * Iterate over a dict. Use like so:
1319 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001320 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001321 * PyObject *key, *value;
1322 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001323 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +00001324 * Refer to borrowed references in key and value.
1325 * }
1326 *
1327 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001328 * mutates the dict. One exception: it is safe if the loop merely changes
1329 * the values associated with the keys (but doesn't insert new keys or
1330 * delete keys), via PyDict_SetItem().
1331 */
Guido van Rossum25831651993-05-19 14:50:45 +00001332int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001333PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001334{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001335 PyDictObject *mp;
1336 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 if (i < 0)
1338 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001339 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 *ppos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001342 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001344}
1345
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001346/* Internal version of PyDict_Next that returns a hash value in addition
1347 * to the key and value.
1348 */
Thomas Wouterscf297e42007-02-23 15:07:44 +00001349int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001350_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1351 PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001352{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001353 PyDictObject *mp;
1354 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 if (i < 0)
1356 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001357 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 *ppos = i+1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001359 *phash = mp->ma_keys->dk_entries[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001361 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001363}
1364
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001365/* Methods */
1366
1367static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001368dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001369{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001370 PyObject **values = mp->ma_values;
1371 PyDictKeysObject *keys = mp->ma_keys;
1372 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 PyObject_GC_UnTrack(mp);
1374 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001375 if (values != NULL) {
1376 if (values != empty_values) {
1377 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
1378 Py_XDECREF(values[i]);
1379 }
1380 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001382 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 }
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02001384 else if (keys != NULL) {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001385 assert(keys->dk_refcnt == 1);
1386 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001387 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1389 free_list[numfree++] = mp;
1390 else
1391 Py_TYPE(mp)->tp_free((PyObject *)mp);
1392 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001393}
1394
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001395
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001397dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 Py_ssize_t i;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001400 PyObject *key = NULL, *value = NULL;
1401 _PyUnicodeWriter writer;
1402 int first;
Guido van Rossum255443b1998-04-10 22:47:14 +00001403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 i = Py_ReprEnter((PyObject *)mp);
1405 if (i != 0) {
1406 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1407 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 if (mp->ma_used == 0) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001410 Py_ReprLeave((PyObject *)mp);
1411 return PyUnicode_FromString("{}");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 }
Tim Petersa7259592001-06-16 05:11:17 +00001413
Victor Stinnerf91929b2013-11-19 13:07:38 +01001414 _PyUnicodeWriter_Init(&writer);
1415 writer.overallocate = 1;
1416 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */
1417 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1;
Tim Petersa7259592001-06-16 05:11:17 +00001418
Victor Stinnerf91929b2013-11-19 13:07:38 +01001419 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0)
1420 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 /* Do repr() on each key+value pair, and insert ": " between them.
1423 Note that repr may mutate the dict. */
1424 i = 0;
Victor Stinnerf91929b2013-11-19 13:07:38 +01001425 first = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Victor Stinnerf91929b2013-11-19 13:07:38 +01001427 PyObject *s;
1428 int res;
1429
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001430 /* Prevent repr from deleting key or value during key format. */
1431 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 Py_INCREF(value);
Victor Stinnerf97dfd72013-07-18 01:00:45 +02001433
Victor Stinnerf91929b2013-11-19 13:07:38 +01001434 if (!first) {
1435 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
1436 goto error;
1437 }
1438 first = 0;
1439
1440 s = PyObject_Repr(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 if (s == NULL)
Victor Stinnerf91929b2013-11-19 13:07:38 +01001442 goto error;
1443 res = _PyUnicodeWriter_WriteStr(&writer, s);
1444 Py_DECREF(s);
1445 if (res < 0)
1446 goto error;
1447
1448 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0)
1449 goto error;
1450
1451 s = PyObject_Repr(value);
1452 if (s == NULL)
1453 goto error;
1454 res = _PyUnicodeWriter_WriteStr(&writer, s);
1455 Py_DECREF(s);
1456 if (res < 0)
1457 goto error;
1458
1459 Py_CLEAR(key);
1460 Py_CLEAR(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 }
Tim Petersa7259592001-06-16 05:11:17 +00001462
Victor Stinnerf91929b2013-11-19 13:07:38 +01001463 writer.overallocate = 0;
1464 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0)
1465 goto error;
Tim Petersa7259592001-06-16 05:11:17 +00001466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 Py_ReprLeave((PyObject *)mp);
Victor Stinnerf91929b2013-11-19 13:07:38 +01001468
1469 return _PyUnicodeWriter_Finish(&writer);
1470
1471error:
1472 Py_ReprLeave((PyObject *)mp);
1473 _PyUnicodeWriter_Dealloc(&writer);
1474 Py_XDECREF(key);
1475 Py_XDECREF(value);
1476 return NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001477}
1478
Martin v. Löwis18e16552006-02-15 17:27:45 +00001479static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001480dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001483}
1484
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001485static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001486dict_subscript(PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001487{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 PyObject *v;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001489 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001490 PyDictKeyEntry *ep;
1491 PyObject **value_addr;
1492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001494 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 hash = PyObject_Hash(key);
1496 if (hash == -1)
1497 return NULL;
1498 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001499 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 if (ep == NULL)
1501 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001502 v = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 if (v == NULL) {
1504 if (!PyDict_CheckExact(mp)) {
1505 /* Look up __missing__ method if we're a subclass. */
1506 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05001507 _Py_IDENTIFIER(__missing__);
1508 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 if (missing != NULL) {
1510 res = PyObject_CallFunctionObjArgs(missing,
1511 key, NULL);
1512 Py_DECREF(missing);
1513 return res;
1514 }
1515 else if (PyErr_Occurred())
1516 return NULL;
1517 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07001518 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 return NULL;
1520 }
1521 else
1522 Py_INCREF(v);
1523 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001524}
1525
1526static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001527dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 if (w == NULL)
1530 return PyDict_DelItem((PyObject *)mp, v);
1531 else
1532 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001533}
1534
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001535static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 (lenfunc)dict_length, /*mp_length*/
1537 (binaryfunc)dict_subscript, /*mp_subscript*/
1538 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001539};
1540
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001541static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001542dict_keys(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001543{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001544 PyObject *v;
1545 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001546 PyDictKeyEntry *ep;
1547 Py_ssize_t size, n, offset;
1548 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001549
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001550 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 n = mp->ma_used;
1552 v = PyList_New(n);
1553 if (v == NULL)
1554 return NULL;
1555 if (n != mp->ma_used) {
1556 /* Durnit. The allocations caused the dict to resize.
1557 * Just start over, this shouldn't normally happen.
1558 */
1559 Py_DECREF(v);
1560 goto again;
1561 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001562 ep = &mp->ma_keys->dk_entries[0];
1563 size = DK_SIZE(mp->ma_keys);
1564 if (mp->ma_values) {
1565 value_ptr = mp->ma_values;
1566 offset = sizeof(PyObject *);
1567 }
1568 else {
1569 value_ptr = &ep[0].me_value;
1570 offset = sizeof(PyDictKeyEntry);
1571 }
1572 for (i = 0, j = 0; i < size; i++) {
1573 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 PyObject *key = ep[i].me_key;
1575 Py_INCREF(key);
1576 PyList_SET_ITEM(v, j, key);
1577 j++;
1578 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001579 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 }
1581 assert(j == n);
1582 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001583}
1584
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001585static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001586dict_values(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001587{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001588 PyObject *v;
1589 Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001590 Py_ssize_t size, n, offset;
1591 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001592
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001593 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 n = mp->ma_used;
1595 v = PyList_New(n);
1596 if (v == NULL)
1597 return NULL;
1598 if (n != mp->ma_used) {
1599 /* Durnit. The allocations caused the dict to resize.
1600 * Just start over, this shouldn't normally happen.
1601 */
1602 Py_DECREF(v);
1603 goto again;
1604 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001605 size = DK_SIZE(mp->ma_keys);
1606 if (mp->ma_values) {
1607 value_ptr = mp->ma_values;
1608 offset = sizeof(PyObject *);
1609 }
1610 else {
1611 value_ptr = &mp->ma_keys->dk_entries[0].me_value;
1612 offset = sizeof(PyDictKeyEntry);
1613 }
1614 for (i = 0, j = 0; i < size; i++) {
1615 PyObject *value = *value_ptr;
1616 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1617 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 Py_INCREF(value);
1619 PyList_SET_ITEM(v, j, value);
1620 j++;
1621 }
1622 }
1623 assert(j == n);
1624 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001625}
1626
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001627static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001628dict_items(PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001629{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001630 PyObject *v;
1631 Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001632 Py_ssize_t size, offset;
1633 PyObject *item, *key;
1634 PyDictKeyEntry *ep;
1635 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 /* Preallocate the list of tuples, to avoid allocations during
1638 * the loop over the items, which could trigger GC, which
1639 * could resize the dict. :-(
1640 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001641 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 n = mp->ma_used;
1643 v = PyList_New(n);
1644 if (v == NULL)
1645 return NULL;
1646 for (i = 0; i < n; i++) {
1647 item = PyTuple_New(2);
1648 if (item == NULL) {
1649 Py_DECREF(v);
1650 return NULL;
1651 }
1652 PyList_SET_ITEM(v, i, item);
1653 }
1654 if (n != mp->ma_used) {
1655 /* Durnit. The allocations caused the dict to resize.
1656 * Just start over, this shouldn't normally happen.
1657 */
1658 Py_DECREF(v);
1659 goto again;
1660 }
1661 /* Nothing we do below makes any function calls. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001662 ep = mp->ma_keys->dk_entries;
1663 size = DK_SIZE(mp->ma_keys);
1664 if (mp->ma_values) {
1665 value_ptr = mp->ma_values;
1666 offset = sizeof(PyObject *);
1667 }
1668 else {
1669 value_ptr = &ep[0].me_value;
1670 offset = sizeof(PyDictKeyEntry);
1671 }
1672 for (i = 0, j = 0; i < size; i++) {
1673 PyObject *value = *value_ptr;
1674 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1675 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 key = ep[i].me_key;
1677 item = PyList_GET_ITEM(v, j);
1678 Py_INCREF(key);
1679 PyTuple_SET_ITEM(item, 0, key);
1680 Py_INCREF(value);
1681 PyTuple_SET_ITEM(item, 1, value);
1682 j++;
1683 }
1684 }
1685 assert(j == n);
1686 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001687}
1688
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001689static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001690dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 PyObject *seq;
1693 PyObject *value = Py_None;
1694 PyObject *it; /* iter(seq) */
1695 PyObject *key;
1696 PyObject *d;
1697 int status;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
1700 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 d = PyObject_CallObject(cls, NULL);
1703 if (d == NULL)
1704 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001705
Benjamin Peterson9892f522012-10-31 14:22:12 -04001706 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001707 if (PyDict_CheckExact(seq)) {
1708 PyDictObject *mp = (PyDictObject *)d;
1709 PyObject *oldvalue;
1710 Py_ssize_t pos = 0;
1711 PyObject *key;
1712 Py_hash_t hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001713
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001714 if (dictresize(mp, Py_SIZE(seq))) {
Petri Lehtinena94200e2011-10-24 21:12:58 +03001715 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001717 }
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001718
1719 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001720 if (insertdict(mp, key, hash, value)) {
1721 Py_DECREF(d);
1722 return NULL;
1723 }
1724 }
1725 return d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 }
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001727 if (PyAnySet_CheckExact(seq)) {
1728 PyDictObject *mp = (PyDictObject *)d;
1729 Py_ssize_t pos = 0;
1730 PyObject *key;
1731 Py_hash_t hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001732
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001733 if (dictresize(mp, PySet_GET_SIZE(seq))) {
Petri Lehtinena94200e2011-10-24 21:12:58 +03001734 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001736 }
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001737
1738 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
Benjamin Petersond1f2cb32012-10-31 14:05:55 -04001739 if (insertdict(mp, key, hash, value)) {
1740 Py_DECREF(d);
1741 return NULL;
1742 }
1743 }
1744 return d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 it = PyObject_GetIter(seq);
1749 if (it == NULL){
1750 Py_DECREF(d);
1751 return NULL;
1752 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 if (PyDict_CheckExact(d)) {
1755 while ((key = PyIter_Next(it)) != NULL) {
1756 status = PyDict_SetItem(d, key, value);
1757 Py_DECREF(key);
1758 if (status < 0)
1759 goto Fail;
1760 }
1761 } else {
1762 while ((key = PyIter_Next(it)) != NULL) {
1763 status = PyObject_SetItem(d, key, value);
1764 Py_DECREF(key);
1765 if (status < 0)
1766 goto Fail;
1767 }
1768 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 if (PyErr_Occurred())
1771 goto Fail;
1772 Py_DECREF(it);
1773 return d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001774
1775Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 Py_DECREF(it);
1777 Py_DECREF(d);
1778 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001779}
1780
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001781static int
1782dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 PyObject *arg = NULL;
1785 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1788 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001791 _Py_IDENTIFIER(keys);
1792 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 result = PyDict_Merge(self, arg, 1);
1794 else
1795 result = PyDict_MergeFromSeq2(self, arg, 1);
1796 }
1797 if (result == 0 && kwds != NULL) {
1798 if (PyArg_ValidateKeywordArguments(kwds))
1799 result = PyDict_Merge(self, kwds, 1);
1800 else
1801 result = -1;
1802 }
1803 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001804}
1805
1806static PyObject *
1807dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1808{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 if (dict_update_common(self, args, kwds, "update") != -1)
1810 Py_RETURN_NONE;
1811 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001812}
1813
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001814/* Update unconditionally replaces existing items.
1815 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001816 otherwise it leaves existing items unchanged.
1817
1818 PyDict_{Update,Merge} update/merge from a mapping object.
1819
Tim Petersf582b822001-12-11 18:51:08 +00001820 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001821 producing iterable objects of length 2.
1822*/
1823
Tim Petersf582b822001-12-11 18:51:08 +00001824int
Tim Peters1fc240e2001-10-26 05:06:50 +00001825PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1826{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 PyObject *it; /* iter(seq2) */
1828 Py_ssize_t i; /* index into seq2 of current element */
1829 PyObject *item; /* seq2[i] */
1830 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 assert(d != NULL);
1833 assert(PyDict_Check(d));
1834 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 it = PyObject_GetIter(seq2);
1837 if (it == NULL)
1838 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 for (i = 0; ; ++i) {
1841 PyObject *key, *value;
1842 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 fast = NULL;
1845 item = PyIter_Next(it);
1846 if (item == NULL) {
1847 if (PyErr_Occurred())
1848 goto Fail;
1849 break;
1850 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 /* Convert item to sequence, and verify length 2. */
1853 fast = PySequence_Fast(item, "");
1854 if (fast == NULL) {
1855 if (PyErr_ExceptionMatches(PyExc_TypeError))
1856 PyErr_Format(PyExc_TypeError,
1857 "cannot convert dictionary update "
1858 "sequence element #%zd to a sequence",
1859 i);
1860 goto Fail;
1861 }
1862 n = PySequence_Fast_GET_SIZE(fast);
1863 if (n != 2) {
1864 PyErr_Format(PyExc_ValueError,
1865 "dictionary update sequence element #%zd "
1866 "has length %zd; 2 is required",
1867 i, n);
1868 goto Fail;
1869 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 /* Update/merge with this (key, value) pair. */
1872 key = PySequence_Fast_GET_ITEM(fast, 0);
1873 value = PySequence_Fast_GET_ITEM(fast, 1);
1874 if (override || PyDict_GetItem(d, key) == NULL) {
1875 int status = PyDict_SetItem(d, key, value);
1876 if (status < 0)
1877 goto Fail;
1878 }
1879 Py_DECREF(fast);
1880 Py_DECREF(item);
1881 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 i = 0;
1884 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00001885Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 Py_XDECREF(item);
1887 Py_XDECREF(fast);
1888 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001889Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 Py_DECREF(it);
1891 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001892}
1893
Tim Peters6d6c1a32001-08-02 04:15:00 +00001894int
1895PyDict_Update(PyObject *a, PyObject *b)
1896{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001898}
1899
1900int
1901PyDict_Merge(PyObject *a, PyObject *b, int override)
1902{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001903 PyDictObject *mp, *other;
1904 Py_ssize_t i, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001905 PyDictKeyEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 /* We accept for the argument either a concrete dictionary object,
1908 * or an abstract "mapping" object. For the former, we can do
1909 * things quite efficiently. For the latter, we only require that
1910 * PyMapping_Keys() and PyObject_GetItem() be supported.
1911 */
1912 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1913 PyErr_BadInternalCall();
1914 return -1;
1915 }
1916 mp = (PyDictObject*)a;
1917 if (PyDict_Check(b)) {
1918 other = (PyDictObject*)b;
1919 if (other == mp || other->ma_used == 0)
1920 /* a.update(a) or a.update({}); nothing to do */
1921 return 0;
1922 if (mp->ma_used == 0)
1923 /* Since the target dict is empty, PyDict_GetItem()
1924 * always returns NULL. Setting override to 1
1925 * skips the unnecessary test.
1926 */
1927 override = 1;
1928 /* Do one big resize at the start, rather than
1929 * incrementally resizing as we insert new items. Expect
1930 * that there will be no (or few) overlapping keys.
1931 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001932 if (mp->ma_keys->dk_usable * 3 < other->ma_used * 2)
1933 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001935 for (i = 0, n = DK_SIZE(other->ma_keys); i < n; i++) {
1936 PyObject *value;
1937 entry = &other->ma_keys->dk_entries[i];
1938 if (other->ma_values)
1939 value = other->ma_values[i];
1940 else
1941 value = entry->me_value;
1942
1943 if (value != NULL &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 (override ||
1945 PyDict_GetItem(a, entry->me_key) == NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 if (insertdict(mp, entry->me_key,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001947 entry->me_hash,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001948 value) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 return -1;
1950 }
1951 }
1952 }
1953 else {
1954 /* Do it the generic, slower way */
1955 PyObject *keys = PyMapping_Keys(b);
1956 PyObject *iter;
1957 PyObject *key, *value;
1958 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 if (keys == NULL)
1961 /* Docstring says this is equivalent to E.keys() so
1962 * if E doesn't have a .keys() method we want
1963 * AttributeError to percolate up. Might as well
1964 * do the same for any other error.
1965 */
1966 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 iter = PyObject_GetIter(keys);
1969 Py_DECREF(keys);
1970 if (iter == NULL)
1971 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
1974 if (!override && PyDict_GetItem(a, key) != NULL) {
1975 Py_DECREF(key);
1976 continue;
1977 }
1978 value = PyObject_GetItem(b, key);
1979 if (value == NULL) {
1980 Py_DECREF(iter);
1981 Py_DECREF(key);
1982 return -1;
1983 }
1984 status = PyDict_SetItem(a, key, value);
1985 Py_DECREF(key);
1986 Py_DECREF(value);
1987 if (status < 0) {
1988 Py_DECREF(iter);
1989 return -1;
1990 }
1991 }
1992 Py_DECREF(iter);
1993 if (PyErr_Occurred())
1994 /* Iterator completed, via error */
1995 return -1;
1996 }
1997 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001998}
1999
2000static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002001dict_copy(PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002004}
2005
2006PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002007PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002010 PyDictObject *mp;
2011 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 if (o == NULL || !PyDict_Check(o)) {
2014 PyErr_BadInternalCall();
2015 return NULL;
2016 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002017 mp = (PyDictObject *)o;
2018 if (_PyDict_HasSplitTable(mp)) {
2019 PyDictObject *split_copy;
2020 PyObject **newvalues = new_values(DK_SIZE(mp->ma_keys));
2021 if (newvalues == NULL)
2022 return PyErr_NoMemory();
2023 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2024 if (split_copy == NULL) {
2025 free_values(newvalues);
2026 return NULL;
2027 }
2028 split_copy->ma_values = newvalues;
2029 split_copy->ma_keys = mp->ma_keys;
2030 split_copy->ma_used = mp->ma_used;
2031 DK_INCREF(mp->ma_keys);
2032 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2033 PyObject *value = mp->ma_values[i];
2034 Py_XINCREF(value);
2035 split_copy->ma_values[i] = value;
2036 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002037 if (_PyObject_GC_IS_TRACKED(mp))
2038 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002039 return (PyObject *)split_copy;
2040 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 copy = PyDict_New();
2042 if (copy == NULL)
2043 return NULL;
2044 if (PyDict_Merge(copy, o, 1) == 0)
2045 return copy;
2046 Py_DECREF(copy);
2047 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002048}
2049
Martin v. Löwis18e16552006-02-15 17:27:45 +00002050Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002051PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 if (mp == NULL || !PyDict_Check(mp)) {
2054 PyErr_BadInternalCall();
2055 return -1;
2056 }
2057 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002058}
2059
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002060PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002061PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 if (mp == NULL || !PyDict_Check(mp)) {
2064 PyErr_BadInternalCall();
2065 return NULL;
2066 }
2067 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002068}
2069
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002070PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002071PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 if (mp == NULL || !PyDict_Check(mp)) {
2074 PyErr_BadInternalCall();
2075 return NULL;
2076 }
2077 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002078}
2079
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002080PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002081PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002082{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 if (mp == NULL || !PyDict_Check(mp)) {
2084 PyErr_BadInternalCall();
2085 return NULL;
2086 }
2087 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002088}
2089
Tim Peterse63415e2001-05-08 04:38:29 +00002090/* Return 1 if dicts equal, 0 if not, -1 if error.
2091 * Gets out as soon as any difference is detected.
2092 * Uses only Py_EQ comparison.
2093 */
2094static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002095dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 if (a->ma_used != b->ma_used)
2100 /* can't be equal if # of entries differ */
2101 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002103 for (i = 0; i < DK_SIZE(a->ma_keys); i++) {
2104 PyDictKeyEntry *ep = &a->ma_keys->dk_entries[i];
2105 PyObject *aval;
2106 if (a->ma_values)
2107 aval = a->ma_values[i];
2108 else
2109 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 if (aval != NULL) {
2111 int cmp;
2112 PyObject *bval;
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002113 PyObject **vaddr;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002114 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 /* temporarily bump aval's refcount to ensure it stays
2116 alive until we're done with it */
2117 Py_INCREF(aval);
2118 /* ditto for key */
2119 Py_INCREF(key);
Antoine Pitrou0e9958b2012-12-02 19:10:07 +01002120 /* reuse the known hash value */
2121 if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr) == NULL)
2122 bval = NULL;
2123 else
2124 bval = *vaddr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 Py_DECREF(key);
2126 if (bval == NULL) {
2127 Py_DECREF(aval);
2128 if (PyErr_Occurred())
2129 return -1;
2130 return 0;
2131 }
2132 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2133 Py_DECREF(aval);
2134 if (cmp <= 0) /* error or not equal */
2135 return cmp;
2136 }
2137 }
2138 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002139}
Tim Peterse63415e2001-05-08 04:38:29 +00002140
2141static PyObject *
2142dict_richcompare(PyObject *v, PyObject *w, int op)
2143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 int cmp;
2145 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2148 res = Py_NotImplemented;
2149 }
2150 else if (op == Py_EQ || op == Py_NE) {
2151 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2152 if (cmp < 0)
2153 return NULL;
2154 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2155 }
2156 else
2157 res = Py_NotImplemented;
2158 Py_INCREF(res);
2159 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002160}
Tim Peterse63415e2001-05-08 04:38:29 +00002161
Larry Hastings31826802013-10-19 00:09:25 -07002162/*[clinic]
Larry Hastingsed4a1c52013-11-18 09:32:13 -08002163class dict
Larry Hastings31826802013-10-19 00:09:25 -07002164
2165@coexist
2166dict.__contains__
2167
2168 key: object
2169 /
2170
2171True if D has a key k, else False"
2172[clinic]*/
2173
2174PyDoc_STRVAR(dict___contains____doc__,
2175"True if D has a key k, else False\"\n"
2176"\n"
2177"dict.__contains__(key)");
2178
2179#define DICT___CONTAINS___METHODDEF \
2180 {"__contains__", (PyCFunction)dict___contains__, METH_O|METH_COEXIST, dict___contains____doc__},
2181
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002182static PyObject *
Larry Hastings31826802013-10-19 00:09:25 -07002183dict___contains__(PyObject *self, PyObject *key)
2184/*[clinic checksum: 61c5c802ea1d35699a1a754f1f3538ea9b259cf4]*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002185{
Larry Hastings31826802013-10-19 00:09:25 -07002186 register PyDictObject *mp = (PyDictObject *)self;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002187 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002188 PyDictKeyEntry *ep;
2189 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002192 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 hash = PyObject_Hash(key);
2194 if (hash == -1)
2195 return NULL;
2196 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002197 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 if (ep == NULL)
2199 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002200 return PyBool_FromLong(*value_addr != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002201}
2202
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002203static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002204dict_get(PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 PyObject *key;
2207 PyObject *failobj = Py_None;
2208 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002209 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002210 PyDictKeyEntry *ep;
2211 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2214 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002217 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 hash = PyObject_Hash(key);
2219 if (hash == -1)
2220 return NULL;
2221 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002222 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 if (ep == NULL)
2224 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002225 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002226 if (val == NULL)
2227 val = failobj;
2228 Py_INCREF(val);
2229 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002230}
2231
Benjamin Peterson00e98862013-03-07 22:16:29 -05002232PyObject *
2233PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
Guido van Rossum164452c2000-08-08 16:12:54 +00002234{
Benjamin Peterson00e98862013-03-07 22:16:29 -05002235 PyDictObject *mp = (PyDictObject *)d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002237 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002238 PyDictKeyEntry *ep;
2239 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002240
Benjamin Peterson00e98862013-03-07 22:16:29 -05002241 if (!PyDict_Check(d)) {
2242 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 return NULL;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002244 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002246 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 hash = PyObject_Hash(key);
2248 if (hash == -1)
2249 return NULL;
2250 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002251 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 if (ep == NULL)
2253 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002254 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 if (val == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002256 if (mp->ma_keys->dk_usable <= 0) {
2257 /* Need to resize. */
2258 if (insertion_resize(mp) < 0)
2259 return NULL;
2260 ep = find_empty_slot(mp, key, hash, &value_addr);
2261 }
Benjamin Peterson00e98862013-03-07 22:16:29 -05002262 Py_INCREF(defaultobj);
Benjamin Petersonb1efa532013-03-04 09:47:50 -05002263 Py_INCREF(key);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002264 MAINTAIN_TRACKING(mp, key, defaultobj);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002265 ep->me_key = key;
2266 ep->me_hash = hash;
Benjamin Peterson00e98862013-03-07 22:16:29 -05002267 *value_addr = defaultobj;
2268 val = defaultobj;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002269 mp->ma_keys->dk_usable--;
2270 mp->ma_used++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00002273}
2274
Benjamin Peterson00e98862013-03-07 22:16:29 -05002275static PyObject *
2276dict_setdefault(PyDictObject *mp, PyObject *args)
2277{
2278 PyObject *key, *val;
2279 PyObject *defaultobj = Py_None;
2280
2281 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
2282 return NULL;
2283
Benjamin Peterson55898502013-03-08 08:36:49 -05002284 val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
Benjamin Peterson00e98862013-03-07 22:16:29 -05002285 Py_XINCREF(val);
2286 return val;
2287}
Guido van Rossum164452c2000-08-08 16:12:54 +00002288
2289static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002290dict_clear(PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 PyDict_Clear((PyObject *)mp);
2293 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002294}
2295
Guido van Rossumba6ab842000-12-12 22:02:18 +00002296static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002297dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002298{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002299 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 PyObject *old_value, *old_key;
2301 PyObject *key, *deflt = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002302 PyDictKeyEntry *ep;
2303 PyObject **value_addr;
Guido van Rossume027d982002-04-12 15:11:59 +00002304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2306 return NULL;
2307 if (mp->ma_used == 0) {
2308 if (deflt) {
2309 Py_INCREF(deflt);
2310 return deflt;
2311 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07002312 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002313 return NULL;
2314 }
2315 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002316 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 hash = PyObject_Hash(key);
2318 if (hash == -1)
2319 return NULL;
2320 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002321 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 if (ep == NULL)
2323 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002324 old_value = *value_addr;
2325 if (old_value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 if (deflt) {
2327 Py_INCREF(deflt);
2328 return deflt;
2329 }
Raymond Hettinger69492da2013-09-02 15:59:26 -07002330 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 return NULL;
2332 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002333 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002335 if (!_PyDict_HasSplitTable(mp)) {
2336 ENSURE_ALLOWS_DELETIONS(mp);
2337 old_key = ep->me_key;
2338 Py_INCREF(dummy);
2339 ep->me_key = dummy;
2340 Py_DECREF(old_key);
2341 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 return old_value;
Guido van Rossume027d982002-04-12 15:11:59 +00002343}
2344
2345static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002346dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002347{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002348 Py_hash_t i = 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002349 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002351
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 /* Allocate the result tuple before checking the size. Believe it
2354 * or not, this allocation could trigger a garbage collection which
2355 * could empty the dict, so if we checked the size first and that
2356 * happened, the result would be an infinite loop (searching for an
2357 * entry that no longer exists). Note that the usual popitem()
2358 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2359 * tuple away if the dict *is* empty isn't a significant
2360 * inefficiency -- possible, but unlikely in practice.
2361 */
2362 res = PyTuple_New(2);
2363 if (res == NULL)
2364 return NULL;
2365 if (mp->ma_used == 0) {
2366 Py_DECREF(res);
2367 PyErr_SetString(PyExc_KeyError,
2368 "popitem(): dictionary is empty");
2369 return NULL;
2370 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002371 /* Convert split table to combined table */
2372 if (mp->ma_keys->dk_lookup == lookdict_split) {
2373 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2374 Py_DECREF(res);
2375 return NULL;
2376 }
2377 }
2378 ENSURE_ALLOWS_DELETIONS(mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 /* Set ep to "the first" dict entry with a value. We abuse the hash
2380 * field of slot 0 to hold a search finger:
2381 * If slot 0 has a value, use slot 0.
2382 * Else slot 0 is being used to hold a search finger,
2383 * and we use its hash value as the first index to look.
2384 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002385 ep = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 if (ep->me_value == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002387 Py_ssize_t mask = DK_MASK(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 i = ep->me_hash;
2389 /* The hash field may be a real hash value, or it may be a
2390 * legit search finger, or it may be a once-legit search
2391 * finger that's out of bounds now because it wrapped around
2392 * or the table shrunk -- simply make sure it's in bounds now.
2393 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002394 if (i > mask || i < 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 i = 1; /* skip slot 0 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002396 while ((ep = &mp->ma_keys->dk_entries[i])->me_value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002398 if (i > mask)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 i = 1;
2400 }
2401 }
2402 PyTuple_SET_ITEM(res, 0, ep->me_key);
2403 PyTuple_SET_ITEM(res, 1, ep->me_value);
2404 Py_INCREF(dummy);
2405 ep->me_key = dummy;
2406 ep->me_value = NULL;
2407 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002408 assert(mp->ma_keys->dk_entries[0].me_value == NULL);
2409 mp->ma_keys->dk_entries[0].me_hash = i + 1; /* next place to start */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002411}
2412
Jeremy Hylton8caad492000-06-23 14:18:11 +00002413static int
2414dict_traverse(PyObject *op, visitproc visit, void *arg)
2415{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002416 Py_ssize_t i, n;
2417 PyDictObject *mp = (PyDictObject *)op;
2418 if (mp->ma_keys->dk_lookup == lookdict) {
2419 for (i = 0; i < DK_SIZE(mp->ma_keys); i++) {
2420 if (mp->ma_keys->dk_entries[i].me_value != NULL) {
2421 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2422 Py_VISIT(mp->ma_keys->dk_entries[i].me_key);
2423 }
2424 }
2425 } else {
2426 if (mp->ma_values != NULL) {
2427 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2428 Py_VISIT(mp->ma_values[i]);
2429 }
2430 }
2431 else {
2432 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2433 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2434 }
2435 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 }
2437 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002438}
2439
2440static int
2441dict_tp_clear(PyObject *op)
2442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 PyDict_Clear(op);
2444 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002445}
2446
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002447static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002448
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002449static PyObject *
2450dict_sizeof(PyDictObject *mp)
2451{
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002452 Py_ssize_t size, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002453
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002454 size = DK_SIZE(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 res = sizeof(PyDictObject);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002456 if (mp->ma_values)
2457 res += size * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002458 /* If the dictionary is split, the keys portion is accounted-for
2459 in the type object. */
2460 if (mp->ma_keys->dk_refcnt == 1)
2461 res += sizeof(PyDictKeysObject) + (size-1) * sizeof(PyDictKeyEntry);
2462 return PyLong_FromSsize_t(res);
2463}
2464
2465Py_ssize_t
2466_PyDict_KeysSize(PyDictKeysObject *keys)
2467{
2468 return sizeof(PyDictKeysObject) + (DK_SIZE(keys)-1) * sizeof(PyDictKeyEntry);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002469}
2470
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002471PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2472
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002473PyDoc_STRVAR(sizeof__doc__,
2474"D.__sizeof__() -> size of D in memory, in bytes");
2475
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002476PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002477"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002478
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002479PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002480"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 +00002481
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002482PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002483"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002484If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002485
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002486PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002487"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000024882-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002489
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002490PyDoc_STRVAR(update__doc__,
Brett Cannonf2754162013-05-11 14:46:48 -04002491"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
2492If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
2493If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
2494In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002495
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002496PyDoc_STRVAR(fromkeys__doc__,
2497"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
2498v defaults to None.");
2499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002500PyDoc_STRVAR(clear__doc__,
2501"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002502
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002503PyDoc_STRVAR(copy__doc__,
2504"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002505
Guido van Rossumb90c8482007-02-10 01:11:45 +00002506/* Forward */
2507static PyObject *dictkeys_new(PyObject *);
2508static PyObject *dictitems_new(PyObject *);
2509static PyObject *dictvalues_new(PyObject *);
2510
Guido van Rossum45c85d12007-07-27 16:31:40 +00002511PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002513PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002515PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002517
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002518static PyMethodDef mapp_methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002519 DICT___CONTAINS___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2521 getitem__doc__},
2522 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2523 sizeof__doc__},
2524 {"get", (PyCFunction)dict_get, METH_VARARGS,
2525 get__doc__},
2526 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2527 setdefault_doc__},
2528 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2529 pop__doc__},
2530 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2531 popitem__doc__},
2532 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2533 keys__doc__},
2534 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2535 items__doc__},
2536 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2537 values__doc__},
2538 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2539 update__doc__},
2540 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2541 fromkeys__doc__},
2542 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2543 clear__doc__},
2544 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2545 copy__doc__},
2546 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002547};
2548
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002549/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002550int
2551PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002552{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002553 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002555 PyDictKeyEntry *ep;
2556 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002559 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 hash = PyObject_Hash(key);
2561 if (hash == -1)
2562 return -1;
2563 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002564 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2565 return (ep == NULL) ? -1 : (*value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002566}
2567
Thomas Wouterscf297e42007-02-23 15:07:44 +00002568/* Internal version of PyDict_Contains used when the hash value is already known */
2569int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002570_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002573 PyDictKeyEntry *ep;
2574 PyObject **value_addr;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002575
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002576 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2577 return (ep == NULL) ? -1 : (*value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002578}
2579
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002580/* Hack to implement "key in dict" */
2581static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 0, /* sq_length */
2583 0, /* sq_concat */
2584 0, /* sq_repeat */
2585 0, /* sq_item */
2586 0, /* sq_slice */
2587 0, /* sq_ass_item */
2588 0, /* sq_ass_slice */
2589 PyDict_Contains, /* sq_contains */
2590 0, /* sq_inplace_concat */
2591 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002592};
2593
Guido van Rossum09e563a2001-05-01 12:10:21 +00002594static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002595dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597 PyObject *self;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002598 PyDictObject *d;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 assert(type != NULL && type->tp_alloc != NULL);
2601 self = type->tp_alloc(type, 0);
Victor Stinnera9f61a52013-07-16 22:17:26 +02002602 if (self == NULL)
2603 return NULL;
Victor Stinnera9f61a52013-07-16 22:17:26 +02002604 d = (PyDictObject *)self;
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002605
Victor Stinnera9f61a52013-07-16 22:17:26 +02002606 /* The object has been implicitly tracked by tp_alloc */
2607 if (type == &PyDict_Type)
2608 _PyObject_GC_UNTRACK(d);
Victor Stinnerac2a4fe2013-07-16 22:19:00 +02002609
2610 d->ma_used = 0;
2611 d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
2612 if (d->ma_keys == NULL) {
2613 Py_DECREF(self);
2614 return NULL;
2615 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002617}
2618
Tim Peters25786c02001-09-02 08:22:48 +00002619static int
2620dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002623}
2624
Tim Peters6d6c1a32001-08-02 04:15:00 +00002625static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002626dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002629}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002630
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002631PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002632"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002633"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002634" (key, value) pairs\n"
2635"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002636" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002637" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002638" d[k] = v\n"
2639"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2640" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002641
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002642PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2644 "dict",
2645 sizeof(PyDictObject),
2646 0,
2647 (destructor)dict_dealloc, /* tp_dealloc */
2648 0, /* tp_print */
2649 0, /* tp_getattr */
2650 0, /* tp_setattr */
2651 0, /* tp_reserved */
2652 (reprfunc)dict_repr, /* tp_repr */
2653 0, /* tp_as_number */
2654 &dict_as_sequence, /* tp_as_sequence */
2655 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002656 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 0, /* tp_call */
2658 0, /* tp_str */
2659 PyObject_GenericGetAttr, /* tp_getattro */
2660 0, /* tp_setattro */
2661 0, /* tp_as_buffer */
2662 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2663 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2664 dictionary_doc, /* tp_doc */
2665 dict_traverse, /* tp_traverse */
2666 dict_tp_clear, /* tp_clear */
2667 dict_richcompare, /* tp_richcompare */
2668 0, /* tp_weaklistoffset */
2669 (getiterfunc)dict_iter, /* tp_iter */
2670 0, /* tp_iternext */
2671 mapp_methods, /* tp_methods */
2672 0, /* tp_members */
2673 0, /* tp_getset */
2674 0, /* tp_base */
2675 0, /* tp_dict */
2676 0, /* tp_descr_get */
2677 0, /* tp_descr_set */
2678 0, /* tp_dictoffset */
2679 dict_init, /* tp_init */
2680 PyType_GenericAlloc, /* tp_alloc */
2681 dict_new, /* tp_new */
2682 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002683};
2684
Victor Stinner3c1e4812012-03-26 22:10:51 +02002685PyObject *
2686_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
2687{
2688 PyObject *kv;
2689 kv = _PyUnicode_FromId(key); /* borrowed */
Victor Stinner5b3b1002013-07-22 23:50:57 +02002690 if (kv == NULL) {
2691 PyErr_Clear();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002692 return NULL;
Victor Stinner5b3b1002013-07-22 23:50:57 +02002693 }
Victor Stinner3c1e4812012-03-26 22:10:51 +02002694 return PyDict_GetItem(dp, kv);
2695}
2696
Guido van Rossum3cca2451997-05-16 14:23:33 +00002697/* For backward compatibility with old dictionary interface */
2698
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002699PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002700PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 PyObject *kv, *rv;
2703 kv = PyUnicode_FromString(key);
Victor Stinnerfdcbab92013-07-16 22:16:05 +02002704 if (kv == NULL) {
2705 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 return NULL;
Victor Stinnerfdcbab92013-07-16 22:16:05 +02002707 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 rv = PyDict_GetItem(v, kv);
2709 Py_DECREF(kv);
2710 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002711}
2712
2713int
Victor Stinner3c1e4812012-03-26 22:10:51 +02002714_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
2715{
2716 PyObject *kv;
2717 kv = _PyUnicode_FromId(key); /* borrowed */
2718 if (kv == NULL)
2719 return -1;
2720 return PyDict_SetItem(v, kv, item);
2721}
2722
2723int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002724PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 PyObject *kv;
2727 int err;
2728 kv = PyUnicode_FromString(key);
2729 if (kv == NULL)
2730 return -1;
2731 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2732 err = PyDict_SetItem(v, kv, item);
2733 Py_DECREF(kv);
2734 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002735}
2736
2737int
Victor Stinner5fd2e5a2013-11-06 18:58:22 +01002738_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
2739{
2740 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */
2741 if (kv == NULL)
2742 return -1;
2743 return PyDict_DelItem(v, kv);
2744}
2745
2746int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002747PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 PyObject *kv;
2750 int err;
2751 kv = PyUnicode_FromString(key);
2752 if (kv == NULL)
2753 return -1;
2754 err = PyDict_DelItem(v, kv);
2755 Py_DECREF(kv);
2756 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002757}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002758
Raymond Hettinger019a1482004-03-18 02:41:19 +00002759/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002760
2761typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 PyObject_HEAD
2763 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2764 Py_ssize_t di_used;
2765 Py_ssize_t di_pos;
2766 PyObject* di_result; /* reusable result tuple for iteritems */
2767 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002768} dictiterobject;
2769
2770static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002771dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002772{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 dictiterobject *di;
2774 di = PyObject_GC_New(dictiterobject, itertype);
2775 if (di == NULL)
2776 return NULL;
2777 Py_INCREF(dict);
2778 di->di_dict = dict;
2779 di->di_used = dict->ma_used;
2780 di->di_pos = 0;
2781 di->len = dict->ma_used;
2782 if (itertype == &PyDictIterItem_Type) {
2783 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2784 if (di->di_result == NULL) {
2785 Py_DECREF(di);
2786 return NULL;
2787 }
2788 }
2789 else
2790 di->di_result = NULL;
2791 _PyObject_GC_TRACK(di);
2792 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002793}
2794
2795static void
2796dictiter_dealloc(dictiterobject *di)
2797{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 Py_XDECREF(di->di_dict);
2799 Py_XDECREF(di->di_result);
2800 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002801}
2802
2803static int
2804dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2805{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 Py_VISIT(di->di_dict);
2807 Py_VISIT(di->di_result);
2808 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002809}
2810
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002811static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002812dictiter_len(dictiterobject *di)
2813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 Py_ssize_t len = 0;
2815 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2816 len = di->len;
2817 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002818}
2819
Guido van Rossumb90c8482007-02-10 01:11:45 +00002820PyDoc_STRVAR(length_hint_doc,
2821 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002822
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002823static PyObject *
2824dictiter_reduce(dictiterobject *di);
2825
2826PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2827
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002828static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2830 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002831 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
2832 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002834};
2835
Raymond Hettinger019a1482004-03-18 02:41:19 +00002836static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002837{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002838 PyObject *key;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002839 Py_ssize_t i, mask, offset;
2840 PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002842 PyObject **value_ptr;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 if (d == NULL)
2845 return NULL;
2846 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 if (di->di_used != d->ma_used) {
2849 PyErr_SetString(PyExc_RuntimeError,
2850 "dictionary changed size during iteration");
2851 di->di_used = -1; /* Make this state sticky */
2852 return NULL;
2853 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 i = di->di_pos;
2856 if (i < 0)
2857 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002858 k = d->ma_keys;
2859 if (d->ma_values) {
2860 value_ptr = &d->ma_values[i];
2861 offset = sizeof(PyObject *);
2862 }
2863 else {
2864 value_ptr = &k->dk_entries[i].me_value;
2865 offset = sizeof(PyDictKeyEntry);
2866 }
2867 mask = DK_SIZE(k)-1;
2868 while (i <= mask && *value_ptr == NULL) {
2869 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002871 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 di->di_pos = i+1;
2873 if (i > mask)
2874 goto fail;
2875 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002876 key = k->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 Py_INCREF(key);
2878 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002879
2880fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 Py_DECREF(d);
2882 di->di_dict = NULL;
2883 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002884}
2885
Raymond Hettinger019a1482004-03-18 02:41:19 +00002886PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2888 "dict_keyiterator", /* tp_name */
2889 sizeof(dictiterobject), /* tp_basicsize */
2890 0, /* tp_itemsize */
2891 /* methods */
2892 (destructor)dictiter_dealloc, /* tp_dealloc */
2893 0, /* tp_print */
2894 0, /* tp_getattr */
2895 0, /* tp_setattr */
2896 0, /* tp_reserved */
2897 0, /* tp_repr */
2898 0, /* tp_as_number */
2899 0, /* tp_as_sequence */
2900 0, /* tp_as_mapping */
2901 0, /* tp_hash */
2902 0, /* tp_call */
2903 0, /* tp_str */
2904 PyObject_GenericGetAttr, /* tp_getattro */
2905 0, /* tp_setattro */
2906 0, /* tp_as_buffer */
2907 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2908 0, /* tp_doc */
2909 (traverseproc)dictiter_traverse, /* tp_traverse */
2910 0, /* tp_clear */
2911 0, /* tp_richcompare */
2912 0, /* tp_weaklistoffset */
2913 PyObject_SelfIter, /* tp_iter */
2914 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2915 dictiter_methods, /* tp_methods */
2916 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002917};
2918
2919static PyObject *dictiter_iternextvalue(dictiterobject *di)
2920{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 PyObject *value;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002922 Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002923 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002924 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 if (d == NULL)
2927 return NULL;
2928 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 if (di->di_used != d->ma_used) {
2931 PyErr_SetString(PyExc_RuntimeError,
2932 "dictionary changed size during iteration");
2933 di->di_used = -1; /* Make this state sticky */
2934 return NULL;
2935 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002938 mask = DK_SIZE(d->ma_keys)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939 if (i < 0 || i > mask)
2940 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002941 if (d->ma_values) {
2942 value_ptr = &d->ma_values[i];
2943 offset = sizeof(PyObject *);
2944 }
2945 else {
2946 value_ptr = &d->ma_keys->dk_entries[i].me_value;
2947 offset = sizeof(PyDictKeyEntry);
2948 }
2949 while (i <= mask && *value_ptr == NULL) {
2950 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 i++;
2952 if (i > mask)
2953 goto fail;
2954 }
2955 di->di_pos = i+1;
2956 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002957 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 Py_INCREF(value);
2959 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002960
2961fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002962 Py_DECREF(d);
2963 di->di_dict = NULL;
2964 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002965}
2966
2967PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2969 "dict_valueiterator", /* tp_name */
2970 sizeof(dictiterobject), /* tp_basicsize */
2971 0, /* tp_itemsize */
2972 /* methods */
2973 (destructor)dictiter_dealloc, /* tp_dealloc */
2974 0, /* tp_print */
2975 0, /* tp_getattr */
2976 0, /* tp_setattr */
2977 0, /* tp_reserved */
2978 0, /* tp_repr */
2979 0, /* tp_as_number */
2980 0, /* tp_as_sequence */
2981 0, /* tp_as_mapping */
2982 0, /* tp_hash */
2983 0, /* tp_call */
2984 0, /* tp_str */
2985 PyObject_GenericGetAttr, /* tp_getattro */
2986 0, /* tp_setattro */
2987 0, /* tp_as_buffer */
2988 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2989 0, /* tp_doc */
2990 (traverseproc)dictiter_traverse, /* tp_traverse */
2991 0, /* tp_clear */
2992 0, /* tp_richcompare */
2993 0, /* tp_weaklistoffset */
2994 PyObject_SelfIter, /* tp_iter */
2995 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2996 dictiter_methods, /* tp_methods */
2997 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002998};
2999
3000static PyObject *dictiter_iternextitem(dictiterobject *di)
3001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003002 PyObject *key, *value, *result = di->di_result;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003003 Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003004 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003005 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003007 if (d == NULL)
3008 return NULL;
3009 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00003010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 if (di->di_used != d->ma_used) {
3012 PyErr_SetString(PyExc_RuntimeError,
3013 "dictionary changed size during iteration");
3014 di->di_used = -1; /* Make this state sticky */
3015 return NULL;
3016 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00003017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 i = di->di_pos;
3019 if (i < 0)
3020 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003021 mask = DK_SIZE(d->ma_keys)-1;
3022 if (d->ma_values) {
3023 value_ptr = &d->ma_values[i];
3024 offset = sizeof(PyObject *);
3025 }
3026 else {
3027 value_ptr = &d->ma_keys->dk_entries[i].me_value;
3028 offset = sizeof(PyDictKeyEntry);
3029 }
3030 while (i <= mask && *value_ptr == NULL) {
3031 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003033 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034 di->di_pos = i+1;
3035 if (i > mask)
3036 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038 if (result->ob_refcnt == 1) {
3039 Py_INCREF(result);
3040 Py_DECREF(PyTuple_GET_ITEM(result, 0));
3041 Py_DECREF(PyTuple_GET_ITEM(result, 1));
3042 } else {
3043 result = PyTuple_New(2);
3044 if (result == NULL)
3045 return NULL;
3046 }
3047 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003048 key = d->ma_keys->dk_entries[i].me_key;
3049 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003050 Py_INCREF(key);
3051 Py_INCREF(value);
3052 PyTuple_SET_ITEM(result, 0, key);
3053 PyTuple_SET_ITEM(result, 1, value);
3054 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003055
3056fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 Py_DECREF(d);
3058 di->di_dict = NULL;
3059 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003060}
3061
3062PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3064 "dict_itemiterator", /* tp_name */
3065 sizeof(dictiterobject), /* tp_basicsize */
3066 0, /* tp_itemsize */
3067 /* methods */
3068 (destructor)dictiter_dealloc, /* tp_dealloc */
3069 0, /* tp_print */
3070 0, /* tp_getattr */
3071 0, /* tp_setattr */
3072 0, /* tp_reserved */
3073 0, /* tp_repr */
3074 0, /* tp_as_number */
3075 0, /* tp_as_sequence */
3076 0, /* tp_as_mapping */
3077 0, /* tp_hash */
3078 0, /* tp_call */
3079 0, /* tp_str */
3080 PyObject_GenericGetAttr, /* tp_getattro */
3081 0, /* tp_setattro */
3082 0, /* tp_as_buffer */
3083 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3084 0, /* tp_doc */
3085 (traverseproc)dictiter_traverse, /* tp_traverse */
3086 0, /* tp_clear */
3087 0, /* tp_richcompare */
3088 0, /* tp_weaklistoffset */
3089 PyObject_SelfIter, /* tp_iter */
3090 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3091 dictiter_methods, /* tp_methods */
3092 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003093};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003094
3095
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003096static PyObject *
3097dictiter_reduce(dictiterobject *di)
3098{
3099 PyObject *list;
3100 dictiterobject tmp;
3101
3102 list = PyList_New(0);
3103 if (!list)
3104 return NULL;
3105
3106 /* copy the itertor state */
3107 tmp = *di;
3108 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003109
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003110 /* iterate the temporary into a list */
3111 for(;;) {
3112 PyObject *element = 0;
3113 if (Py_TYPE(di) == &PyDictIterItem_Type)
3114 element = dictiter_iternextitem(&tmp);
3115 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3116 element = dictiter_iternextkey(&tmp);
3117 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3118 element = dictiter_iternextvalue(&tmp);
3119 else
3120 assert(0);
3121 if (element) {
3122 if (PyList_Append(list, element)) {
3123 Py_DECREF(element);
3124 Py_DECREF(list);
3125 Py_XDECREF(tmp.di_dict);
3126 return NULL;
3127 }
3128 Py_DECREF(element);
3129 } else
3130 break;
3131 }
3132 Py_XDECREF(tmp.di_dict);
3133 /* check for error */
3134 if (tmp.di_dict != NULL) {
3135 /* we have an error */
3136 Py_DECREF(list);
3137 return NULL;
3138 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003139 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003140}
3141
Guido van Rossum3ac67412007-02-10 18:55:06 +00003142/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003143/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003144/***********************************************/
3145
Guido van Rossumb90c8482007-02-10 01:11:45 +00003146/* The instance lay-out is the same for all three; but the type differs. */
3147
3148typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 PyObject_HEAD
3150 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003151} dictviewobject;
3152
3153
3154static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00003155dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003156{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 Py_XDECREF(dv->dv_dict);
3158 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003159}
3160
3161static int
3162dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
3163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003164 Py_VISIT(dv->dv_dict);
3165 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003166}
3167
Guido van Rossum83825ac2007-02-10 04:54:19 +00003168static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00003169dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003171 Py_ssize_t len = 0;
3172 if (dv->dv_dict != NULL)
3173 len = dv->dv_dict->ma_used;
3174 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003175}
3176
3177static PyObject *
3178dictview_new(PyObject *dict, PyTypeObject *type)
3179{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 dictviewobject *dv;
3181 if (dict == NULL) {
3182 PyErr_BadInternalCall();
3183 return NULL;
3184 }
3185 if (!PyDict_Check(dict)) {
3186 /* XXX Get rid of this restriction later */
3187 PyErr_Format(PyExc_TypeError,
3188 "%s() requires a dict argument, not '%s'",
3189 type->tp_name, dict->ob_type->tp_name);
3190 return NULL;
3191 }
3192 dv = PyObject_GC_New(dictviewobject, type);
3193 if (dv == NULL)
3194 return NULL;
3195 Py_INCREF(dict);
3196 dv->dv_dict = (PyDictObject *)dict;
3197 _PyObject_GC_TRACK(dv);
3198 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003199}
3200
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003201/* TODO(guido): The views objects are not complete:
3202
3203 * support more set operations
3204 * support arbitrary mappings?
3205 - either these should be static or exported in dictobject.h
3206 - if public then they should probably be in builtins
3207*/
3208
Guido van Rossumaac530c2007-08-24 22:33:45 +00003209/* Return 1 if self is a subset of other, iterating over self;
3210 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003211static int
3212all_contained_in(PyObject *self, PyObject *other)
3213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 PyObject *iter = PyObject_GetIter(self);
3215 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 if (iter == NULL)
3218 return -1;
3219 for (;;) {
3220 PyObject *next = PyIter_Next(iter);
3221 if (next == NULL) {
3222 if (PyErr_Occurred())
3223 ok = -1;
3224 break;
3225 }
3226 ok = PySequence_Contains(other, next);
3227 Py_DECREF(next);
3228 if (ok <= 0)
3229 break;
3230 }
3231 Py_DECREF(iter);
3232 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003233}
3234
3235static PyObject *
3236dictview_richcompare(PyObject *self, PyObject *other, int op)
3237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 Py_ssize_t len_self, len_other;
3239 int ok;
3240 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 assert(self != NULL);
3243 assert(PyDictViewSet_Check(self));
3244 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003245
Brian Curtindfc80e32011-08-10 20:28:54 -05003246 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3247 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 len_self = PyObject_Size(self);
3250 if (len_self < 0)
3251 return NULL;
3252 len_other = PyObject_Size(other);
3253 if (len_other < 0)
3254 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003256 ok = 0;
3257 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003259 case Py_NE:
3260 case Py_EQ:
3261 if (len_self == len_other)
3262 ok = all_contained_in(self, other);
3263 if (op == Py_NE && ok >= 0)
3264 ok = !ok;
3265 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003267 case Py_LT:
3268 if (len_self < len_other)
3269 ok = all_contained_in(self, other);
3270 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003272 case Py_LE:
3273 if (len_self <= len_other)
3274 ok = all_contained_in(self, other);
3275 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003277 case Py_GT:
3278 if (len_self > len_other)
3279 ok = all_contained_in(other, self);
3280 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003282 case Py_GE:
3283 if (len_self >= len_other)
3284 ok = all_contained_in(other, self);
3285 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 }
3288 if (ok < 0)
3289 return NULL;
3290 result = ok ? Py_True : Py_False;
3291 Py_INCREF(result);
3292 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003293}
3294
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003295static PyObject *
3296dictview_repr(dictviewobject *dv)
3297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 PyObject *seq;
3299 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 seq = PySequence_List((PyObject *)dv);
3302 if (seq == NULL)
3303 return NULL;
3304
3305 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3306 Py_DECREF(seq);
3307 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003308}
3309
Guido van Rossum3ac67412007-02-10 18:55:06 +00003310/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003311
3312static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003313dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 if (dv->dv_dict == NULL) {
3316 Py_RETURN_NONE;
3317 }
3318 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003319}
3320
3321static int
3322dictkeys_contains(dictviewobject *dv, PyObject *obj)
3323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 if (dv->dv_dict == NULL)
3325 return 0;
3326 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003327}
3328
Guido van Rossum83825ac2007-02-10 04:54:19 +00003329static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 (lenfunc)dictview_len, /* sq_length */
3331 0, /* sq_concat */
3332 0, /* sq_repeat */
3333 0, /* sq_item */
3334 0, /* sq_slice */
3335 0, /* sq_ass_item */
3336 0, /* sq_ass_slice */
3337 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003338};
3339
Guido van Rossum523259b2007-08-24 23:41:22 +00003340static PyObject*
3341dictviews_sub(PyObject* self, PyObject *other)
3342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 PyObject *result = PySet_New(self);
3344 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003345 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 if (result == NULL)
3348 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003349
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003350 tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 if (tmp == NULL) {
3352 Py_DECREF(result);
3353 return NULL;
3354 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 Py_DECREF(tmp);
3357 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003358}
3359
3360static PyObject*
3361dictviews_and(PyObject* self, PyObject *other)
3362{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 PyObject *result = PySet_New(self);
3364 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003365 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003367 if (result == NULL)
3368 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003369
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003370 tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003371 if (tmp == NULL) {
3372 Py_DECREF(result);
3373 return NULL;
3374 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003376 Py_DECREF(tmp);
3377 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003378}
3379
3380static PyObject*
3381dictviews_or(PyObject* self, PyObject *other)
3382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 PyObject *result = PySet_New(self);
3384 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003385 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 if (result == NULL)
3388 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003389
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003390 tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 if (tmp == NULL) {
3392 Py_DECREF(result);
3393 return NULL;
3394 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 Py_DECREF(tmp);
3397 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003398}
3399
3400static PyObject*
3401dictviews_xor(PyObject* self, PyObject *other)
3402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 PyObject *result = PySet_New(self);
3404 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003405 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003407 if (result == NULL)
3408 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003409
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003410 tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003411 other);
3412 if (tmp == NULL) {
3413 Py_DECREF(result);
3414 return NULL;
3415 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 Py_DECREF(tmp);
3418 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003419}
3420
3421static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 0, /*nb_add*/
3423 (binaryfunc)dictviews_sub, /*nb_subtract*/
3424 0, /*nb_multiply*/
3425 0, /*nb_remainder*/
3426 0, /*nb_divmod*/
3427 0, /*nb_power*/
3428 0, /*nb_negative*/
3429 0, /*nb_positive*/
3430 0, /*nb_absolute*/
3431 0, /*nb_bool*/
3432 0, /*nb_invert*/
3433 0, /*nb_lshift*/
3434 0, /*nb_rshift*/
3435 (binaryfunc)dictviews_and, /*nb_and*/
3436 (binaryfunc)dictviews_xor, /*nb_xor*/
3437 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003438};
3439
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003440static PyObject*
3441dictviews_isdisjoint(PyObject *self, PyObject *other)
3442{
3443 PyObject *it;
3444 PyObject *item = NULL;
3445
3446 if (self == other) {
3447 if (dictview_len((dictviewobject *)self) == 0)
3448 Py_RETURN_TRUE;
3449 else
3450 Py_RETURN_FALSE;
3451 }
3452
3453 /* Iterate over the shorter object (only if other is a set,
3454 * because PySequence_Contains may be expensive otherwise): */
3455 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
3456 Py_ssize_t len_self = dictview_len((dictviewobject *)self);
3457 Py_ssize_t len_other = PyObject_Size(other);
3458 if (len_other == -1)
3459 return NULL;
3460
3461 if ((len_other > len_self)) {
3462 PyObject *tmp = other;
3463 other = self;
3464 self = tmp;
3465 }
3466 }
3467
3468 it = PyObject_GetIter(other);
3469 if (it == NULL)
3470 return NULL;
3471
3472 while ((item = PyIter_Next(it)) != NULL) {
3473 int contains = PySequence_Contains(self, item);
3474 Py_DECREF(item);
3475 if (contains == -1) {
3476 Py_DECREF(it);
3477 return NULL;
3478 }
3479
3480 if (contains) {
3481 Py_DECREF(it);
3482 Py_RETURN_FALSE;
3483 }
3484 }
3485 Py_DECREF(it);
3486 if (PyErr_Occurred())
3487 return NULL; /* PyIter_Next raised an exception. */
3488 Py_RETURN_TRUE;
3489}
3490
3491PyDoc_STRVAR(isdisjoint_doc,
3492"Return True if the view and the given iterable have a null intersection.");
3493
Guido van Rossumb90c8482007-02-10 01:11:45 +00003494static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003495 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3496 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003497 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003498};
3499
3500PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3502 "dict_keys", /* tp_name */
3503 sizeof(dictviewobject), /* tp_basicsize */
3504 0, /* tp_itemsize */
3505 /* methods */
3506 (destructor)dictview_dealloc, /* tp_dealloc */
3507 0, /* tp_print */
3508 0, /* tp_getattr */
3509 0, /* tp_setattr */
3510 0, /* tp_reserved */
3511 (reprfunc)dictview_repr, /* tp_repr */
3512 &dictviews_as_number, /* tp_as_number */
3513 &dictkeys_as_sequence, /* tp_as_sequence */
3514 0, /* tp_as_mapping */
3515 0, /* tp_hash */
3516 0, /* tp_call */
3517 0, /* tp_str */
3518 PyObject_GenericGetAttr, /* tp_getattro */
3519 0, /* tp_setattro */
3520 0, /* tp_as_buffer */
3521 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3522 0, /* tp_doc */
3523 (traverseproc)dictview_traverse, /* tp_traverse */
3524 0, /* tp_clear */
3525 dictview_richcompare, /* tp_richcompare */
3526 0, /* tp_weaklistoffset */
3527 (getiterfunc)dictkeys_iter, /* tp_iter */
3528 0, /* tp_iternext */
3529 dictkeys_methods, /* tp_methods */
3530 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003531};
3532
3533static PyObject *
3534dictkeys_new(PyObject *dict)
3535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 return dictview_new(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003537}
3538
Guido van Rossum3ac67412007-02-10 18:55:06 +00003539/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003540
3541static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003542dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003544 if (dv->dv_dict == NULL) {
3545 Py_RETURN_NONE;
3546 }
3547 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003548}
3549
3550static int
3551dictitems_contains(dictviewobject *dv, PyObject *obj)
3552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 PyObject *key, *value, *found;
3554 if (dv->dv_dict == NULL)
3555 return 0;
3556 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3557 return 0;
3558 key = PyTuple_GET_ITEM(obj, 0);
3559 value = PyTuple_GET_ITEM(obj, 1);
3560 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3561 if (found == NULL) {
3562 if (PyErr_Occurred())
3563 return -1;
3564 return 0;
3565 }
3566 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003567}
3568
Guido van Rossum83825ac2007-02-10 04:54:19 +00003569static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003570 (lenfunc)dictview_len, /* sq_length */
3571 0, /* sq_concat */
3572 0, /* sq_repeat */
3573 0, /* sq_item */
3574 0, /* sq_slice */
3575 0, /* sq_ass_item */
3576 0, /* sq_ass_slice */
3577 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003578};
3579
Guido van Rossumb90c8482007-02-10 01:11:45 +00003580static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003581 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3582 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003583 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003584};
3585
3586PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003587 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3588 "dict_items", /* tp_name */
3589 sizeof(dictviewobject), /* tp_basicsize */
3590 0, /* tp_itemsize */
3591 /* methods */
3592 (destructor)dictview_dealloc, /* tp_dealloc */
3593 0, /* tp_print */
3594 0, /* tp_getattr */
3595 0, /* tp_setattr */
3596 0, /* tp_reserved */
3597 (reprfunc)dictview_repr, /* tp_repr */
3598 &dictviews_as_number, /* tp_as_number */
3599 &dictitems_as_sequence, /* tp_as_sequence */
3600 0, /* tp_as_mapping */
3601 0, /* tp_hash */
3602 0, /* tp_call */
3603 0, /* tp_str */
3604 PyObject_GenericGetAttr, /* tp_getattro */
3605 0, /* tp_setattro */
3606 0, /* tp_as_buffer */
3607 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3608 0, /* tp_doc */
3609 (traverseproc)dictview_traverse, /* tp_traverse */
3610 0, /* tp_clear */
3611 dictview_richcompare, /* tp_richcompare */
3612 0, /* tp_weaklistoffset */
3613 (getiterfunc)dictitems_iter, /* tp_iter */
3614 0, /* tp_iternext */
3615 dictitems_methods, /* tp_methods */
3616 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003617};
3618
3619static PyObject *
3620dictitems_new(PyObject *dict)
3621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003622 return dictview_new(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003623}
3624
Guido van Rossum3ac67412007-02-10 18:55:06 +00003625/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003626
3627static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003628dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003630 if (dv->dv_dict == NULL) {
3631 Py_RETURN_NONE;
3632 }
3633 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003634}
3635
Guido van Rossum83825ac2007-02-10 04:54:19 +00003636static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003637 (lenfunc)dictview_len, /* sq_length */
3638 0, /* sq_concat */
3639 0, /* sq_repeat */
3640 0, /* sq_item */
3641 0, /* sq_slice */
3642 0, /* sq_ass_item */
3643 0, /* sq_ass_slice */
3644 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003645};
3646
Guido van Rossumb90c8482007-02-10 01:11:45 +00003647static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003648 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003649};
3650
3651PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003652 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3653 "dict_values", /* tp_name */
3654 sizeof(dictviewobject), /* tp_basicsize */
3655 0, /* tp_itemsize */
3656 /* methods */
3657 (destructor)dictview_dealloc, /* tp_dealloc */
3658 0, /* tp_print */
3659 0, /* tp_getattr */
3660 0, /* tp_setattr */
3661 0, /* tp_reserved */
3662 (reprfunc)dictview_repr, /* tp_repr */
3663 0, /* tp_as_number */
3664 &dictvalues_as_sequence, /* tp_as_sequence */
3665 0, /* tp_as_mapping */
3666 0, /* tp_hash */
3667 0, /* tp_call */
3668 0, /* tp_str */
3669 PyObject_GenericGetAttr, /* tp_getattro */
3670 0, /* tp_setattro */
3671 0, /* tp_as_buffer */
3672 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3673 0, /* tp_doc */
3674 (traverseproc)dictview_traverse, /* tp_traverse */
3675 0, /* tp_clear */
3676 0, /* tp_richcompare */
3677 0, /* tp_weaklistoffset */
3678 (getiterfunc)dictvalues_iter, /* tp_iter */
3679 0, /* tp_iternext */
3680 dictvalues_methods, /* tp_methods */
3681 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003682};
3683
3684static PyObject *
3685dictvalues_new(PyObject *dict)
3686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 return dictview_new(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003688}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003689
3690/* Returns NULL if cannot allocate a new PyDictKeysObject,
3691 but does not set an error */
3692PyDictKeysObject *
3693_PyDict_NewKeysForClass(void)
3694{
3695 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_SPLIT);
3696 if (keys == NULL)
3697 PyErr_Clear();
3698 else
3699 keys->dk_lookup = lookdict_split;
3700 return keys;
3701}
3702
3703#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
3704
3705PyObject *
3706PyObject_GenericGetDict(PyObject *obj, void *context)
3707{
3708 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
3709 if (dictptr == NULL) {
3710 PyErr_SetString(PyExc_AttributeError,
3711 "This object has no __dict__");
3712 return NULL;
3713 }
3714 dict = *dictptr;
3715 if (dict == NULL) {
3716 PyTypeObject *tp = Py_TYPE(obj);
3717 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
3718 DK_INCREF(CACHED_KEYS(tp));
3719 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
3720 }
3721 else {
3722 *dictptr = dict = PyDict_New();
3723 }
3724 }
3725 Py_XINCREF(dict);
3726 return dict;
3727}
3728
3729int
3730_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
3731 PyObject *key, PyObject *value)
3732{
3733 PyObject *dict;
3734 int res;
3735 PyDictKeysObject *cached;
3736
3737 assert(dictptr != NULL);
3738 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
3739 assert(dictptr != NULL);
3740 dict = *dictptr;
3741 if (dict == NULL) {
3742 DK_INCREF(cached);
3743 dict = new_dict_with_shared_keys(cached);
3744 if (dict == NULL)
3745 return -1;
3746 *dictptr = dict;
3747 }
3748 if (value == NULL) {
3749 res = PyDict_DelItem(dict, key);
3750 if (cached != ((PyDictObject *)dict)->ma_keys) {
3751 CACHED_KEYS(tp) = NULL;
3752 DK_DECREF(cached);
3753 }
3754 } else {
3755 res = PyDict_SetItem(dict, key, value);
3756 if (cached != ((PyDictObject *)dict)->ma_keys) {
3757 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04003758 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003759 CACHED_KEYS(tp) = make_keys_shared(dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003760 } else {
3761 CACHED_KEYS(tp) = NULL;
3762 }
3763 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04003764 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
3765 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003766 }
3767 }
3768 } else {
3769 dict = *dictptr;
3770 if (dict == NULL) {
3771 dict = PyDict_New();
3772 if (dict == NULL)
3773 return -1;
3774 *dictptr = dict;
3775 }
3776 if (value == NULL) {
3777 res = PyDict_DelItem(dict, key);
3778 } else {
3779 res = PyDict_SetItem(dict, key, value);
3780 }
3781 }
3782 return res;
3783}
3784
3785void
3786_PyDictKeys_DecRef(PyDictKeysObject *keys)
3787{
3788 DK_DECREF(keys);
3789}
3790
3791
3792/* ARGSUSED */
3793static PyObject *
3794dummy_repr(PyObject *op)
3795{
3796 return PyUnicode_FromString("<dummy key>");
3797}
3798
3799/* ARGUSED */
3800static void
3801dummy_dealloc(PyObject* ignore)
3802{
3803 /* This should never get called, but we also don't want to SEGV if
3804 * we accidentally decref dummy-key out of existence.
3805 */
3806 Py_FatalError("deallocating <dummy key>");
3807}
3808
3809static PyTypeObject PyDictDummy_Type = {
3810 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3811 "<dummy key> type",
3812 0,
3813 0,
3814 dummy_dealloc, /*tp_dealloc*/ /*never called*/
3815 0, /*tp_print*/
3816 0, /*tp_getattr*/
3817 0, /*tp_setattr*/
3818 0, /*tp_reserved*/
3819 dummy_repr, /*tp_repr*/
3820 0, /*tp_as_number*/
3821 0, /*tp_as_sequence*/
3822 0, /*tp_as_mapping*/
3823 0, /*tp_hash */
3824 0, /*tp_call */
3825 0, /*tp_str */
3826 0, /*tp_getattro */
3827 0, /*tp_setattro */
3828 0, /*tp_as_buffer */
3829 Py_TPFLAGS_DEFAULT, /*tp_flags */
3830};
3831
3832static PyObject _dummy_struct = {
3833 _PyObject_EXTRA_INIT
3834 2, &PyDictDummy_Type
3835};
3836