blob: 610a5ee24eff6a63396f2ad6b35b01f72c2b2c3e [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
Thomas Wouters89f507f2006-12-13 04:49:30 +000098/* Set a key error with the specified argument, wrapping it in a
99 * tuple automatically so that tuple keys are not unpacked as the
100 * exception arguments. */
101static void
102set_key_error(PyObject *arg)
103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 PyObject *tup;
105 tup = PyTuple_Pack(1, arg);
106 if (!tup)
107 return; /* caller will expect error to be set anyway */
108 PyErr_SetObject(PyExc_KeyError, tup);
109 Py_DECREF(tup);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000110}
111
Tim Peterseb28ef22001-06-02 05:27:19 +0000112#define PERTURB_SHIFT 5
113
Guido van Rossum16e93a81997-01-28 00:00:11 +0000114/*
Tim Peterseb28ef22001-06-02 05:27:19 +0000115Major subtleties ahead: Most hash schemes depend on having a "good" hash
116function, in the sense of simulating randomness. Python doesn't: its most
117important hash functions (for strings and ints) are very regular in common
118cases:
Tim Peters15d49292001-05-27 07:39:22 +0000119
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000120 >>> map(hash, (0, 1, 2, 3))
121 [0, 1, 2, 3]
122 >>> map(hash, ("namea", "nameb", "namec", "named"))
123 [-1658398457, -1658398460, -1658398459, -1658398462]
124 >>>
Tim Peters15d49292001-05-27 07:39:22 +0000125
Tim Peterseb28ef22001-06-02 05:27:19 +0000126This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
127the low-order i bits as the initial table index is extremely fast, and there
128are no collisions at all for dicts indexed by a contiguous range of ints.
129The same is approximately true when keys are "consecutive" strings. So this
130gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +0000131
Tim Peterseb28ef22001-06-02 05:27:19 +0000132OTOH, when collisions occur, the tendency to fill contiguous slices of the
133hash table makes a good collision resolution strategy crucial. Taking only
134the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000136their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
137 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +0000138
Tim Peterseb28ef22001-06-02 05:27:19 +0000139But catering to unusual cases should not slow the usual ones, so we just take
140the last i bits anyway. It's up to collision resolution to do the rest. If
141we *usually* find the key we're looking for on the first try (and, it turns
142out, we usually do -- the table load factor is kept under 2/3, so the odds
143are solidly in our favor), then it makes best sense to keep the initial index
144computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +0000145
Tim Peterseb28ef22001-06-02 05:27:19 +0000146The first half of collision resolution is to visit table indices via this
147recurrence:
Tim Peters15d49292001-05-27 07:39:22 +0000148
Tim Peterseb28ef22001-06-02 05:27:19 +0000149 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +0000150
Tim Peterseb28ef22001-06-02 05:27:19 +0000151For any initial j in range(2**i), repeating that 2**i times generates each
152int in range(2**i) exactly once (see any text on random-number generation for
153proof). By itself, this doesn't help much: like linear probing (setting
154j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
155order. This would be bad, except that's not the only thing we do, and it's
156actually *good* in the common cases where hash keys are consecutive. In an
157example that's really too small to make this entirely clear, for a table of
158size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +0000159
Tim Peterseb28ef22001-06-02 05:27:19 +0000160 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
161
162If two things come in at index 5, the first place we look after is index 2,
163not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
164Linear probing is deadly in this case because there the fixed probe order
165is the *same* as the order consecutive keys are likely to arrive. But it's
166extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
167and certain that consecutive hash codes do not.
168
169The other half of the strategy is to get the other bits of the hash code
170into play. This is done by initializing a (unsigned) vrbl "perturb" to the
171full hash code, and changing the recurrence to:
172
173 j = (5*j) + 1 + perturb;
174 perturb >>= PERTURB_SHIFT;
175 use j % 2**i as the next table index;
176
177Now the probe sequence depends (eventually) on every bit in the hash code,
178and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
179because it quickly magnifies small differences in the bits that didn't affect
180the initial index. Note that because perturb is unsigned, if the recurrence
181is executed often enough perturb eventually becomes and remains 0. At that
182point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
183that's certain to find an empty slot eventually (since it generates every int
184in range(2**i), and we make sure there's always at least one empty slot).
185
186Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
187small so that the high bits of the hash code continue to affect the probe
188sequence across iterations; but you want it large so that in really bad cases
189the high-order hash bits have an effect on early iterations. 5 was "the
190best" in minimizing total collisions across experiments Tim Peters ran (on
191both normal and pathological cases), but 4 and 6 weren't significantly worse.
192
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000193Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000194approach, using repeated multiplication by x in GF(2**n) where an irreducible
195polynomial for each table size was chosen such that x was a primitive root.
196Christian Tismer later extended that to use division by x instead, as an
197efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000198also gave excellent collision statistics, but was more expensive: two
199if-tests were required inside the loop; computing "the next" index took about
200the same number of operations but without as much potential parallelism
201(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
202above, and then shifting perturb can be done while the table index is being
203masked); and the PyDictObject struct required a member to hold the table's
204polynomial. In Tim's experiments the current scheme ran faster, produced
205equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000206
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000207*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000208
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400209/* Object used as dummy key to fill deleted entries
210 * This could be any unique object,
211 * use a custom type in order to minimise coupling.
212*/
213static PyObject _dummy_struct;
214
215#define dummy (&_dummy_struct)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000216
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000217#ifdef Py_REF_DEBUG
218PyObject *
219_PyDict_Dummy(void)
220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 return dummy;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000222}
223#endif
224
Fred Drake1bff34a2000-08-31 19:31:38 +0000225/* forward declarations */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400226static PyDictKeyEntry *lookdict(PyDictObject *mp, PyObject *key,
227 Py_hash_t hash, PyObject ***value_addr);
228static PyDictKeyEntry *lookdict_unicode(PyDictObject *mp, PyObject *key,
229 Py_hash_t hash, PyObject ***value_addr);
230static PyDictKeyEntry *
231lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
232 Py_hash_t hash, PyObject ***value_addr);
233static PyDictKeyEntry *lookdict_split(PyDictObject *mp, PyObject *key,
234 Py_hash_t hash, PyObject ***value_addr);
Fred Drake1bff34a2000-08-31 19:31:38 +0000235
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400236static int dictresize(PyDictObject *mp, Py_ssize_t minused);
Tim Petersdea48ec2001-05-22 20:40:22 +0000237
Raymond Hettinger43442782004-03-17 21:55:03 +0000238/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes2202f872008-02-06 14:31:34 +0000239#ifndef PyDict_MAXFREELIST
240#define PyDict_MAXFREELIST 80
241#endif
242static PyDictObject *free_list[PyDict_MAXFREELIST];
243static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000244
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100245int
246PyDict_ClearFreeList(void)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 PyDictObject *op;
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100249 int ret = numfree;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 while (numfree) {
251 op = free_list[--numfree];
252 assert(PyDict_CheckExact(op));
253 PyObject_GC_Del(op);
254 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100255 return ret;
256}
257
258void
259PyDict_Fini(void)
260{
261 PyDict_ClearFreeList();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000262}
263
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400264#define DK_INCREF(dk) (++(dk)->dk_refcnt)
265#define DK_DECREF(dk) if ((--(dk)->dk_refcnt) == 0) free_keys_object(dk)
266#define DK_SIZE(dk) ((dk)->dk_size)
267#define DK_MASK(dk) (((dk)->dk_size)-1)
268#define IS_POWER_OF_2(x) (((x) & (x-1)) == 0)
269
270/* USABLE_FRACTION must obey the following:
271 * (0 < USABLE_FRACTION(n) < n) for all n >= 2
272 *
273 * USABLE_FRACTION should be very quick to calculate.
274 * Fractions around 5/8 to 2/3 seem to work well in practice.
275 */
276
277/* Use (2n+1)/3 rather than 2n+3 because: it makes no difference for
278 * combined tables (the two fractions round to the same number n < ),
279 * but 2*4/3 is 2 whereas (2*4+1)/3 is 3 which potentially saves quite
280 * a lot of space for small, split tables */
281#define USABLE_FRACTION(n) ((((n) << 1)+1)/3)
282
283/* Alternative fraction that is otherwise close enough to (2n+1)/3 to make
284 * little difference. 8 * 2/3 == 8 * 5/8 == 5. 16 * 2/3 == 16 * 5/8 == 10.
285 * 32 * 2/3 = 21, 32 * 5/8 = 20.
286 * Its advantage is that it is faster to compute on machines with slow division.
287 * #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
288*/
289
290
291#define ENSURE_ALLOWS_DELETIONS(d) \
292 if ((d)->ma_keys->dk_lookup == lookdict_unicode_nodummy) { \
293 (d)->ma_keys->dk_lookup = lookdict_unicode; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400295
296/* This immutable, empty PyDictKeysObject is used for PyDict_Clear()
297 * (which cannot fail and thus can do no allocation).
298 */
299static PyDictKeysObject empty_keys_struct = {
300 2, /* dk_refcnt 1 for this struct, 1 for dummy_struct */
301 1, /* dk_size */
302 lookdict_split, /* dk_lookup */
303 0, /* dk_usable (immutable) */
304 {
305 { 0, 0, 0 } /* dk_entries (empty) */
306 }
307};
308
309static PyObject *empty_values[1] = { NULL };
310
311#define Py_EMPTY_KEYS &empty_keys_struct
312
313static PyDictKeysObject *new_keys_object(Py_ssize_t size)
314{
315 PyDictKeysObject *dk;
316 Py_ssize_t i;
317 PyDictKeyEntry *ep0;
318
319 assert(size >= PyDict_MINSIZE_SPLIT);
320 assert(IS_POWER_OF_2(size));
321 dk = PyMem_MALLOC(sizeof(PyDictKeysObject) +
322 sizeof(PyDictKeyEntry) * (size-1));
323 if (dk == NULL) {
324 PyErr_NoMemory();
325 return NULL;
326 }
327 dk->dk_refcnt = 1;
328 dk->dk_size = size;
329 dk->dk_usable = USABLE_FRACTION(size);
330 ep0 = &dk->dk_entries[0];
331 /* Hash value of slot 0 is used by popitem, so it must be initialized */
332 ep0->me_hash = 0;
333 for (i = 0; i < size; i++) {
334 ep0[i].me_key = NULL;
335 ep0[i].me_value = NULL;
336 }
337 dk->dk_lookup = lookdict_unicode_nodummy;
338 return dk;
339}
340
341static void
342free_keys_object(PyDictKeysObject *keys)
343{
344 PyDictKeyEntry *entries = &keys->dk_entries[0];
345 Py_ssize_t i, n;
346 for (i = 0, n = DK_SIZE(keys); i < n; i++) {
347 Py_XDECREF(entries[i].me_key);
348 Py_XDECREF(entries[i].me_value);
349 }
350 PyMem_FREE(keys);
351}
352
353#define new_values(size) PyMem_NEW(PyObject *, size)
354
355#define free_values(values) PyMem_FREE(values)
356
357/* Consumes a reference to the keys object */
358static PyObject *
359new_dict(PyDictKeysObject *keys, PyObject **values)
360{
361 PyDictObject *mp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 if (numfree) {
363 mp = free_list[--numfree];
364 assert (mp != NULL);
365 assert (Py_TYPE(mp) == &PyDict_Type);
366 _Py_NewReference((PyObject *)mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400368 else {
369 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
370 if (mp == NULL) {
371 DK_DECREF(keys);
372 free_values(values);
373 return NULL;
374 }
375 }
376 mp->ma_keys = keys;
377 mp->ma_values = values;
378 mp->ma_used = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000380}
381
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400382/* Consumes a reference to the keys object */
383static PyObject *
384new_dict_with_shared_keys(PyDictKeysObject *keys)
385{
386 PyObject **values;
387 Py_ssize_t i, size;
388
389 size = DK_SIZE(keys);
390 values = new_values(size);
391 if (values == NULL) {
392 DK_DECREF(keys);
393 return PyErr_NoMemory();
394 }
395 for (i = 0; i < size; i++) {
396 values[i] = NULL;
397 }
398 return new_dict(keys, values);
399}
400
401PyObject *
402PyDict_New(void)
403{
404 return new_dict(new_keys_object(PyDict_MINSIZE_COMBINED), NULL);
405}
406
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000407/*
408The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000409This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000410Open addressing is preferred over chaining since the link overhead for
411chaining would be substantial (100% with typical malloc overhead).
412
Tim Peterseb28ef22001-06-02 05:27:19 +0000413The initial probe index is computed as hash mod the table size. Subsequent
414probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000415
416All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000417
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000418The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000419contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000420Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000421
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000422lookdict() is general-purpose, and may return NULL if (and only if) a
423comparison raises an exception (this was new in Python 2.5).
Guido van Rossum89d8c602007-09-18 17:26:56 +0000424lookdict_unicode() below is specialized to string keys, comparison of which can
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400425never raise an exception; that function can never return NULL.
426lookdict_unicode_nodummy is further specialized for string keys that cannot be
427the <dummy> value.
428For both, when the key isn't found a PyDictEntry* is returned
429where the key would have been found, *value_addr points to the matching value
430slot.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000431*/
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400432static PyDictKeyEntry *
433lookdict(PyDictObject *mp, PyObject *key,
434 Py_hash_t hash, PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000435{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 register size_t i;
437 register size_t perturb;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400438 register PyDictKeyEntry *freeslot;
439 register size_t mask = DK_MASK(mp->ma_keys);
440 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
441 register PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 register int cmp;
443 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 i = (size_t)hash & mask;
446 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400447 if (ep->me_key == NULL || ep->me_key == key) {
448 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400450 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 if (ep->me_key == dummy)
452 freeslot = ep;
453 else {
454 if (ep->me_hash == hash) {
455 startkey = ep->me_key;
456 Py_INCREF(startkey);
457 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
458 Py_DECREF(startkey);
459 if (cmp < 0)
460 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400461 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
462 if (cmp > 0) {
463 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400465 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 }
467 else {
Victor Stinner198b2912012-03-06 01:03:13 +0100468 PyErr_SetString(PyExc_RuntimeError,
469 "dictionary changed size during lookup");
470 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 }
472 }
473 freeslot = NULL;
474 }
Tim Peters15d49292001-05-27 07:39:22 +0000475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 /* In the loop, me_key == dummy is by far (factor of 100s) the
477 least likely outcome, so test for that last. */
478 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
479 i = (i << 2) + i + perturb + 1;
480 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400481 if (ep->me_key == NULL) {
482 if (freeslot == NULL) {
483 *value_addr = &ep->me_value;
484 return ep;
485 } else {
486 *value_addr = &freeslot->me_value;
487 return freeslot;
488 }
489 }
490 if (ep->me_key == key) {
491 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400493 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 if (ep->me_hash == hash && ep->me_key != dummy) {
495 startkey = ep->me_key;
496 Py_INCREF(startkey);
497 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
498 Py_DECREF(startkey);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400499 if (cmp < 0) {
500 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400502 }
503 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
504 if (cmp > 0) {
505 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400507 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 }
509 else {
Victor Stinner198b2912012-03-06 01:03:13 +0100510 PyErr_SetString(PyExc_RuntimeError,
511 "dictionary changed size during lookup");
512 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 }
514 }
515 else if (ep->me_key == dummy && freeslot == NULL)
516 freeslot = ep;
517 }
518 assert(0); /* NOT REACHED */
519 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000520}
521
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400522/* Specialized version for string-only keys */
523static PyDictKeyEntry *
524lookdict_unicode(PyDictObject *mp, PyObject *key,
525 Py_hash_t hash, PyObject ***value_addr)
Fred Drake1bff34a2000-08-31 19:31:38 +0000526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 register size_t i;
528 register size_t perturb;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400529 register PyDictKeyEntry *freeslot;
530 register size_t mask = DK_MASK(mp->ma_keys);
531 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
532 register PyDictKeyEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 /* Make sure this function doesn't have to handle non-unicode keys,
535 including subclasses of str; e.g., one reason to subclass
536 unicodes is to override __eq__, and for speed we don't cater to
537 that here. */
538 if (!PyUnicode_CheckExact(key)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400539 mp->ma_keys->dk_lookup = lookdict;
540 return lookdict(mp, key, hash, value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100542 i = (size_t)hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400544 if (ep->me_key == NULL || ep->me_key == key) {
545 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400547 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 if (ep->me_key == dummy)
549 freeslot = ep;
550 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400551 if (ep->me_hash == hash && unicode_eq(ep->me_key, key)) {
552 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400554 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 freeslot = NULL;
556 }
Tim Peters15d49292001-05-27 07:39:22 +0000557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 /* In the loop, me_key == dummy is by far (factor of 100s) the
559 least likely outcome, so test for that last. */
560 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
561 i = (i << 2) + i + perturb + 1;
562 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400563 if (ep->me_key == NULL) {
564 if (freeslot == NULL) {
565 *value_addr = &ep->me_value;
566 return ep;
567 } else {
568 *value_addr = &freeslot->me_value;
569 return freeslot;
570 }
571 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 if (ep->me_key == key
573 || (ep->me_hash == hash
574 && ep->me_key != dummy
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400575 && unicode_eq(ep->me_key, key))) {
576 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400578 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 if (ep->me_key == dummy && freeslot == NULL)
580 freeslot = ep;
581 }
582 assert(0); /* NOT REACHED */
583 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000584}
585
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400586/* Faster version of lookdict_unicode when it is known that no <dummy> keys
587 * will be present. */
588static PyDictKeyEntry *
589lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
590 Py_hash_t hash, PyObject ***value_addr)
591{
592 register size_t i;
593 register size_t perturb;
594 register size_t mask = DK_MASK(mp->ma_keys);
595 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
596 register PyDictKeyEntry *ep;
597
598 /* Make sure this function doesn't have to handle non-unicode keys,
599 including subclasses of str; e.g., one reason to subclass
600 unicodes is to override __eq__, and for speed we don't cater to
601 that here. */
602 if (!PyUnicode_CheckExact(key)) {
603 mp->ma_keys->dk_lookup = lookdict;
604 return lookdict(mp, key, hash, value_addr);
605 }
606 i = (size_t)hash & mask;
607 ep = &ep0[i];
608 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
609 if (ep->me_key == NULL || ep->me_key == key ||
610 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
611 *value_addr = &ep->me_value;
612 return ep;
613 }
614 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
615 i = (i << 2) + i + perturb + 1;
616 ep = &ep0[i & mask];
617 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
618 if (ep->me_key == NULL || ep->me_key == key ||
619 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
620 *value_addr = &ep->me_value;
621 return ep;
622 }
623 }
624 assert(0); /* NOT REACHED */
625 return 0;
626}
627
628/* Version of lookdict for split tables.
629 * All split tables and only split tables use this lookup function.
630 * Split tables only contain unicode keys and no dummy keys,
631 * so algorithm is the same as lookdict_unicode_nodummy.
632 */
633static PyDictKeyEntry *
634lookdict_split(PyDictObject *mp, PyObject *key,
635 Py_hash_t hash, PyObject ***value_addr)
636{
637 register size_t i;
638 register size_t perturb;
639 register size_t mask = DK_MASK(mp->ma_keys);
640 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
641 register PyDictKeyEntry *ep;
642
643 if (!PyUnicode_CheckExact(key)) {
Benjamin Petersondb780d02012-04-23 13:44:32 -0400644 ep = lookdict(mp, key, hash, value_addr);
645 /* lookdict expects a combined-table, so fix value_addr */
646 i = ep - ep0;
647 *value_addr = &mp->ma_values[i];
648 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400649 }
650 i = (size_t)hash & mask;
651 ep = &ep0[i];
652 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
653 if (ep->me_key == NULL || ep->me_key == key ||
654 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
655 *value_addr = &mp->ma_values[i];
656 return ep;
657 }
658 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
659 i = (i << 2) + i + perturb + 1;
660 ep = &ep0[i & mask];
661 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
662 if (ep->me_key == NULL || ep->me_key == key ||
663 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
664 *value_addr = &mp->ma_values[i & mask];
665 return ep;
666 }
667 }
668 assert(0); /* NOT REACHED */
669 return 0;
670}
671
Benjamin Petersonfb886362010-04-24 18:21:17 +0000672int
673_PyDict_HasOnlyStringKeys(PyObject *dict)
674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 Py_ssize_t pos = 0;
676 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +0000677 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 /* Shortcut */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400679 if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 return 1;
681 while (PyDict_Next(dict, &pos, &key, &value))
682 if (!PyUnicode_Check(key))
683 return 0;
684 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +0000685}
686
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000687#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 do { \
689 if (!_PyObject_GC_IS_TRACKED(mp)) { \
690 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
691 _PyObject_GC_MAY_BE_TRACKED(value)) { \
692 _PyObject_GC_TRACK(mp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 } \
694 } \
695 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000696
697void
698_PyDict_MaybeUntrack(PyObject *op)
699{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 PyDictObject *mp;
701 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400702 Py_ssize_t i, size;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
705 return;
706
707 mp = (PyDictObject *) op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400708 size = DK_SIZE(mp->ma_keys);
709 if (_PyDict_HasSplitTable(mp)) {
710 for (i = 0; i < size; i++) {
711 if ((value = mp->ma_values[i]) == NULL)
712 continue;
713 if (_PyObject_GC_MAY_BE_TRACKED(value)) {
714 assert(!_PyObject_GC_MAY_BE_TRACKED(
715 mp->ma_keys->dk_entries[i].me_key));
716 return;
717 }
718 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400720 else {
721 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
722 for (i = 0; i < size; i++) {
723 if ((value = ep0[i].me_value) == NULL)
724 continue;
725 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
726 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
727 return;
728 }
729 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000731}
732
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400733/* Internal function to find slot for an item from its hash
734 * when it is known that the key is not present in the dict.
735 */
736static PyDictKeyEntry *
737find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
738 PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000739{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400740 size_t i;
741 size_t perturb;
742 size_t mask = DK_MASK(mp->ma_keys);
743 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
744 PyDictKeyEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000745
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400746 assert(key != NULL);
747 if (!PyUnicode_CheckExact(key))
748 mp->ma_keys->dk_lookup = lookdict;
749 i = hash & mask;
750 ep = &ep0[i];
751 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
752 i = (i << 2) + i + perturb + 1;
753 ep = &ep0[i & mask];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400755 assert(ep->me_value == NULL);
756 if (mp->ma_values)
757 *value_addr = &mp->ma_values[i & mask];
758 else
759 *value_addr = &ep->me_value;
760 return ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000761}
762
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400763static int
764insertion_resize(PyDictObject *mp)
765{
766 /*
767 * Double the size of the dict,
768 * Previous versions quadrupled size, but doing so may result in excessive
769 * memory use. Doubling keeps the number of resizes low without wasting
770 * too much memory.
771 */
772 return dictresize(mp, 2 * mp->ma_used);
773}
Antoine Pitroue965d972012-02-27 00:45:12 +0100774
775/*
776Internal routine to insert a new item into the table.
777Used both by the internal resize routine and by the public insert routine.
778Eats a reference to key and one to value.
779Returns -1 if an error occurred, or 0 on success.
780*/
781static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400782insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +0100783{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400784 PyObject *old_value;
785 PyObject **value_addr;
786 PyDictKeyEntry *ep;
787 assert(key != dummy);
Antoine Pitroue965d972012-02-27 00:45:12 +0100788
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400789 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
790 if (insertion_resize(mp) < 0)
791 return -1;
792 }
793
794 ep = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr);
Antoine Pitroue965d972012-02-27 00:45:12 +0100795 if (ep == NULL) {
796 Py_DECREF(key);
797 Py_DECREF(value);
798 return -1;
799 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400800 MAINTAIN_TRACKING(mp, key, value);
801 old_value = *value_addr;
802 if (old_value != NULL) {
803 assert(ep->me_key != NULL && ep->me_key != dummy);
804 *value_addr = value;
805 Py_DECREF(old_value); /* which **CAN** re-enter */
806 Py_DECREF(key);
807 }
808 else {
809 if (ep->me_key == NULL) {
810 if (mp->ma_keys->dk_usable <= 0) {
811 /* Need to resize. */
812 if (insertion_resize(mp) < 0) {
813 Py_DECREF(key);
814 Py_DECREF(value);
815 return -1;
816 }
817 ep = find_empty_slot(mp, key, hash, &value_addr);
818 }
819 mp->ma_keys->dk_usable--;
820 assert(mp->ma_keys->dk_usable >= 0);
821 ep->me_key = key;
822 ep->me_hash = hash;
823 }
824 else {
825 if (ep->me_key == dummy) {
826 ep->me_key = key;
827 ep->me_hash = hash;
828 Py_DECREF(dummy);
829 } else {
830 Py_DECREF(key);
831 assert(_PyDict_HasSplitTable(mp));
832 }
833 }
834 mp->ma_used++;
835 *value_addr = value;
836 }
837 assert(ep->me_key != NULL && ep->me_key != dummy);
838 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
839 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +0100840}
841
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000842/*
843Internal routine used by dictresize() to insert an item which is
844known to be absent from the dict. This routine also assumes that
845the dict contains no deleted entries. Besides the performance benefit,
846using insertdict() in dictresize() is dangerous (SF bug #1456209).
847Note that no refcounts are changed by this routine; if needed, the caller
848is responsible for incref'ing `key` and `value`.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400849Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
850must set them correctly
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000851*/
852static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400853insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000855{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400856 size_t i;
857 size_t perturb;
858 PyDictKeysObject *k = mp->ma_keys;
859 size_t mask = (size_t)DK_SIZE(k)-1;
860 PyDictKeyEntry *ep0 = &k->dk_entries[0];
861 PyDictKeyEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000862
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400863 assert(k->dk_lookup != NULL);
864 assert(value != NULL);
865 assert(key != NULL);
866 assert(key != dummy);
867 assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
868 i = hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 ep = &ep0[i];
870 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
871 i = (i << 2) + i + perturb + 1;
872 ep = &ep0[i & mask];
873 }
874 assert(ep->me_value == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000876 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000878}
879
880/*
881Restructure the table by allocating a new table and reinserting all
882items again. When entries have been deleted, the new table may
883actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400884If a table is split (its keys and hashes are shared, its values are not),
885then the values are temporarily copied into the table, it is resized as
886a combined table, then the me_value slots in the old table are NULLed out.
887After resizing a table is always combined,
888but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000889*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000890static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000891dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000892{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 Py_ssize_t newsize;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400894 PyDictKeysObject *oldkeys;
895 PyObject **oldvalues;
896 Py_ssize_t i, oldsize;
Tim Peters91a364d2001-05-19 07:04:38 +0000897
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400898/* Find the smallest table size > minused. */
899 for (newsize = PyDict_MINSIZE_COMBINED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 newsize <= minused && newsize > 0;
901 newsize <<= 1)
902 ;
903 if (newsize <= 0) {
904 PyErr_NoMemory();
905 return -1;
906 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400907 oldkeys = mp->ma_keys;
908 oldvalues = mp->ma_values;
909 /* Allocate a new table. */
910 mp->ma_keys = new_keys_object(newsize);
911 if (mp->ma_keys == NULL) {
912 mp->ma_keys = oldkeys;
913 return -1;
914 }
915 if (oldkeys->dk_lookup == lookdict)
916 mp->ma_keys->dk_lookup = lookdict;
917 oldsize = DK_SIZE(oldkeys);
918 mp->ma_values = NULL;
919 /* If empty then nothing to copy so just return */
920 if (oldsize == 1) {
921 assert(oldkeys == Py_EMPTY_KEYS);
922 DK_DECREF(oldkeys);
923 return 0;
924 }
925 /* Main loop below assumes we can transfer refcount to new keys
926 * and that value is stored in me_value.
927 * Increment ref-counts and copy values here to compensate
928 * This (resizing a split table) should be relatively rare */
929 if (oldvalues != NULL) {
930 for (i = 0; i < oldsize; i++) {
931 if (oldvalues[i] != NULL) {
932 Py_INCREF(oldkeys->dk_entries[i].me_key);
933 oldkeys->dk_entries[i].me_value = oldvalues[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 }
936 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400937 /* Main loop */
938 for (i = 0; i < oldsize; i++) {
939 PyDictKeyEntry *ep = &oldkeys->dk_entries[i];
940 if (ep->me_value != NULL) {
941 assert(ep->me_key != dummy);
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000942 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400945 mp->ma_keys->dk_usable -= mp->ma_used;
946 if (oldvalues != NULL) {
947 /* NULL out me_value slot in oldkeys, in case it was shared */
948 for (i = 0; i < oldsize; i++)
949 oldkeys->dk_entries[i].me_value = NULL;
950 assert(oldvalues != empty_values);
951 free_values(oldvalues);
952 DK_DECREF(oldkeys);
953 }
954 else {
955 assert(oldkeys->dk_lookup != lookdict_split);
956 if (oldkeys->dk_lookup != lookdict_unicode_nodummy) {
957 PyDictKeyEntry *ep0 = &oldkeys->dk_entries[0];
958 for (i = 0; i < oldsize; i++) {
959 if (ep0[i].me_key == dummy)
960 Py_DECREF(dummy);
961 }
962 }
963 assert(oldkeys->dk_refcnt == 1);
964 PyMem_FREE(oldkeys);
965 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000967}
968
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400969static PyDictKeysObject *
970make_keys_shared(PyObject *op)
971{
972 Py_ssize_t i;
973 Py_ssize_t size;
974 PyDictObject *mp = (PyDictObject *)op;
975
976 assert(PyDict_CheckExact(op));
977 if (!_PyDict_HasSplitTable(mp)) {
978 PyDictKeyEntry *ep0;
979 PyObject **values;
980 assert(mp->ma_keys->dk_refcnt == 1);
981 if (mp->ma_keys->dk_lookup == lookdict) {
982 return NULL;
983 }
984 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
985 /* Remove dummy keys */
986 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
987 return NULL;
988 }
989 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
990 /* Copy values into a new array */
991 ep0 = &mp->ma_keys->dk_entries[0];
992 size = DK_SIZE(mp->ma_keys);
993 values = new_values(size);
994 if (values == NULL) {
995 PyErr_SetString(PyExc_MemoryError,
996 "Not enough memory to allocate new values array");
997 return NULL;
998 }
999 for (i = 0; i < size; i++) {
1000 values[i] = ep0[i].me_value;
1001 ep0[i].me_value = NULL;
1002 }
1003 mp->ma_keys->dk_lookup = lookdict_split;
1004 mp->ma_values = values;
1005 }
1006 DK_INCREF(mp->ma_keys);
1007 return mp->ma_keys;
1008}
Christian Heimes99170a52007-12-19 02:07:34 +00001009
1010PyObject *
1011_PyDict_NewPresized(Py_ssize_t minused)
1012{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001013 Py_ssize_t newsize;
1014 PyDictKeysObject *new_keys;
1015 for (newsize = PyDict_MINSIZE_COMBINED;
1016 newsize <= minused && newsize > 0;
1017 newsize <<= 1)
1018 ;
1019 new_keys = new_keys_object(newsize);
1020 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001022 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001023}
1024
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001025/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1026 * that may occur (originally dicts supported only string keys, and exceptions
1027 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001028 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001029 * (suppressed) occurred while computing the key's hash, or that some error
1030 * (suppressed) occurred when comparing keys in the dict's internal probe
1031 * sequence. A nasty example of the latter is when a Python-coded comparison
1032 * function hits a stack-depth error, which can cause this to return NULL
1033 * even if the key is present.
1034 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001035PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001036PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001037{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001038 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001040 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001042 PyObject **value_addr;
1043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 if (!PyDict_Check(op))
1045 return NULL;
1046 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001047 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 {
1049 hash = PyObject_Hash(key);
1050 if (hash == -1) {
1051 PyErr_Clear();
1052 return NULL;
1053 }
1054 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 /* We can arrive here with a NULL tstate during initialization: try
1057 running "python -Wi" for an example related to string interning.
1058 Let's just hope that no exception occurs then... This must be
1059 _PyThreadState_Current and not PyThreadState_GET() because in debug
1060 mode, the latter complains if tstate is NULL. */
1061 tstate = (PyThreadState*)_Py_atomic_load_relaxed(
1062 &_PyThreadState_Current);
1063 if (tstate != NULL && tstate->curexc_type != NULL) {
1064 /* preserve the existing exception */
1065 PyObject *err_type, *err_value, *err_tb;
1066 PyErr_Fetch(&err_type, &err_value, &err_tb);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001067 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 /* ignore errors */
1069 PyErr_Restore(err_type, err_value, err_tb);
1070 if (ep == NULL)
1071 return NULL;
1072 }
1073 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001074 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 if (ep == NULL) {
1076 PyErr_Clear();
1077 return NULL;
1078 }
1079 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001080 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001081}
1082
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001083/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1084 This returns NULL *with* an exception set if an exception occurred.
1085 It returns NULL *without* an exception set if the key wasn't present.
1086*/
1087PyObject *
1088PyDict_GetItemWithError(PyObject *op, PyObject *key)
1089{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001090 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001092 PyDictKeyEntry *ep;
1093 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 if (!PyDict_Check(op)) {
1096 PyErr_BadInternalCall();
1097 return NULL;
1098 }
1099 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001100 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 {
1102 hash = PyObject_Hash(key);
1103 if (hash == -1) {
1104 return NULL;
1105 }
1106 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001107
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001108 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 if (ep == NULL)
1110 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001111 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001112}
1113
Brett Cannonfd074152012-04-14 14:10:13 -04001114PyObject *
1115_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1116{
1117 PyObject *kv;
1118 kv = _PyUnicode_FromId(key); /* borrowed */
1119 if (kv == NULL)
1120 return NULL;
1121 return PyDict_GetItemWithError(dp, kv);
1122}
1123
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001124/* Fast version of global value lookup.
1125 * Lookup in globals, then builtins.
1126 */
1127PyObject *
1128_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001129{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001130 PyObject *x;
1131 if (PyUnicode_CheckExact(key)) {
1132 PyObject **value_addr;
1133 Py_hash_t hash = ((PyASCIIObject *)key)->hash;
1134 if (hash != -1) {
1135 PyDictKeyEntry *e;
1136 e = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr);
1137 if (e == NULL) {
1138 return NULL;
1139 }
1140 x = *value_addr;
1141 if (x != NULL)
1142 return x;
1143 e = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr);
1144 if (e == NULL) {
1145 return NULL;
1146 }
1147 x = *value_addr;
1148 return x;
1149 }
Antoine Pitroue965d972012-02-27 00:45:12 +01001150 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001151 x = PyDict_GetItemWithError((PyObject *)globals, key);
1152 if (x != NULL)
1153 return x;
1154 if (PyErr_Occurred())
1155 return NULL;
1156 return PyDict_GetItemWithError((PyObject *)builtins, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001157}
1158
Antoine Pitroue965d972012-02-27 00:45:12 +01001159/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1160 * dictionary if it's merely replacing the value for an existing key.
1161 * This means that it's safe to loop over a dictionary with PyDict_Next()
1162 * and occasionally replace a value -- but you can't insert new keys or
1163 * remove them.
1164 */
1165int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001166PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001167{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001168 PyDictObject *mp;
1169 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001170 if (!PyDict_Check(op)) {
1171 PyErr_BadInternalCall();
1172 return -1;
1173 }
1174 assert(key);
1175 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001176 mp = (PyDictObject *)op;
1177 if (!PyUnicode_CheckExact(key) ||
1178 (hash = ((PyASCIIObject *) key)->hash) == -1)
1179 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001180 hash = PyObject_Hash(key);
1181 if (hash == -1)
1182 return -1;
1183 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001184 Py_INCREF(value);
1185 Py_INCREF(key);
1186
1187 /* insertdict() handles any resizing that might be necessary */
1188 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001189}
1190
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001191int
Tim Peters1f5871e2000-07-04 17:44:48 +00001192PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001193{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001194 PyDictObject *mp;
1195 Py_hash_t hash;
1196 PyDictKeyEntry *ep;
1197 PyObject *old_key, *old_value;
1198 PyObject **value_addr;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 if (!PyDict_Check(op)) {
1201 PyErr_BadInternalCall();
1202 return -1;
1203 }
1204 assert(key);
1205 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001206 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 hash = PyObject_Hash(key);
1208 if (hash == -1)
1209 return -1;
1210 }
1211 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001212 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 if (ep == NULL)
1214 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001215 if (*value_addr == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 set_key_error(key);
1217 return -1;
1218 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001219 old_value = *value_addr;
1220 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001222 if (!_PyDict_HasSplitTable(mp)) {
1223 ENSURE_ALLOWS_DELETIONS(mp);
1224 old_key = ep->me_key;
1225 Py_INCREF(dummy);
1226 ep->me_key = dummy;
1227 Py_DECREF(old_key);
1228 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001231}
1232
Guido van Rossum25831651993-05-19 14:50:45 +00001233void
Tim Peters1f5871e2000-07-04 17:44:48 +00001234PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001237 PyDictKeysObject *oldkeys;
1238 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 if (!PyDict_Check(op))
1242 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001243 mp = ((PyDictObject *)op);
1244 oldkeys = mp->ma_keys;
1245 oldvalues = mp->ma_values;
1246 if (oldvalues == empty_values)
1247 return;
1248 /* Empty the dict... */
1249 DK_INCREF(Py_EMPTY_KEYS);
1250 mp->ma_keys = Py_EMPTY_KEYS;
1251 mp->ma_values = empty_values;
1252 mp->ma_used = 0;
1253 /* ...then clear the keys and values */
1254 if (oldvalues != NULL) {
1255 n = DK_SIZE(oldkeys);
1256 for (i = 0; i < n; i++)
1257 Py_CLEAR(oldvalues[i]);
1258 free_values(oldvalues);
1259 DK_DECREF(oldkeys);
1260 }
1261 else {
1262 assert(oldkeys->dk_refcnt == 1);
1263 free_keys_object(oldkeys);
1264 }
1265}
1266
1267/* Returns -1 if no more items (or op is not a dict),
1268 * index of item otherwise. Stores value in pvalue
1269 */
1270Py_LOCAL_INLINE(Py_ssize_t)
1271dict_next(PyObject *op, Py_ssize_t i, PyObject **pvalue)
1272{
1273 Py_ssize_t mask, offset;
1274 PyDictObject *mp;
1275 PyObject **value_ptr;
1276
1277
1278 if (!PyDict_Check(op))
1279 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001281 if (i < 0)
1282 return -1;
1283 if (mp->ma_values) {
1284 value_ptr = &mp->ma_values[i];
1285 offset = sizeof(PyObject *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001287 else {
1288 value_ptr = &mp->ma_keys->dk_entries[i].me_value;
1289 offset = sizeof(PyDictKeyEntry);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001291 mask = DK_MASK(mp->ma_keys);
1292 while (i <= mask && *value_ptr == NULL) {
1293 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1294 i++;
1295 }
1296 if (i > mask)
1297 return -1;
1298 if (pvalue)
1299 *pvalue = *value_ptr;
1300 return i;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001301}
1302
Tim Peters080c88b2003-02-15 03:01:11 +00001303/*
1304 * Iterate over a dict. Use like so:
1305 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001306 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001307 * PyObject *key, *value;
1308 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001309 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +00001310 * Refer to borrowed references in key and value.
1311 * }
1312 *
1313 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001314 * mutates the dict. One exception: it is safe if the loop merely changes
1315 * the values associated with the keys (but doesn't insert new keys or
1316 * delete keys), via PyDict_SetItem().
1317 */
Guido van Rossum25831651993-05-19 14:50:45 +00001318int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001319PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001320{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001321 PyDictObject *mp;
1322 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 if (i < 0)
1324 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001325 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 *ppos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001328 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001330}
1331
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001332/* Internal version of PyDict_Next that returns a hash value in addition
1333 * to the key and value.
1334 */
Thomas Wouterscf297e42007-02-23 15:07:44 +00001335int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001336_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1337 PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001338{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001339 PyDictObject *mp;
1340 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 if (i < 0)
1342 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001343 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 *ppos = i+1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001345 *phash = mp->ma_keys->dk_entries[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001347 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001349}
1350
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001351/* Methods */
1352
1353static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001354dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001355{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001356 PyObject **values = mp->ma_values;
1357 PyDictKeysObject *keys = mp->ma_keys;
1358 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 PyObject_GC_UnTrack(mp);
1360 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001361 if (values != NULL) {
1362 if (values != empty_values) {
1363 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
1364 Py_XDECREF(values[i]);
1365 }
1366 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001368 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001370 else {
1371 free_keys_object(keys);
1372 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1374 free_list[numfree++] = mp;
1375 else
1376 Py_TYPE(mp)->tp_free((PyObject *)mp);
1377 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001378}
1379
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001380
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001381static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001382dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 Py_ssize_t i;
1385 PyObject *s, *temp, *colon = NULL;
1386 PyObject *pieces = NULL, *result = NULL;
1387 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 i = Py_ReprEnter((PyObject *)mp);
1390 if (i != 0) {
1391 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1392 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 if (mp->ma_used == 0) {
1395 result = PyUnicode_FromString("{}");
1396 goto Done;
1397 }
Tim Petersa7259592001-06-16 05:11:17 +00001398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 pieces = PyList_New(0);
1400 if (pieces == NULL)
1401 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 colon = PyUnicode_FromString(": ");
1404 if (colon == NULL)
1405 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 /* Do repr() on each key+value pair, and insert ": " between them.
1408 Note that repr may mutate the dict. */
1409 i = 0;
1410 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
1411 int status;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001412 /* Prevent repr from deleting key or value during key format. */
1413 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 Py_INCREF(value);
1415 s = PyObject_Repr(key);
1416 PyUnicode_Append(&s, colon);
1417 PyUnicode_AppendAndDel(&s, PyObject_Repr(value));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001418 Py_DECREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 Py_DECREF(value);
1420 if (s == NULL)
1421 goto Done;
1422 status = PyList_Append(pieces, s);
1423 Py_DECREF(s); /* append created a new ref */
1424 if (status < 0)
1425 goto Done;
1426 }
Tim Petersa7259592001-06-16 05:11:17 +00001427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 /* Add "{}" decorations to the first and last items. */
1429 assert(PyList_GET_SIZE(pieces) > 0);
1430 s = PyUnicode_FromString("{");
1431 if (s == NULL)
1432 goto Done;
1433 temp = PyList_GET_ITEM(pieces, 0);
1434 PyUnicode_AppendAndDel(&s, temp);
1435 PyList_SET_ITEM(pieces, 0, s);
1436 if (s == NULL)
1437 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 s = PyUnicode_FromString("}");
1440 if (s == NULL)
1441 goto Done;
1442 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
1443 PyUnicode_AppendAndDel(&temp, s);
1444 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1445 if (temp == NULL)
1446 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 /* Paste them all together with ", " between. */
1449 s = PyUnicode_FromString(", ");
1450 if (s == NULL)
1451 goto Done;
1452 result = PyUnicode_Join(s, pieces);
1453 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001454
1455Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 Py_XDECREF(pieces);
1457 Py_XDECREF(colon);
1458 Py_ReprLeave((PyObject *)mp);
1459 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001460}
1461
Martin v. Löwis18e16552006-02-15 17:27:45 +00001462static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001463dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001466}
1467
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001468static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001469dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 PyObject *v;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001472 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001473 PyDictKeyEntry *ep;
1474 PyObject **value_addr;
1475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001477 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 hash = PyObject_Hash(key);
1479 if (hash == -1)
1480 return NULL;
1481 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001482 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 if (ep == NULL)
1484 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001485 v = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 if (v == NULL) {
1487 if (!PyDict_CheckExact(mp)) {
1488 /* Look up __missing__ method if we're a subclass. */
1489 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05001490 _Py_IDENTIFIER(__missing__);
1491 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 if (missing != NULL) {
1493 res = PyObject_CallFunctionObjArgs(missing,
1494 key, NULL);
1495 Py_DECREF(missing);
1496 return res;
1497 }
1498 else if (PyErr_Occurred())
1499 return NULL;
1500 }
1501 set_key_error(key);
1502 return NULL;
1503 }
1504 else
1505 Py_INCREF(v);
1506 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001507}
1508
1509static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001510dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 if (w == NULL)
1513 return PyDict_DelItem((PyObject *)mp, v);
1514 else
1515 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001516}
1517
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001518static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 (lenfunc)dict_length, /*mp_length*/
1520 (binaryfunc)dict_subscript, /*mp_subscript*/
1521 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001522};
1523
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001524static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001525dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 register PyObject *v;
1528 register Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001529 PyDictKeyEntry *ep;
1530 Py_ssize_t size, n, offset;
1531 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001532
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001533 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 n = mp->ma_used;
1535 v = PyList_New(n);
1536 if (v == NULL)
1537 return NULL;
1538 if (n != mp->ma_used) {
1539 /* Durnit. The allocations caused the dict to resize.
1540 * Just start over, this shouldn't normally happen.
1541 */
1542 Py_DECREF(v);
1543 goto again;
1544 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001545 ep = &mp->ma_keys->dk_entries[0];
1546 size = DK_SIZE(mp->ma_keys);
1547 if (mp->ma_values) {
1548 value_ptr = mp->ma_values;
1549 offset = sizeof(PyObject *);
1550 }
1551 else {
1552 value_ptr = &ep[0].me_value;
1553 offset = sizeof(PyDictKeyEntry);
1554 }
1555 for (i = 0, j = 0; i < size; i++) {
1556 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 PyObject *key = ep[i].me_key;
1558 Py_INCREF(key);
1559 PyList_SET_ITEM(v, j, key);
1560 j++;
1561 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001562 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 }
1564 assert(j == n);
1565 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001566}
1567
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001569dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001570{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 register PyObject *v;
1572 register Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001573 Py_ssize_t size, n, offset;
1574 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001575
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001576 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 n = mp->ma_used;
1578 v = PyList_New(n);
1579 if (v == NULL)
1580 return NULL;
1581 if (n != mp->ma_used) {
1582 /* Durnit. The allocations caused the dict to resize.
1583 * Just start over, this shouldn't normally happen.
1584 */
1585 Py_DECREF(v);
1586 goto again;
1587 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001588 size = DK_SIZE(mp->ma_keys);
1589 if (mp->ma_values) {
1590 value_ptr = mp->ma_values;
1591 offset = sizeof(PyObject *);
1592 }
1593 else {
1594 value_ptr = &mp->ma_keys->dk_entries[0].me_value;
1595 offset = sizeof(PyDictKeyEntry);
1596 }
1597 for (i = 0, j = 0; i < size; i++) {
1598 PyObject *value = *value_ptr;
1599 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1600 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 Py_INCREF(value);
1602 PyList_SET_ITEM(v, j, value);
1603 j++;
1604 }
1605 }
1606 assert(j == n);
1607 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001608}
1609
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001610static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001611dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 register PyObject *v;
1614 register Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001615 Py_ssize_t size, offset;
1616 PyObject *item, *key;
1617 PyDictKeyEntry *ep;
1618 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 /* Preallocate the list of tuples, to avoid allocations during
1621 * the loop over the items, which could trigger GC, which
1622 * could resize the dict. :-(
1623 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001624 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 n = mp->ma_used;
1626 v = PyList_New(n);
1627 if (v == NULL)
1628 return NULL;
1629 for (i = 0; i < n; i++) {
1630 item = PyTuple_New(2);
1631 if (item == NULL) {
1632 Py_DECREF(v);
1633 return NULL;
1634 }
1635 PyList_SET_ITEM(v, i, item);
1636 }
1637 if (n != mp->ma_used) {
1638 /* Durnit. The allocations caused the dict to resize.
1639 * Just start over, this shouldn't normally happen.
1640 */
1641 Py_DECREF(v);
1642 goto again;
1643 }
1644 /* Nothing we do below makes any function calls. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001645 ep = mp->ma_keys->dk_entries;
1646 size = DK_SIZE(mp->ma_keys);
1647 if (mp->ma_values) {
1648 value_ptr = mp->ma_values;
1649 offset = sizeof(PyObject *);
1650 }
1651 else {
1652 value_ptr = &ep[0].me_value;
1653 offset = sizeof(PyDictKeyEntry);
1654 }
1655 for (i = 0, j = 0; i < size; i++) {
1656 PyObject *value = *value_ptr;
1657 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1658 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 key = ep[i].me_key;
1660 item = PyList_GET_ITEM(v, j);
1661 Py_INCREF(key);
1662 PyTuple_SET_ITEM(item, 0, key);
1663 Py_INCREF(value);
1664 PyTuple_SET_ITEM(item, 1, value);
1665 j++;
1666 }
1667 }
1668 assert(j == n);
1669 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001670}
1671
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001672static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001673dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 PyObject *seq;
1676 PyObject *value = Py_None;
1677 PyObject *it; /* iter(seq) */
1678 PyObject *key;
1679 PyObject *d;
1680 int status;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
1683 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 d = PyObject_CallObject(cls, NULL);
1686 if (d == NULL)
1687 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1690 PyDictObject *mp = (PyDictObject *)d;
1691 PyObject *oldvalue;
1692 Py_ssize_t pos = 0;
1693 PyObject *key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001694 Py_hash_t hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001695
Petri Lehtinena94200e2011-10-24 21:12:58 +03001696 if (dictresize(mp, Py_SIZE(seq))) {
1697 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001699 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1702 Py_INCREF(key);
1703 Py_INCREF(value);
Petri Lehtinena94200e2011-10-24 21:12:58 +03001704 if (insertdict(mp, key, hash, value)) {
1705 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001707 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 }
1709 return d;
1710 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
1713 PyDictObject *mp = (PyDictObject *)d;
1714 Py_ssize_t pos = 0;
1715 PyObject *key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001716 Py_hash_t hash;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001717
Petri Lehtinena94200e2011-10-24 21:12:58 +03001718 if (dictresize(mp, PySet_GET_SIZE(seq))) {
1719 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001721 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1724 Py_INCREF(key);
1725 Py_INCREF(value);
Petri Lehtinena94200e2011-10-24 21:12:58 +03001726 if (insertdict(mp, key, hash, value)) {
1727 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001729 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 }
1731 return d;
1732 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 it = PyObject_GetIter(seq);
1735 if (it == NULL){
1736 Py_DECREF(d);
1737 return NULL;
1738 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 if (PyDict_CheckExact(d)) {
1741 while ((key = PyIter_Next(it)) != NULL) {
1742 status = PyDict_SetItem(d, key, value);
1743 Py_DECREF(key);
1744 if (status < 0)
1745 goto Fail;
1746 }
1747 } else {
1748 while ((key = PyIter_Next(it)) != NULL) {
1749 status = PyObject_SetItem(d, key, value);
1750 Py_DECREF(key);
1751 if (status < 0)
1752 goto Fail;
1753 }
1754 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 if (PyErr_Occurred())
1757 goto Fail;
1758 Py_DECREF(it);
1759 return d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001760
1761Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 Py_DECREF(it);
1763 Py_DECREF(d);
1764 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001765}
1766
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001767static int
1768dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 PyObject *arg = NULL;
1771 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1774 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001777 _Py_IDENTIFIER(keys);
1778 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 result = PyDict_Merge(self, arg, 1);
1780 else
1781 result = PyDict_MergeFromSeq2(self, arg, 1);
1782 }
1783 if (result == 0 && kwds != NULL) {
1784 if (PyArg_ValidateKeywordArguments(kwds))
1785 result = PyDict_Merge(self, kwds, 1);
1786 else
1787 result = -1;
1788 }
1789 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001790}
1791
1792static PyObject *
1793dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 if (dict_update_common(self, args, kwds, "update") != -1)
1796 Py_RETURN_NONE;
1797 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001798}
1799
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001800/* Update unconditionally replaces existing items.
1801 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001802 otherwise it leaves existing items unchanged.
1803
1804 PyDict_{Update,Merge} update/merge from a mapping object.
1805
Tim Petersf582b822001-12-11 18:51:08 +00001806 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001807 producing iterable objects of length 2.
1808*/
1809
Tim Petersf582b822001-12-11 18:51:08 +00001810int
Tim Peters1fc240e2001-10-26 05:06:50 +00001811PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 PyObject *it; /* iter(seq2) */
1814 Py_ssize_t i; /* index into seq2 of current element */
1815 PyObject *item; /* seq2[i] */
1816 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 assert(d != NULL);
1819 assert(PyDict_Check(d));
1820 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 it = PyObject_GetIter(seq2);
1823 if (it == NULL)
1824 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 for (i = 0; ; ++i) {
1827 PyObject *key, *value;
1828 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 fast = NULL;
1831 item = PyIter_Next(it);
1832 if (item == NULL) {
1833 if (PyErr_Occurred())
1834 goto Fail;
1835 break;
1836 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 /* Convert item to sequence, and verify length 2. */
1839 fast = PySequence_Fast(item, "");
1840 if (fast == NULL) {
1841 if (PyErr_ExceptionMatches(PyExc_TypeError))
1842 PyErr_Format(PyExc_TypeError,
1843 "cannot convert dictionary update "
1844 "sequence element #%zd to a sequence",
1845 i);
1846 goto Fail;
1847 }
1848 n = PySequence_Fast_GET_SIZE(fast);
1849 if (n != 2) {
1850 PyErr_Format(PyExc_ValueError,
1851 "dictionary update sequence element #%zd "
1852 "has length %zd; 2 is required",
1853 i, n);
1854 goto Fail;
1855 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 /* Update/merge with this (key, value) pair. */
1858 key = PySequence_Fast_GET_ITEM(fast, 0);
1859 value = PySequence_Fast_GET_ITEM(fast, 1);
1860 if (override || PyDict_GetItem(d, key) == NULL) {
1861 int status = PyDict_SetItem(d, key, value);
1862 if (status < 0)
1863 goto Fail;
1864 }
1865 Py_DECREF(fast);
1866 Py_DECREF(item);
1867 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 i = 0;
1870 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00001871Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 Py_XDECREF(item);
1873 Py_XDECREF(fast);
1874 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001875Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 Py_DECREF(it);
1877 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001878}
1879
Tim Peters6d6c1a32001-08-02 04:15:00 +00001880int
1881PyDict_Update(PyObject *a, PyObject *b)
1882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001884}
1885
1886int
1887PyDict_Merge(PyObject *a, PyObject *b, int override)
1888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 register PyDictObject *mp, *other;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001890 register Py_ssize_t i, n;
1891 PyDictKeyEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 /* We accept for the argument either a concrete dictionary object,
1894 * or an abstract "mapping" object. For the former, we can do
1895 * things quite efficiently. For the latter, we only require that
1896 * PyMapping_Keys() and PyObject_GetItem() be supported.
1897 */
1898 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1899 PyErr_BadInternalCall();
1900 return -1;
1901 }
1902 mp = (PyDictObject*)a;
1903 if (PyDict_Check(b)) {
1904 other = (PyDictObject*)b;
1905 if (other == mp || other->ma_used == 0)
1906 /* a.update(a) or a.update({}); nothing to do */
1907 return 0;
1908 if (mp->ma_used == 0)
1909 /* Since the target dict is empty, PyDict_GetItem()
1910 * always returns NULL. Setting override to 1
1911 * skips the unnecessary test.
1912 */
1913 override = 1;
1914 /* Do one big resize at the start, rather than
1915 * incrementally resizing as we insert new items. Expect
1916 * that there will be no (or few) overlapping keys.
1917 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001918 if (mp->ma_keys->dk_usable * 3 < other->ma_used * 2)
1919 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001921 for (i = 0, n = DK_SIZE(other->ma_keys); i < n; i++) {
1922 PyObject *value;
1923 entry = &other->ma_keys->dk_entries[i];
1924 if (other->ma_values)
1925 value = other->ma_values[i];
1926 else
1927 value = entry->me_value;
1928
1929 if (value != NULL &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 (override ||
1931 PyDict_GetItem(a, entry->me_key) == NULL)) {
1932 Py_INCREF(entry->me_key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001933 Py_INCREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 if (insertdict(mp, entry->me_key,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001935 entry->me_hash,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001936 value) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 return -1;
1938 }
1939 }
1940 }
1941 else {
1942 /* Do it the generic, slower way */
1943 PyObject *keys = PyMapping_Keys(b);
1944 PyObject *iter;
1945 PyObject *key, *value;
1946 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 if (keys == NULL)
1949 /* Docstring says this is equivalent to E.keys() so
1950 * if E doesn't have a .keys() method we want
1951 * AttributeError to percolate up. Might as well
1952 * do the same for any other error.
1953 */
1954 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 iter = PyObject_GetIter(keys);
1957 Py_DECREF(keys);
1958 if (iter == NULL)
1959 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
1962 if (!override && PyDict_GetItem(a, key) != NULL) {
1963 Py_DECREF(key);
1964 continue;
1965 }
1966 value = PyObject_GetItem(b, key);
1967 if (value == NULL) {
1968 Py_DECREF(iter);
1969 Py_DECREF(key);
1970 return -1;
1971 }
1972 status = PyDict_SetItem(a, key, value);
1973 Py_DECREF(key);
1974 Py_DECREF(value);
1975 if (status < 0) {
1976 Py_DECREF(iter);
1977 return -1;
1978 }
1979 }
1980 Py_DECREF(iter);
1981 if (PyErr_Occurred())
1982 /* Iterator completed, via error */
1983 return -1;
1984 }
1985 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001986}
1987
1988static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001989dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001990{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001992}
1993
1994PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001995PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001998 PyDictObject *mp;
1999 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 if (o == NULL || !PyDict_Check(o)) {
2002 PyErr_BadInternalCall();
2003 return NULL;
2004 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002005 mp = (PyDictObject *)o;
2006 if (_PyDict_HasSplitTable(mp)) {
2007 PyDictObject *split_copy;
2008 PyObject **newvalues = new_values(DK_SIZE(mp->ma_keys));
2009 if (newvalues == NULL)
2010 return PyErr_NoMemory();
2011 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2012 if (split_copy == NULL) {
2013 free_values(newvalues);
2014 return NULL;
2015 }
2016 split_copy->ma_values = newvalues;
2017 split_copy->ma_keys = mp->ma_keys;
2018 split_copy->ma_used = mp->ma_used;
2019 DK_INCREF(mp->ma_keys);
2020 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2021 PyObject *value = mp->ma_values[i];
2022 Py_XINCREF(value);
2023 split_copy->ma_values[i] = value;
2024 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002025 if (_PyObject_GC_IS_TRACKED(mp))
2026 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002027 return (PyObject *)split_copy;
2028 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 copy = PyDict_New();
2030 if (copy == NULL)
2031 return NULL;
2032 if (PyDict_Merge(copy, o, 1) == 0)
2033 return copy;
2034 Py_DECREF(copy);
2035 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002036}
2037
Martin v. Löwis18e16552006-02-15 17:27:45 +00002038Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002039PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 if (mp == NULL || !PyDict_Check(mp)) {
2042 PyErr_BadInternalCall();
2043 return -1;
2044 }
2045 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002046}
2047
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002048PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002049PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 if (mp == NULL || !PyDict_Check(mp)) {
2052 PyErr_BadInternalCall();
2053 return NULL;
2054 }
2055 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002056}
2057
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002058PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002059PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 if (mp == NULL || !PyDict_Check(mp)) {
2062 PyErr_BadInternalCall();
2063 return NULL;
2064 }
2065 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002066}
2067
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002068PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002069PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002070{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 if (mp == NULL || !PyDict_Check(mp)) {
2072 PyErr_BadInternalCall();
2073 return NULL;
2074 }
2075 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002076}
2077
Tim Peterse63415e2001-05-08 04:38:29 +00002078/* Return 1 if dicts equal, 0 if not, -1 if error.
2079 * Gets out as soon as any difference is detected.
2080 * Uses only Py_EQ comparison.
2081 */
2082static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002083dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 if (a->ma_used != b->ma_used)
2088 /* can't be equal if # of entries differ */
2089 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002091 for (i = 0; i < DK_SIZE(a->ma_keys); i++) {
2092 PyDictKeyEntry *ep = &a->ma_keys->dk_entries[i];
2093 PyObject *aval;
2094 if (a->ma_values)
2095 aval = a->ma_values[i];
2096 else
2097 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 if (aval != NULL) {
2099 int cmp;
2100 PyObject *bval;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002101 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 /* temporarily bump aval's refcount to ensure it stays
2103 alive until we're done with it */
2104 Py_INCREF(aval);
2105 /* ditto for key */
2106 Py_INCREF(key);
2107 bval = PyDict_GetItemWithError((PyObject *)b, key);
2108 Py_DECREF(key);
2109 if (bval == NULL) {
2110 Py_DECREF(aval);
2111 if (PyErr_Occurred())
2112 return -1;
2113 return 0;
2114 }
2115 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2116 Py_DECREF(aval);
2117 if (cmp <= 0) /* error or not equal */
2118 return cmp;
2119 }
2120 }
2121 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002122}
Tim Peterse63415e2001-05-08 04:38:29 +00002123
2124static PyObject *
2125dict_richcompare(PyObject *v, PyObject *w, int op)
2126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 int cmp;
2128 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2131 res = Py_NotImplemented;
2132 }
2133 else if (op == Py_EQ || op == Py_NE) {
2134 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2135 if (cmp < 0)
2136 return NULL;
2137 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2138 }
2139 else
2140 res = Py_NotImplemented;
2141 Py_INCREF(res);
2142 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002143}
Tim Peterse63415e2001-05-08 04:38:29 +00002144
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002145static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002146dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002147{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002148 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002149 PyDictKeyEntry *ep;
2150 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002153 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 hash = PyObject_Hash(key);
2155 if (hash == -1)
2156 return NULL;
2157 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002158 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 if (ep == NULL)
2160 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002161 return PyBool_FromLong(*value_addr != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002162}
2163
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002164static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002165dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167 PyObject *key;
2168 PyObject *failobj = Py_None;
2169 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002170 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002171 PyDictKeyEntry *ep;
2172 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2175 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002178 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 hash = PyObject_Hash(key);
2180 if (hash == -1)
2181 return NULL;
2182 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002183 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 if (ep == NULL)
2185 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002186 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 if (val == NULL)
2188 val = failobj;
2189 Py_INCREF(val);
2190 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002191}
2192
Barry Warsawc38c5da1997-10-06 17:49:20 +00002193static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002194dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00002195{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 PyObject *key;
2197 PyObject *failobj = Py_None;
2198 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002199 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002200 PyDictKeyEntry *ep;
2201 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002203 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
2204 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00002205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002207 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002208 hash = PyObject_Hash(key);
2209 if (hash == -1)
2210 return NULL;
2211 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002212 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 if (ep == NULL)
2214 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002215 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 if (val == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002217 Py_INCREF(failobj);
2218 Py_INCREF(key);
2219 if (mp->ma_keys->dk_usable <= 0) {
2220 /* Need to resize. */
2221 if (insertion_resize(mp) < 0)
2222 return NULL;
2223 ep = find_empty_slot(mp, key, hash, &value_addr);
2224 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002225 MAINTAIN_TRACKING(mp, key, failobj);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002226 ep->me_key = key;
2227 ep->me_hash = hash;
2228 *value_addr = failobj;
2229 val = failobj;
2230 mp->ma_keys->dk_usable--;
2231 mp->ma_used++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002233 Py_INCREF(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00002235}
2236
2237
2238static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002239dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 PyDict_Clear((PyObject *)mp);
2242 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002243}
2244
Guido van Rossumba6ab842000-12-12 22:02:18 +00002245static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002246dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002247{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002248 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002249 PyObject *old_value, *old_key;
2250 PyObject *key, *deflt = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002251 PyDictKeyEntry *ep;
2252 PyObject **value_addr;
Guido van Rossume027d982002-04-12 15:11:59 +00002253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2255 return NULL;
2256 if (mp->ma_used == 0) {
2257 if (deflt) {
2258 Py_INCREF(deflt);
2259 return deflt;
2260 }
Raymond Hettingerdd421542010-10-30 08:10:29 +00002261 set_key_error(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 return NULL;
2263 }
2264 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002265 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 hash = PyObject_Hash(key);
2267 if (hash == -1)
2268 return NULL;
2269 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002270 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 if (ep == NULL)
2272 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002273 old_value = *value_addr;
2274 if (old_value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 if (deflt) {
2276 Py_INCREF(deflt);
2277 return deflt;
2278 }
2279 set_key_error(key);
2280 return NULL;
2281 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002282 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002284 if (!_PyDict_HasSplitTable(mp)) {
2285 ENSURE_ALLOWS_DELETIONS(mp);
2286 old_key = ep->me_key;
2287 Py_INCREF(dummy);
2288 ep->me_key = dummy;
2289 Py_DECREF(old_key);
2290 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 return old_value;
Guido van Rossume027d982002-04-12 15:11:59 +00002292}
2293
2294static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002295dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002296{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002297 Py_hash_t i = 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002298 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002300
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 /* Allocate the result tuple before checking the size. Believe it
2303 * or not, this allocation could trigger a garbage collection which
2304 * could empty the dict, so if we checked the size first and that
2305 * happened, the result would be an infinite loop (searching for an
2306 * entry that no longer exists). Note that the usual popitem()
2307 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2308 * tuple away if the dict *is* empty isn't a significant
2309 * inefficiency -- possible, but unlikely in practice.
2310 */
2311 res = PyTuple_New(2);
2312 if (res == NULL)
2313 return NULL;
2314 if (mp->ma_used == 0) {
2315 Py_DECREF(res);
2316 PyErr_SetString(PyExc_KeyError,
2317 "popitem(): dictionary is empty");
2318 return NULL;
2319 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002320 /* Convert split table to combined table */
2321 if (mp->ma_keys->dk_lookup == lookdict_split) {
2322 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2323 Py_DECREF(res);
2324 return NULL;
2325 }
2326 }
2327 ENSURE_ALLOWS_DELETIONS(mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 /* Set ep to "the first" dict entry with a value. We abuse the hash
2329 * field of slot 0 to hold a search finger:
2330 * If slot 0 has a value, use slot 0.
2331 * Else slot 0 is being used to hold a search finger,
2332 * and we use its hash value as the first index to look.
2333 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002334 ep = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 if (ep->me_value == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002336 Py_ssize_t mask = DK_MASK(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 i = ep->me_hash;
2338 /* The hash field may be a real hash value, or it may be a
2339 * legit search finger, or it may be a once-legit search
2340 * finger that's out of bounds now because it wrapped around
2341 * or the table shrunk -- simply make sure it's in bounds now.
2342 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002343 if (i > mask || i < 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 i = 1; /* skip slot 0 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002345 while ((ep = &mp->ma_keys->dk_entries[i])->me_value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002347 if (i > mask)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 i = 1;
2349 }
2350 }
2351 PyTuple_SET_ITEM(res, 0, ep->me_key);
2352 PyTuple_SET_ITEM(res, 1, ep->me_value);
2353 Py_INCREF(dummy);
2354 ep->me_key = dummy;
2355 ep->me_value = NULL;
2356 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002357 assert(mp->ma_keys->dk_entries[0].me_value == NULL);
2358 mp->ma_keys->dk_entries[0].me_hash = i + 1; /* next place to start */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002360}
2361
Jeremy Hylton8caad492000-06-23 14:18:11 +00002362static int
2363dict_traverse(PyObject *op, visitproc visit, void *arg)
2364{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002365 Py_ssize_t i, n;
2366 PyDictObject *mp = (PyDictObject *)op;
2367 if (mp->ma_keys->dk_lookup == lookdict) {
2368 for (i = 0; i < DK_SIZE(mp->ma_keys); i++) {
2369 if (mp->ma_keys->dk_entries[i].me_value != NULL) {
2370 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2371 Py_VISIT(mp->ma_keys->dk_entries[i].me_key);
2372 }
2373 }
2374 } else {
2375 if (mp->ma_values != NULL) {
2376 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2377 Py_VISIT(mp->ma_values[i]);
2378 }
2379 }
2380 else {
2381 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2382 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2383 }
2384 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 }
2386 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002387}
2388
2389static int
2390dict_tp_clear(PyObject *op)
2391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 PyDict_Clear(op);
2393 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002394}
2395
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002396static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002397
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002398static PyObject *
2399dict_sizeof(PyDictObject *mp)
2400{
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002401 Py_ssize_t size, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002402
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002403 size = DK_SIZE(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 res = sizeof(PyDictObject);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002405 if (mp->ma_values)
2406 res += size * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002407 /* If the dictionary is split, the keys portion is accounted-for
2408 in the type object. */
2409 if (mp->ma_keys->dk_refcnt == 1)
2410 res += sizeof(PyDictKeysObject) + (size-1) * sizeof(PyDictKeyEntry);
2411 return PyLong_FromSsize_t(res);
2412}
2413
2414Py_ssize_t
2415_PyDict_KeysSize(PyDictKeysObject *keys)
2416{
2417 return sizeof(PyDictKeysObject) + (DK_SIZE(keys)-1) * sizeof(PyDictKeyEntry);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002418}
2419
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002420PyDoc_STRVAR(contains__doc__,
2421"D.__contains__(k) -> True if D has a key k, else False");
2422
2423PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2424
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002425PyDoc_STRVAR(sizeof__doc__,
2426"D.__sizeof__() -> size of D in memory, in bytes");
2427
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002428PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002429"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002430
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002431PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002432"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 +00002433
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002434PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002435"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002436If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002437
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002438PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002439"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000024402-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002441
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002442PyDoc_STRVAR(update__doc__,
Georg Brandlac0675c2011-12-18 19:30:55 +01002443"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n"
2444"If E present and has a .keys() method, does: for k in E: D[k] = E[k]\n\
2445If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002446In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002447
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002448PyDoc_STRVAR(fromkeys__doc__,
2449"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
2450v defaults to None.");
2451
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002452PyDoc_STRVAR(clear__doc__,
2453"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002454
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002455PyDoc_STRVAR(copy__doc__,
2456"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002457
Guido van Rossumb90c8482007-02-10 01:11:45 +00002458/* Forward */
2459static PyObject *dictkeys_new(PyObject *);
2460static PyObject *dictitems_new(PyObject *);
2461static PyObject *dictvalues_new(PyObject *);
2462
Guido van Rossum45c85d12007-07-27 16:31:40 +00002463PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002465PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002467PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002469
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002470static PyMethodDef mapp_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
2472 contains__doc__},
2473 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2474 getitem__doc__},
2475 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2476 sizeof__doc__},
2477 {"get", (PyCFunction)dict_get, METH_VARARGS,
2478 get__doc__},
2479 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2480 setdefault_doc__},
2481 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2482 pop__doc__},
2483 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2484 popitem__doc__},
2485 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2486 keys__doc__},
2487 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2488 items__doc__},
2489 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2490 values__doc__},
2491 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2492 update__doc__},
2493 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2494 fromkeys__doc__},
2495 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2496 clear__doc__},
2497 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2498 copy__doc__},
2499 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002500};
2501
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002502/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002503int
2504PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002505{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002506 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002508 PyDictKeyEntry *ep;
2509 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002512 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 hash = PyObject_Hash(key);
2514 if (hash == -1)
2515 return -1;
2516 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002517 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2518 return (ep == NULL) ? -1 : (*value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002519}
2520
Thomas Wouterscf297e42007-02-23 15:07:44 +00002521/* Internal version of PyDict_Contains used when the hash value is already known */
2522int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002523_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002526 PyDictKeyEntry *ep;
2527 PyObject **value_addr;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002528
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002529 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2530 return (ep == NULL) ? -1 : (*value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002531}
2532
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002533/* Hack to implement "key in dict" */
2534static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 0, /* sq_length */
2536 0, /* sq_concat */
2537 0, /* sq_repeat */
2538 0, /* sq_item */
2539 0, /* sq_slice */
2540 0, /* sq_ass_item */
2541 0, /* sq_ass_slice */
2542 PyDict_Contains, /* sq_contains */
2543 0, /* sq_inplace_concat */
2544 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002545};
2546
Guido van Rossum09e563a2001-05-01 12:10:21 +00002547static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002548dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 PyObject *self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 assert(type != NULL && type->tp_alloc != NULL);
2553 self = type->tp_alloc(type, 0);
2554 if (self != NULL) {
2555 PyDictObject *d = (PyDictObject *)self;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002556 d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
2557 /* XXX - Should we raise a no-memory error? */
2558 if (d->ma_keys == NULL) {
2559 DK_INCREF(Py_EMPTY_KEYS);
2560 d->ma_keys = Py_EMPTY_KEYS;
2561 d->ma_values = empty_values;
2562 }
2563 d->ma_used = 0;
Ezio Melotti13925002011-03-16 11:05:33 +02002564 /* The object has been implicitly tracked by tp_alloc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 if (type == &PyDict_Type)
2566 _PyObject_GC_UNTRACK(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 }
2568 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002569}
2570
Tim Peters25786c02001-09-02 08:22:48 +00002571static int
2572dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002575}
2576
Tim Peters6d6c1a32001-08-02 04:15:00 +00002577static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002578dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002580 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002581}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002582
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002583PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002584"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002585"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002586" (key, value) pairs\n"
2587"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002588" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002589" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002590" d[k] = v\n"
2591"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2592" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002593
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002594PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2596 "dict",
2597 sizeof(PyDictObject),
2598 0,
2599 (destructor)dict_dealloc, /* tp_dealloc */
2600 0, /* tp_print */
2601 0, /* tp_getattr */
2602 0, /* tp_setattr */
2603 0, /* tp_reserved */
2604 (reprfunc)dict_repr, /* tp_repr */
2605 0, /* tp_as_number */
2606 &dict_as_sequence, /* tp_as_sequence */
2607 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002608 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 0, /* tp_call */
2610 0, /* tp_str */
2611 PyObject_GenericGetAttr, /* tp_getattro */
2612 0, /* tp_setattro */
2613 0, /* tp_as_buffer */
2614 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2615 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2616 dictionary_doc, /* tp_doc */
2617 dict_traverse, /* tp_traverse */
2618 dict_tp_clear, /* tp_clear */
2619 dict_richcompare, /* tp_richcompare */
2620 0, /* tp_weaklistoffset */
2621 (getiterfunc)dict_iter, /* tp_iter */
2622 0, /* tp_iternext */
2623 mapp_methods, /* tp_methods */
2624 0, /* tp_members */
2625 0, /* tp_getset */
2626 0, /* tp_base */
2627 0, /* tp_dict */
2628 0, /* tp_descr_get */
2629 0, /* tp_descr_set */
2630 0, /* tp_dictoffset */
2631 dict_init, /* tp_init */
2632 PyType_GenericAlloc, /* tp_alloc */
2633 dict_new, /* tp_new */
2634 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002635};
2636
Victor Stinner3c1e4812012-03-26 22:10:51 +02002637PyObject *
2638_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
2639{
2640 PyObject *kv;
2641 kv = _PyUnicode_FromId(key); /* borrowed */
2642 if (kv == NULL)
2643 return NULL;
2644 return PyDict_GetItem(dp, kv);
2645}
2646
Guido van Rossum3cca2451997-05-16 14:23:33 +00002647/* For backward compatibility with old dictionary interface */
2648
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002649PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002650PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 PyObject *kv, *rv;
2653 kv = PyUnicode_FromString(key);
2654 if (kv == NULL)
2655 return NULL;
2656 rv = PyDict_GetItem(v, kv);
2657 Py_DECREF(kv);
2658 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002659}
2660
2661int
Victor Stinner3c1e4812012-03-26 22:10:51 +02002662_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
2663{
2664 PyObject *kv;
2665 kv = _PyUnicode_FromId(key); /* borrowed */
2666 if (kv == NULL)
2667 return -1;
2668 return PyDict_SetItem(v, kv, item);
2669}
2670
2671int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002672PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 PyObject *kv;
2675 int err;
2676 kv = PyUnicode_FromString(key);
2677 if (kv == NULL)
2678 return -1;
2679 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2680 err = PyDict_SetItem(v, kv, item);
2681 Py_DECREF(kv);
2682 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002683}
2684
2685int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002686PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 PyObject *kv;
2689 int err;
2690 kv = PyUnicode_FromString(key);
2691 if (kv == NULL)
2692 return -1;
2693 err = PyDict_DelItem(v, kv);
2694 Py_DECREF(kv);
2695 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002696}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002697
Raymond Hettinger019a1482004-03-18 02:41:19 +00002698/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002699
2700typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 PyObject_HEAD
2702 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2703 Py_ssize_t di_used;
2704 Py_ssize_t di_pos;
2705 PyObject* di_result; /* reusable result tuple for iteritems */
2706 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002707} dictiterobject;
2708
2709static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002710dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 dictiterobject *di;
2713 di = PyObject_GC_New(dictiterobject, itertype);
2714 if (di == NULL)
2715 return NULL;
2716 Py_INCREF(dict);
2717 di->di_dict = dict;
2718 di->di_used = dict->ma_used;
2719 di->di_pos = 0;
2720 di->len = dict->ma_used;
2721 if (itertype == &PyDictIterItem_Type) {
2722 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2723 if (di->di_result == NULL) {
2724 Py_DECREF(di);
2725 return NULL;
2726 }
2727 }
2728 else
2729 di->di_result = NULL;
2730 _PyObject_GC_TRACK(di);
2731 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002732}
2733
2734static void
2735dictiter_dealloc(dictiterobject *di)
2736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 Py_XDECREF(di->di_dict);
2738 Py_XDECREF(di->di_result);
2739 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002740}
2741
2742static int
2743dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 Py_VISIT(di->di_dict);
2746 Py_VISIT(di->di_result);
2747 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002748}
2749
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002750static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002751dictiter_len(dictiterobject *di)
2752{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 Py_ssize_t len = 0;
2754 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2755 len = di->len;
2756 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002757}
2758
Guido van Rossumb90c8482007-02-10 01:11:45 +00002759PyDoc_STRVAR(length_hint_doc,
2760 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002761
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002762static PyObject *
2763dictiter_reduce(dictiterobject *di);
2764
2765PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2766
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002767static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2769 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002770 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
2771 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002772 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002773};
2774
Raymond Hettinger019a1482004-03-18 02:41:19 +00002775static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 PyObject *key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002778 register Py_ssize_t i, mask, offset;
2779 register PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002781 PyObject **value_ptr;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 if (d == NULL)
2784 return NULL;
2785 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 if (di->di_used != d->ma_used) {
2788 PyErr_SetString(PyExc_RuntimeError,
2789 "dictionary changed size during iteration");
2790 di->di_used = -1; /* Make this state sticky */
2791 return NULL;
2792 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 i = di->di_pos;
2795 if (i < 0)
2796 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002797 k = d->ma_keys;
2798 if (d->ma_values) {
2799 value_ptr = &d->ma_values[i];
2800 offset = sizeof(PyObject *);
2801 }
2802 else {
2803 value_ptr = &k->dk_entries[i].me_value;
2804 offset = sizeof(PyDictKeyEntry);
2805 }
2806 mask = DK_SIZE(k)-1;
2807 while (i <= mask && *value_ptr == NULL) {
2808 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002810 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 di->di_pos = i+1;
2812 if (i > mask)
2813 goto fail;
2814 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002815 key = k->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 Py_INCREF(key);
2817 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002818
2819fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 Py_DECREF(d);
2821 di->di_dict = NULL;
2822 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002823}
2824
Raymond Hettinger019a1482004-03-18 02:41:19 +00002825PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002826 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2827 "dict_keyiterator", /* tp_name */
2828 sizeof(dictiterobject), /* tp_basicsize */
2829 0, /* tp_itemsize */
2830 /* methods */
2831 (destructor)dictiter_dealloc, /* tp_dealloc */
2832 0, /* tp_print */
2833 0, /* tp_getattr */
2834 0, /* tp_setattr */
2835 0, /* tp_reserved */
2836 0, /* tp_repr */
2837 0, /* tp_as_number */
2838 0, /* tp_as_sequence */
2839 0, /* tp_as_mapping */
2840 0, /* tp_hash */
2841 0, /* tp_call */
2842 0, /* tp_str */
2843 PyObject_GenericGetAttr, /* tp_getattro */
2844 0, /* tp_setattro */
2845 0, /* tp_as_buffer */
2846 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2847 0, /* tp_doc */
2848 (traverseproc)dictiter_traverse, /* tp_traverse */
2849 0, /* tp_clear */
2850 0, /* tp_richcompare */
2851 0, /* tp_weaklistoffset */
2852 PyObject_SelfIter, /* tp_iter */
2853 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2854 dictiter_methods, /* tp_methods */
2855 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002856};
2857
2858static PyObject *dictiter_iternextvalue(dictiterobject *di)
2859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002861 register Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002863 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 if (d == NULL)
2866 return NULL;
2867 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002869 if (di->di_used != d->ma_used) {
2870 PyErr_SetString(PyExc_RuntimeError,
2871 "dictionary changed size during iteration");
2872 di->di_used = -1; /* Make this state sticky */
2873 return NULL;
2874 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002877 mask = DK_SIZE(d->ma_keys)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 if (i < 0 || i > mask)
2879 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002880 if (d->ma_values) {
2881 value_ptr = &d->ma_values[i];
2882 offset = sizeof(PyObject *);
2883 }
2884 else {
2885 value_ptr = &d->ma_keys->dk_entries[i].me_value;
2886 offset = sizeof(PyDictKeyEntry);
2887 }
2888 while (i <= mask && *value_ptr == NULL) {
2889 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 i++;
2891 if (i > mask)
2892 goto fail;
2893 }
2894 di->di_pos = i+1;
2895 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002896 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 Py_INCREF(value);
2898 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002899
2900fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901 Py_DECREF(d);
2902 di->di_dict = NULL;
2903 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002904}
2905
2906PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2908 "dict_valueiterator", /* tp_name */
2909 sizeof(dictiterobject), /* tp_basicsize */
2910 0, /* tp_itemsize */
2911 /* methods */
2912 (destructor)dictiter_dealloc, /* tp_dealloc */
2913 0, /* tp_print */
2914 0, /* tp_getattr */
2915 0, /* tp_setattr */
2916 0, /* tp_reserved */
2917 0, /* tp_repr */
2918 0, /* tp_as_number */
2919 0, /* tp_as_sequence */
2920 0, /* tp_as_mapping */
2921 0, /* tp_hash */
2922 0, /* tp_call */
2923 0, /* tp_str */
2924 PyObject_GenericGetAttr, /* tp_getattro */
2925 0, /* tp_setattro */
2926 0, /* tp_as_buffer */
2927 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2928 0, /* tp_doc */
2929 (traverseproc)dictiter_traverse, /* tp_traverse */
2930 0, /* tp_clear */
2931 0, /* tp_richcompare */
2932 0, /* tp_weaklistoffset */
2933 PyObject_SelfIter, /* tp_iter */
2934 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2935 dictiter_methods, /* tp_methods */
2936 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002937};
2938
2939static PyObject *dictiter_iternextitem(dictiterobject *di)
2940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002941 PyObject *key, *value, *result = di->di_result;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002942 register Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002944 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 if (d == NULL)
2947 return NULL;
2948 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 if (di->di_used != d->ma_used) {
2951 PyErr_SetString(PyExc_RuntimeError,
2952 "dictionary changed size during iteration");
2953 di->di_used = -1; /* Make this state sticky */
2954 return NULL;
2955 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957 i = di->di_pos;
2958 if (i < 0)
2959 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002960 mask = DK_SIZE(d->ma_keys)-1;
2961 if (d->ma_values) {
2962 value_ptr = &d->ma_values[i];
2963 offset = sizeof(PyObject *);
2964 }
2965 else {
2966 value_ptr = &d->ma_keys->dk_entries[i].me_value;
2967 offset = sizeof(PyDictKeyEntry);
2968 }
2969 while (i <= mask && *value_ptr == NULL) {
2970 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002972 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002973 di->di_pos = i+1;
2974 if (i > mask)
2975 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002977 if (result->ob_refcnt == 1) {
2978 Py_INCREF(result);
2979 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2980 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2981 } else {
2982 result = PyTuple_New(2);
2983 if (result == NULL)
2984 return NULL;
2985 }
2986 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002987 key = d->ma_keys->dk_entries[i].me_key;
2988 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002989 Py_INCREF(key);
2990 Py_INCREF(value);
2991 PyTuple_SET_ITEM(result, 0, key);
2992 PyTuple_SET_ITEM(result, 1, value);
2993 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002994
2995fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 Py_DECREF(d);
2997 di->di_dict = NULL;
2998 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002999}
3000
3001PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003002 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3003 "dict_itemiterator", /* tp_name */
3004 sizeof(dictiterobject), /* tp_basicsize */
3005 0, /* tp_itemsize */
3006 /* methods */
3007 (destructor)dictiter_dealloc, /* tp_dealloc */
3008 0, /* tp_print */
3009 0, /* tp_getattr */
3010 0, /* tp_setattr */
3011 0, /* tp_reserved */
3012 0, /* tp_repr */
3013 0, /* tp_as_number */
3014 0, /* tp_as_sequence */
3015 0, /* tp_as_mapping */
3016 0, /* tp_hash */
3017 0, /* tp_call */
3018 0, /* tp_str */
3019 PyObject_GenericGetAttr, /* tp_getattro */
3020 0, /* tp_setattro */
3021 0, /* tp_as_buffer */
3022 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3023 0, /* tp_doc */
3024 (traverseproc)dictiter_traverse, /* tp_traverse */
3025 0, /* tp_clear */
3026 0, /* tp_richcompare */
3027 0, /* tp_weaklistoffset */
3028 PyObject_SelfIter, /* tp_iter */
3029 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3030 dictiter_methods, /* tp_methods */
3031 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003032};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003033
3034
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003035static PyObject *
3036dictiter_reduce(dictiterobject *di)
3037{
3038 PyObject *list;
3039 dictiterobject tmp;
3040
3041 list = PyList_New(0);
3042 if (!list)
3043 return NULL;
3044
3045 /* copy the itertor state */
3046 tmp = *di;
3047 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003048
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003049 /* iterate the temporary into a list */
3050 for(;;) {
3051 PyObject *element = 0;
3052 if (Py_TYPE(di) == &PyDictIterItem_Type)
3053 element = dictiter_iternextitem(&tmp);
3054 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3055 element = dictiter_iternextkey(&tmp);
3056 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3057 element = dictiter_iternextvalue(&tmp);
3058 else
3059 assert(0);
3060 if (element) {
3061 if (PyList_Append(list, element)) {
3062 Py_DECREF(element);
3063 Py_DECREF(list);
3064 Py_XDECREF(tmp.di_dict);
3065 return NULL;
3066 }
3067 Py_DECREF(element);
3068 } else
3069 break;
3070 }
3071 Py_XDECREF(tmp.di_dict);
3072 /* check for error */
3073 if (tmp.di_dict != NULL) {
3074 /* we have an error */
3075 Py_DECREF(list);
3076 return NULL;
3077 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003078 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003079}
3080
Guido van Rossum3ac67412007-02-10 18:55:06 +00003081/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003082/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003083/***********************************************/
3084
Guido van Rossumb90c8482007-02-10 01:11:45 +00003085/* The instance lay-out is the same for all three; but the type differs. */
3086
3087typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003088 PyObject_HEAD
3089 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003090} dictviewobject;
3091
3092
3093static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00003094dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 Py_XDECREF(dv->dv_dict);
3097 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003098}
3099
3100static int
3101dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
3102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 Py_VISIT(dv->dv_dict);
3104 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003105}
3106
Guido van Rossum83825ac2007-02-10 04:54:19 +00003107static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00003108dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 Py_ssize_t len = 0;
3111 if (dv->dv_dict != NULL)
3112 len = dv->dv_dict->ma_used;
3113 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003114}
3115
3116static PyObject *
3117dictview_new(PyObject *dict, PyTypeObject *type)
3118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 dictviewobject *dv;
3120 if (dict == NULL) {
3121 PyErr_BadInternalCall();
3122 return NULL;
3123 }
3124 if (!PyDict_Check(dict)) {
3125 /* XXX Get rid of this restriction later */
3126 PyErr_Format(PyExc_TypeError,
3127 "%s() requires a dict argument, not '%s'",
3128 type->tp_name, dict->ob_type->tp_name);
3129 return NULL;
3130 }
3131 dv = PyObject_GC_New(dictviewobject, type);
3132 if (dv == NULL)
3133 return NULL;
3134 Py_INCREF(dict);
3135 dv->dv_dict = (PyDictObject *)dict;
3136 _PyObject_GC_TRACK(dv);
3137 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003138}
3139
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003140/* TODO(guido): The views objects are not complete:
3141
3142 * support more set operations
3143 * support arbitrary mappings?
3144 - either these should be static or exported in dictobject.h
3145 - if public then they should probably be in builtins
3146*/
3147
Guido van Rossumaac530c2007-08-24 22:33:45 +00003148/* Return 1 if self is a subset of other, iterating over self;
3149 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003150static int
3151all_contained_in(PyObject *self, PyObject *other)
3152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 PyObject *iter = PyObject_GetIter(self);
3154 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003156 if (iter == NULL)
3157 return -1;
3158 for (;;) {
3159 PyObject *next = PyIter_Next(iter);
3160 if (next == NULL) {
3161 if (PyErr_Occurred())
3162 ok = -1;
3163 break;
3164 }
3165 ok = PySequence_Contains(other, next);
3166 Py_DECREF(next);
3167 if (ok <= 0)
3168 break;
3169 }
3170 Py_DECREF(iter);
3171 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003172}
3173
3174static PyObject *
3175dictview_richcompare(PyObject *self, PyObject *other, int op)
3176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003177 Py_ssize_t len_self, len_other;
3178 int ok;
3179 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 assert(self != NULL);
3182 assert(PyDictViewSet_Check(self));
3183 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003184
Brian Curtindfc80e32011-08-10 20:28:54 -05003185 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3186 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 len_self = PyObject_Size(self);
3189 if (len_self < 0)
3190 return NULL;
3191 len_other = PyObject_Size(other);
3192 if (len_other < 0)
3193 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 ok = 0;
3196 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003198 case Py_NE:
3199 case Py_EQ:
3200 if (len_self == len_other)
3201 ok = all_contained_in(self, other);
3202 if (op == Py_NE && ok >= 0)
3203 ok = !ok;
3204 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 case Py_LT:
3207 if (len_self < len_other)
3208 ok = all_contained_in(self, other);
3209 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 case Py_LE:
3212 if (len_self <= len_other)
3213 ok = all_contained_in(self, other);
3214 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 case Py_GT:
3217 if (len_self > len_other)
3218 ok = all_contained_in(other, self);
3219 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 case Py_GE:
3222 if (len_self >= len_other)
3223 ok = all_contained_in(other, self);
3224 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 }
3227 if (ok < 0)
3228 return NULL;
3229 result = ok ? Py_True : Py_False;
3230 Py_INCREF(result);
3231 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003232}
3233
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003234static PyObject *
3235dictview_repr(dictviewobject *dv)
3236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 PyObject *seq;
3238 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 seq = PySequence_List((PyObject *)dv);
3241 if (seq == NULL)
3242 return NULL;
3243
3244 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3245 Py_DECREF(seq);
3246 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003247}
3248
Guido van Rossum3ac67412007-02-10 18:55:06 +00003249/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003250
3251static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003252dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 if (dv->dv_dict == NULL) {
3255 Py_RETURN_NONE;
3256 }
3257 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003258}
3259
3260static int
3261dictkeys_contains(dictviewobject *dv, PyObject *obj)
3262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 if (dv->dv_dict == NULL)
3264 return 0;
3265 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003266}
3267
Guido van Rossum83825ac2007-02-10 04:54:19 +00003268static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 (lenfunc)dictview_len, /* sq_length */
3270 0, /* sq_concat */
3271 0, /* sq_repeat */
3272 0, /* sq_item */
3273 0, /* sq_slice */
3274 0, /* sq_ass_item */
3275 0, /* sq_ass_slice */
3276 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003277};
3278
Guido van Rossum523259b2007-08-24 23:41:22 +00003279static PyObject*
3280dictviews_sub(PyObject* self, PyObject *other)
3281{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003282 PyObject *result = PySet_New(self);
3283 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003284 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 if (result == NULL)
3287 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003288
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003289 tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 if (tmp == NULL) {
3291 Py_DECREF(result);
3292 return NULL;
3293 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003295 Py_DECREF(tmp);
3296 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003297}
3298
3299static PyObject*
3300dictviews_and(PyObject* self, PyObject *other)
3301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 PyObject *result = PySet_New(self);
3303 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003304 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 if (result == NULL)
3307 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003308
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003309 tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 if (tmp == NULL) {
3311 Py_DECREF(result);
3312 return NULL;
3313 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 Py_DECREF(tmp);
3316 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003317}
3318
3319static PyObject*
3320dictviews_or(PyObject* self, PyObject *other)
3321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 PyObject *result = PySet_New(self);
3323 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003324 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003326 if (result == NULL)
3327 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003328
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003329 tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 if (tmp == NULL) {
3331 Py_DECREF(result);
3332 return NULL;
3333 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 Py_DECREF(tmp);
3336 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003337}
3338
3339static PyObject*
3340dictviews_xor(PyObject* self, PyObject *other)
3341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 PyObject *result = PySet_New(self);
3343 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003344 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 if (result == NULL)
3347 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003348
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003349 tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 other);
3351 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 PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 0, /*nb_add*/
3362 (binaryfunc)dictviews_sub, /*nb_subtract*/
3363 0, /*nb_multiply*/
3364 0, /*nb_remainder*/
3365 0, /*nb_divmod*/
3366 0, /*nb_power*/
3367 0, /*nb_negative*/
3368 0, /*nb_positive*/
3369 0, /*nb_absolute*/
3370 0, /*nb_bool*/
3371 0, /*nb_invert*/
3372 0, /*nb_lshift*/
3373 0, /*nb_rshift*/
3374 (binaryfunc)dictviews_and, /*nb_and*/
3375 (binaryfunc)dictviews_xor, /*nb_xor*/
3376 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003377};
3378
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003379static PyObject*
3380dictviews_isdisjoint(PyObject *self, PyObject *other)
3381{
3382 PyObject *it;
3383 PyObject *item = NULL;
3384
3385 if (self == other) {
3386 if (dictview_len((dictviewobject *)self) == 0)
3387 Py_RETURN_TRUE;
3388 else
3389 Py_RETURN_FALSE;
3390 }
3391
3392 /* Iterate over the shorter object (only if other is a set,
3393 * because PySequence_Contains may be expensive otherwise): */
3394 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
3395 Py_ssize_t len_self = dictview_len((dictviewobject *)self);
3396 Py_ssize_t len_other = PyObject_Size(other);
3397 if (len_other == -1)
3398 return NULL;
3399
3400 if ((len_other > len_self)) {
3401 PyObject *tmp = other;
3402 other = self;
3403 self = tmp;
3404 }
3405 }
3406
3407 it = PyObject_GetIter(other);
3408 if (it == NULL)
3409 return NULL;
3410
3411 while ((item = PyIter_Next(it)) != NULL) {
3412 int contains = PySequence_Contains(self, item);
3413 Py_DECREF(item);
3414 if (contains == -1) {
3415 Py_DECREF(it);
3416 return NULL;
3417 }
3418
3419 if (contains) {
3420 Py_DECREF(it);
3421 Py_RETURN_FALSE;
3422 }
3423 }
3424 Py_DECREF(it);
3425 if (PyErr_Occurred())
3426 return NULL; /* PyIter_Next raised an exception. */
3427 Py_RETURN_TRUE;
3428}
3429
3430PyDoc_STRVAR(isdisjoint_doc,
3431"Return True if the view and the given iterable have a null intersection.");
3432
Guido van Rossumb90c8482007-02-10 01:11:45 +00003433static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003434 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3435 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003436 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003437};
3438
3439PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3441 "dict_keys", /* tp_name */
3442 sizeof(dictviewobject), /* tp_basicsize */
3443 0, /* tp_itemsize */
3444 /* methods */
3445 (destructor)dictview_dealloc, /* tp_dealloc */
3446 0, /* tp_print */
3447 0, /* tp_getattr */
3448 0, /* tp_setattr */
3449 0, /* tp_reserved */
3450 (reprfunc)dictview_repr, /* tp_repr */
3451 &dictviews_as_number, /* tp_as_number */
3452 &dictkeys_as_sequence, /* tp_as_sequence */
3453 0, /* tp_as_mapping */
3454 0, /* tp_hash */
3455 0, /* tp_call */
3456 0, /* tp_str */
3457 PyObject_GenericGetAttr, /* tp_getattro */
3458 0, /* tp_setattro */
3459 0, /* tp_as_buffer */
3460 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3461 0, /* tp_doc */
3462 (traverseproc)dictview_traverse, /* tp_traverse */
3463 0, /* tp_clear */
3464 dictview_richcompare, /* tp_richcompare */
3465 0, /* tp_weaklistoffset */
3466 (getiterfunc)dictkeys_iter, /* tp_iter */
3467 0, /* tp_iternext */
3468 dictkeys_methods, /* tp_methods */
3469 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003470};
3471
3472static PyObject *
3473dictkeys_new(PyObject *dict)
3474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003475 return dictview_new(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003476}
3477
Guido van Rossum3ac67412007-02-10 18:55:06 +00003478/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003479
3480static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003481dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003483 if (dv->dv_dict == NULL) {
3484 Py_RETURN_NONE;
3485 }
3486 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003487}
3488
3489static int
3490dictitems_contains(dictviewobject *dv, PyObject *obj)
3491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003492 PyObject *key, *value, *found;
3493 if (dv->dv_dict == NULL)
3494 return 0;
3495 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3496 return 0;
3497 key = PyTuple_GET_ITEM(obj, 0);
3498 value = PyTuple_GET_ITEM(obj, 1);
3499 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3500 if (found == NULL) {
3501 if (PyErr_Occurred())
3502 return -1;
3503 return 0;
3504 }
3505 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003506}
3507
Guido van Rossum83825ac2007-02-10 04:54:19 +00003508static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003509 (lenfunc)dictview_len, /* sq_length */
3510 0, /* sq_concat */
3511 0, /* sq_repeat */
3512 0, /* sq_item */
3513 0, /* sq_slice */
3514 0, /* sq_ass_item */
3515 0, /* sq_ass_slice */
3516 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003517};
3518
Guido van Rossumb90c8482007-02-10 01:11:45 +00003519static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003520 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3521 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003523};
3524
3525PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003526 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3527 "dict_items", /* tp_name */
3528 sizeof(dictviewobject), /* tp_basicsize */
3529 0, /* tp_itemsize */
3530 /* methods */
3531 (destructor)dictview_dealloc, /* tp_dealloc */
3532 0, /* tp_print */
3533 0, /* tp_getattr */
3534 0, /* tp_setattr */
3535 0, /* tp_reserved */
3536 (reprfunc)dictview_repr, /* tp_repr */
3537 &dictviews_as_number, /* tp_as_number */
3538 &dictitems_as_sequence, /* tp_as_sequence */
3539 0, /* tp_as_mapping */
3540 0, /* tp_hash */
3541 0, /* tp_call */
3542 0, /* tp_str */
3543 PyObject_GenericGetAttr, /* tp_getattro */
3544 0, /* tp_setattro */
3545 0, /* tp_as_buffer */
3546 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3547 0, /* tp_doc */
3548 (traverseproc)dictview_traverse, /* tp_traverse */
3549 0, /* tp_clear */
3550 dictview_richcompare, /* tp_richcompare */
3551 0, /* tp_weaklistoffset */
3552 (getiterfunc)dictitems_iter, /* tp_iter */
3553 0, /* tp_iternext */
3554 dictitems_methods, /* tp_methods */
3555 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003556};
3557
3558static PyObject *
3559dictitems_new(PyObject *dict)
3560{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003561 return dictview_new(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003562}
3563
Guido van Rossum3ac67412007-02-10 18:55:06 +00003564/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003565
3566static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003567dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 if (dv->dv_dict == NULL) {
3570 Py_RETURN_NONE;
3571 }
3572 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003573}
3574
Guido van Rossum83825ac2007-02-10 04:54:19 +00003575static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003576 (lenfunc)dictview_len, /* sq_length */
3577 0, /* sq_concat */
3578 0, /* sq_repeat */
3579 0, /* sq_item */
3580 0, /* sq_slice */
3581 0, /* sq_ass_item */
3582 0, /* sq_ass_slice */
3583 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003584};
3585
Guido van Rossumb90c8482007-02-10 01:11:45 +00003586static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003587 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003588};
3589
3590PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003591 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3592 "dict_values", /* tp_name */
3593 sizeof(dictviewobject), /* tp_basicsize */
3594 0, /* tp_itemsize */
3595 /* methods */
3596 (destructor)dictview_dealloc, /* tp_dealloc */
3597 0, /* tp_print */
3598 0, /* tp_getattr */
3599 0, /* tp_setattr */
3600 0, /* tp_reserved */
3601 (reprfunc)dictview_repr, /* tp_repr */
3602 0, /* tp_as_number */
3603 &dictvalues_as_sequence, /* tp_as_sequence */
3604 0, /* tp_as_mapping */
3605 0, /* tp_hash */
3606 0, /* tp_call */
3607 0, /* tp_str */
3608 PyObject_GenericGetAttr, /* tp_getattro */
3609 0, /* tp_setattro */
3610 0, /* tp_as_buffer */
3611 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3612 0, /* tp_doc */
3613 (traverseproc)dictview_traverse, /* tp_traverse */
3614 0, /* tp_clear */
3615 0, /* tp_richcompare */
3616 0, /* tp_weaklistoffset */
3617 (getiterfunc)dictvalues_iter, /* tp_iter */
3618 0, /* tp_iternext */
3619 dictvalues_methods, /* tp_methods */
3620 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003621};
3622
3623static PyObject *
3624dictvalues_new(PyObject *dict)
3625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003626 return dictview_new(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003627}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003628
3629/* Returns NULL if cannot allocate a new PyDictKeysObject,
3630 but does not set an error */
3631PyDictKeysObject *
3632_PyDict_NewKeysForClass(void)
3633{
3634 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_SPLIT);
3635 if (keys == NULL)
3636 PyErr_Clear();
3637 else
3638 keys->dk_lookup = lookdict_split;
3639 return keys;
3640}
3641
3642#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
3643
3644PyObject *
3645PyObject_GenericGetDict(PyObject *obj, void *context)
3646{
3647 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
3648 if (dictptr == NULL) {
3649 PyErr_SetString(PyExc_AttributeError,
3650 "This object has no __dict__");
3651 return NULL;
3652 }
3653 dict = *dictptr;
3654 if (dict == NULL) {
3655 PyTypeObject *tp = Py_TYPE(obj);
3656 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
3657 DK_INCREF(CACHED_KEYS(tp));
3658 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
3659 }
3660 else {
3661 *dictptr = dict = PyDict_New();
3662 }
3663 }
3664 Py_XINCREF(dict);
3665 return dict;
3666}
3667
3668int
3669_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
3670 PyObject *key, PyObject *value)
3671{
3672 PyObject *dict;
3673 int res;
3674 PyDictKeysObject *cached;
3675
3676 assert(dictptr != NULL);
3677 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
3678 assert(dictptr != NULL);
3679 dict = *dictptr;
3680 if (dict == NULL) {
3681 DK_INCREF(cached);
3682 dict = new_dict_with_shared_keys(cached);
3683 if (dict == NULL)
3684 return -1;
3685 *dictptr = dict;
3686 }
3687 if (value == NULL) {
3688 res = PyDict_DelItem(dict, key);
3689 if (cached != ((PyDictObject *)dict)->ma_keys) {
3690 CACHED_KEYS(tp) = NULL;
3691 DK_DECREF(cached);
3692 }
3693 } else {
3694 res = PyDict_SetItem(dict, key, value);
3695 if (cached != ((PyDictObject *)dict)->ma_keys) {
3696 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson53b97712012-04-23 11:50:47 -04003697 if (cached->dk_refcnt == 1 && PyDict_CheckExact(dict)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003698 CACHED_KEYS(tp) = make_keys_shared(dict);
3699 if (CACHED_KEYS(tp) == NULL)
3700 return -1;
3701 } else {
3702 CACHED_KEYS(tp) = NULL;
3703 }
3704 DK_DECREF(cached);
3705 }
3706 }
3707 } else {
3708 dict = *dictptr;
3709 if (dict == NULL) {
3710 dict = PyDict_New();
3711 if (dict == NULL)
3712 return -1;
3713 *dictptr = dict;
3714 }
3715 if (value == NULL) {
3716 res = PyDict_DelItem(dict, key);
3717 } else {
3718 res = PyDict_SetItem(dict, key, value);
3719 }
3720 }
3721 return res;
3722}
3723
3724void
3725_PyDictKeys_DecRef(PyDictKeysObject *keys)
3726{
3727 DK_DECREF(keys);
3728}
3729
3730
3731/* ARGSUSED */
3732static PyObject *
3733dummy_repr(PyObject *op)
3734{
3735 return PyUnicode_FromString("<dummy key>");
3736}
3737
3738/* ARGUSED */
3739static void
3740dummy_dealloc(PyObject* ignore)
3741{
3742 /* This should never get called, but we also don't want to SEGV if
3743 * we accidentally decref dummy-key out of existence.
3744 */
3745 Py_FatalError("deallocating <dummy key>");
3746}
3747
3748static PyTypeObject PyDictDummy_Type = {
3749 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3750 "<dummy key> type",
3751 0,
3752 0,
3753 dummy_dealloc, /*tp_dealloc*/ /*never called*/
3754 0, /*tp_print*/
3755 0, /*tp_getattr*/
3756 0, /*tp_setattr*/
3757 0, /*tp_reserved*/
3758 dummy_repr, /*tp_repr*/
3759 0, /*tp_as_number*/
3760 0, /*tp_as_sequence*/
3761 0, /*tp_as_mapping*/
3762 0, /*tp_hash */
3763 0, /*tp_call */
3764 0, /*tp_str */
3765 0, /*tp_getattro */
3766 0, /*tp_setattro */
3767 0, /*tp_as_buffer */
3768 Py_TPFLAGS_DEFAULT, /*tp_flags */
3769};
3770
3771static PyObject _dummy_struct = {
3772 _PyObject_EXTRA_INIT
3773 2, &PyDictDummy_Type
3774};
3775