blob: 4af5c49e9573d6bd6b25aa14d6d4a18196ea02cd [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
David Malcolm49526f42012-06-22 14:55:41 -0400258/* Print summary info about the state of the optimized allocator */
259void
260_PyDict_DebugMallocStats(FILE *out)
261{
262 _PyDebugAllocatorStats(out,
263 "free PyDictObject", numfree, sizeof(PyDictObject));
264}
265
266
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100267void
268PyDict_Fini(void)
269{
270 PyDict_ClearFreeList();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000271}
272
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200273#define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
274#define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
275
276#define DK_INCREF(dk) (DK_DEBUG_INCREF ++(dk)->dk_refcnt)
277#define DK_DECREF(dk) if (DK_DEBUG_DECREF (--(dk)->dk_refcnt) == 0) free_keys_object(dk)
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400278#define DK_SIZE(dk) ((dk)->dk_size)
279#define DK_MASK(dk) (((dk)->dk_size)-1)
280#define IS_POWER_OF_2(x) (((x) & (x-1)) == 0)
281
282/* USABLE_FRACTION must obey the following:
283 * (0 < USABLE_FRACTION(n) < n) for all n >= 2
284 *
285 * USABLE_FRACTION should be very quick to calculate.
286 * Fractions around 5/8 to 2/3 seem to work well in practice.
287 */
288
289/* Use (2n+1)/3 rather than 2n+3 because: it makes no difference for
290 * combined tables (the two fractions round to the same number n < ),
291 * but 2*4/3 is 2 whereas (2*4+1)/3 is 3 which potentially saves quite
292 * a lot of space for small, split tables */
293#define USABLE_FRACTION(n) ((((n) << 1)+1)/3)
294
295/* Alternative fraction that is otherwise close enough to (2n+1)/3 to make
296 * little difference. 8 * 2/3 == 8 * 5/8 == 5. 16 * 2/3 == 16 * 5/8 == 10.
297 * 32 * 2/3 = 21, 32 * 5/8 = 20.
298 * Its advantage is that it is faster to compute on machines with slow division.
299 * #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
300*/
301
302
303#define ENSURE_ALLOWS_DELETIONS(d) \
304 if ((d)->ma_keys->dk_lookup == lookdict_unicode_nodummy) { \
305 (d)->ma_keys->dk_lookup = lookdict_unicode; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400307
308/* This immutable, empty PyDictKeysObject is used for PyDict_Clear()
309 * (which cannot fail and thus can do no allocation).
310 */
311static PyDictKeysObject empty_keys_struct = {
312 2, /* dk_refcnt 1 for this struct, 1 for dummy_struct */
313 1, /* dk_size */
314 lookdict_split, /* dk_lookup */
315 0, /* dk_usable (immutable) */
316 {
317 { 0, 0, 0 } /* dk_entries (empty) */
318 }
319};
320
321static PyObject *empty_values[1] = { NULL };
322
323#define Py_EMPTY_KEYS &empty_keys_struct
324
325static PyDictKeysObject *new_keys_object(Py_ssize_t size)
326{
327 PyDictKeysObject *dk;
328 Py_ssize_t i;
329 PyDictKeyEntry *ep0;
330
331 assert(size >= PyDict_MINSIZE_SPLIT);
332 assert(IS_POWER_OF_2(size));
333 dk = PyMem_MALLOC(sizeof(PyDictKeysObject) +
334 sizeof(PyDictKeyEntry) * (size-1));
335 if (dk == NULL) {
336 PyErr_NoMemory();
337 return NULL;
338 }
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200339 DK_DEBUG_INCREF dk->dk_refcnt = 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400340 dk->dk_size = size;
341 dk->dk_usable = USABLE_FRACTION(size);
342 ep0 = &dk->dk_entries[0];
343 /* Hash value of slot 0 is used by popitem, so it must be initialized */
344 ep0->me_hash = 0;
345 for (i = 0; i < size; i++) {
346 ep0[i].me_key = NULL;
347 ep0[i].me_value = NULL;
348 }
349 dk->dk_lookup = lookdict_unicode_nodummy;
350 return dk;
351}
352
353static void
354free_keys_object(PyDictKeysObject *keys)
355{
356 PyDictKeyEntry *entries = &keys->dk_entries[0];
357 Py_ssize_t i, n;
358 for (i = 0, n = DK_SIZE(keys); i < n; i++) {
359 Py_XDECREF(entries[i].me_key);
360 Py_XDECREF(entries[i].me_value);
361 }
362 PyMem_FREE(keys);
363}
364
365#define new_values(size) PyMem_NEW(PyObject *, size)
366
367#define free_values(values) PyMem_FREE(values)
368
369/* Consumes a reference to the keys object */
370static PyObject *
371new_dict(PyDictKeysObject *keys, PyObject **values)
372{
373 PyDictObject *mp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 if (numfree) {
375 mp = free_list[--numfree];
376 assert (mp != NULL);
377 assert (Py_TYPE(mp) == &PyDict_Type);
378 _Py_NewReference((PyObject *)mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400380 else {
381 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
382 if (mp == NULL) {
383 DK_DECREF(keys);
384 free_values(values);
385 return NULL;
386 }
387 }
388 mp->ma_keys = keys;
389 mp->ma_values = values;
390 mp->ma_used = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000392}
393
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400394/* Consumes a reference to the keys object */
395static PyObject *
396new_dict_with_shared_keys(PyDictKeysObject *keys)
397{
398 PyObject **values;
399 Py_ssize_t i, size;
400
401 size = DK_SIZE(keys);
402 values = new_values(size);
403 if (values == NULL) {
404 DK_DECREF(keys);
405 return PyErr_NoMemory();
406 }
407 for (i = 0; i < size; i++) {
408 values[i] = NULL;
409 }
410 return new_dict(keys, values);
411}
412
413PyObject *
414PyDict_New(void)
415{
416 return new_dict(new_keys_object(PyDict_MINSIZE_COMBINED), NULL);
417}
418
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000419/*
420The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000421This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000422Open addressing is preferred over chaining since the link overhead for
423chaining would be substantial (100% with typical malloc overhead).
424
Tim Peterseb28ef22001-06-02 05:27:19 +0000425The initial probe index is computed as hash mod the table size. Subsequent
426probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000427
428All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000429
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000430The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000431contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000432Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000433
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000434lookdict() is general-purpose, and may return NULL if (and only if) a
435comparison raises an exception (this was new in Python 2.5).
Guido van Rossum89d8c602007-09-18 17:26:56 +0000436lookdict_unicode() below is specialized to string keys, comparison of which can
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400437never raise an exception; that function can never return NULL.
438lookdict_unicode_nodummy is further specialized for string keys that cannot be
439the <dummy> value.
440For both, when the key isn't found a PyDictEntry* is returned
441where the key would have been found, *value_addr points to the matching value
442slot.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000443*/
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400444static PyDictKeyEntry *
445lookdict(PyDictObject *mp, PyObject *key,
446 Py_hash_t hash, PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 register size_t i;
449 register size_t perturb;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400450 register PyDictKeyEntry *freeslot;
Antoine Pitrou9a234902012-05-13 20:48:01 +0200451 register size_t mask;
452 PyDictKeyEntry *ep0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400453 register PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 register int cmp;
455 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000456
Antoine Pitrou9a234902012-05-13 20:48:01 +0200457top:
458 mask = DK_MASK(mp->ma_keys);
459 ep0 = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 i = (size_t)hash & mask;
461 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400462 if (ep->me_key == NULL || ep->me_key == key) {
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 if (ep->me_key == dummy)
467 freeslot = ep;
468 else {
469 if (ep->me_hash == hash) {
470 startkey = ep->me_key;
471 Py_INCREF(startkey);
472 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
473 Py_DECREF(startkey);
474 if (cmp < 0)
475 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400476 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
477 if (cmp > 0) {
478 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400480 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 }
482 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200483 /* The dict was mutated, restart */
484 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 }
486 }
487 freeslot = NULL;
488 }
Tim Peters15d49292001-05-27 07:39:22 +0000489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 /* In the loop, me_key == dummy is by far (factor of 100s) the
491 least likely outcome, so test for that last. */
492 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
493 i = (i << 2) + i + perturb + 1;
494 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400495 if (ep->me_key == NULL) {
496 if (freeslot == NULL) {
497 *value_addr = &ep->me_value;
498 return ep;
499 } else {
500 *value_addr = &freeslot->me_value;
501 return freeslot;
502 }
503 }
504 if (ep->me_key == key) {
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 if (ep->me_hash == hash && ep->me_key != dummy) {
509 startkey = ep->me_key;
510 Py_INCREF(startkey);
511 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
512 Py_DECREF(startkey);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400513 if (cmp < 0) {
514 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400516 }
517 if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
518 if (cmp > 0) {
519 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400521 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 }
523 else {
Antoine Pitrou9a234902012-05-13 20:48:01 +0200524 /* The dict was mutated, restart */
525 goto top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 }
527 }
528 else if (ep->me_key == dummy && freeslot == NULL)
529 freeslot = ep;
530 }
531 assert(0); /* NOT REACHED */
532 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000533}
534
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400535/* Specialized version for string-only keys */
536static PyDictKeyEntry *
537lookdict_unicode(PyDictObject *mp, PyObject *key,
538 Py_hash_t hash, PyObject ***value_addr)
Fred Drake1bff34a2000-08-31 19:31:38 +0000539{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 register size_t i;
541 register size_t perturb;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400542 register PyDictKeyEntry *freeslot;
543 register size_t mask = DK_MASK(mp->ma_keys);
544 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
545 register PyDictKeyEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 /* Make sure this function doesn't have to handle non-unicode keys,
548 including subclasses of str; e.g., one reason to subclass
549 unicodes is to override __eq__, and for speed we don't cater to
550 that here. */
551 if (!PyUnicode_CheckExact(key)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400552 mp->ma_keys->dk_lookup = lookdict;
553 return lookdict(mp, key, hash, value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100555 i = (size_t)hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 ep = &ep0[i];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400557 if (ep->me_key == NULL || ep->me_key == key) {
558 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400560 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 if (ep->me_key == dummy)
562 freeslot = ep;
563 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400564 if (ep->me_hash == hash && unicode_eq(ep->me_key, key)) {
565 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400567 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 freeslot = NULL;
569 }
Tim Peters15d49292001-05-27 07:39:22 +0000570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 /* In the loop, me_key == dummy is by far (factor of 100s) the
572 least likely outcome, so test for that last. */
573 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
574 i = (i << 2) + i + perturb + 1;
575 ep = &ep0[i & mask];
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400576 if (ep->me_key == NULL) {
577 if (freeslot == NULL) {
578 *value_addr = &ep->me_value;
579 return ep;
580 } else {
581 *value_addr = &freeslot->me_value;
582 return freeslot;
583 }
584 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 if (ep->me_key == key
586 || (ep->me_hash == hash
587 && ep->me_key != dummy
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400588 && unicode_eq(ep->me_key, key))) {
589 *value_addr = &ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400591 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 if (ep->me_key == dummy && freeslot == NULL)
593 freeslot = ep;
594 }
595 assert(0); /* NOT REACHED */
596 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000597}
598
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400599/* Faster version of lookdict_unicode when it is known that no <dummy> keys
600 * will be present. */
601static PyDictKeyEntry *
602lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
603 Py_hash_t hash, PyObject ***value_addr)
604{
605 register size_t i;
606 register size_t perturb;
607 register size_t mask = DK_MASK(mp->ma_keys);
608 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
609 register PyDictKeyEntry *ep;
610
611 /* Make sure this function doesn't have to handle non-unicode keys,
612 including subclasses of str; e.g., one reason to subclass
613 unicodes is to override __eq__, and for speed we don't cater to
614 that here. */
615 if (!PyUnicode_CheckExact(key)) {
616 mp->ma_keys->dk_lookup = lookdict;
617 return lookdict(mp, key, hash, value_addr);
618 }
619 i = (size_t)hash & mask;
620 ep = &ep0[i];
621 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
622 if (ep->me_key == NULL || ep->me_key == key ||
623 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
624 *value_addr = &ep->me_value;
625 return ep;
626 }
627 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
628 i = (i << 2) + i + perturb + 1;
629 ep = &ep0[i & mask];
630 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
631 if (ep->me_key == NULL || ep->me_key == key ||
632 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
633 *value_addr = &ep->me_value;
634 return ep;
635 }
636 }
637 assert(0); /* NOT REACHED */
638 return 0;
639}
640
641/* Version of lookdict for split tables.
642 * All split tables and only split tables use this lookup function.
643 * Split tables only contain unicode keys and no dummy keys,
644 * so algorithm is the same as lookdict_unicode_nodummy.
645 */
646static PyDictKeyEntry *
647lookdict_split(PyDictObject *mp, PyObject *key,
648 Py_hash_t hash, PyObject ***value_addr)
649{
650 register size_t i;
651 register size_t perturb;
652 register size_t mask = DK_MASK(mp->ma_keys);
653 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
654 register PyDictKeyEntry *ep;
655
656 if (!PyUnicode_CheckExact(key)) {
Benjamin Petersondb780d02012-04-23 13:44:32 -0400657 ep = lookdict(mp, key, hash, value_addr);
658 /* lookdict expects a combined-table, so fix value_addr */
659 i = ep - ep0;
660 *value_addr = &mp->ma_values[i];
661 return ep;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400662 }
663 i = (size_t)hash & mask;
664 ep = &ep0[i];
665 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
666 if (ep->me_key == NULL || ep->me_key == key ||
667 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
668 *value_addr = &mp->ma_values[i];
669 return ep;
670 }
671 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
672 i = (i << 2) + i + perturb + 1;
673 ep = &ep0[i & mask];
674 assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
675 if (ep->me_key == NULL || ep->me_key == key ||
676 (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
677 *value_addr = &mp->ma_values[i & mask];
678 return ep;
679 }
680 }
681 assert(0); /* NOT REACHED */
682 return 0;
683}
684
Benjamin Petersonfb886362010-04-24 18:21:17 +0000685int
686_PyDict_HasOnlyStringKeys(PyObject *dict)
687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 Py_ssize_t pos = 0;
689 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +0000690 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 /* Shortcut */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400692 if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 return 1;
694 while (PyDict_Next(dict, &pos, &key, &value))
695 if (!PyUnicode_Check(key))
696 return 0;
697 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +0000698}
699
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000700#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 do { \
702 if (!_PyObject_GC_IS_TRACKED(mp)) { \
703 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
704 _PyObject_GC_MAY_BE_TRACKED(value)) { \
705 _PyObject_GC_TRACK(mp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 } \
707 } \
708 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000709
710void
711_PyDict_MaybeUntrack(PyObject *op)
712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 PyDictObject *mp;
714 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400715 Py_ssize_t i, size;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
718 return;
719
720 mp = (PyDictObject *) op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400721 size = DK_SIZE(mp->ma_keys);
722 if (_PyDict_HasSplitTable(mp)) {
723 for (i = 0; i < size; i++) {
724 if ((value = mp->ma_values[i]) == NULL)
725 continue;
726 if (_PyObject_GC_MAY_BE_TRACKED(value)) {
727 assert(!_PyObject_GC_MAY_BE_TRACKED(
728 mp->ma_keys->dk_entries[i].me_key));
729 return;
730 }
731 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400733 else {
734 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
735 for (i = 0; i < size; i++) {
736 if ((value = ep0[i].me_value) == NULL)
737 continue;
738 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
739 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
740 return;
741 }
742 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000744}
745
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400746/* Internal function to find slot for an item from its hash
747 * when it is known that the key is not present in the dict.
748 */
749static PyDictKeyEntry *
750find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
751 PyObject ***value_addr)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000752{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400753 size_t i;
754 size_t perturb;
755 size_t mask = DK_MASK(mp->ma_keys);
756 PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
757 PyDictKeyEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000758
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400759 assert(key != NULL);
760 if (!PyUnicode_CheckExact(key))
761 mp->ma_keys->dk_lookup = lookdict;
762 i = hash & mask;
763 ep = &ep0[i];
764 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
765 i = (i << 2) + i + perturb + 1;
766 ep = &ep0[i & mask];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400768 assert(ep->me_value == NULL);
769 if (mp->ma_values)
770 *value_addr = &mp->ma_values[i & mask];
771 else
772 *value_addr = &ep->me_value;
773 return ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000774}
775
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400776static int
777insertion_resize(PyDictObject *mp)
778{
779 /*
780 * Double the size of the dict,
781 * Previous versions quadrupled size, but doing so may result in excessive
782 * memory use. Doubling keeps the number of resizes low without wasting
783 * too much memory.
784 */
785 return dictresize(mp, 2 * mp->ma_used);
786}
Antoine Pitroue965d972012-02-27 00:45:12 +0100787
788/*
789Internal routine to insert a new item into the table.
790Used both by the internal resize routine and by the public insert routine.
Antoine Pitroue965d972012-02-27 00:45:12 +0100791Returns -1 if an error occurred, or 0 on success.
792*/
793static int
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400794insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +0100795{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400796 PyObject *old_value;
797 PyObject **value_addr;
798 PyDictKeyEntry *ep;
799 assert(key != dummy);
Antoine Pitroue965d972012-02-27 00:45:12 +0100800
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400801 if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
802 if (insertion_resize(mp) < 0)
803 return -1;
804 }
805
806 ep = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr);
Antoine Pitroue965d972012-02-27 00:45:12 +0100807 if (ep == NULL) {
Antoine Pitroue965d972012-02-27 00:45:12 +0100808 return -1;
809 }
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400810 Py_INCREF(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400811 MAINTAIN_TRACKING(mp, key, value);
812 old_value = *value_addr;
813 if (old_value != NULL) {
814 assert(ep->me_key != NULL && ep->me_key != dummy);
815 *value_addr = value;
816 Py_DECREF(old_value); /* which **CAN** re-enter */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400817 }
818 else {
819 if (ep->me_key == NULL) {
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400820 Py_INCREF(key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400821 if (mp->ma_keys->dk_usable <= 0) {
822 /* Need to resize. */
823 if (insertion_resize(mp) < 0) {
824 Py_DECREF(key);
825 Py_DECREF(value);
826 return -1;
827 }
828 ep = find_empty_slot(mp, key, hash, &value_addr);
829 }
830 mp->ma_keys->dk_usable--;
831 assert(mp->ma_keys->dk_usable >= 0);
832 ep->me_key = key;
833 ep->me_hash = hash;
834 }
835 else {
836 if (ep->me_key == dummy) {
Benjamin Petersona6f195e2012-04-30 10:23:40 -0400837 Py_INCREF(key);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400838 ep->me_key = key;
839 ep->me_hash = hash;
840 Py_DECREF(dummy);
841 } else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400842 assert(_PyDict_HasSplitTable(mp));
843 }
844 }
845 mp->ma_used++;
846 *value_addr = value;
847 }
848 assert(ep->me_key != NULL && ep->me_key != dummy);
849 assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
850 return 0;
Antoine Pitroue965d972012-02-27 00:45:12 +0100851}
852
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000853/*
854Internal routine used by dictresize() to insert an item which is
855known to be absent from the dict. This routine also assumes that
856the dict contains no deleted entries. Besides the performance benefit,
857using insertdict() in dictresize() is dangerous (SF bug #1456209).
858Note that no refcounts are changed by this routine; if needed, the caller
859is responsible for incref'ing `key` and `value`.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400860Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
861must set them correctly
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000862*/
863static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400864insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000866{
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400867 size_t i;
868 size_t perturb;
869 PyDictKeysObject *k = mp->ma_keys;
870 size_t mask = (size_t)DK_SIZE(k)-1;
871 PyDictKeyEntry *ep0 = &k->dk_entries[0];
872 PyDictKeyEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000873
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400874 assert(k->dk_lookup != NULL);
875 assert(value != NULL);
876 assert(key != NULL);
877 assert(key != dummy);
878 assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
879 i = hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 ep = &ep0[i];
881 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
882 i = (i << 2) + i + perturb + 1;
883 ep = &ep0[i & mask];
884 }
885 assert(ep->me_value == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000887 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000889}
890
891/*
892Restructure the table by allocating a new table and reinserting all
893items again. When entries have been deleted, the new table may
894actually be smaller than the old one.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400895If a table is split (its keys and hashes are shared, its values are not),
896then the values are temporarily copied into the table, it is resized as
897a combined table, then the me_value slots in the old table are NULLed out.
898After resizing a table is always combined,
899but can be resplit by make_keys_shared().
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000900*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000901static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000902dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 Py_ssize_t newsize;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400905 PyDictKeysObject *oldkeys;
906 PyObject **oldvalues;
907 Py_ssize_t i, oldsize;
Tim Peters91a364d2001-05-19 07:04:38 +0000908
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400909/* Find the smallest table size > minused. */
910 for (newsize = PyDict_MINSIZE_COMBINED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 newsize <= minused && newsize > 0;
912 newsize <<= 1)
913 ;
914 if (newsize <= 0) {
915 PyErr_NoMemory();
916 return -1;
917 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400918 oldkeys = mp->ma_keys;
919 oldvalues = mp->ma_values;
920 /* Allocate a new table. */
921 mp->ma_keys = new_keys_object(newsize);
922 if (mp->ma_keys == NULL) {
923 mp->ma_keys = oldkeys;
924 return -1;
925 }
926 if (oldkeys->dk_lookup == lookdict)
927 mp->ma_keys->dk_lookup = lookdict;
928 oldsize = DK_SIZE(oldkeys);
929 mp->ma_values = NULL;
930 /* If empty then nothing to copy so just return */
931 if (oldsize == 1) {
932 assert(oldkeys == Py_EMPTY_KEYS);
933 DK_DECREF(oldkeys);
934 return 0;
935 }
936 /* Main loop below assumes we can transfer refcount to new keys
937 * and that value is stored in me_value.
938 * Increment ref-counts and copy values here to compensate
939 * This (resizing a split table) should be relatively rare */
940 if (oldvalues != NULL) {
941 for (i = 0; i < oldsize; i++) {
942 if (oldvalues[i] != NULL) {
943 Py_INCREF(oldkeys->dk_entries[i].me_key);
944 oldkeys->dk_entries[i].me_value = oldvalues[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 }
947 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400948 /* Main loop */
949 for (i = 0; i < oldsize; i++) {
950 PyDictKeyEntry *ep = &oldkeys->dk_entries[i];
951 if (ep->me_value != NULL) {
952 assert(ep->me_key != dummy);
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000953 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400956 mp->ma_keys->dk_usable -= mp->ma_used;
957 if (oldvalues != NULL) {
958 /* NULL out me_value slot in oldkeys, in case it was shared */
959 for (i = 0; i < oldsize; i++)
960 oldkeys->dk_entries[i].me_value = NULL;
961 assert(oldvalues != empty_values);
962 free_values(oldvalues);
963 DK_DECREF(oldkeys);
964 }
965 else {
966 assert(oldkeys->dk_lookup != lookdict_split);
967 if (oldkeys->dk_lookup != lookdict_unicode_nodummy) {
968 PyDictKeyEntry *ep0 = &oldkeys->dk_entries[0];
969 for (i = 0; i < oldsize; i++) {
970 if (ep0[i].me_key == dummy)
971 Py_DECREF(dummy);
972 }
973 }
974 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +0200975 DK_DEBUG_DECREF PyMem_FREE(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400976 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000978}
979
Benjamin Peterson15ee8212012-04-24 14:44:18 -0400980/* Returns NULL if unable to split table.
981 * A NULL return does not necessarily indicate an error */
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400982static PyDictKeysObject *
983make_keys_shared(PyObject *op)
984{
985 Py_ssize_t i;
986 Py_ssize_t size;
987 PyDictObject *mp = (PyDictObject *)op;
988
Benjamin Peterson15ee8212012-04-24 14:44:18 -0400989 if (!PyDict_CheckExact(op))
990 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400991 if (!_PyDict_HasSplitTable(mp)) {
992 PyDictKeyEntry *ep0;
993 PyObject **values;
994 assert(mp->ma_keys->dk_refcnt == 1);
995 if (mp->ma_keys->dk_lookup == lookdict) {
996 return NULL;
997 }
998 else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
999 /* Remove dummy keys */
1000 if (dictresize(mp, DK_SIZE(mp->ma_keys)))
1001 return NULL;
1002 }
1003 assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
1004 /* Copy values into a new array */
1005 ep0 = &mp->ma_keys->dk_entries[0];
1006 size = DK_SIZE(mp->ma_keys);
1007 values = new_values(size);
1008 if (values == NULL) {
1009 PyErr_SetString(PyExc_MemoryError,
1010 "Not enough memory to allocate new values array");
1011 return NULL;
1012 }
1013 for (i = 0; i < size; i++) {
1014 values[i] = ep0[i].me_value;
1015 ep0[i].me_value = NULL;
1016 }
1017 mp->ma_keys->dk_lookup = lookdict_split;
1018 mp->ma_values = values;
1019 }
1020 DK_INCREF(mp->ma_keys);
1021 return mp->ma_keys;
1022}
Christian Heimes99170a52007-12-19 02:07:34 +00001023
1024PyObject *
1025_PyDict_NewPresized(Py_ssize_t minused)
1026{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001027 Py_ssize_t newsize;
1028 PyDictKeysObject *new_keys;
1029 for (newsize = PyDict_MINSIZE_COMBINED;
1030 newsize <= minused && newsize > 0;
1031 newsize <<= 1)
1032 ;
1033 new_keys = new_keys_object(newsize);
1034 if (new_keys == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001036 return new_dict(new_keys, NULL);
Christian Heimes99170a52007-12-19 02:07:34 +00001037}
1038
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001039/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
1040 * that may occur (originally dicts supported only string keys, and exceptions
1041 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001042 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001043 * (suppressed) occurred while computing the key's hash, or that some error
1044 * (suppressed) occurred when comparing keys in the dict's internal probe
1045 * sequence. A nasty example of the latter is when a Python-coded comparison
1046 * function hits a stack-depth error, which can cause this to return NULL
1047 * even if the key is present.
1048 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001049PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001050PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001051{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001052 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001054 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 PyThreadState *tstate;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001056 PyObject **value_addr;
1057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 if (!PyDict_Check(op))
1059 return NULL;
1060 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001061 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 {
1063 hash = PyObject_Hash(key);
1064 if (hash == -1) {
1065 PyErr_Clear();
1066 return NULL;
1067 }
1068 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 /* We can arrive here with a NULL tstate during initialization: try
1071 running "python -Wi" for an example related to string interning.
1072 Let's just hope that no exception occurs then... This must be
1073 _PyThreadState_Current and not PyThreadState_GET() because in debug
1074 mode, the latter complains if tstate is NULL. */
1075 tstate = (PyThreadState*)_Py_atomic_load_relaxed(
1076 &_PyThreadState_Current);
1077 if (tstate != NULL && tstate->curexc_type != NULL) {
1078 /* preserve the existing exception */
1079 PyObject *err_type, *err_value, *err_tb;
1080 PyErr_Fetch(&err_type, &err_value, &err_tb);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001081 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 /* ignore errors */
1083 PyErr_Restore(err_type, err_value, err_tb);
1084 if (ep == NULL)
1085 return NULL;
1086 }
1087 else {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001088 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 if (ep == NULL) {
1090 PyErr_Clear();
1091 return NULL;
1092 }
1093 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001094 return *value_addr;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001095}
1096
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001097/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
1098 This returns NULL *with* an exception set if an exception occurred.
1099 It returns NULL *without* an exception set if the key wasn't present.
1100*/
1101PyObject *
1102PyDict_GetItemWithError(PyObject *op, PyObject *key)
1103{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001104 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 PyDictObject*mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001106 PyDictKeyEntry *ep;
1107 PyObject **value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 if (!PyDict_Check(op)) {
1110 PyErr_BadInternalCall();
1111 return NULL;
1112 }
1113 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001114 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 {
1116 hash = PyObject_Hash(key);
1117 if (hash == -1) {
1118 return NULL;
1119 }
1120 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001121
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001122 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 if (ep == NULL)
1124 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001125 return *value_addr;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001126}
1127
Brett Cannonfd074152012-04-14 14:10:13 -04001128PyObject *
1129_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
1130{
1131 PyObject *kv;
1132 kv = _PyUnicode_FromId(key); /* borrowed */
1133 if (kv == NULL)
1134 return NULL;
1135 return PyDict_GetItemWithError(dp, kv);
1136}
1137
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001138/* Fast version of global value lookup.
1139 * Lookup in globals, then builtins.
1140 */
1141PyObject *
1142_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001143{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001144 PyObject *x;
1145 if (PyUnicode_CheckExact(key)) {
1146 PyObject **value_addr;
1147 Py_hash_t hash = ((PyASCIIObject *)key)->hash;
1148 if (hash != -1) {
1149 PyDictKeyEntry *e;
1150 e = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr);
1151 if (e == NULL) {
1152 return NULL;
1153 }
1154 x = *value_addr;
1155 if (x != NULL)
1156 return x;
1157 e = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr);
1158 if (e == NULL) {
1159 return NULL;
1160 }
1161 x = *value_addr;
1162 return x;
1163 }
Antoine Pitroue965d972012-02-27 00:45:12 +01001164 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001165 x = PyDict_GetItemWithError((PyObject *)globals, key);
1166 if (x != NULL)
1167 return x;
1168 if (PyErr_Occurred())
1169 return NULL;
1170 return PyDict_GetItemWithError((PyObject *)builtins, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001171}
1172
Antoine Pitroue965d972012-02-27 00:45:12 +01001173/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
1174 * dictionary if it's merely replacing the value for an existing key.
1175 * This means that it's safe to loop over a dictionary with PyDict_Next()
1176 * and occasionally replace a value -- but you can't insert new keys or
1177 * remove them.
1178 */
1179int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001180PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
Antoine Pitroue965d972012-02-27 00:45:12 +01001181{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001182 PyDictObject *mp;
1183 Py_hash_t hash;
Antoine Pitroue965d972012-02-27 00:45:12 +01001184 if (!PyDict_Check(op)) {
1185 PyErr_BadInternalCall();
1186 return -1;
1187 }
1188 assert(key);
1189 assert(value);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001190 mp = (PyDictObject *)op;
1191 if (!PyUnicode_CheckExact(key) ||
1192 (hash = ((PyASCIIObject *) key)->hash) == -1)
1193 {
Antoine Pitroue965d972012-02-27 00:45:12 +01001194 hash = PyObject_Hash(key);
1195 if (hash == -1)
1196 return -1;
1197 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001198
1199 /* insertdict() handles any resizing that might be necessary */
1200 return insertdict(mp, key, hash, value);
Antoine Pitroue965d972012-02-27 00:45:12 +01001201}
1202
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001203int
Tim Peters1f5871e2000-07-04 17:44:48 +00001204PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001205{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001206 PyDictObject *mp;
1207 Py_hash_t hash;
1208 PyDictKeyEntry *ep;
1209 PyObject *old_key, *old_value;
1210 PyObject **value_addr;
Guido van Rossumd7047b31995-01-02 19:07:15 +00001211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 if (!PyDict_Check(op)) {
1213 PyErr_BadInternalCall();
1214 return -1;
1215 }
1216 assert(key);
1217 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001218 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 hash = PyObject_Hash(key);
1220 if (hash == -1)
1221 return -1;
1222 }
1223 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001224 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 if (ep == NULL)
1226 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001227 if (*value_addr == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 set_key_error(key);
1229 return -1;
1230 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001231 old_value = *value_addr;
1232 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001234 if (!_PyDict_HasSplitTable(mp)) {
1235 ENSURE_ALLOWS_DELETIONS(mp);
1236 old_key = ep->me_key;
1237 Py_INCREF(dummy);
1238 ep->me_key = dummy;
1239 Py_DECREF(old_key);
1240 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001243}
1244
Guido van Rossum25831651993-05-19 14:50:45 +00001245void
Tim Peters1f5871e2000-07-04 17:44:48 +00001246PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 PyDictObject *mp;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001249 PyDictKeysObject *oldkeys;
1250 PyObject **oldvalues;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +00001252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 if (!PyDict_Check(op))
1254 return;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001255 mp = ((PyDictObject *)op);
1256 oldkeys = mp->ma_keys;
1257 oldvalues = mp->ma_values;
1258 if (oldvalues == empty_values)
1259 return;
1260 /* Empty the dict... */
1261 DK_INCREF(Py_EMPTY_KEYS);
1262 mp->ma_keys = Py_EMPTY_KEYS;
1263 mp->ma_values = empty_values;
1264 mp->ma_used = 0;
1265 /* ...then clear the keys and values */
1266 if (oldvalues != NULL) {
1267 n = DK_SIZE(oldkeys);
1268 for (i = 0; i < n; i++)
1269 Py_CLEAR(oldvalues[i]);
1270 free_values(oldvalues);
1271 DK_DECREF(oldkeys);
1272 }
1273 else {
1274 assert(oldkeys->dk_refcnt == 1);
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001275 DK_DECREF(oldkeys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001276 }
1277}
1278
1279/* Returns -1 if no more items (or op is not a dict),
1280 * index of item otherwise. Stores value in pvalue
1281 */
1282Py_LOCAL_INLINE(Py_ssize_t)
1283dict_next(PyObject *op, Py_ssize_t i, PyObject **pvalue)
1284{
1285 Py_ssize_t mask, offset;
1286 PyDictObject *mp;
1287 PyObject **value_ptr;
1288
1289
1290 if (!PyDict_Check(op))
1291 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001293 if (i < 0)
1294 return -1;
1295 if (mp->ma_values) {
1296 value_ptr = &mp->ma_values[i];
1297 offset = sizeof(PyObject *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001299 else {
1300 value_ptr = &mp->ma_keys->dk_entries[i].me_value;
1301 offset = sizeof(PyDictKeyEntry);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001303 mask = DK_MASK(mp->ma_keys);
1304 while (i <= mask && *value_ptr == NULL) {
1305 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1306 i++;
1307 }
1308 if (i > mask)
1309 return -1;
1310 if (pvalue)
1311 *pvalue = *value_ptr;
1312 return i;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001313}
1314
Tim Peters080c88b2003-02-15 03:01:11 +00001315/*
1316 * Iterate over a dict. Use like so:
1317 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001318 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00001319 * PyObject *key, *value;
1320 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +00001321 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +00001322 * Refer to borrowed references in key and value.
1323 * }
1324 *
1325 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +00001326 * mutates the dict. One exception: it is safe if the loop merely changes
1327 * the values associated with the keys (but doesn't insert new keys or
1328 * delete keys), via PyDict_SetItem().
1329 */
Guido van Rossum25831651993-05-19 14:50:45 +00001330int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001331PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001332{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001333 PyDictObject *mp;
1334 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 if (i < 0)
1336 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001337 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 *ppos = i+1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001340 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001342}
1343
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001344/* Internal version of PyDict_Next that returns a hash value in addition
1345 * to the key and value.
1346 */
Thomas Wouterscf297e42007-02-23 15:07:44 +00001347int
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001348_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
1349 PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001350{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001351 PyDictObject *mp;
1352 Py_ssize_t i = dict_next(op, *ppos, pvalue);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 if (i < 0)
1354 return 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001355 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 *ppos = i+1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001357 *phash = mp->ma_keys->dk_entries[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 if (pkey)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001359 *pkey = mp->ma_keys->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001361}
1362
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001363/* Methods */
1364
1365static void
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001366dict_dealloc(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001367{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001368 PyObject **values = mp->ma_values;
1369 PyDictKeysObject *keys = mp->ma_keys;
1370 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 PyObject_GC_UnTrack(mp);
1372 Py_TRASHCAN_SAFE_BEGIN(mp)
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001373 if (values != NULL) {
1374 if (values != empty_values) {
1375 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
1376 Py_XDECREF(values[i]);
1377 }
1378 free_values(values);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001380 DK_DECREF(keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001382 else {
Antoine Pitrou2d169b22012-05-12 23:43:44 +02001383 assert(keys->dk_refcnt == 1);
1384 DK_DECREF(keys);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001385 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1387 free_list[numfree++] = mp;
1388 else
1389 Py_TYPE(mp)->tp_free((PyObject *)mp);
1390 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001391}
1392
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001393
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001394static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001395dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 Py_ssize_t i;
1398 PyObject *s, *temp, *colon = NULL;
1399 PyObject *pieces = NULL, *result = NULL;
1400 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 i = Py_ReprEnter((PyObject *)mp);
1403 if (i != 0) {
1404 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1405 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 if (mp->ma_used == 0) {
1408 result = PyUnicode_FromString("{}");
1409 goto Done;
1410 }
Tim Petersa7259592001-06-16 05:11:17 +00001411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 pieces = PyList_New(0);
1413 if (pieces == NULL)
1414 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 colon = PyUnicode_FromString(": ");
1417 if (colon == NULL)
1418 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 /* Do repr() on each key+value pair, and insert ": " between them.
1421 Note that repr may mutate the dict. */
1422 i = 0;
1423 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
1424 int status;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001425 /* Prevent repr from deleting key or value during key format. */
1426 Py_INCREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 Py_INCREF(value);
1428 s = PyObject_Repr(key);
1429 PyUnicode_Append(&s, colon);
1430 PyUnicode_AppendAndDel(&s, PyObject_Repr(value));
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001431 Py_DECREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 Py_DECREF(value);
1433 if (s == NULL)
1434 goto Done;
1435 status = PyList_Append(pieces, s);
1436 Py_DECREF(s); /* append created a new ref */
1437 if (status < 0)
1438 goto Done;
1439 }
Tim Petersa7259592001-06-16 05:11:17 +00001440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 /* Add "{}" decorations to the first and last items. */
1442 assert(PyList_GET_SIZE(pieces) > 0);
1443 s = PyUnicode_FromString("{");
1444 if (s == NULL)
1445 goto Done;
1446 temp = PyList_GET_ITEM(pieces, 0);
1447 PyUnicode_AppendAndDel(&s, temp);
1448 PyList_SET_ITEM(pieces, 0, s);
1449 if (s == NULL)
1450 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 s = PyUnicode_FromString("}");
1453 if (s == NULL)
1454 goto Done;
1455 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
1456 PyUnicode_AppendAndDel(&temp, s);
1457 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1458 if (temp == NULL)
1459 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 /* Paste them all together with ", " between. */
1462 s = PyUnicode_FromString(", ");
1463 if (s == NULL)
1464 goto Done;
1465 result = PyUnicode_Join(s, pieces);
1466 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001467
1468Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 Py_XDECREF(pieces);
1470 Py_XDECREF(colon);
1471 Py_ReprLeave((PyObject *)mp);
1472 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001473}
1474
Martin v. Löwis18e16552006-02-15 17:27:45 +00001475static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001476dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001479}
1480
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001481static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001482dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 PyObject *v;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001485 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001486 PyDictKeyEntry *ep;
1487 PyObject **value_addr;
1488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001490 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 hash = PyObject_Hash(key);
1492 if (hash == -1)
1493 return NULL;
1494 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001495 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 if (ep == NULL)
1497 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001498 v = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 if (v == NULL) {
1500 if (!PyDict_CheckExact(mp)) {
1501 /* Look up __missing__ method if we're a subclass. */
1502 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05001503 _Py_IDENTIFIER(__missing__);
1504 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 if (missing != NULL) {
1506 res = PyObject_CallFunctionObjArgs(missing,
1507 key, NULL);
1508 Py_DECREF(missing);
1509 return res;
1510 }
1511 else if (PyErr_Occurred())
1512 return NULL;
1513 }
1514 set_key_error(key);
1515 return NULL;
1516 }
1517 else
1518 Py_INCREF(v);
1519 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001520}
1521
1522static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001523dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 if (w == NULL)
1526 return PyDict_DelItem((PyObject *)mp, v);
1527 else
1528 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001529}
1530
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001531static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 (lenfunc)dict_length, /*mp_length*/
1533 (binaryfunc)dict_subscript, /*mp_subscript*/
1534 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001535};
1536
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001537static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001538dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001539{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 register PyObject *v;
1541 register Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001542 PyDictKeyEntry *ep;
1543 Py_ssize_t size, n, offset;
1544 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001545
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001546 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 n = mp->ma_used;
1548 v = PyList_New(n);
1549 if (v == NULL)
1550 return NULL;
1551 if (n != mp->ma_used) {
1552 /* Durnit. The allocations caused the dict to resize.
1553 * Just start over, this shouldn't normally happen.
1554 */
1555 Py_DECREF(v);
1556 goto again;
1557 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001558 ep = &mp->ma_keys->dk_entries[0];
1559 size = DK_SIZE(mp->ma_keys);
1560 if (mp->ma_values) {
1561 value_ptr = mp->ma_values;
1562 offset = sizeof(PyObject *);
1563 }
1564 else {
1565 value_ptr = &ep[0].me_value;
1566 offset = sizeof(PyDictKeyEntry);
1567 }
1568 for (i = 0, j = 0; i < size; i++) {
1569 if (*value_ptr != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 PyObject *key = ep[i].me_key;
1571 Py_INCREF(key);
1572 PyList_SET_ITEM(v, j, key);
1573 j++;
1574 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001575 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 }
1577 assert(j == n);
1578 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001579}
1580
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001581static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001582dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 register PyObject *v;
1585 register Py_ssize_t i, j;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001586 Py_ssize_t size, n, offset;
1587 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001588
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001589 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 n = mp->ma_used;
1591 v = PyList_New(n);
1592 if (v == NULL)
1593 return NULL;
1594 if (n != mp->ma_used) {
1595 /* Durnit. The allocations caused the dict to resize.
1596 * Just start over, this shouldn't normally happen.
1597 */
1598 Py_DECREF(v);
1599 goto again;
1600 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001601 size = DK_SIZE(mp->ma_keys);
1602 if (mp->ma_values) {
1603 value_ptr = mp->ma_values;
1604 offset = sizeof(PyObject *);
1605 }
1606 else {
1607 value_ptr = &mp->ma_keys->dk_entries[0].me_value;
1608 offset = sizeof(PyDictKeyEntry);
1609 }
1610 for (i = 0, j = 0; i < size; i++) {
1611 PyObject *value = *value_ptr;
1612 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1613 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 Py_INCREF(value);
1615 PyList_SET_ITEM(v, j, value);
1616 j++;
1617 }
1618 }
1619 assert(j == n);
1620 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001621}
1622
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001623static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001624dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 register PyObject *v;
1627 register Py_ssize_t i, j, n;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001628 Py_ssize_t size, offset;
1629 PyObject *item, *key;
1630 PyDictKeyEntry *ep;
1631 PyObject **value_ptr;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 /* Preallocate the list of tuples, to avoid allocations during
1634 * the loop over the items, which could trigger GC, which
1635 * could resize the dict. :-(
1636 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001637 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 n = mp->ma_used;
1639 v = PyList_New(n);
1640 if (v == NULL)
1641 return NULL;
1642 for (i = 0; i < n; i++) {
1643 item = PyTuple_New(2);
1644 if (item == NULL) {
1645 Py_DECREF(v);
1646 return NULL;
1647 }
1648 PyList_SET_ITEM(v, i, item);
1649 }
1650 if (n != mp->ma_used) {
1651 /* Durnit. The allocations caused the dict to resize.
1652 * Just start over, this shouldn't normally happen.
1653 */
1654 Py_DECREF(v);
1655 goto again;
1656 }
1657 /* Nothing we do below makes any function calls. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001658 ep = mp->ma_keys->dk_entries;
1659 size = DK_SIZE(mp->ma_keys);
1660 if (mp->ma_values) {
1661 value_ptr = mp->ma_values;
1662 offset = sizeof(PyObject *);
1663 }
1664 else {
1665 value_ptr = &ep[0].me_value;
1666 offset = sizeof(PyDictKeyEntry);
1667 }
1668 for (i = 0, j = 0; i < size; i++) {
1669 PyObject *value = *value_ptr;
1670 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
1671 if (value != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 key = ep[i].me_key;
1673 item = PyList_GET_ITEM(v, j);
1674 Py_INCREF(key);
1675 PyTuple_SET_ITEM(item, 0, key);
1676 Py_INCREF(value);
1677 PyTuple_SET_ITEM(item, 1, value);
1678 j++;
1679 }
1680 }
1681 assert(j == n);
1682 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001683}
1684
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001685static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001686dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 PyObject *seq;
1689 PyObject *value = Py_None;
1690 PyObject *it; /* iter(seq) */
1691 PyObject *key;
1692 PyObject *d;
1693 int status;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
1696 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 d = PyObject_CallObject(cls, NULL);
1699 if (d == NULL)
1700 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1703 PyDictObject *mp = (PyDictObject *)d;
1704 PyObject *oldvalue;
1705 Py_ssize_t pos = 0;
1706 PyObject *key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001707 Py_hash_t hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001708
Petri Lehtinena94200e2011-10-24 21:12:58 +03001709 if (dictresize(mp, Py_SIZE(seq))) {
1710 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001712 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
Petri Lehtinena94200e2011-10-24 21:12:58 +03001715 if (insertdict(mp, key, hash, value)) {
1716 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001718 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 }
1720 return d;
1721 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
1724 PyDictObject *mp = (PyDictObject *)d;
1725 Py_ssize_t pos = 0;
1726 PyObject *key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001727 Py_hash_t hash;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001728
Petri Lehtinena94200e2011-10-24 21:12:58 +03001729 if (dictresize(mp, PySet_GET_SIZE(seq))) {
1730 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001732 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
Petri Lehtinena94200e2011-10-24 21:12:58 +03001735 if (insertdict(mp, key, hash, value)) {
1736 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001738 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 }
1740 return d;
1741 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 it = PyObject_GetIter(seq);
1744 if (it == NULL){
1745 Py_DECREF(d);
1746 return NULL;
1747 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 if (PyDict_CheckExact(d)) {
1750 while ((key = PyIter_Next(it)) != NULL) {
1751 status = PyDict_SetItem(d, key, value);
1752 Py_DECREF(key);
1753 if (status < 0)
1754 goto Fail;
1755 }
1756 } else {
1757 while ((key = PyIter_Next(it)) != NULL) {
1758 status = PyObject_SetItem(d, key, value);
1759 Py_DECREF(key);
1760 if (status < 0)
1761 goto Fail;
1762 }
1763 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 if (PyErr_Occurred())
1766 goto Fail;
1767 Py_DECREF(it);
1768 return d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001769
1770Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 Py_DECREF(it);
1772 Py_DECREF(d);
1773 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001774}
1775
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001776static int
1777dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001778{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 PyObject *arg = NULL;
1780 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1783 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001786 _Py_IDENTIFIER(keys);
1787 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 result = PyDict_Merge(self, arg, 1);
1789 else
1790 result = PyDict_MergeFromSeq2(self, arg, 1);
1791 }
1792 if (result == 0 && kwds != NULL) {
1793 if (PyArg_ValidateKeywordArguments(kwds))
1794 result = PyDict_Merge(self, kwds, 1);
1795 else
1796 result = -1;
1797 }
1798 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001799}
1800
1801static PyObject *
1802dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1803{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 if (dict_update_common(self, args, kwds, "update") != -1)
1805 Py_RETURN_NONE;
1806 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001807}
1808
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001809/* Update unconditionally replaces existing items.
1810 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001811 otherwise it leaves existing items unchanged.
1812
1813 PyDict_{Update,Merge} update/merge from a mapping object.
1814
Tim Petersf582b822001-12-11 18:51:08 +00001815 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001816 producing iterable objects of length 2.
1817*/
1818
Tim Petersf582b822001-12-11 18:51:08 +00001819int
Tim Peters1fc240e2001-10-26 05:06:50 +00001820PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1821{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 PyObject *it; /* iter(seq2) */
1823 Py_ssize_t i; /* index into seq2 of current element */
1824 PyObject *item; /* seq2[i] */
1825 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 assert(d != NULL);
1828 assert(PyDict_Check(d));
1829 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 it = PyObject_GetIter(seq2);
1832 if (it == NULL)
1833 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 for (i = 0; ; ++i) {
1836 PyObject *key, *value;
1837 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 fast = NULL;
1840 item = PyIter_Next(it);
1841 if (item == NULL) {
1842 if (PyErr_Occurred())
1843 goto Fail;
1844 break;
1845 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 /* Convert item to sequence, and verify length 2. */
1848 fast = PySequence_Fast(item, "");
1849 if (fast == NULL) {
1850 if (PyErr_ExceptionMatches(PyExc_TypeError))
1851 PyErr_Format(PyExc_TypeError,
1852 "cannot convert dictionary update "
1853 "sequence element #%zd to a sequence",
1854 i);
1855 goto Fail;
1856 }
1857 n = PySequence_Fast_GET_SIZE(fast);
1858 if (n != 2) {
1859 PyErr_Format(PyExc_ValueError,
1860 "dictionary update sequence element #%zd "
1861 "has length %zd; 2 is required",
1862 i, n);
1863 goto Fail;
1864 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 /* Update/merge with this (key, value) pair. */
1867 key = PySequence_Fast_GET_ITEM(fast, 0);
1868 value = PySequence_Fast_GET_ITEM(fast, 1);
1869 if (override || PyDict_GetItem(d, key) == NULL) {
1870 int status = PyDict_SetItem(d, key, value);
1871 if (status < 0)
1872 goto Fail;
1873 }
1874 Py_DECREF(fast);
1875 Py_DECREF(item);
1876 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 i = 0;
1879 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00001880Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 Py_XDECREF(item);
1882 Py_XDECREF(fast);
1883 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001884Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 Py_DECREF(it);
1886 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001887}
1888
Tim Peters6d6c1a32001-08-02 04:15:00 +00001889int
1890PyDict_Update(PyObject *a, PyObject *b)
1891{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001893}
1894
1895int
1896PyDict_Merge(PyObject *a, PyObject *b, int override)
1897{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 register PyDictObject *mp, *other;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001899 register Py_ssize_t i, n;
1900 PyDictKeyEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 /* We accept for the argument either a concrete dictionary object,
1903 * or an abstract "mapping" object. For the former, we can do
1904 * things quite efficiently. For the latter, we only require that
1905 * PyMapping_Keys() and PyObject_GetItem() be supported.
1906 */
1907 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1908 PyErr_BadInternalCall();
1909 return -1;
1910 }
1911 mp = (PyDictObject*)a;
1912 if (PyDict_Check(b)) {
1913 other = (PyDictObject*)b;
1914 if (other == mp || other->ma_used == 0)
1915 /* a.update(a) or a.update({}); nothing to do */
1916 return 0;
1917 if (mp->ma_used == 0)
1918 /* Since the target dict is empty, PyDict_GetItem()
1919 * always returns NULL. Setting override to 1
1920 * skips the unnecessary test.
1921 */
1922 override = 1;
1923 /* Do one big resize at the start, rather than
1924 * incrementally resizing as we insert new items. Expect
1925 * that there will be no (or few) overlapping keys.
1926 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001927 if (mp->ma_keys->dk_usable * 3 < other->ma_used * 2)
1928 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001930 for (i = 0, n = DK_SIZE(other->ma_keys); i < n; i++) {
1931 PyObject *value;
1932 entry = &other->ma_keys->dk_entries[i];
1933 if (other->ma_values)
1934 value = other->ma_values[i];
1935 else
1936 value = entry->me_value;
1937
1938 if (value != NULL &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 (override ||
1940 PyDict_GetItem(a, entry->me_key) == NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 if (insertdict(mp, entry->me_key,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001942 entry->me_hash,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001943 value) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 return -1;
1945 }
1946 }
1947 }
1948 else {
1949 /* Do it the generic, slower way */
1950 PyObject *keys = PyMapping_Keys(b);
1951 PyObject *iter;
1952 PyObject *key, *value;
1953 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 if (keys == NULL)
1956 /* Docstring says this is equivalent to E.keys() so
1957 * if E doesn't have a .keys() method we want
1958 * AttributeError to percolate up. Might as well
1959 * do the same for any other error.
1960 */
1961 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 iter = PyObject_GetIter(keys);
1964 Py_DECREF(keys);
1965 if (iter == NULL)
1966 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
1969 if (!override && PyDict_GetItem(a, key) != NULL) {
1970 Py_DECREF(key);
1971 continue;
1972 }
1973 value = PyObject_GetItem(b, key);
1974 if (value == NULL) {
1975 Py_DECREF(iter);
1976 Py_DECREF(key);
1977 return -1;
1978 }
1979 status = PyDict_SetItem(a, key, value);
1980 Py_DECREF(key);
1981 Py_DECREF(value);
1982 if (status < 0) {
1983 Py_DECREF(iter);
1984 return -1;
1985 }
1986 }
1987 Py_DECREF(iter);
1988 if (PyErr_Occurred())
1989 /* Iterator completed, via error */
1990 return -1;
1991 }
1992 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001993}
1994
1995static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001996dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001999}
2000
2001PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002002PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002003{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 PyObject *copy;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002005 PyDictObject *mp;
2006 Py_ssize_t i, n;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00002007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 if (o == NULL || !PyDict_Check(o)) {
2009 PyErr_BadInternalCall();
2010 return NULL;
2011 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002012 mp = (PyDictObject *)o;
2013 if (_PyDict_HasSplitTable(mp)) {
2014 PyDictObject *split_copy;
2015 PyObject **newvalues = new_values(DK_SIZE(mp->ma_keys));
2016 if (newvalues == NULL)
2017 return PyErr_NoMemory();
2018 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
2019 if (split_copy == NULL) {
2020 free_values(newvalues);
2021 return NULL;
2022 }
2023 split_copy->ma_values = newvalues;
2024 split_copy->ma_keys = mp->ma_keys;
2025 split_copy->ma_used = mp->ma_used;
2026 DK_INCREF(mp->ma_keys);
2027 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2028 PyObject *value = mp->ma_values[i];
2029 Py_XINCREF(value);
2030 split_copy->ma_values[i] = value;
2031 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002032 if (_PyObject_GC_IS_TRACKED(mp))
2033 _PyObject_GC_TRACK(split_copy);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002034 return (PyObject *)split_copy;
2035 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 copy = PyDict_New();
2037 if (copy == NULL)
2038 return NULL;
2039 if (PyDict_Merge(copy, o, 1) == 0)
2040 return copy;
2041 Py_DECREF(copy);
2042 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00002043}
2044
Martin v. Löwis18e16552006-02-15 17:27:45 +00002045Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00002046PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00002047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 if (mp == NULL || !PyDict_Check(mp)) {
2049 PyErr_BadInternalCall();
2050 return -1;
2051 }
2052 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00002053}
2054
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002055PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002056PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 if (mp == NULL || !PyDict_Check(mp)) {
2059 PyErr_BadInternalCall();
2060 return NULL;
2061 }
2062 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002063}
2064
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002065PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002066PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002067{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 if (mp == NULL || !PyDict_Check(mp)) {
2069 PyErr_BadInternalCall();
2070 return NULL;
2071 }
2072 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002073}
2074
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002075PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00002076PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00002077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 if (mp == NULL || !PyDict_Check(mp)) {
2079 PyErr_BadInternalCall();
2080 return NULL;
2081 }
2082 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00002083}
2084
Tim Peterse63415e2001-05-08 04:38:29 +00002085/* Return 1 if dicts equal, 0 if not, -1 if error.
2086 * Gets out as soon as any difference is detected.
2087 * Uses only Py_EQ comparison.
2088 */
2089static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002090dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00002091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00002093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 if (a->ma_used != b->ma_used)
2095 /* can't be equal if # of entries differ */
2096 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002098 for (i = 0; i < DK_SIZE(a->ma_keys); i++) {
2099 PyDictKeyEntry *ep = &a->ma_keys->dk_entries[i];
2100 PyObject *aval;
2101 if (a->ma_values)
2102 aval = a->ma_values[i];
2103 else
2104 aval = ep->me_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 if (aval != NULL) {
2106 int cmp;
2107 PyObject *bval;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002108 PyObject *key = ep->me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 /* temporarily bump aval's refcount to ensure it stays
2110 alive until we're done with it */
2111 Py_INCREF(aval);
2112 /* ditto for key */
2113 Py_INCREF(key);
2114 bval = PyDict_GetItemWithError((PyObject *)b, key);
2115 Py_DECREF(key);
2116 if (bval == NULL) {
2117 Py_DECREF(aval);
2118 if (PyErr_Occurred())
2119 return -1;
2120 return 0;
2121 }
2122 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
2123 Py_DECREF(aval);
2124 if (cmp <= 0) /* error or not equal */
2125 return cmp;
2126 }
2127 }
2128 return 1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002129}
Tim Peterse63415e2001-05-08 04:38:29 +00002130
2131static PyObject *
2132dict_richcompare(PyObject *v, PyObject *w, int op)
2133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 int cmp;
2135 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00002136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 if (!PyDict_Check(v) || !PyDict_Check(w)) {
2138 res = Py_NotImplemented;
2139 }
2140 else if (op == Py_EQ || op == Py_NE) {
2141 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
2142 if (cmp < 0)
2143 return NULL;
2144 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
2145 }
2146 else
2147 res = Py_NotImplemented;
2148 Py_INCREF(res);
2149 return res;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002150}
Tim Peterse63415e2001-05-08 04:38:29 +00002151
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002152static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002153dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002154{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002155 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002156 PyDictKeyEntry *ep;
2157 PyObject **value_addr;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002160 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 hash = PyObject_Hash(key);
2162 if (hash == -1)
2163 return NULL;
2164 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002165 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 if (ep == NULL)
2167 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002168 return PyBool_FromLong(*value_addr != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002169}
2170
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002171static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002172dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00002173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 PyObject *key;
2175 PyObject *failobj = Py_None;
2176 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002177 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002178 PyDictKeyEntry *ep;
2179 PyObject **value_addr;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
2182 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002185 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 hash = PyObject_Hash(key);
2187 if (hash == -1)
2188 return NULL;
2189 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002190 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 if (ep == NULL)
2192 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002193 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 if (val == NULL)
2195 val = failobj;
2196 Py_INCREF(val);
2197 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00002198}
2199
Barry Warsawc38c5da1997-10-06 17:49:20 +00002200static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002201dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00002202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002203 PyObject *key;
2204 PyObject *failobj = Py_None;
2205 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002206 Py_hash_t hash;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002207 PyDictKeyEntry *ep;
2208 PyObject **value_addr;
Guido van Rossum164452c2000-08-08 16:12:54 +00002209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
2211 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00002212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002214 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002215 hash = PyObject_Hash(key);
2216 if (hash == -1)
2217 return NULL;
2218 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002219 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002220 if (ep == NULL)
2221 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002222 val = *value_addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 if (val == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002224 Py_INCREF(failobj);
2225 Py_INCREF(key);
2226 if (mp->ma_keys->dk_usable <= 0) {
2227 /* Need to resize. */
2228 if (insertion_resize(mp) < 0)
2229 return NULL;
2230 ep = find_empty_slot(mp, key, hash, &value_addr);
2231 }
Benjamin Peterson7ce67e42012-04-24 10:32:57 -04002232 MAINTAIN_TRACKING(mp, key, failobj);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002233 ep->me_key = key;
2234 ep->me_hash = hash;
2235 *value_addr = failobj;
2236 val = failobj;
2237 mp->ma_keys->dk_usable--;
2238 mp->ma_used++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002239 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002240 Py_INCREF(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00002242}
2243
2244
2245static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002246dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 PyDict_Clear((PyObject *)mp);
2249 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002250}
2251
Guido van Rossumba6ab842000-12-12 22:02:18 +00002252static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002253dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002254{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002255 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 PyObject *old_value, *old_key;
2257 PyObject *key, *deflt = NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002258 PyDictKeyEntry *ep;
2259 PyObject **value_addr;
Guido van Rossume027d982002-04-12 15:11:59 +00002260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2262 return NULL;
2263 if (mp->ma_used == 0) {
2264 if (deflt) {
2265 Py_INCREF(deflt);
2266 return deflt;
2267 }
Raymond Hettingerdd421542010-10-30 08:10:29 +00002268 set_key_error(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 return NULL;
2270 }
2271 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002272 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 hash = PyObject_Hash(key);
2274 if (hash == -1)
2275 return NULL;
2276 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002277 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 if (ep == NULL)
2279 return NULL;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002280 old_value = *value_addr;
2281 if (old_value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 if (deflt) {
2283 Py_INCREF(deflt);
2284 return deflt;
2285 }
2286 set_key_error(key);
2287 return NULL;
2288 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002289 *value_addr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002291 if (!_PyDict_HasSplitTable(mp)) {
2292 ENSURE_ALLOWS_DELETIONS(mp);
2293 old_key = ep->me_key;
2294 Py_INCREF(dummy);
2295 ep->me_key = dummy;
2296 Py_DECREF(old_key);
2297 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 return old_value;
Guido van Rossume027d982002-04-12 15:11:59 +00002299}
2300
2301static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002302dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002303{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002304 Py_hash_t i = 0;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002305 PyDictKeyEntry *ep;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002307
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 /* Allocate the result tuple before checking the size. Believe it
2310 * or not, this allocation could trigger a garbage collection which
2311 * could empty the dict, so if we checked the size first and that
2312 * happened, the result would be an infinite loop (searching for an
2313 * entry that no longer exists). Note that the usual popitem()
2314 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2315 * tuple away if the dict *is* empty isn't a significant
2316 * inefficiency -- possible, but unlikely in practice.
2317 */
2318 res = PyTuple_New(2);
2319 if (res == NULL)
2320 return NULL;
2321 if (mp->ma_used == 0) {
2322 Py_DECREF(res);
2323 PyErr_SetString(PyExc_KeyError,
2324 "popitem(): dictionary is empty");
2325 return NULL;
2326 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002327 /* Convert split table to combined table */
2328 if (mp->ma_keys->dk_lookup == lookdict_split) {
2329 if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
2330 Py_DECREF(res);
2331 return NULL;
2332 }
2333 }
2334 ENSURE_ALLOWS_DELETIONS(mp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 /* Set ep to "the first" dict entry with a value. We abuse the hash
2336 * field of slot 0 to hold a search finger:
2337 * If slot 0 has a value, use slot 0.
2338 * Else slot 0 is being used to hold a search finger,
2339 * and we use its hash value as the first index to look.
2340 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002341 ep = &mp->ma_keys->dk_entries[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 if (ep->me_value == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002343 Py_ssize_t mask = DK_MASK(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 i = ep->me_hash;
2345 /* The hash field may be a real hash value, or it may be a
2346 * legit search finger, or it may be a once-legit search
2347 * finger that's out of bounds now because it wrapped around
2348 * or the table shrunk -- simply make sure it's in bounds now.
2349 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002350 if (i > mask || i < 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 i = 1; /* skip slot 0 */
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002352 while ((ep = &mp->ma_keys->dk_entries[i])->me_value == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002354 if (i > mask)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 i = 1;
2356 }
2357 }
2358 PyTuple_SET_ITEM(res, 0, ep->me_key);
2359 PyTuple_SET_ITEM(res, 1, ep->me_value);
2360 Py_INCREF(dummy);
2361 ep->me_key = dummy;
2362 ep->me_value = NULL;
2363 mp->ma_used--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002364 assert(mp->ma_keys->dk_entries[0].me_value == NULL);
2365 mp->ma_keys->dk_entries[0].me_hash = i + 1; /* next place to start */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002367}
2368
Jeremy Hylton8caad492000-06-23 14:18:11 +00002369static int
2370dict_traverse(PyObject *op, visitproc visit, void *arg)
2371{
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002372 Py_ssize_t i, n;
2373 PyDictObject *mp = (PyDictObject *)op;
2374 if (mp->ma_keys->dk_lookup == lookdict) {
2375 for (i = 0; i < DK_SIZE(mp->ma_keys); i++) {
2376 if (mp->ma_keys->dk_entries[i].me_value != NULL) {
2377 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2378 Py_VISIT(mp->ma_keys->dk_entries[i].me_key);
2379 }
2380 }
2381 } else {
2382 if (mp->ma_values != NULL) {
2383 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2384 Py_VISIT(mp->ma_values[i]);
2385 }
2386 }
2387 else {
2388 for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
2389 Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
2390 }
2391 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 }
2393 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002394}
2395
2396static int
2397dict_tp_clear(PyObject *op)
2398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 PyDict_Clear(op);
2400 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002401}
2402
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002403static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002404
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002405static PyObject *
2406dict_sizeof(PyDictObject *mp)
2407{
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002408 Py_ssize_t size, res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002409
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002410 size = DK_SIZE(mp->ma_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 res = sizeof(PyDictObject);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002412 if (mp->ma_values)
2413 res += size * sizeof(PyObject*);
Martin v. Loewis4f2f3b62012-04-24 19:13:57 +02002414 /* If the dictionary is split, the keys portion is accounted-for
2415 in the type object. */
2416 if (mp->ma_keys->dk_refcnt == 1)
2417 res += sizeof(PyDictKeysObject) + (size-1) * sizeof(PyDictKeyEntry);
2418 return PyLong_FromSsize_t(res);
2419}
2420
2421Py_ssize_t
2422_PyDict_KeysSize(PyDictKeysObject *keys)
2423{
2424 return sizeof(PyDictKeysObject) + (DK_SIZE(keys)-1) * sizeof(PyDictKeyEntry);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002425}
2426
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002427PyDoc_STRVAR(contains__doc__,
2428"D.__contains__(k) -> True if D has a key k, else False");
2429
2430PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2431
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002432PyDoc_STRVAR(sizeof__doc__,
2433"D.__sizeof__() -> size of D in memory, in bytes");
2434
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002435PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002436"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002437
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002438PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002439"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 +00002440
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002441PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002442"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002443If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002444
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002445PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002446"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000024472-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002448
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002449PyDoc_STRVAR(update__doc__,
Georg Brandlac0675c2011-12-18 19:30:55 +01002450"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n"
2451"If E present and has a .keys() method, does: for k in E: D[k] = E[k]\n\
2452If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002453In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002454
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002455PyDoc_STRVAR(fromkeys__doc__,
2456"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
2457v defaults to None.");
2458
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002459PyDoc_STRVAR(clear__doc__,
2460"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002461
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002462PyDoc_STRVAR(copy__doc__,
2463"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002464
Guido van Rossumb90c8482007-02-10 01:11:45 +00002465/* Forward */
2466static PyObject *dictkeys_new(PyObject *);
2467static PyObject *dictitems_new(PyObject *);
2468static PyObject *dictvalues_new(PyObject *);
2469
Guido van Rossum45c85d12007-07-27 16:31:40 +00002470PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002472PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002474PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002476
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002477static PyMethodDef mapp_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
2479 contains__doc__},
2480 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2481 getitem__doc__},
2482 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2483 sizeof__doc__},
2484 {"get", (PyCFunction)dict_get, METH_VARARGS,
2485 get__doc__},
2486 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2487 setdefault_doc__},
2488 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2489 pop__doc__},
2490 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2491 popitem__doc__},
2492 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2493 keys__doc__},
2494 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2495 items__doc__},
2496 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2497 values__doc__},
2498 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2499 update__doc__},
2500 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2501 fromkeys__doc__},
2502 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2503 clear__doc__},
2504 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2505 copy__doc__},
2506 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002507};
2508
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002509/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002510int
2511PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002512{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002513 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002515 PyDictKeyEntry *ep;
2516 PyObject **value_addr;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002519 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 hash = PyObject_Hash(key);
2521 if (hash == -1)
2522 return -1;
2523 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002524 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2525 return (ep == NULL) ? -1 : (*value_addr != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002526}
2527
Thomas Wouterscf297e42007-02-23 15:07:44 +00002528/* Internal version of PyDict_Contains used when the hash value is already known */
2529int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002530_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 PyDictObject *mp = (PyDictObject *)op;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002533 PyDictKeyEntry *ep;
2534 PyObject **value_addr;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002535
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002536 ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
2537 return (ep == NULL) ? -1 : (*value_addr != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002538}
2539
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002540/* Hack to implement "key in dict" */
2541static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 0, /* sq_length */
2543 0, /* sq_concat */
2544 0, /* sq_repeat */
2545 0, /* sq_item */
2546 0, /* sq_slice */
2547 0, /* sq_ass_item */
2548 0, /* sq_ass_slice */
2549 PyDict_Contains, /* sq_contains */
2550 0, /* sq_inplace_concat */
2551 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002552};
2553
Guido van Rossum09e563a2001-05-01 12:10:21 +00002554static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002555dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2556{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 PyObject *self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 assert(type != NULL && type->tp_alloc != NULL);
2560 self = type->tp_alloc(type, 0);
2561 if (self != NULL) {
2562 PyDictObject *d = (PyDictObject *)self;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002563 d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
2564 /* XXX - Should we raise a no-memory error? */
2565 if (d->ma_keys == NULL) {
2566 DK_INCREF(Py_EMPTY_KEYS);
2567 d->ma_keys = Py_EMPTY_KEYS;
2568 d->ma_values = empty_values;
2569 }
2570 d->ma_used = 0;
Ezio Melotti13925002011-03-16 11:05:33 +02002571 /* The object has been implicitly tracked by tp_alloc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 if (type == &PyDict_Type)
2573 _PyObject_GC_UNTRACK(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 }
2575 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002576}
2577
Tim Peters25786c02001-09-02 08:22:48 +00002578static int
2579dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002582}
2583
Tim Peters6d6c1a32001-08-02 04:15:00 +00002584static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002585dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002588}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002589
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002590PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002591"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002592"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002593" (key, value) pairs\n"
2594"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002595" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002596" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002597" d[k] = v\n"
2598"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2599" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002600
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002601PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2603 "dict",
2604 sizeof(PyDictObject),
2605 0,
2606 (destructor)dict_dealloc, /* tp_dealloc */
2607 0, /* tp_print */
2608 0, /* tp_getattr */
2609 0, /* tp_setattr */
2610 0, /* tp_reserved */
2611 (reprfunc)dict_repr, /* tp_repr */
2612 0, /* tp_as_number */
2613 &dict_as_sequence, /* tp_as_sequence */
2614 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002615 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 0, /* tp_call */
2617 0, /* tp_str */
2618 PyObject_GenericGetAttr, /* tp_getattro */
2619 0, /* tp_setattro */
2620 0, /* tp_as_buffer */
2621 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2622 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2623 dictionary_doc, /* tp_doc */
2624 dict_traverse, /* tp_traverse */
2625 dict_tp_clear, /* tp_clear */
2626 dict_richcompare, /* tp_richcompare */
2627 0, /* tp_weaklistoffset */
2628 (getiterfunc)dict_iter, /* tp_iter */
2629 0, /* tp_iternext */
2630 mapp_methods, /* tp_methods */
2631 0, /* tp_members */
2632 0, /* tp_getset */
2633 0, /* tp_base */
2634 0, /* tp_dict */
2635 0, /* tp_descr_get */
2636 0, /* tp_descr_set */
2637 0, /* tp_dictoffset */
2638 dict_init, /* tp_init */
2639 PyType_GenericAlloc, /* tp_alloc */
2640 dict_new, /* tp_new */
2641 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002642};
2643
Victor Stinner3c1e4812012-03-26 22:10:51 +02002644PyObject *
2645_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
2646{
2647 PyObject *kv;
2648 kv = _PyUnicode_FromId(key); /* borrowed */
2649 if (kv == NULL)
2650 return NULL;
2651 return PyDict_GetItem(dp, kv);
2652}
2653
Guido van Rossum3cca2451997-05-16 14:23:33 +00002654/* For backward compatibility with old dictionary interface */
2655
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002656PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002657PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002658{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 PyObject *kv, *rv;
2660 kv = PyUnicode_FromString(key);
2661 if (kv == NULL)
2662 return NULL;
2663 rv = PyDict_GetItem(v, kv);
2664 Py_DECREF(kv);
2665 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002666}
2667
2668int
Victor Stinner3c1e4812012-03-26 22:10:51 +02002669_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
2670{
2671 PyObject *kv;
2672 kv = _PyUnicode_FromId(key); /* borrowed */
2673 if (kv == NULL)
2674 return -1;
2675 return PyDict_SetItem(v, kv, item);
2676}
2677
2678int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002679PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 PyObject *kv;
2682 int err;
2683 kv = PyUnicode_FromString(key);
2684 if (kv == NULL)
2685 return -1;
2686 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2687 err = PyDict_SetItem(v, kv, item);
2688 Py_DECREF(kv);
2689 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002690}
2691
2692int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002693PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 PyObject *kv;
2696 int err;
2697 kv = PyUnicode_FromString(key);
2698 if (kv == NULL)
2699 return -1;
2700 err = PyDict_DelItem(v, kv);
2701 Py_DECREF(kv);
2702 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002703}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002704
Raymond Hettinger019a1482004-03-18 02:41:19 +00002705/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002706
2707typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 PyObject_HEAD
2709 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2710 Py_ssize_t di_used;
2711 Py_ssize_t di_pos;
2712 PyObject* di_result; /* reusable result tuple for iteritems */
2713 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002714} dictiterobject;
2715
2716static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002717dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 dictiterobject *di;
2720 di = PyObject_GC_New(dictiterobject, itertype);
2721 if (di == NULL)
2722 return NULL;
2723 Py_INCREF(dict);
2724 di->di_dict = dict;
2725 di->di_used = dict->ma_used;
2726 di->di_pos = 0;
2727 di->len = dict->ma_used;
2728 if (itertype == &PyDictIterItem_Type) {
2729 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2730 if (di->di_result == NULL) {
2731 Py_DECREF(di);
2732 return NULL;
2733 }
2734 }
2735 else
2736 di->di_result = NULL;
2737 _PyObject_GC_TRACK(di);
2738 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002739}
2740
2741static void
2742dictiter_dealloc(dictiterobject *di)
2743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 Py_XDECREF(di->di_dict);
2745 Py_XDECREF(di->di_result);
2746 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002747}
2748
2749static int
2750dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 Py_VISIT(di->di_dict);
2753 Py_VISIT(di->di_result);
2754 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002755}
2756
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002757static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002758dictiter_len(dictiterobject *di)
2759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 Py_ssize_t len = 0;
2761 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2762 len = di->len;
2763 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002764}
2765
Guido van Rossumb90c8482007-02-10 01:11:45 +00002766PyDoc_STRVAR(length_hint_doc,
2767 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002768
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002769static PyObject *
2770dictiter_reduce(dictiterobject *di);
2771
2772PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2773
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002774static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2776 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002777 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
2778 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002780};
2781
Raymond Hettinger019a1482004-03-18 02:41:19 +00002782static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 PyObject *key;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002785 register Py_ssize_t i, mask, offset;
2786 register PyDictKeysObject *k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002788 PyObject **value_ptr;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 if (d == NULL)
2791 return NULL;
2792 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 if (di->di_used != d->ma_used) {
2795 PyErr_SetString(PyExc_RuntimeError,
2796 "dictionary changed size during iteration");
2797 di->di_used = -1; /* Make this state sticky */
2798 return NULL;
2799 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 i = di->di_pos;
2802 if (i < 0)
2803 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002804 k = d->ma_keys;
2805 if (d->ma_values) {
2806 value_ptr = &d->ma_values[i];
2807 offset = sizeof(PyObject *);
2808 }
2809 else {
2810 value_ptr = &k->dk_entries[i].me_value;
2811 offset = sizeof(PyDictKeyEntry);
2812 }
2813 mask = DK_SIZE(k)-1;
2814 while (i <= mask && *value_ptr == NULL) {
2815 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002817 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 di->di_pos = i+1;
2819 if (i > mask)
2820 goto fail;
2821 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002822 key = k->dk_entries[i].me_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 Py_INCREF(key);
2824 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002825
2826fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 Py_DECREF(d);
2828 di->di_dict = NULL;
2829 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002830}
2831
Raymond Hettinger019a1482004-03-18 02:41:19 +00002832PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2834 "dict_keyiterator", /* tp_name */
2835 sizeof(dictiterobject), /* tp_basicsize */
2836 0, /* tp_itemsize */
2837 /* methods */
2838 (destructor)dictiter_dealloc, /* tp_dealloc */
2839 0, /* tp_print */
2840 0, /* tp_getattr */
2841 0, /* tp_setattr */
2842 0, /* tp_reserved */
2843 0, /* tp_repr */
2844 0, /* tp_as_number */
2845 0, /* tp_as_sequence */
2846 0, /* tp_as_mapping */
2847 0, /* tp_hash */
2848 0, /* tp_call */
2849 0, /* tp_str */
2850 PyObject_GenericGetAttr, /* tp_getattro */
2851 0, /* tp_setattro */
2852 0, /* tp_as_buffer */
2853 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2854 0, /* tp_doc */
2855 (traverseproc)dictiter_traverse, /* tp_traverse */
2856 0, /* tp_clear */
2857 0, /* tp_richcompare */
2858 0, /* tp_weaklistoffset */
2859 PyObject_SelfIter, /* tp_iter */
2860 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2861 dictiter_methods, /* tp_methods */
2862 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002863};
2864
2865static PyObject *dictiter_iternextvalue(dictiterobject *di)
2866{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 PyObject *value;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002868 register Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002869 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002870 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 if (d == NULL)
2873 return NULL;
2874 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 if (di->di_used != d->ma_used) {
2877 PyErr_SetString(PyExc_RuntimeError,
2878 "dictionary changed size during iteration");
2879 di->di_used = -1; /* Make this state sticky */
2880 return NULL;
2881 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 i = di->di_pos;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002884 mask = DK_SIZE(d->ma_keys)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 if (i < 0 || i > mask)
2886 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002887 if (d->ma_values) {
2888 value_ptr = &d->ma_values[i];
2889 offset = sizeof(PyObject *);
2890 }
2891 else {
2892 value_ptr = &d->ma_keys->dk_entries[i].me_value;
2893 offset = sizeof(PyDictKeyEntry);
2894 }
2895 while (i <= mask && *value_ptr == NULL) {
2896 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 i++;
2898 if (i > mask)
2899 goto fail;
2900 }
2901 di->di_pos = i+1;
2902 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002903 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904 Py_INCREF(value);
2905 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002906
2907fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 Py_DECREF(d);
2909 di->di_dict = NULL;
2910 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002911}
2912
2913PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2915 "dict_valueiterator", /* tp_name */
2916 sizeof(dictiterobject), /* tp_basicsize */
2917 0, /* tp_itemsize */
2918 /* methods */
2919 (destructor)dictiter_dealloc, /* tp_dealloc */
2920 0, /* tp_print */
2921 0, /* tp_getattr */
2922 0, /* tp_setattr */
2923 0, /* tp_reserved */
2924 0, /* tp_repr */
2925 0, /* tp_as_number */
2926 0, /* tp_as_sequence */
2927 0, /* tp_as_mapping */
2928 0, /* tp_hash */
2929 0, /* tp_call */
2930 0, /* tp_str */
2931 PyObject_GenericGetAttr, /* tp_getattro */
2932 0, /* tp_setattro */
2933 0, /* tp_as_buffer */
2934 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2935 0, /* tp_doc */
2936 (traverseproc)dictiter_traverse, /* tp_traverse */
2937 0, /* tp_clear */
2938 0, /* tp_richcompare */
2939 0, /* tp_weaklistoffset */
2940 PyObject_SelfIter, /* tp_iter */
2941 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2942 dictiter_methods, /* tp_methods */
2943 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002944};
2945
2946static PyObject *dictiter_iternextitem(dictiterobject *di)
2947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 PyObject *key, *value, *result = di->di_result;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002949 register Py_ssize_t i, mask, offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 PyDictObject *d = di->di_dict;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002951 PyObject **value_ptr;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 if (d == NULL)
2954 return NULL;
2955 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957 if (di->di_used != d->ma_used) {
2958 PyErr_SetString(PyExc_RuntimeError,
2959 "dictionary changed size during iteration");
2960 di->di_used = -1; /* Make this state sticky */
2961 return NULL;
2962 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002964 i = di->di_pos;
2965 if (i < 0)
2966 goto fail;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002967 mask = DK_SIZE(d->ma_keys)-1;
2968 if (d->ma_values) {
2969 value_ptr = &d->ma_values[i];
2970 offset = sizeof(PyObject *);
2971 }
2972 else {
2973 value_ptr = &d->ma_keys->dk_entries[i].me_value;
2974 offset = sizeof(PyDictKeyEntry);
2975 }
2976 while (i <= mask && *value_ptr == NULL) {
2977 value_ptr = (PyObject **)(((char *)value_ptr) + offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 i++;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002979 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002980 di->di_pos = i+1;
2981 if (i > mask)
2982 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002984 if (result->ob_refcnt == 1) {
2985 Py_INCREF(result);
2986 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2987 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2988 } else {
2989 result = PyTuple_New(2);
2990 if (result == NULL)
2991 return NULL;
2992 }
2993 di->len--;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002994 key = d->ma_keys->dk_entries[i].me_key;
2995 value = *value_ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 Py_INCREF(key);
2997 Py_INCREF(value);
2998 PyTuple_SET_ITEM(result, 0, key);
2999 PyTuple_SET_ITEM(result, 1, value);
3000 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003001
3002fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003003 Py_DECREF(d);
3004 di->di_dict = NULL;
3005 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00003006}
3007
3008PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003009 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3010 "dict_itemiterator", /* tp_name */
3011 sizeof(dictiterobject), /* tp_basicsize */
3012 0, /* tp_itemsize */
3013 /* methods */
3014 (destructor)dictiter_dealloc, /* tp_dealloc */
3015 0, /* tp_print */
3016 0, /* tp_getattr */
3017 0, /* tp_setattr */
3018 0, /* tp_reserved */
3019 0, /* tp_repr */
3020 0, /* tp_as_number */
3021 0, /* tp_as_sequence */
3022 0, /* tp_as_mapping */
3023 0, /* tp_hash */
3024 0, /* tp_call */
3025 0, /* tp_str */
3026 PyObject_GenericGetAttr, /* tp_getattro */
3027 0, /* tp_setattro */
3028 0, /* tp_as_buffer */
3029 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3030 0, /* tp_doc */
3031 (traverseproc)dictiter_traverse, /* tp_traverse */
3032 0, /* tp_clear */
3033 0, /* tp_richcompare */
3034 0, /* tp_weaklistoffset */
3035 PyObject_SelfIter, /* tp_iter */
3036 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
3037 dictiter_methods, /* tp_methods */
3038 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003039};
Guido van Rossumb90c8482007-02-10 01:11:45 +00003040
3041
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003042static PyObject *
3043dictiter_reduce(dictiterobject *di)
3044{
3045 PyObject *list;
3046 dictiterobject tmp;
3047
3048 list = PyList_New(0);
3049 if (!list)
3050 return NULL;
3051
3052 /* copy the itertor state */
3053 tmp = *di;
3054 Py_XINCREF(tmp.di_dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003055
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003056 /* iterate the temporary into a list */
3057 for(;;) {
3058 PyObject *element = 0;
3059 if (Py_TYPE(di) == &PyDictIterItem_Type)
3060 element = dictiter_iternextitem(&tmp);
3061 else if (Py_TYPE(di) == &PyDictIterKey_Type)
3062 element = dictiter_iternextkey(&tmp);
3063 else if (Py_TYPE(di) == &PyDictIterValue_Type)
3064 element = dictiter_iternextvalue(&tmp);
3065 else
3066 assert(0);
3067 if (element) {
3068 if (PyList_Append(list, element)) {
3069 Py_DECREF(element);
3070 Py_DECREF(list);
3071 Py_XDECREF(tmp.di_dict);
3072 return NULL;
3073 }
3074 Py_DECREF(element);
3075 } else
3076 break;
3077 }
3078 Py_XDECREF(tmp.di_dict);
3079 /* check for error */
3080 if (tmp.di_dict != NULL) {
3081 /* we have an error */
3082 Py_DECREF(list);
3083 return NULL;
3084 }
Antoine Pitroua7013882012-04-05 00:04:20 +02003085 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003086}
3087
Guido van Rossum3ac67412007-02-10 18:55:06 +00003088/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003089/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00003090/***********************************************/
3091
Guido van Rossumb90c8482007-02-10 01:11:45 +00003092/* The instance lay-out is the same for all three; but the type differs. */
3093
3094typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 PyObject_HEAD
3096 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003097} dictviewobject;
3098
3099
3100static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00003101dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 Py_XDECREF(dv->dv_dict);
3104 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003105}
3106
3107static int
3108dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
3109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 Py_VISIT(dv->dv_dict);
3111 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003112}
3113
Guido van Rossum83825ac2007-02-10 04:54:19 +00003114static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00003115dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003117 Py_ssize_t len = 0;
3118 if (dv->dv_dict != NULL)
3119 len = dv->dv_dict->ma_used;
3120 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003121}
3122
3123static PyObject *
3124dictview_new(PyObject *dict, PyTypeObject *type)
3125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 dictviewobject *dv;
3127 if (dict == NULL) {
3128 PyErr_BadInternalCall();
3129 return NULL;
3130 }
3131 if (!PyDict_Check(dict)) {
3132 /* XXX Get rid of this restriction later */
3133 PyErr_Format(PyExc_TypeError,
3134 "%s() requires a dict argument, not '%s'",
3135 type->tp_name, dict->ob_type->tp_name);
3136 return NULL;
3137 }
3138 dv = PyObject_GC_New(dictviewobject, type);
3139 if (dv == NULL)
3140 return NULL;
3141 Py_INCREF(dict);
3142 dv->dv_dict = (PyDictObject *)dict;
3143 _PyObject_GC_TRACK(dv);
3144 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00003145}
3146
Neal Norwitze36f2ba2007-02-26 23:12:28 +00003147/* TODO(guido): The views objects are not complete:
3148
3149 * support more set operations
3150 * support arbitrary mappings?
3151 - either these should be static or exported in dictobject.h
3152 - if public then they should probably be in builtins
3153*/
3154
Guido van Rossumaac530c2007-08-24 22:33:45 +00003155/* Return 1 if self is a subset of other, iterating over self;
3156 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00003157static int
3158all_contained_in(PyObject *self, PyObject *other)
3159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003160 PyObject *iter = PyObject_GetIter(self);
3161 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003163 if (iter == NULL)
3164 return -1;
3165 for (;;) {
3166 PyObject *next = PyIter_Next(iter);
3167 if (next == NULL) {
3168 if (PyErr_Occurred())
3169 ok = -1;
3170 break;
3171 }
3172 ok = PySequence_Contains(other, next);
3173 Py_DECREF(next);
3174 if (ok <= 0)
3175 break;
3176 }
3177 Py_DECREF(iter);
3178 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003179}
3180
3181static PyObject *
3182dictview_richcompare(PyObject *self, PyObject *other, int op)
3183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 Py_ssize_t len_self, len_other;
3185 int ok;
3186 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 assert(self != NULL);
3189 assert(PyDictViewSet_Check(self));
3190 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00003191
Brian Curtindfc80e32011-08-10 20:28:54 -05003192 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
3193 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 len_self = PyObject_Size(self);
3196 if (len_self < 0)
3197 return NULL;
3198 len_other = PyObject_Size(other);
3199 if (len_other < 0)
3200 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003202 ok = 0;
3203 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00003204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 case Py_NE:
3206 case Py_EQ:
3207 if (len_self == len_other)
3208 ok = all_contained_in(self, other);
3209 if (op == Py_NE && ok >= 0)
3210 ok = !ok;
3211 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 case Py_LT:
3214 if (len_self < len_other)
3215 ok = all_contained_in(self, other);
3216 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 case Py_LE:
3219 if (len_self <= len_other)
3220 ok = all_contained_in(self, other);
3221 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 case Py_GT:
3224 if (len_self > len_other)
3225 ok = all_contained_in(other, self);
3226 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 case Py_GE:
3229 if (len_self >= len_other)
3230 ok = all_contained_in(other, self);
3231 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00003232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 }
3234 if (ok < 0)
3235 return NULL;
3236 result = ok ? Py_True : Py_False;
3237 Py_INCREF(result);
3238 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00003239}
3240
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003241static PyObject *
3242dictview_repr(dictviewobject *dv)
3243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 PyObject *seq;
3245 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 seq = PySequence_List((PyObject *)dv);
3248 if (seq == NULL)
3249 return NULL;
3250
3251 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
3252 Py_DECREF(seq);
3253 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00003254}
3255
Guido van Rossum3ac67412007-02-10 18:55:06 +00003256/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003257
3258static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003259dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003260{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003261 if (dv->dv_dict == NULL) {
3262 Py_RETURN_NONE;
3263 }
3264 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003265}
3266
3267static int
3268dictkeys_contains(dictviewobject *dv, PyObject *obj)
3269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 if (dv->dv_dict == NULL)
3271 return 0;
3272 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003273}
3274
Guido van Rossum83825ac2007-02-10 04:54:19 +00003275static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 (lenfunc)dictview_len, /* sq_length */
3277 0, /* sq_concat */
3278 0, /* sq_repeat */
3279 0, /* sq_item */
3280 0, /* sq_slice */
3281 0, /* sq_ass_item */
3282 0, /* sq_ass_slice */
3283 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003284};
3285
Guido van Rossum523259b2007-08-24 23:41:22 +00003286static PyObject*
3287dictviews_sub(PyObject* self, PyObject *other)
3288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 PyObject *result = PySet_New(self);
3290 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003291 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 if (result == NULL)
3294 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003295
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003296 tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 if (tmp == NULL) {
3298 Py_DECREF(result);
3299 return NULL;
3300 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 Py_DECREF(tmp);
3303 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003304}
3305
3306static PyObject*
3307dictviews_and(PyObject* self, PyObject *other)
3308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 PyObject *result = PySet_New(self);
3310 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003311 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 if (result == NULL)
3314 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003315
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003316 tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 if (tmp == NULL) {
3318 Py_DECREF(result);
3319 return NULL;
3320 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 Py_DECREF(tmp);
3323 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003324}
3325
3326static PyObject*
3327dictviews_or(PyObject* self, PyObject *other)
3328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 PyObject *result = PySet_New(self);
3330 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003331 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 if (result == NULL)
3334 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003335
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02003336 tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 if (tmp == NULL) {
3338 Py_DECREF(result);
3339 return NULL;
3340 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 Py_DECREF(tmp);
3343 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003344}
3345
3346static PyObject*
3347dictviews_xor(PyObject* self, PyObject *other)
3348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 PyObject *result = PySet_New(self);
3350 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003351 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 if (result == NULL)
3354 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00003355
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003356 tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 other);
3358 if (tmp == NULL) {
3359 Py_DECREF(result);
3360 return NULL;
3361 }
Guido van Rossum523259b2007-08-24 23:41:22 +00003362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 Py_DECREF(tmp);
3364 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00003365}
3366
3367static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 0, /*nb_add*/
3369 (binaryfunc)dictviews_sub, /*nb_subtract*/
3370 0, /*nb_multiply*/
3371 0, /*nb_remainder*/
3372 0, /*nb_divmod*/
3373 0, /*nb_power*/
3374 0, /*nb_negative*/
3375 0, /*nb_positive*/
3376 0, /*nb_absolute*/
3377 0, /*nb_bool*/
3378 0, /*nb_invert*/
3379 0, /*nb_lshift*/
3380 0, /*nb_rshift*/
3381 (binaryfunc)dictviews_and, /*nb_and*/
3382 (binaryfunc)dictviews_xor, /*nb_xor*/
3383 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00003384};
3385
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003386static PyObject*
3387dictviews_isdisjoint(PyObject *self, PyObject *other)
3388{
3389 PyObject *it;
3390 PyObject *item = NULL;
3391
3392 if (self == other) {
3393 if (dictview_len((dictviewobject *)self) == 0)
3394 Py_RETURN_TRUE;
3395 else
3396 Py_RETURN_FALSE;
3397 }
3398
3399 /* Iterate over the shorter object (only if other is a set,
3400 * because PySequence_Contains may be expensive otherwise): */
3401 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
3402 Py_ssize_t len_self = dictview_len((dictviewobject *)self);
3403 Py_ssize_t len_other = PyObject_Size(other);
3404 if (len_other == -1)
3405 return NULL;
3406
3407 if ((len_other > len_self)) {
3408 PyObject *tmp = other;
3409 other = self;
3410 self = tmp;
3411 }
3412 }
3413
3414 it = PyObject_GetIter(other);
3415 if (it == NULL)
3416 return NULL;
3417
3418 while ((item = PyIter_Next(it)) != NULL) {
3419 int contains = PySequence_Contains(self, item);
3420 Py_DECREF(item);
3421 if (contains == -1) {
3422 Py_DECREF(it);
3423 return NULL;
3424 }
3425
3426 if (contains) {
3427 Py_DECREF(it);
3428 Py_RETURN_FALSE;
3429 }
3430 }
3431 Py_DECREF(it);
3432 if (PyErr_Occurred())
3433 return NULL; /* PyIter_Next raised an exception. */
3434 Py_RETURN_TRUE;
3435}
3436
3437PyDoc_STRVAR(isdisjoint_doc,
3438"Return True if the view and the given iterable have a null intersection.");
3439
Guido van Rossumb90c8482007-02-10 01:11:45 +00003440static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003441 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3442 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003444};
3445
3446PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003447 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3448 "dict_keys", /* tp_name */
3449 sizeof(dictviewobject), /* tp_basicsize */
3450 0, /* tp_itemsize */
3451 /* methods */
3452 (destructor)dictview_dealloc, /* tp_dealloc */
3453 0, /* tp_print */
3454 0, /* tp_getattr */
3455 0, /* tp_setattr */
3456 0, /* tp_reserved */
3457 (reprfunc)dictview_repr, /* tp_repr */
3458 &dictviews_as_number, /* tp_as_number */
3459 &dictkeys_as_sequence, /* tp_as_sequence */
3460 0, /* tp_as_mapping */
3461 0, /* tp_hash */
3462 0, /* tp_call */
3463 0, /* tp_str */
3464 PyObject_GenericGetAttr, /* tp_getattro */
3465 0, /* tp_setattro */
3466 0, /* tp_as_buffer */
3467 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3468 0, /* tp_doc */
3469 (traverseproc)dictview_traverse, /* tp_traverse */
3470 0, /* tp_clear */
3471 dictview_richcompare, /* tp_richcompare */
3472 0, /* tp_weaklistoffset */
3473 (getiterfunc)dictkeys_iter, /* tp_iter */
3474 0, /* tp_iternext */
3475 dictkeys_methods, /* tp_methods */
3476 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003477};
3478
3479static PyObject *
3480dictkeys_new(PyObject *dict)
3481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003482 return dictview_new(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003483}
3484
Guido van Rossum3ac67412007-02-10 18:55:06 +00003485/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003486
3487static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003488dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003489{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003490 if (dv->dv_dict == NULL) {
3491 Py_RETURN_NONE;
3492 }
3493 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003494}
3495
3496static int
3497dictitems_contains(dictviewobject *dv, PyObject *obj)
3498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 PyObject *key, *value, *found;
3500 if (dv->dv_dict == NULL)
3501 return 0;
3502 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3503 return 0;
3504 key = PyTuple_GET_ITEM(obj, 0);
3505 value = PyTuple_GET_ITEM(obj, 1);
3506 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3507 if (found == NULL) {
3508 if (PyErr_Occurred())
3509 return -1;
3510 return 0;
3511 }
3512 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003513}
3514
Guido van Rossum83825ac2007-02-10 04:54:19 +00003515static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 (lenfunc)dictview_len, /* sq_length */
3517 0, /* sq_concat */
3518 0, /* sq_repeat */
3519 0, /* sq_item */
3520 0, /* sq_slice */
3521 0, /* sq_ass_item */
3522 0, /* sq_ass_slice */
3523 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003524};
3525
Guido van Rossumb90c8482007-02-10 01:11:45 +00003526static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003527 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3528 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003529 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003530};
3531
3532PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003533 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3534 "dict_items", /* tp_name */
3535 sizeof(dictviewobject), /* tp_basicsize */
3536 0, /* tp_itemsize */
3537 /* methods */
3538 (destructor)dictview_dealloc, /* tp_dealloc */
3539 0, /* tp_print */
3540 0, /* tp_getattr */
3541 0, /* tp_setattr */
3542 0, /* tp_reserved */
3543 (reprfunc)dictview_repr, /* tp_repr */
3544 &dictviews_as_number, /* tp_as_number */
3545 &dictitems_as_sequence, /* tp_as_sequence */
3546 0, /* tp_as_mapping */
3547 0, /* tp_hash */
3548 0, /* tp_call */
3549 0, /* tp_str */
3550 PyObject_GenericGetAttr, /* tp_getattro */
3551 0, /* tp_setattro */
3552 0, /* tp_as_buffer */
3553 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3554 0, /* tp_doc */
3555 (traverseproc)dictview_traverse, /* tp_traverse */
3556 0, /* tp_clear */
3557 dictview_richcompare, /* tp_richcompare */
3558 0, /* tp_weaklistoffset */
3559 (getiterfunc)dictitems_iter, /* tp_iter */
3560 0, /* tp_iternext */
3561 dictitems_methods, /* tp_methods */
3562 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003563};
3564
3565static PyObject *
3566dictitems_new(PyObject *dict)
3567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003568 return dictview_new(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003569}
3570
Guido van Rossum3ac67412007-02-10 18:55:06 +00003571/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003572
3573static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003574dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003576 if (dv->dv_dict == NULL) {
3577 Py_RETURN_NONE;
3578 }
3579 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003580}
3581
Guido van Rossum83825ac2007-02-10 04:54:19 +00003582static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003583 (lenfunc)dictview_len, /* sq_length */
3584 0, /* sq_concat */
3585 0, /* sq_repeat */
3586 0, /* sq_item */
3587 0, /* sq_slice */
3588 0, /* sq_ass_item */
3589 0, /* sq_ass_slice */
3590 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003591};
3592
Guido van Rossumb90c8482007-02-10 01:11:45 +00003593static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003594 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003595};
3596
3597PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3599 "dict_values", /* tp_name */
3600 sizeof(dictviewobject), /* tp_basicsize */
3601 0, /* tp_itemsize */
3602 /* methods */
3603 (destructor)dictview_dealloc, /* tp_dealloc */
3604 0, /* tp_print */
3605 0, /* tp_getattr */
3606 0, /* tp_setattr */
3607 0, /* tp_reserved */
3608 (reprfunc)dictview_repr, /* tp_repr */
3609 0, /* tp_as_number */
3610 &dictvalues_as_sequence, /* tp_as_sequence */
3611 0, /* tp_as_mapping */
3612 0, /* tp_hash */
3613 0, /* tp_call */
3614 0, /* tp_str */
3615 PyObject_GenericGetAttr, /* tp_getattro */
3616 0, /* tp_setattro */
3617 0, /* tp_as_buffer */
3618 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3619 0, /* tp_doc */
3620 (traverseproc)dictview_traverse, /* tp_traverse */
3621 0, /* tp_clear */
3622 0, /* tp_richcompare */
3623 0, /* tp_weaklistoffset */
3624 (getiterfunc)dictvalues_iter, /* tp_iter */
3625 0, /* tp_iternext */
3626 dictvalues_methods, /* tp_methods */
3627 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003628};
3629
3630static PyObject *
3631dictvalues_new(PyObject *dict)
3632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003633 return dictview_new(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003634}
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003635
3636/* Returns NULL if cannot allocate a new PyDictKeysObject,
3637 but does not set an error */
3638PyDictKeysObject *
3639_PyDict_NewKeysForClass(void)
3640{
3641 PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_SPLIT);
3642 if (keys == NULL)
3643 PyErr_Clear();
3644 else
3645 keys->dk_lookup = lookdict_split;
3646 return keys;
3647}
3648
3649#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
3650
3651PyObject *
3652PyObject_GenericGetDict(PyObject *obj, void *context)
3653{
3654 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
3655 if (dictptr == NULL) {
3656 PyErr_SetString(PyExc_AttributeError,
3657 "This object has no __dict__");
3658 return NULL;
3659 }
3660 dict = *dictptr;
3661 if (dict == NULL) {
3662 PyTypeObject *tp = Py_TYPE(obj);
3663 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
3664 DK_INCREF(CACHED_KEYS(tp));
3665 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
3666 }
3667 else {
3668 *dictptr = dict = PyDict_New();
3669 }
3670 }
3671 Py_XINCREF(dict);
3672 return dict;
3673}
3674
3675int
3676_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
3677 PyObject *key, PyObject *value)
3678{
3679 PyObject *dict;
3680 int res;
3681 PyDictKeysObject *cached;
3682
3683 assert(dictptr != NULL);
3684 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
3685 assert(dictptr != NULL);
3686 dict = *dictptr;
3687 if (dict == NULL) {
3688 DK_INCREF(cached);
3689 dict = new_dict_with_shared_keys(cached);
3690 if (dict == NULL)
3691 return -1;
3692 *dictptr = dict;
3693 }
3694 if (value == NULL) {
3695 res = PyDict_DelItem(dict, key);
3696 if (cached != ((PyDictObject *)dict)->ma_keys) {
3697 CACHED_KEYS(tp) = NULL;
3698 DK_DECREF(cached);
3699 }
3700 } else {
3701 res = PyDict_SetItem(dict, key, value);
3702 if (cached != ((PyDictObject *)dict)->ma_keys) {
3703 /* Either update tp->ht_cached_keys or delete it */
Benjamin Peterson15ee8212012-04-24 14:44:18 -04003704 if (cached->dk_refcnt == 1) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003705 CACHED_KEYS(tp) = make_keys_shared(dict);
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003706 } else {
3707 CACHED_KEYS(tp) = NULL;
3708 }
3709 DK_DECREF(cached);
Benjamin Peterson15ee8212012-04-24 14:44:18 -04003710 if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
3711 return -1;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003712 }
3713 }
3714 } else {
3715 dict = *dictptr;
3716 if (dict == NULL) {
3717 dict = PyDict_New();
3718 if (dict == NULL)
3719 return -1;
3720 *dictptr = dict;
3721 }
3722 if (value == NULL) {
3723 res = PyDict_DelItem(dict, key);
3724 } else {
3725 res = PyDict_SetItem(dict, key, value);
3726 }
3727 }
3728 return res;
3729}
3730
3731void
3732_PyDictKeys_DecRef(PyDictKeysObject *keys)
3733{
3734 DK_DECREF(keys);
3735}
3736
3737
3738/* ARGSUSED */
3739static PyObject *
3740dummy_repr(PyObject *op)
3741{
3742 return PyUnicode_FromString("<dummy key>");
3743}
3744
3745/* ARGUSED */
3746static void
3747dummy_dealloc(PyObject* ignore)
3748{
3749 /* This should never get called, but we also don't want to SEGV if
3750 * we accidentally decref dummy-key out of existence.
3751 */
3752 Py_FatalError("deallocating <dummy key>");
3753}
3754
3755static PyTypeObject PyDictDummy_Type = {
3756 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3757 "<dummy key> type",
3758 0,
3759 0,
3760 dummy_dealloc, /*tp_dealloc*/ /*never called*/
3761 0, /*tp_print*/
3762 0, /*tp_getattr*/
3763 0, /*tp_setattr*/
3764 0, /*tp_reserved*/
3765 dummy_repr, /*tp_repr*/
3766 0, /*tp_as_number*/
3767 0, /*tp_as_sequence*/
3768 0, /*tp_as_mapping*/
3769 0, /*tp_hash */
3770 0, /*tp_call */
3771 0, /*tp_str */
3772 0, /*tp_getattro */
3773 0, /*tp_setattro */
3774 0, /*tp_as_buffer */
3775 Py_TPFLAGS_DEFAULT, /*tp_flags */
3776};
3777
3778static PyObject _dummy_struct = {
3779 _PyObject_EXTRA_INIT
3780 2, &PyDictDummy_Type
3781};
3782