blob: 6eb9b25a1f29ac31963950f630da5b8f89ce85ab [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{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002401 Py_ssize_t size;
2402 double res, keys_size;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002403
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002404 size = DK_SIZE(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 res = sizeof(PyDictObject);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002406 if (mp->ma_values)
2407 res += size * sizeof(PyObject*);
2408 /* Count our share of the keys object -- with rounding errors. */
2409 keys_size = sizeof(PyDictKeysObject) + (size-1) * sizeof(PyDictKeyEntry);
2410 /* If refcnt > 1, then one count is (probably) held by a type */
2411 /* XXX This is somewhat approximate :) */
2412 if (mp->ma_keys->dk_refcnt < 3)
2413 res += keys_size;
2414 else
2415 res += keys_size / (mp->ma_keys->dk_refcnt - 1);
2416 return PyFloat_FromDouble(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002417}
2418
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002419PyDoc_STRVAR(contains__doc__,
2420"D.__contains__(k) -> True if D has a key k, else False");
2421
2422PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2423
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002424PyDoc_STRVAR(sizeof__doc__,
2425"D.__sizeof__() -> size of D in memory, in bytes");
2426
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002427PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002428"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002429
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002430PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002431"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 +00002432
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002433PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002434"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002435If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002436
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002437PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002438"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000024392-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002440
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002441PyDoc_STRVAR(update__doc__,
Georg Brandlac0675c2011-12-18 19:30:55 +01002442"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n"
2443"If E present and has a .keys() method, does: for k in E: D[k] = E[k]\n\
2444If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002445In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002446
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002447PyDoc_STRVAR(fromkeys__doc__,
2448"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
2449v defaults to None.");
2450
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002451PyDoc_STRVAR(clear__doc__,
2452"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002453
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002454PyDoc_STRVAR(copy__doc__,
2455"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002456
Guido van Rossumb90c8482007-02-10 01:11:45 +00002457/* Forward */
2458static PyObject *dictkeys_new(PyObject *);
2459static PyObject *dictitems_new(PyObject *);
2460static PyObject *dictvalues_new(PyObject *);
2461
Guido van Rossum45c85d12007-07-27 16:31:40 +00002462PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002464PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002466PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002468
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002469static PyMethodDef mapp_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
2471 contains__doc__},
2472 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2473 getitem__doc__},
2474 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2475 sizeof__doc__},
2476 {"get", (PyCFunction)dict_get, METH_VARARGS,
2477 get__doc__},
2478 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2479 setdefault_doc__},
2480 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2481 pop__doc__},
2482 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2483 popitem__doc__},
2484 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2485 keys__doc__},
2486 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2487 items__doc__},
2488 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2489 values__doc__},
2490 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2491 update__doc__},
2492 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2493 fromkeys__doc__},
2494 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2495 clear__doc__},
2496 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2497 copy__doc__},
2498 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002499};
2500
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002501/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002502int
2503PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002504{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002505 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002507 PyDictKeyEntry *ep;
2508 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002511 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 hash = PyObject_Hash(key);
2513 if (hash == -1)
2514 return -1;
2515 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002516 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2517 return (ep == NULL) ? -1 : (*value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002518}
2519
Thomas Wouterscf297e42007-02-23 15:07:44 +00002520/* Internal version of PyDict_Contains used when the hash value is already known */
2521int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002522_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002525 PyDictKeyEntry *ep;
2526 PyObject **value_addr;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002527
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002528 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2529 return (ep == NULL) ? -1 : (*value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002530}
2531
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002532/* Hack to implement "key in dict" */
2533static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 0, /* sq_length */
2535 0, /* sq_concat */
2536 0, /* sq_repeat */
2537 0, /* sq_item */
2538 0, /* sq_slice */
2539 0, /* sq_ass_item */
2540 0, /* sq_ass_slice */
2541 PyDict_Contains, /* sq_contains */
2542 0, /* sq_inplace_concat */
2543 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002544};
2545
Guido van Rossum09e563a2001-05-01 12:10:21 +00002546static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002547dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 PyObject *self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 assert(type != NULL && type->tp_alloc != NULL);
2552 self = type->tp_alloc(type, 0);
2553 if (self != NULL) {
2554 PyDictObject *d = (PyDictObject *)self;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002555 d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
2556 /* XXX - Should we raise a no-memory error? */
2557 if (d->ma_keys == NULL) {
2558 DK_INCREF(Py_EMPTY_KEYS);
2559 d->ma_keys = Py_EMPTY_KEYS;
2560 d->ma_values = empty_values;
2561 }
2562 d->ma_used = 0;
Ezio Melotti13925002011-03-16 11:05:33 +02002563 /* The object has been implicitly tracked by tp_alloc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 if (type == &PyDict_Type)
2565 _PyObject_GC_UNTRACK(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 }
2567 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002568}
2569
Tim Peters25786c02001-09-02 08:22:48 +00002570static int
2571dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2572{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002573 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002574}
2575
Tim Peters6d6c1a32001-08-02 04:15:00 +00002576static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002577dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002580}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002581
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002582PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002583"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002584"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002585" (key, value) pairs\n"
2586"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002587" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002588" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002589" d[k] = v\n"
2590"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2591" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002592
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002593PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2595 "dict",
2596 sizeof(PyDictObject),
2597 0,
2598 (destructor)dict_dealloc, /* tp_dealloc */
2599 0, /* tp_print */
2600 0, /* tp_getattr */
2601 0, /* tp_setattr */
2602 0, /* tp_reserved */
2603 (reprfunc)dict_repr, /* tp_repr */
2604 0, /* tp_as_number */
2605 &dict_as_sequence, /* tp_as_sequence */
2606 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002607 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002608 0, /* tp_call */
2609 0, /* tp_str */
2610 PyObject_GenericGetAttr, /* tp_getattro */
2611 0, /* tp_setattro */
2612 0, /* tp_as_buffer */
2613 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2614 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2615 dictionary_doc, /* tp_doc */
2616 dict_traverse, /* tp_traverse */
2617 dict_tp_clear, /* tp_clear */
2618 dict_richcompare, /* tp_richcompare */
2619 0, /* tp_weaklistoffset */
2620 (getiterfunc)dict_iter, /* tp_iter */
2621 0, /* tp_iternext */
2622 mapp_methods, /* tp_methods */
2623 0, /* tp_members */
2624 0, /* tp_getset */
2625 0, /* tp_base */
2626 0, /* tp_dict */
2627 0, /* tp_descr_get */
2628 0, /* tp_descr_set */
2629 0, /* tp_dictoffset */
2630 dict_init, /* tp_init */
2631 PyType_GenericAlloc, /* tp_alloc */
2632 dict_new, /* tp_new */
2633 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002634};
2635
Victor Stinner3c1e4812012-03-26 22:10:51 +02002636PyObject *
2637_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
2638{
2639 PyObject *kv;
2640 kv = _PyUnicode_FromId(key); /* borrowed */
2641 if (kv == NULL)
2642 return NULL;
2643 return PyDict_GetItem(dp, kv);
2644}
2645
Guido van Rossum3cca2451997-05-16 14:23:33 +00002646/* For backward compatibility with old dictionary interface */
2647
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002648PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002649PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002650{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 PyObject *kv, *rv;
2652 kv = PyUnicode_FromString(key);
2653 if (kv == NULL)
2654 return NULL;
2655 rv = PyDict_GetItem(v, kv);
2656 Py_DECREF(kv);
2657 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002658}
2659
2660int
Victor Stinner3c1e4812012-03-26 22:10:51 +02002661_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
2662{
2663 PyObject *kv;
2664 kv = _PyUnicode_FromId(key); /* borrowed */
2665 if (kv == NULL)
2666 return -1;
2667 return PyDict_SetItem(v, kv, item);
2668}
2669
2670int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002671PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 PyObject *kv;
2674 int err;
2675 kv = PyUnicode_FromString(key);
2676 if (kv == NULL)
2677 return -1;
2678 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2679 err = PyDict_SetItem(v, kv, item);
2680 Py_DECREF(kv);
2681 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002682}
2683
2684int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002685PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 PyObject *kv;
2688 int err;
2689 kv = PyUnicode_FromString(key);
2690 if (kv == NULL)
2691 return -1;
2692 err = PyDict_DelItem(v, kv);
2693 Py_DECREF(kv);
2694 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002695}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002696
Raymond Hettinger019a1482004-03-18 02:41:19 +00002697/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002698
2699typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 PyObject_HEAD
2701 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2702 Py_ssize_t di_used;
2703 Py_ssize_t di_pos;
2704 PyObject* di_result; /* reusable result tuple for iteritems */
2705 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002706} dictiterobject;
2707
2708static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002709dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 dictiterobject *di;
2712 di = PyObject_GC_New(dictiterobject, itertype);
2713 if (di == NULL)
2714 return NULL;
2715 Py_INCREF(dict);
2716 di->di_dict = dict;
2717 di->di_used = dict->ma_used;
2718 di->di_pos = 0;
2719 di->len = dict->ma_used;
2720 if (itertype == &PyDictIterItem_Type) {
2721 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2722 if (di->di_result == NULL) {
2723 Py_DECREF(di);
2724 return NULL;
2725 }
2726 }
2727 else
2728 di->di_result = NULL;
2729 _PyObject_GC_TRACK(di);
2730 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002731}
2732
2733static void
2734dictiter_dealloc(dictiterobject *di)
2735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 Py_XDECREF(di->di_dict);
2737 Py_XDECREF(di->di_result);
2738 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002739}
2740
2741static int
2742dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 Py_VISIT(di->di_dict);
2745 Py_VISIT(di->di_result);
2746 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002747}
2748
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002749static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002750dictiter_len(dictiterobject *di)
2751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 Py_ssize_t len = 0;
2753 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2754 len = di->len;
2755 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002756}
2757
Guido van Rossumb90c8482007-02-10 01:11:45 +00002758PyDoc_STRVAR(length_hint_doc,
2759 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002760
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002761static PyObject *
2762dictiter_reduce(dictiterobject *di);
2763
2764PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2765
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002766static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2768 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002769 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
2770 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002772};
2773
Raymond Hettinger019a1482004-03-18 02:41:19 +00002774static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002776 PyObject *key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002777 register Py_ssize_t i, mask, offset;
2778 register PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002780 PyObject **value_ptr;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 if (d == NULL)
2783 return NULL;
2784 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 if (di->di_used != d->ma_used) {
2787 PyErr_SetString(PyExc_RuntimeError,
2788 "dictionary changed size during iteration");
2789 di->di_used = -1; /* Make this state sticky */
2790 return NULL;
2791 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 i = di->di_pos;
2794 if (i < 0)
2795 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002796 k = d->ma_keys;
2797 if (d->ma_values) {
2798 value_ptr = &d->ma_values[i];
2799 offset = sizeof(PyObject *);
2800 }
2801 else {
2802 value_ptr = &k->dk_entries[i].me_value;
2803 offset = sizeof(PyDictKeyEntry);
2804 }
2805 mask = DK_SIZE(k)-1;
2806 while (i <= mask && *value_ptr == NULL) {
2807 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002808 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002809 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 di->di_pos = i+1;
2811 if (i > mask)
2812 goto fail;
2813 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002814 key = k->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 Py_INCREF(key);
2816 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002817
2818fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 Py_DECREF(d);
2820 di->di_dict = NULL;
2821 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002822}
2823
Raymond Hettinger019a1482004-03-18 02:41:19 +00002824PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2826 "dict_keyiterator", /* tp_name */
2827 sizeof(dictiterobject), /* tp_basicsize */
2828 0, /* tp_itemsize */
2829 /* methods */
2830 (destructor)dictiter_dealloc, /* tp_dealloc */
2831 0, /* tp_print */
2832 0, /* tp_getattr */
2833 0, /* tp_setattr */
2834 0, /* tp_reserved */
2835 0, /* tp_repr */
2836 0, /* tp_as_number */
2837 0, /* tp_as_sequence */
2838 0, /* tp_as_mapping */
2839 0, /* tp_hash */
2840 0, /* tp_call */
2841 0, /* tp_str */
2842 PyObject_GenericGetAttr, /* tp_getattro */
2843 0, /* tp_setattro */
2844 0, /* tp_as_buffer */
2845 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2846 0, /* tp_doc */
2847 (traverseproc)dictiter_traverse, /* tp_traverse */
2848 0, /* tp_clear */
2849 0, /* tp_richcompare */
2850 0, /* tp_weaklistoffset */
2851 PyObject_SelfIter, /* tp_iter */
2852 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2853 dictiter_methods, /* tp_methods */
2854 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002855};
2856
2857static PyObject *dictiter_iternextvalue(dictiterobject *di)
2858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002860 register Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002861 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002862 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 if (d == NULL)
2865 return NULL;
2866 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 if (di->di_used != d->ma_used) {
2869 PyErr_SetString(PyExc_RuntimeError,
2870 "dictionary changed size during iteration");
2871 di->di_used = -1; /* Make this state sticky */
2872 return NULL;
2873 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002876 mask = DK_SIZE(d->ma_keys)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 if (i < 0 || i > mask)
2878 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002879 if (d->ma_values) {
2880 value_ptr = &d->ma_values[i];
2881 offset = sizeof(PyObject *);
2882 }
2883 else {
2884 value_ptr = &d->ma_keys->dk_entries[i].me_value;
2885 offset = sizeof(PyDictKeyEntry);
2886 }
2887 while (i <= mask && *value_ptr == NULL) {
2888 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002889 i++;
2890 if (i > mask)
2891 goto fail;
2892 }
2893 di->di_pos = i+1;
2894 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002895 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 Py_INCREF(value);
2897 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002898
2899fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002900 Py_DECREF(d);
2901 di->di_dict = NULL;
2902 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002903}
2904
2905PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002906 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2907 "dict_valueiterator", /* tp_name */
2908 sizeof(dictiterobject), /* tp_basicsize */
2909 0, /* tp_itemsize */
2910 /* methods */
2911 (destructor)dictiter_dealloc, /* tp_dealloc */
2912 0, /* tp_print */
2913 0, /* tp_getattr */
2914 0, /* tp_setattr */
2915 0, /* tp_reserved */
2916 0, /* tp_repr */
2917 0, /* tp_as_number */
2918 0, /* tp_as_sequence */
2919 0, /* tp_as_mapping */
2920 0, /* tp_hash */
2921 0, /* tp_call */
2922 0, /* tp_str */
2923 PyObject_GenericGetAttr, /* tp_getattro */
2924 0, /* tp_setattro */
2925 0, /* tp_as_buffer */
2926 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2927 0, /* tp_doc */
2928 (traverseproc)dictiter_traverse, /* tp_traverse */
2929 0, /* tp_clear */
2930 0, /* tp_richcompare */
2931 0, /* tp_weaklistoffset */
2932 PyObject_SelfIter, /* tp_iter */
2933 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2934 dictiter_methods, /* tp_methods */
2935 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002936};
2937
2938static PyObject *dictiter_iternextitem(dictiterobject *di)
2939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002940 PyObject *key, *value, *result = di->di_result;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002941 register Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002942 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002943 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 if (d == NULL)
2946 return NULL;
2947 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 if (di->di_used != d->ma_used) {
2950 PyErr_SetString(PyExc_RuntimeError,
2951 "dictionary changed size during iteration");
2952 di->di_used = -1; /* Make this state sticky */
2953 return NULL;
2954 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002956 i = di->di_pos;
2957 if (i < 0)
2958 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002959 mask = DK_SIZE(d->ma_keys)-1;
2960 if (d->ma_values) {
2961 value_ptr = &d->ma_values[i];
2962 offset = sizeof(PyObject *);
2963 }
2964 else {
2965 value_ptr = &d->ma_keys->dk_entries[i].me_value;
2966 offset = sizeof(PyDictKeyEntry);
2967 }
2968 while (i <= mask && *value_ptr == NULL) {
2969 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002970 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002971 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002972 di->di_pos = i+1;
2973 if (i > mask)
2974 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002976 if (result->ob_refcnt == 1) {
2977 Py_INCREF(result);
2978 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2979 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2980 } else {
2981 result = PyTuple_New(2);
2982 if (result == NULL)
2983 return NULL;
2984 }
2985 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002986 key = d->ma_keys->dk_entries[i].me_key;
2987 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 Py_INCREF(key);
2989 Py_INCREF(value);
2990 PyTuple_SET_ITEM(result, 0, key);
2991 PyTuple_SET_ITEM(result, 1, value);
2992 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002993
2994fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995 Py_DECREF(d);
2996 di->di_dict = NULL;
2997 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002998}
2999
3000PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003001 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3002 "dict_itemiterator", /* tp_name */
3003 sizeof(dictiterobject), /* tp_basicsize */
3004 0, /* tp_itemsize */
3005 /* methods */
3006 (destructor)dictiter_dealloc, /* tp_dealloc */
3007 0, /* tp_print */
3008 0, /* tp_getattr */
3009 0, /* tp_setattr */
3010 0, /* tp_reserved */
3011 0, /* tp_repr */
3012 0, /* tp_as_number */
3013 0, /* tp_as_sequence */
3014 0, /* tp_as_mapping */
3015 0, /* tp_hash */
3016 0, /* tp_call */
3017 0, /* tp_str */
3018 PyObject_GenericGetAttr, /* tp_getattro */
3019 0, /* tp_setattro */
3020 0, /* tp_as_buffer */
3021 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3022 0, /* tp_doc */
3023 (traverseproc)dictiter_traverse, /* tp_traverse */
3024 0, /* tp_clear */
3025 0, /* tp_richcompare */
3026 0, /* tp_weaklistoffset */
3027 PyObject_SelfIter, /* tp_iter */
3028 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3029 dictiter_methods, /* tp_methods */
3030 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003031};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003032
3033
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003034static PyObject *
3035dictiter_reduce(dictiterobject *di)
3036{
3037 PyObject *list;
3038 dictiterobject tmp;
3039
3040 list = PyList_New(0);
3041 if (!list)
3042 return NULL;
3043
3044 /* copy the itertor state */
3045 tmp = *di;
3046 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003047
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003048 /* iterate the temporary into a list */
3049 for(;;) {
3050 PyObject *element = 0;
3051 if (Py_TYPE(di) == &PyDictIterItem_Type)
3052 element = dictiter_iternextitem(&tmp);
3053 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3054 element = dictiter_iternextkey(&tmp);
3055 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3056 element = dictiter_iternextvalue(&tmp);
3057 else
3058 assert(0);
3059 if (element) {
3060 if (PyList_Append(list, element)) {
3061 Py_DECREF(element);
3062 Py_DECREF(list);
3063 Py_XDECREF(tmp.di_dict);
3064 return NULL;
3065 }
3066 Py_DECREF(element);
3067 } else
3068 break;
3069 }
3070 Py_XDECREF(tmp.di_dict);
3071 /* check for error */
3072 if (tmp.di_dict != NULL) {
3073 /* we have an error */
3074 Py_DECREF(list);
3075 return NULL;
3076 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003077 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003078}
3079
Guido van Rossum3ac67412007-02-10 18:55:06 +00003080/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003081/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003082/***********************************************/
3083
Guido van Rossumb90c8482007-02-10 01:11:45 +00003084/* The instance lay-out is the same for all three; but the type differs. */
3085
3086typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 PyObject_HEAD
3088 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003089} dictviewobject;
3090
3091
3092static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00003093dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 Py_XDECREF(dv->dv_dict);
3096 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003097}
3098
3099static int
3100dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
3101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003102 Py_VISIT(dv->dv_dict);
3103 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003104}
3105
Guido van Rossum83825ac2007-02-10 04:54:19 +00003106static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00003107dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003109 Py_ssize_t len = 0;
3110 if (dv->dv_dict != NULL)
3111 len = dv->dv_dict->ma_used;
3112 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003113}
3114
3115static PyObject *
3116dictview_new(PyObject *dict, PyTypeObject *type)
3117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 dictviewobject *dv;
3119 if (dict == NULL) {
3120 PyErr_BadInternalCall();
3121 return NULL;
3122 }
3123 if (!PyDict_Check(dict)) {
3124 /* XXX Get rid of this restriction later */
3125 PyErr_Format(PyExc_TypeError,
3126 "%s() requires a dict argument, not '%s'",
3127 type->tp_name, dict->ob_type->tp_name);
3128 return NULL;
3129 }
3130 dv = PyObject_GC_New(dictviewobject, type);
3131 if (dv == NULL)
3132 return NULL;
3133 Py_INCREF(dict);
3134 dv->dv_dict = (PyDictObject *)dict;
3135 _PyObject_GC_TRACK(dv);
3136 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003137}
3138
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003139/* TODO(guido): The views objects are not complete:
3140
3141 * support more set operations
3142 * support arbitrary mappings?
3143 - either these should be static or exported in dictobject.h
3144 - if public then they should probably be in builtins
3145*/
3146
Guido van Rossumaac530c2007-08-24 22:33:45 +00003147/* Return 1 if self is a subset of other, iterating over self;
3148 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003149static int
3150all_contained_in(PyObject *self, PyObject *other)
3151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 PyObject *iter = PyObject_GetIter(self);
3153 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003155 if (iter == NULL)
3156 return -1;
3157 for (;;) {
3158 PyObject *next = PyIter_Next(iter);
3159 if (next == NULL) {
3160 if (PyErr_Occurred())
3161 ok = -1;
3162 break;
3163 }
3164 ok = PySequence_Contains(other, next);
3165 Py_DECREF(next);
3166 if (ok <= 0)
3167 break;
3168 }
3169 Py_DECREF(iter);
3170 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003171}
3172
3173static PyObject *
3174dictview_richcompare(PyObject *self, PyObject *other, int op)
3175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003176 Py_ssize_t len_self, len_other;
3177 int ok;
3178 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 assert(self != NULL);
3181 assert(PyDictViewSet_Check(self));
3182 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003183
Brian Curtindfc80e32011-08-10 20:28:54 -05003184 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3185 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003187 len_self = PyObject_Size(self);
3188 if (len_self < 0)
3189 return NULL;
3190 len_other = PyObject_Size(other);
3191 if (len_other < 0)
3192 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 ok = 0;
3195 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 case Py_NE:
3198 case Py_EQ:
3199 if (len_self == len_other)
3200 ok = all_contained_in(self, other);
3201 if (op == Py_NE && ok >= 0)
3202 ok = !ok;
3203 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 case Py_LT:
3206 if (len_self < len_other)
3207 ok = all_contained_in(self, other);
3208 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 case Py_LE:
3211 if (len_self <= len_other)
3212 ok = all_contained_in(self, other);
3213 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 case Py_GT:
3216 if (len_self > len_other)
3217 ok = all_contained_in(other, self);
3218 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003220 case Py_GE:
3221 if (len_self >= len_other)
3222 ok = all_contained_in(other, self);
3223 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003225 }
3226 if (ok < 0)
3227 return NULL;
3228 result = ok ? Py_True : Py_False;
3229 Py_INCREF(result);
3230 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003231}
3232
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003233static PyObject *
3234dictview_repr(dictviewobject *dv)
3235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 PyObject *seq;
3237 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 seq = PySequence_List((PyObject *)dv);
3240 if (seq == NULL)
3241 return NULL;
3242
3243 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3244 Py_DECREF(seq);
3245 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003246}
3247
Guido van Rossum3ac67412007-02-10 18:55:06 +00003248/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003249
3250static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003251dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 if (dv->dv_dict == NULL) {
3254 Py_RETURN_NONE;
3255 }
3256 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003257}
3258
3259static int
3260dictkeys_contains(dictviewobject *dv, PyObject *obj)
3261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 if (dv->dv_dict == NULL)
3263 return 0;
3264 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003265}
3266
Guido van Rossum83825ac2007-02-10 04:54:19 +00003267static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 (lenfunc)dictview_len, /* sq_length */
3269 0, /* sq_concat */
3270 0, /* sq_repeat */
3271 0, /* sq_item */
3272 0, /* sq_slice */
3273 0, /* sq_ass_item */
3274 0, /* sq_ass_slice */
3275 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003276};
3277
Guido van Rossum523259b2007-08-24 23:41:22 +00003278static PyObject*
3279dictviews_sub(PyObject* self, PyObject *other)
3280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 PyObject *result = PySet_New(self);
3282 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003283 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 if (result == NULL)
3286 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003287
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003288 tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 if (tmp == NULL) {
3290 Py_DECREF(result);
3291 return NULL;
3292 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 Py_DECREF(tmp);
3295 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003296}
3297
3298static PyObject*
3299dictviews_and(PyObject* self, PyObject *other)
3300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 PyObject *result = PySet_New(self);
3302 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003303 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 if (result == NULL)
3306 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003307
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003308 tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 if (tmp == NULL) {
3310 Py_DECREF(result);
3311 return NULL;
3312 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 Py_DECREF(tmp);
3315 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003316}
3317
3318static PyObject*
3319dictviews_or(PyObject* self, PyObject *other)
3320{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 PyObject *result = PySet_New(self);
3322 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003323 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 if (result == NULL)
3326 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003327
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003328 tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 if (tmp == NULL) {
3330 Py_DECREF(result);
3331 return NULL;
3332 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 Py_DECREF(tmp);
3335 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003336}
3337
3338static PyObject*
3339dictviews_xor(PyObject* self, PyObject *other)
3340{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 PyObject *result = PySet_New(self);
3342 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003343 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003345 if (result == NULL)
3346 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003347
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003348 tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 other);
3350 if (tmp == NULL) {
3351 Py_DECREF(result);
3352 return NULL;
3353 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 Py_DECREF(tmp);
3356 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003357}
3358
3359static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 0, /*nb_add*/
3361 (binaryfunc)dictviews_sub, /*nb_subtract*/
3362 0, /*nb_multiply*/
3363 0, /*nb_remainder*/
3364 0, /*nb_divmod*/
3365 0, /*nb_power*/
3366 0, /*nb_negative*/
3367 0, /*nb_positive*/
3368 0, /*nb_absolute*/
3369 0, /*nb_bool*/
3370 0, /*nb_invert*/
3371 0, /*nb_lshift*/
3372 0, /*nb_rshift*/
3373 (binaryfunc)dictviews_and, /*nb_and*/
3374 (binaryfunc)dictviews_xor, /*nb_xor*/
3375 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003376};
3377
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003378static PyObject*
3379dictviews_isdisjoint(PyObject *self, PyObject *other)
3380{
3381 PyObject *it;
3382 PyObject *item = NULL;
3383
3384 if (self == other) {
3385 if (dictview_len((dictviewobject *)self) == 0)
3386 Py_RETURN_TRUE;
3387 else
3388 Py_RETURN_FALSE;
3389 }
3390
3391 /* Iterate over the shorter object (only if other is a set,
3392 * because PySequence_Contains may be expensive otherwise): */
3393 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
3394 Py_ssize_t len_self = dictview_len((dictviewobject *)self);
3395 Py_ssize_t len_other = PyObject_Size(other);
3396 if (len_other == -1)
3397 return NULL;
3398
3399 if ((len_other > len_self)) {
3400 PyObject *tmp = other;
3401 other = self;
3402 self = tmp;
3403 }
3404 }
3405
3406 it = PyObject_GetIter(other);
3407 if (it == NULL)
3408 return NULL;
3409
3410 while ((item = PyIter_Next(it)) != NULL) {
3411 int contains = PySequence_Contains(self, item);
3412 Py_DECREF(item);
3413 if (contains == -1) {
3414 Py_DECREF(it);
3415 return NULL;
3416 }
3417
3418 if (contains) {
3419 Py_DECREF(it);
3420 Py_RETURN_FALSE;
3421 }
3422 }
3423 Py_DECREF(it);
3424 if (PyErr_Occurred())
3425 return NULL; /* PyIter_Next raised an exception. */
3426 Py_RETURN_TRUE;
3427}
3428
3429PyDoc_STRVAR(isdisjoint_doc,
3430"Return True if the view and the given iterable have a null intersection.");
3431
Guido van Rossumb90c8482007-02-10 01:11:45 +00003432static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003433 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3434 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003436};
3437
3438PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3440 "dict_keys", /* tp_name */
3441 sizeof(dictviewobject), /* tp_basicsize */
3442 0, /* tp_itemsize */
3443 /* methods */
3444 (destructor)dictview_dealloc, /* tp_dealloc */
3445 0, /* tp_print */
3446 0, /* tp_getattr */
3447 0, /* tp_setattr */
3448 0, /* tp_reserved */
3449 (reprfunc)dictview_repr, /* tp_repr */
3450 &dictviews_as_number, /* tp_as_number */
3451 &dictkeys_as_sequence, /* tp_as_sequence */
3452 0, /* tp_as_mapping */
3453 0, /* tp_hash */
3454 0, /* tp_call */
3455 0, /* tp_str */
3456 PyObject_GenericGetAttr, /* tp_getattro */
3457 0, /* tp_setattro */
3458 0, /* tp_as_buffer */
3459 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3460 0, /* tp_doc */
3461 (traverseproc)dictview_traverse, /* tp_traverse */
3462 0, /* tp_clear */
3463 dictview_richcompare, /* tp_richcompare */
3464 0, /* tp_weaklistoffset */
3465 (getiterfunc)dictkeys_iter, /* tp_iter */
3466 0, /* tp_iternext */
3467 dictkeys_methods, /* tp_methods */
3468 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003469};
3470
3471static PyObject *
3472dictkeys_new(PyObject *dict)
3473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003474 return dictview_new(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003475}
3476
Guido van Rossum3ac67412007-02-10 18:55:06 +00003477/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003478
3479static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003480dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003482 if (dv->dv_dict == NULL) {
3483 Py_RETURN_NONE;
3484 }
3485 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003486}
3487
3488static int
3489dictitems_contains(dictviewobject *dv, PyObject *obj)
3490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003491 PyObject *key, *value, *found;
3492 if (dv->dv_dict == NULL)
3493 return 0;
3494 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3495 return 0;
3496 key = PyTuple_GET_ITEM(obj, 0);
3497 value = PyTuple_GET_ITEM(obj, 1);
3498 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3499 if (found == NULL) {
3500 if (PyErr_Occurred())
3501 return -1;
3502 return 0;
3503 }
3504 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003505}
3506
Guido van Rossum83825ac2007-02-10 04:54:19 +00003507static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 (lenfunc)dictview_len, /* sq_length */
3509 0, /* sq_concat */
3510 0, /* sq_repeat */
3511 0, /* sq_item */
3512 0, /* sq_slice */
3513 0, /* sq_ass_item */
3514 0, /* sq_ass_slice */
3515 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003516};
3517
Guido van Rossumb90c8482007-02-10 01:11:45 +00003518static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003519 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3520 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003521 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003522};
3523
3524PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003525 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3526 "dict_items", /* tp_name */
3527 sizeof(dictviewobject), /* tp_basicsize */
3528 0, /* tp_itemsize */
3529 /* methods */
3530 (destructor)dictview_dealloc, /* tp_dealloc */
3531 0, /* tp_print */
3532 0, /* tp_getattr */
3533 0, /* tp_setattr */
3534 0, /* tp_reserved */
3535 (reprfunc)dictview_repr, /* tp_repr */
3536 &dictviews_as_number, /* tp_as_number */
3537 &dictitems_as_sequence, /* tp_as_sequence */
3538 0, /* tp_as_mapping */
3539 0, /* tp_hash */
3540 0, /* tp_call */
3541 0, /* tp_str */
3542 PyObject_GenericGetAttr, /* tp_getattro */
3543 0, /* tp_setattro */
3544 0, /* tp_as_buffer */
3545 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3546 0, /* tp_doc */
3547 (traverseproc)dictview_traverse, /* tp_traverse */
3548 0, /* tp_clear */
3549 dictview_richcompare, /* tp_richcompare */
3550 0, /* tp_weaklistoffset */
3551 (getiterfunc)dictitems_iter, /* tp_iter */
3552 0, /* tp_iternext */
3553 dictitems_methods, /* tp_methods */
3554 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003555};
3556
3557static PyObject *
3558dictitems_new(PyObject *dict)
3559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 return dictview_new(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003561}
3562
Guido van Rossum3ac67412007-02-10 18:55:06 +00003563/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003564
3565static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003566dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003568 if (dv->dv_dict == NULL) {
3569 Py_RETURN_NONE;
3570 }
3571 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003572}
3573
Guido van Rossum83825ac2007-02-10 04:54:19 +00003574static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003575 (lenfunc)dictview_len, /* sq_length */
3576 0, /* sq_concat */
3577 0, /* sq_repeat */
3578 0, /* sq_item */
3579 0, /* sq_slice */
3580 0, /* sq_ass_item */
3581 0, /* sq_ass_slice */
3582 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003583};
3584
Guido van Rossumb90c8482007-02-10 01:11:45 +00003585static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003586 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003587};
3588
3589PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003590 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3591 "dict_values", /* tp_name */
3592 sizeof(dictviewobject), /* tp_basicsize */
3593 0, /* tp_itemsize */
3594 /* methods */
3595 (destructor)dictview_dealloc, /* tp_dealloc */
3596 0, /* tp_print */
3597 0, /* tp_getattr */
3598 0, /* tp_setattr */
3599 0, /* tp_reserved */
3600 (reprfunc)dictview_repr, /* tp_repr */
3601 0, /* tp_as_number */
3602 &dictvalues_as_sequence, /* tp_as_sequence */
3603 0, /* tp_as_mapping */
3604 0, /* tp_hash */
3605 0, /* tp_call */
3606 0, /* tp_str */
3607 PyObject_GenericGetAttr, /* tp_getattro */
3608 0, /* tp_setattro */
3609 0, /* tp_as_buffer */
3610 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3611 0, /* tp_doc */
3612 (traverseproc)dictview_traverse, /* tp_traverse */
3613 0, /* tp_clear */
3614 0, /* tp_richcompare */
3615 0, /* tp_weaklistoffset */
3616 (getiterfunc)dictvalues_iter, /* tp_iter */
3617 0, /* tp_iternext */
3618 dictvalues_methods, /* tp_methods */
3619 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003620};
3621
3622static PyObject *
3623dictvalues_new(PyObject *dict)
3624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003625 return dictview_new(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003626}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003627
3628/* Returns NULL if cannot allocate a new PyDictKeysObject,
3629 but does not set an error */
3630PyDictKeysObject *
3631_PyDict_NewKeysForClass(void)
3632{
3633 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_SPLIT);
3634 if (keys == NULL)
3635 PyErr_Clear();
3636 else
3637 keys->dk_lookup = lookdict_split;
3638 return keys;
3639}
3640
3641#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
3642
3643PyObject *
3644PyObject_GenericGetDict(PyObject *obj, void *context)
3645{
3646 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
3647 if (dictptr == NULL) {
3648 PyErr_SetString(PyExc_AttributeError,
3649 "This object has no __dict__");
3650 return NULL;
3651 }
3652 dict = *dictptr;
3653 if (dict == NULL) {
3654 PyTypeObject *tp = Py_TYPE(obj);
3655 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
3656 DK_INCREF(CACHED_KEYS(tp));
3657 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
3658 }
3659 else {
3660 *dictptr = dict = PyDict_New();
3661 }
3662 }
3663 Py_XINCREF(dict);
3664 return dict;
3665}
3666
3667int
3668_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
3669 PyObject *key, PyObject *value)
3670{
3671 PyObject *dict;
3672 int res;
3673 PyDictKeysObject *cached;
3674
3675 assert(dictptr != NULL);
3676 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
3677 assert(dictptr != NULL);
3678 dict = *dictptr;
3679 if (dict == NULL) {
3680 DK_INCREF(cached);
3681 dict = new_dict_with_shared_keys(cached);
3682 if (dict == NULL)
3683 return -1;
3684 *dictptr = dict;
3685 }
3686 if (value == NULL) {
3687 res = PyDict_DelItem(dict, key);
3688 if (cached != ((PyDictObject *)dict)->ma_keys) {
3689 CACHED_KEYS(tp) = NULL;
3690 DK_DECREF(cached);
3691 }
3692 } else {
3693 res = PyDict_SetItem(dict, key, value);
3694 if (cached != ((PyDictObject *)dict)->ma_keys) {
3695 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson53b97712012-04-23 11:50:47 -04003696 if (cached->dk_refcnt == 1 && PyDict_CheckExact(dict)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003697 CACHED_KEYS(tp) = make_keys_shared(dict);
3698 if (CACHED_KEYS(tp) == NULL)
3699 return -1;
3700 } else {
3701 CACHED_KEYS(tp) = NULL;
3702 }
3703 DK_DECREF(cached);
3704 }
3705 }
3706 } else {
3707 dict = *dictptr;
3708 if (dict == NULL) {
3709 dict = PyDict_New();
3710 if (dict == NULL)
3711 return -1;
3712 *dictptr = dict;
3713 }
3714 if (value == NULL) {
3715 res = PyDict_DelItem(dict, key);
3716 } else {
3717 res = PyDict_SetItem(dict, key, value);
3718 }
3719 }
3720 return res;
3721}
3722
3723void
3724_PyDictKeys_DecRef(PyDictKeysObject *keys)
3725{
3726 DK_DECREF(keys);
3727}
3728
3729
3730/* ARGSUSED */
3731static PyObject *
3732dummy_repr(PyObject *op)
3733{
3734 return PyUnicode_FromString("<dummy key>");
3735}
3736
3737/* ARGUSED */
3738static void
3739dummy_dealloc(PyObject* ignore)
3740{
3741 /* This should never get called, but we also don't want to SEGV if
3742 * we accidentally decref dummy-key out of existence.
3743 */
3744 Py_FatalError("deallocating <dummy key>");
3745}
3746
3747static PyTypeObject PyDictDummy_Type = {
3748 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3749 "<dummy key> type",
3750 0,
3751 0,
3752 dummy_dealloc, /*tp_dealloc*/ /*never called*/
3753 0, /*tp_print*/
3754 0, /*tp_getattr*/
3755 0, /*tp_setattr*/
3756 0, /*tp_reserved*/
3757 dummy_repr, /*tp_repr*/
3758 0, /*tp_as_number*/
3759 0, /*tp_as_sequence*/
3760 0, /*tp_as_mapping*/
3761 0, /*tp_hash */
3762 0, /*tp_call */
3763 0, /*tp_str */
3764 0, /*tp_getattro */
3765 0, /*tp_setattro */
3766 0, /*tp_as_buffer */
3767 Py_TPFLAGS_DEFAULT, /*tp_flags */
3768};
3769
3770static PyObject _dummy_struct = {
3771 _PyObject_EXTRA_INIT
3772 2, &PyDictDummy_Type
3773};
3774