blob: e3e4765d0a19c71d0686fb93537ac8d5204f2229 [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
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010#include "Python.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000011
Guido van Rossum16e93a81997-01-28 00:00:11 +000012
Georg Brandlb9f4ad32006-10-29 18:31:42 +000013/* Set a key error with the specified argument, wrapping it in a
14 * tuple automatically so that tuple keys are not unpacked as the
15 * exception arguments. */
16static void
17set_key_error(PyObject *arg)
18{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000019 PyObject *tup;
20 tup = PyTuple_Pack(1, arg);
21 if (!tup)
22 return; /* caller will expect error to be set anyway */
23 PyErr_SetObject(PyExc_KeyError, tup);
24 Py_DECREF(tup);
Georg Brandlb9f4ad32006-10-29 18:31:42 +000025}
26
Tim Peterseb28ef22001-06-02 05:27:19 +000027/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000028#undef SHOW_CONVERSION_COUNTS
29
Tim Peterseb28ef22001-06-02 05:27:19 +000030/* See large comment block below. This must be >= 1. */
31#define PERTURB_SHIFT 5
32
Guido van Rossum16e93a81997-01-28 00:00:11 +000033/*
Tim Peterseb28ef22001-06-02 05:27:19 +000034Major subtleties ahead: Most hash schemes depend on having a "good" hash
35function, in the sense of simulating randomness. Python doesn't: its most
36important hash functions (for strings and ints) are very regular in common
37cases:
Tim Peters15d49292001-05-27 07:39:22 +000038
Tim Peterseb28ef22001-06-02 05:27:19 +000039>>> map(hash, (0, 1, 2, 3))
40[0, 1, 2, 3]
41>>> map(hash, ("namea", "nameb", "namec", "named"))
42[-1658398457, -1658398460, -1658398459, -1658398462]
43>>>
Tim Peters15d49292001-05-27 07:39:22 +000044
Tim Peterseb28ef22001-06-02 05:27:19 +000045This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
46the low-order i bits as the initial table index is extremely fast, and there
47are no collisions at all for dicts indexed by a contiguous range of ints.
48The same is approximately true when keys are "consecutive" strings. So this
49gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000050
Tim Peterseb28ef22001-06-02 05:27:19 +000051OTOH, when collisions occur, the tendency to fill contiguous slices of the
52hash table makes a good collision resolution strategy crucial. Taking only
53the last i bits of the hash code is also vulnerable: for example, consider
54[i << 16 for i in range(20000)] as a set of keys. Since ints are their own
55hash codes, and this fits in a dict of size 2**15, the last 15 bits of every
56hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000057
Tim Peterseb28ef22001-06-02 05:27:19 +000058But catering to unusual cases should not slow the usual ones, so we just take
59the last i bits anyway. It's up to collision resolution to do the rest. If
60we *usually* find the key we're looking for on the first try (and, it turns
61out, we usually do -- the table load factor is kept under 2/3, so the odds
62are solidly in our favor), then it makes best sense to keep the initial index
63computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000064
Tim Peterseb28ef22001-06-02 05:27:19 +000065The first half of collision resolution is to visit table indices via this
66recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000067
Tim Peterseb28ef22001-06-02 05:27:19 +000068 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000069
Tim Peterseb28ef22001-06-02 05:27:19 +000070For any initial j in range(2**i), repeating that 2**i times generates each
71int in range(2**i) exactly once (see any text on random-number generation for
72proof). By itself, this doesn't help much: like linear probing (setting
73j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
74order. This would be bad, except that's not the only thing we do, and it's
75actually *good* in the common cases where hash keys are consecutive. In an
76example that's really too small to make this entirely clear, for a table of
77size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000078
Tim Peterseb28ef22001-06-02 05:27:19 +000079 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
80
81If two things come in at index 5, the first place we look after is index 2,
82not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
83Linear probing is deadly in this case because there the fixed probe order
84is the *same* as the order consecutive keys are likely to arrive. But it's
85extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
86and certain that consecutive hash codes do not.
87
88The other half of the strategy is to get the other bits of the hash code
89into play. This is done by initializing a (unsigned) vrbl "perturb" to the
90full hash code, and changing the recurrence to:
91
92 j = (5*j) + 1 + perturb;
93 perturb >>= PERTURB_SHIFT;
94 use j % 2**i as the next table index;
95
96Now the probe sequence depends (eventually) on every bit in the hash code,
97and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
98because it quickly magnifies small differences in the bits that didn't affect
99the initial index. Note that because perturb is unsigned, if the recurrence
100is executed often enough perturb eventually becomes and remains 0. At that
101point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
102that's certain to find an empty slot eventually (since it generates every int
103in range(2**i), and we make sure there's always at least one empty slot).
104
105Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
106small so that the high bits of the hash code continue to affect the probe
107sequence across iterations; but you want it large so that in really bad cases
108the high-order hash bits have an effect on early iterations. 5 was "the
109best" in minimizing total collisions across experiments Tim Peters ran (on
110both normal and pathological cases), but 4 and 6 weren't significantly worse.
111
112Historical: Reimer Behrends contributed the idea of using a polynomial-based
113approach, using repeated multiplication by x in GF(2**n) where an irreducible
114polynomial for each table size was chosen such that x was a primitive root.
115Christian Tismer later extended that to use division by x instead, as an
116efficient way to get the high bits of the hash code into play. This scheme
117also gave excellent collision statistics, but was more expensive: two
118if-tests were required inside the loop; computing "the next" index took about
119the same number of operations but without as much potential parallelism
120(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
121above, and then shifting perturb can be done while the table index is being
Brett Cannon77ae87c2007-10-10 00:07:50 +0000122masked); and the PyDictObject struct required a member to hold the table's
Tim Peterseb28ef22001-06-02 05:27:19 +0000123polynomial. In Tim's experiments the current scheme ran faster, produced
124equally good collision statistics, needed less code & used less memory.
Tim Peters9b10f7e2006-05-30 04:16:25 +0000125
126Theoretical Python 2.5 headache: hash codes are only C "long", but
127sizeof(Py_ssize_t) > sizeof(long) may be possible. In that case, and if a
128dict is genuinely huge, then only the slots directly reachable via indexing
129by a C long can be the first slot in a probe sequence. The probe sequence
130will still eventually reach every slot in the table, but the collision rate
131on initial probes may be much higher than this scheme was designed for.
132Getting a hash code as fat as Py_ssize_t is the only real cure. But in
133practice, this probably won't make a lick of difference for many years (at
134which point everyone will have terabytes of RAM on 64-bit boxes).
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000135*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000136
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000137/* Object used as dummy key to fill deleted entries */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000138static PyObject *dummy = NULL; /* Initialized by first call to newPyDictObject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000139
Armin Rigoe1709372006-04-12 17:06:05 +0000140#ifdef Py_REF_DEBUG
141PyObject *
142_PyDict_Dummy(void)
143{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000144 return dummy;
Armin Rigoe1709372006-04-12 17:06:05 +0000145}
146#endif
147
Fred Drake1bff34a2000-08-31 19:31:38 +0000148/* forward declarations */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000149static PyDictEntry *
150lookdict_string(PyDictObject *mp, PyObject *key, long hash);
Fred Drake1bff34a2000-08-31 19:31:38 +0000151
152#ifdef SHOW_CONVERSION_COUNTS
153static long created = 0L;
154static long converted = 0L;
155
156static void
157show_counts(void)
158{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000159 fprintf(stderr, "created %ld string dicts\n", created);
160 fprintf(stderr, "converted %ld to normal dicts\n", converted);
161 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
Fred Drake1bff34a2000-08-31 19:31:38 +0000162}
163#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000164
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000165/* Debug statistic to compare allocations with reuse through the free list */
166#undef SHOW_ALLOC_COUNT
167#ifdef SHOW_ALLOC_COUNT
168static size_t count_alloc = 0;
169static size_t count_reuse = 0;
170
171static void
172show_alloc(void)
173{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000174 fprintf(stderr, "Dict allocations: %" PY_FORMAT_SIZE_T "d\n",
175 count_alloc);
176 fprintf(stderr, "Dict reuse through freelist: %" PY_FORMAT_SIZE_T
177 "d\n", count_reuse);
178 fprintf(stderr, "%.2f%% reuse rate\n\n",
179 (100.0*count_reuse/(count_alloc+count_reuse)));
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000180}
181#endif
182
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000183/* Debug statistic to count GC tracking of dicts */
184#ifdef SHOW_TRACK_COUNT
185static Py_ssize_t count_untracked = 0;
186static Py_ssize_t count_tracked = 0;
187
188static void
189show_track(void)
190{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000191 fprintf(stderr, "Dicts created: %" PY_FORMAT_SIZE_T "d\n",
192 count_tracked + count_untracked);
193 fprintf(stderr, "Dicts tracked by the GC: %" PY_FORMAT_SIZE_T
194 "d\n", count_tracked);
195 fprintf(stderr, "%.2f%% dict tracking rate\n\n",
196 (100.0*count_tracked/(count_untracked+count_tracked)));
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000197}
198#endif
199
200
Tim Peters6d6c1a32001-08-02 04:15:00 +0000201/* Initialization macros.
202 There are two ways to create a dict: PyDict_New() is the main C API
203 function, and the tp_new slot maps to dict_new(). In the latter case we
204 can save a little time over what PyDict_New does because it's guaranteed
205 that the PyDictObject struct is already zeroed out.
206 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
207 an excellent reason not to).
208*/
209
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000210#define INIT_NONZERO_DICT_SLOTS(mp) do { \
211 (mp)->ma_table = (mp)->ma_smalltable; \
212 (mp)->ma_mask = PyDict_MINSIZE - 1; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000213 } while(0)
214
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000215#define EMPTY_TO_MINSIZE(mp) do { \
216 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
217 (mp)->ma_used = (mp)->ma_fill = 0; \
218 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000219 } while(0)
220
Raymond Hettinger43442782004-03-17 21:55:03 +0000221/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes5b970ad2008-02-06 13:33:44 +0000222#ifndef PyDict_MAXFREELIST
223#define PyDict_MAXFREELIST 80
224#endif
225static PyDictObject *free_list[PyDict_MAXFREELIST];
226static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000227
Christian Heimesf75dbef2008-02-08 00:11:31 +0000228void
229PyDict_Fini(void)
230{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000231 PyDictObject *op;
Christian Heimesf75dbef2008-02-08 00:11:31 +0000232
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000233 while (numfree) {
234 op = free_list[--numfree];
235 assert(PyDict_CheckExact(op));
236 PyObject_GC_Del(op);
237 }
Christian Heimesf75dbef2008-02-08 00:11:31 +0000238}
239
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000241PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000242{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000243 register PyDictObject *mp;
244 if (dummy == NULL) { /* Auto-initialize dummy */
245 dummy = PyString_FromString("<dummy key>");
246 if (dummy == NULL)
247 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000248#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000249 Py_AtExit(show_counts);
Fred Drake1bff34a2000-08-31 19:31:38 +0000250#endif
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000251#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000252 Py_AtExit(show_alloc);
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000253#endif
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000254#ifdef SHOW_TRACK_COUNT
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000255 Py_AtExit(show_track);
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000256#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000257 }
258 if (numfree) {
259 mp = free_list[--numfree];
260 assert (mp != NULL);
261 assert (Py_TYPE(mp) == &PyDict_Type);
262 _Py_NewReference((PyObject *)mp);
263 if (mp->ma_fill) {
264 EMPTY_TO_MINSIZE(mp);
265 } else {
266 /* At least set ma_table and ma_mask; these are wrong
267 if an empty but presized dict is added to freelist */
268 INIT_NONZERO_DICT_SLOTS(mp);
269 }
270 assert (mp->ma_used == 0);
271 assert (mp->ma_table == mp->ma_smalltable);
272 assert (mp->ma_mask == PyDict_MINSIZE - 1);
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000273#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000274 count_reuse++;
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000275#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000276 } else {
277 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
278 if (mp == NULL)
279 return NULL;
280 EMPTY_TO_MINSIZE(mp);
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000281#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000282 count_alloc++;
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000283#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000284 }
285 mp->ma_lookup = lookdict_string;
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000286#ifdef SHOW_TRACK_COUNT
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000287 count_untracked++;
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000288#endif
Fred Drake1bff34a2000-08-31 19:31:38 +0000289#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000290 ++created;
Fred Drake1bff34a2000-08-31 19:31:38 +0000291#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000292 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000293}
294
295/*
296The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000297This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000298Open addressing is preferred over chaining since the link overhead for
299chaining would be substantial (100% with typical malloc overhead).
300
Tim Peterseb28ef22001-06-02 05:27:19 +0000301The initial probe index is computed as hash mod the table size. Subsequent
302probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000303
304All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000305
Tim Peterseb28ef22001-06-02 05:27:19 +0000306(The details in this version are due to Tim Peters, building on many past
307contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
308Christian Tismer).
Fred Drake1bff34a2000-08-31 19:31:38 +0000309
Tim Petersd770ebd2006-06-01 15:50:44 +0000310lookdict() is general-purpose, and may return NULL if (and only if) a
311comparison raises an exception (this was new in Python 2.5).
312lookdict_string() below is specialized to string keys, comparison of which can
313never raise an exception; that function can never return NULL. For both, when
Brett Cannon77ae87c2007-10-10 00:07:50 +0000314the key isn't found a PyDictEntry* is returned for which the me_value field is
Tim Petersd770ebd2006-06-01 15:50:44 +0000315NULL; this is the slot in the dict at which the key would have been found, and
316the caller can (if it wishes) add the <key, value> pair to the returned
Brett Cannon77ae87c2007-10-10 00:07:50 +0000317PyDictEntry*.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000318*/
Brett Cannon77ae87c2007-10-10 00:07:50 +0000319static PyDictEntry *
320lookdict(PyDictObject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000321{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000322 register size_t i;
323 register size_t perturb;
324 register PyDictEntry *freeslot;
325 register size_t mask = (size_t)mp->ma_mask;
326 PyDictEntry *ep0 = mp->ma_table;
327 register PyDictEntry *ep;
328 register int cmp;
329 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000330
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000331 i = (size_t)hash & mask;
332 ep = &ep0[i];
333 if (ep->me_key == NULL || ep->me_key == key)
334 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000335
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000336 if (ep->me_key == dummy)
337 freeslot = ep;
338 else {
339 if (ep->me_hash == hash) {
340 startkey = ep->me_key;
341 Py_INCREF(startkey);
342 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
343 Py_DECREF(startkey);
344 if (cmp < 0)
345 return NULL;
346 if (ep0 == mp->ma_table && ep->me_key == startkey) {
347 if (cmp > 0)
348 return ep;
349 }
350 else {
351 /* The compare did major nasty stuff to the
352 * dict: start over.
353 * XXX A clever adversary could prevent this
354 * XXX from terminating.
355 */
356 return lookdict(mp, key, hash);
357 }
358 }
359 freeslot = NULL;
360 }
Tim Peters15d49292001-05-27 07:39:22 +0000361
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000362 /* In the loop, me_key == dummy is by far (factor of 100s) the
363 least likely outcome, so test for that last. */
364 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
365 i = (i << 2) + i + perturb + 1;
366 ep = &ep0[i & mask];
367 if (ep->me_key == NULL)
368 return freeslot == NULL ? ep : freeslot;
369 if (ep->me_key == key)
370 return ep;
371 if (ep->me_hash == hash && ep->me_key != dummy) {
372 startkey = ep->me_key;
373 Py_INCREF(startkey);
374 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
375 Py_DECREF(startkey);
376 if (cmp < 0)
377 return NULL;
378 if (ep0 == mp->ma_table && ep->me_key == startkey) {
379 if (cmp > 0)
380 return ep;
381 }
382 else {
383 /* The compare did major nasty stuff to the
384 * dict: start over.
385 * XXX A clever adversary could prevent this
386 * XXX from terminating.
387 */
388 return lookdict(mp, key, hash);
389 }
390 }
391 else if (ep->me_key == dummy && freeslot == NULL)
392 freeslot = ep;
393 }
394 assert(0); /* NOT REACHED */
395 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000396}
397
398/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000399 * Hacked up version of lookdict which can assume keys are always strings;
Tim Petersd770ebd2006-06-01 15:50:44 +0000400 * this assumption allows testing for errors during PyObject_RichCompareBool()
401 * to be dropped; string-string comparisons never raise exceptions. This also
402 * means we don't need to go through PyObject_RichCompareBool(); we can always
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000403 * use _PyString_Eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000404 *
Tim Petersd770ebd2006-06-01 15:50:44 +0000405 * This is valuable because dicts with only string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000406 */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000407static PyDictEntry *
408lookdict_string(PyDictObject *mp, PyObject *key, register long hash)
Fred Drake1bff34a2000-08-31 19:31:38 +0000409{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000410 register size_t i;
411 register size_t perturb;
412 register PyDictEntry *freeslot;
413 register size_t mask = (size_t)mp->ma_mask;
414 PyDictEntry *ep0 = mp->ma_table;
415 register PyDictEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000416
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000417 /* Make sure this function doesn't have to handle non-string keys,
418 including subclasses of str; e.g., one reason to subclass
419 strings is to override __eq__, and for speed we don't cater to
420 that here. */
421 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000422#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000423 ++converted;
Fred Drake1bff34a2000-08-31 19:31:38 +0000424#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000425 mp->ma_lookup = lookdict;
426 return lookdict(mp, key, hash);
427 }
428 i = hash & mask;
429 ep = &ep0[i];
430 if (ep->me_key == NULL || ep->me_key == key)
431 return ep;
432 if (ep->me_key == dummy)
433 freeslot = ep;
434 else {
435 if (ep->me_hash == hash && _PyString_Eq(ep->me_key, key))
436 return ep;
437 freeslot = NULL;
438 }
Tim Peters15d49292001-05-27 07:39:22 +0000439
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000440 /* In the loop, me_key == dummy is by far (factor of 100s) the
441 least likely outcome, so test for that last. */
442 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
443 i = (i << 2) + i + perturb + 1;
444 ep = &ep0[i & mask];
445 if (ep->me_key == NULL)
446 return freeslot == NULL ? ep : freeslot;
447 if (ep->me_key == key
448 || (ep->me_hash == hash
449 && ep->me_key != dummy
450 && _PyString_Eq(ep->me_key, key)))
451 return ep;
452 if (ep->me_key == dummy && freeslot == NULL)
453 freeslot = ep;
454 }
455 assert(0); /* NOT REACHED */
456 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000457}
458
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000459#ifdef SHOW_TRACK_COUNT
460#define INCREASE_TRACK_COUNT \
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000461 (count_tracked++, count_untracked--);
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000462#define DECREASE_TRACK_COUNT \
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000463 (count_tracked--, count_untracked++);
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000464#else
465#define INCREASE_TRACK_COUNT
466#define DECREASE_TRACK_COUNT
467#endif
468
469#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000470 do { \
471 if (!_PyObject_GC_IS_TRACKED(mp)) { \
472 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
473 _PyObject_GC_MAY_BE_TRACKED(value)) { \
474 _PyObject_GC_TRACK(mp); \
475 INCREASE_TRACK_COUNT \
476 } \
477 } \
478 } while(0)
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000479
480void
481_PyDict_MaybeUntrack(PyObject *op)
482{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000483 PyDictObject *mp;
484 PyObject *value;
485 Py_ssize_t mask, i;
486 PyDictEntry *ep;
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000487
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000488 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
489 return;
490
491 mp = (PyDictObject *) op;
492 ep = mp->ma_table;
493 mask = mp->ma_mask;
494 for (i = 0; i <= mask; i++) {
495 if ((value = ep[i].me_value) == NULL)
496 continue;
497 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
498 _PyObject_GC_MAY_BE_TRACKED(ep[i].me_key))
499 return;
500 }
501 DECREASE_TRACK_COUNT
502 _PyObject_GC_UNTRACK(op);
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000503}
504
Fred Drake1bff34a2000-08-31 19:31:38 +0000505/*
Antoine Pitrou6a1cd1b2012-02-27 00:45:12 +0100506Internal routine to insert a new item into the table when you have entry object.
507Used by insertdict.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000508*/
Armin Rigo35f6d362006-06-01 13:19:12 +0000509static int
Antoine Pitrou6a1cd1b2012-02-27 00:45:12 +0100510insertdict_by_entry(register PyDictObject *mp, PyObject *key, long hash,
511 PyDictEntry *ep, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000512{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000513 PyObject *old_value;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000514
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000515 MAINTAIN_TRACKING(mp, key, value);
516 if (ep->me_value != NULL) {
517 old_value = ep->me_value;
518 ep->me_value = value;
519 Py_DECREF(old_value); /* which **CAN** re-enter */
520 Py_DECREF(key);
521 }
522 else {
523 if (ep->me_key == NULL)
524 mp->ma_fill++;
525 else {
526 assert(ep->me_key == dummy);
527 Py_DECREF(dummy);
528 }
529 ep->me_key = key;
530 ep->me_hash = (Py_ssize_t)hash;
531 ep->me_value = value;
532 mp->ma_used++;
533 }
534 return 0;
Armin Rigo35f6d362006-06-01 13:19:12 +0000535}
536
Antoine Pitrou6a1cd1b2012-02-27 00:45:12 +0100537
538/*
539Internal routine to insert a new item into the table.
540Used both by the internal resize routine and by the public insert routine.
541Eats a reference to key and one to value.
542Returns -1 if an error occurred, or 0 on success.
543*/
544static int
545insertdict(register PyDictObject *mp, PyObject *key, long hash, PyObject *value)
546{
547 register PyDictEntry *ep;
548
549 assert(mp->ma_lookup != NULL);
550 ep = mp->ma_lookup(mp, key, hash);
551 if (ep == NULL) {
552 Py_DECREF(key);
553 Py_DECREF(value);
554 return -1;
555 }
556 return insertdict_by_entry(mp, key, hash, ep, value);
557}
558
Armin Rigo35f6d362006-06-01 13:19:12 +0000559/*
560Internal routine used by dictresize() to insert an item which is
561known to be absent from the dict. This routine also assumes that
562the dict contains no deleted entries. Besides the performance benefit,
563using insertdict() in dictresize() is dangerous (SF bug #1456209).
Tim Petersd770ebd2006-06-01 15:50:44 +0000564Note that no refcounts are changed by this routine; if needed, the caller
565is responsible for incref'ing `key` and `value`.
Armin Rigo35f6d362006-06-01 13:19:12 +0000566*/
567static void
Brett Cannon77ae87c2007-10-10 00:07:50 +0000568insertdict_clean(register PyDictObject *mp, PyObject *key, long hash,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000569 PyObject *value)
Armin Rigo35f6d362006-06-01 13:19:12 +0000570{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000571 register size_t i;
572 register size_t perturb;
573 register size_t mask = (size_t)mp->ma_mask;
574 PyDictEntry *ep0 = mp->ma_table;
575 register PyDictEntry *ep;
Armin Rigo35f6d362006-06-01 13:19:12 +0000576
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000577 MAINTAIN_TRACKING(mp, key, value);
578 i = hash & mask;
579 ep = &ep0[i];
580 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
581 i = (i << 2) + i + perturb + 1;
582 ep = &ep0[i & mask];
583 }
584 assert(ep->me_value == NULL);
585 mp->ma_fill++;
586 ep->me_key = key;
587 ep->me_hash = (Py_ssize_t)hash;
588 ep->me_value = value;
589 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000590}
591
592/*
593Restructure the table by allocating a new table and reinserting all
594items again. When entries have been deleted, the new table may
595actually be smaller than the old one.
596*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000597static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000598dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000599{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000600 Py_ssize_t newsize;
601 PyDictEntry *oldtable, *newtable, *ep;
602 Py_ssize_t i;
603 int is_oldtable_malloced;
604 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000605
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000606 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000607
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000608 /* Find the smallest table size > minused. */
609 for (newsize = PyDict_MINSIZE;
610 newsize <= minused && newsize > 0;
611 newsize <<= 1)
612 ;
613 if (newsize <= 0) {
614 PyErr_NoMemory();
615 return -1;
616 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000617
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000618 /* Get space for a new table. */
619 oldtable = mp->ma_table;
620 assert(oldtable != NULL);
621 is_oldtable_malloced = oldtable != mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000622
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000623 if (newsize == PyDict_MINSIZE) {
624 /* A large table is shrinking, or we can't get any smaller. */
625 newtable = mp->ma_smalltable;
626 if (newtable == oldtable) {
627 if (mp->ma_fill == mp->ma_used) {
628 /* No dummies, so no point doing anything. */
629 return 0;
630 }
631 /* We're not going to resize it, but rebuild the
632 table anyway to purge old dummy entries.
633 Subtle: This is *necessary* if fill==size,
634 as lookdict needs at least one virgin slot to
635 terminate failing searches. If fill < size, it's
636 merely desirable, as dummies slow searches. */
637 assert(mp->ma_fill > mp->ma_used);
638 memcpy(small_copy, oldtable, sizeof(small_copy));
639 oldtable = small_copy;
640 }
641 }
642 else {
643 newtable = PyMem_NEW(PyDictEntry, newsize);
644 if (newtable == NULL) {
645 PyErr_NoMemory();
646 return -1;
647 }
648 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000649
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000650 /* Make the dict empty, using the new table. */
651 assert(newtable != oldtable);
652 mp->ma_table = newtable;
653 mp->ma_mask = newsize - 1;
654 memset(newtable, 0, sizeof(PyDictEntry) * newsize);
655 mp->ma_used = 0;
656 i = mp->ma_fill;
657 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000658
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000659 /* Copy the data over; this is refcount-neutral for active entries;
660 dummy entries aren't copied over, of course */
661 for (ep = oldtable; i > 0; ep++) {
662 if (ep->me_value != NULL) { /* active entry */
663 --i;
664 insertdict_clean(mp, ep->me_key, (long)ep->me_hash,
665 ep->me_value);
666 }
667 else if (ep->me_key != NULL) { /* dummy entry */
668 --i;
669 assert(ep->me_key == dummy);
670 Py_DECREF(ep->me_key);
671 }
672 /* else key == value == NULL: nothing to do */
673 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000674
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000675 if (is_oldtable_malloced)
676 PyMem_DEL(oldtable);
677 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000678}
679
Raymond Hettingerfd7ed402007-12-18 21:24:09 +0000680/* Create a new dictionary pre-sized to hold an estimated number of elements.
681 Underestimates are okay because the dictionary will resize as necessary.
682 Overestimates just mean the dictionary will be more sparse than usual.
683*/
684
685PyObject *
686_PyDict_NewPresized(Py_ssize_t minused)
687{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000688 PyObject *op = PyDict_New();
Raymond Hettingerfd7ed402007-12-18 21:24:09 +0000689
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000690 if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
691 Py_DECREF(op);
692 return NULL;
693 }
694 return op;
Raymond Hettingerfd7ed402007-12-18 21:24:09 +0000695}
696
Tim Petersd770ebd2006-06-01 15:50:44 +0000697/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
698 * that may occur (originally dicts supported only string keys, and exceptions
699 * weren't possible). So, while the original intent was that a NULL return
Andrew M. Kuchling0067b5f2006-08-04 20:37:43 +0000700 * meant the key wasn't present, in reality it can mean that, or that an error
Tim Petersd770ebd2006-06-01 15:50:44 +0000701 * (suppressed) occurred while computing the key's hash, or that some error
702 * (suppressed) occurred when comparing keys in the dict's internal probe
703 * sequence. A nasty example of the latter is when a Python-coded comparison
704 * function hits a stack-depth error, which can cause this to return NULL
705 * even if the key is present.
706 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000708PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000709{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000710 long hash;
711 PyDictObject *mp = (PyDictObject *)op;
712 PyDictEntry *ep;
713 PyThreadState *tstate;
714 if (!PyDict_Check(op))
715 return NULL;
716 if (!PyString_CheckExact(key) ||
717 (hash = ((PyStringObject *) key)->ob_shash) == -1)
718 {
719 hash = PyObject_Hash(key);
720 if (hash == -1) {
721 PyErr_Clear();
722 return NULL;
723 }
724 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000725
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000726 /* We can arrive here with a NULL tstate during initialization: try
727 running "python -Wi" for an example related to string interning.
728 Let's just hope that no exception occurs then... This must be
729 _PyThreadState_Current and not PyThreadState_GET() because in debug
730 mode, the latter complains if tstate is NULL. */
731 tstate = _PyThreadState_Current;
732 if (tstate != NULL && tstate->curexc_type != NULL) {
733 /* preserve the existing exception */
734 PyObject *err_type, *err_value, *err_tb;
735 PyErr_Fetch(&err_type, &err_value, &err_tb);
736 ep = (mp->ma_lookup)(mp, key, hash);
737 /* ignore errors */
738 PyErr_Restore(err_type, err_value, err_tb);
739 if (ep == NULL)
740 return NULL;
741 }
742 else {
743 ep = (mp->ma_lookup)(mp, key, hash);
744 if (ep == NULL) {
745 PyErr_Clear();
746 return NULL;
747 }
748 }
749 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000750}
751
Serhiy Storchaka1c496172016-02-10 10:28:06 +0200752/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
753 This returns NULL *with* an exception set if an exception occurred.
754 It returns NULL *without* an exception set if the key wasn't present.
755*/
756PyObject *
757_PyDict_GetItemWithError(PyObject *op, PyObject *key)
758{
759 long hash;
760 PyDictObject *mp = (PyDictObject *)op;
761 PyDictEntry *ep;
762 if (!PyDict_Check(op)) {
763 PyErr_BadInternalCall();
764 return NULL;
765 }
766 if (!PyString_CheckExact(key) ||
767 (hash = ((PyStringObject *) key)->ob_shash) == -1)
768 {
769 hash = PyObject_Hash(key);
770 if (hash == -1) {
771 return NULL;
772 }
773 }
774
775 ep = (mp->ma_lookup)(mp, key, hash);
776 if (ep == NULL) {
777 return NULL;
778 }
779 return ep->me_value;
780}
781
Antoine Pitrou6a1cd1b2012-02-27 00:45:12 +0100782static int
783dict_set_item_by_hash_or_entry(register PyObject *op, PyObject *key,
784 long hash, PyDictEntry *ep, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000785{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000786 register PyDictObject *mp;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000787 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000788
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000789 mp = (PyDictObject *)op;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000790 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
791 n_used = mp->ma_used;
792 Py_INCREF(value);
793 Py_INCREF(key);
Antoine Pitrou6a1cd1b2012-02-27 00:45:12 +0100794 if (ep == NULL) {
795 if (insertdict(mp, key, hash, value) != 0)
796 return -1;
797 }
798 else {
799 if (insertdict_by_entry(mp, key, hash, ep, value) != 0)
800 return -1;
801 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000802 /* If we added a key, we can safely resize. Otherwise just return!
803 * If fill >= 2/3 size, adjust size. Normally, this doubles or
804 * quaduples the size, but it's also possible for the dict to shrink
805 * (if ma_fill is much larger than ma_used, meaning a lot of dict
806 * keys have been * deleted).
807 *
808 * Quadrupling the size improves average dictionary sparseness
809 * (reducing collisions) at the cost of some memory and iteration
810 * speed (which loops over every possible entry). It also halves
811 * the number of expensive resize operations in a growing dictionary.
812 *
813 * Very large dictionaries (over 50K items) use doubling instead.
814 * This may help applications with severe memory constraints.
815 */
816 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
817 return 0;
818 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000819}
820
Antoine Pitrou6a1cd1b2012-02-27 00:45:12 +0100821/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
822 * dictionary if it's merely replacing the value for an existing key.
823 * This means that it's safe to loop over a dictionary with PyDict_Next()
824 * and occasionally replace a value -- but you can't insert new keys or
825 * remove them.
826 */
827int
828PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
829{
830 register long hash;
831
832 if (!PyDict_Check(op)) {
833 PyErr_BadInternalCall();
834 return -1;
835 }
836 assert(key);
837 assert(value);
838 if (PyString_CheckExact(key)) {
839 hash = ((PyStringObject *)key)->ob_shash;
840 if (hash == -1)
841 hash = PyObject_Hash(key);
842 }
843 else {
844 hash = PyObject_Hash(key);
845 if (hash == -1)
846 return -1;
847 }
848 return dict_set_item_by_hash_or_entry(op, key, hash, NULL, value);
849}
850
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000851int
Tim Peters1f5871e2000-07-04 17:44:48 +0000852PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000853{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000854 register PyDictObject *mp;
855 register long hash;
856 register PyDictEntry *ep;
857 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000858
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000859 if (!PyDict_Check(op)) {
860 PyErr_BadInternalCall();
861 return -1;
862 }
863 assert(key);
864 if (!PyString_CheckExact(key) ||
865 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
866 hash = PyObject_Hash(key);
867 if (hash == -1)
868 return -1;
869 }
870 mp = (PyDictObject *)op;
871 ep = (mp->ma_lookup)(mp, key, hash);
872 if (ep == NULL)
873 return -1;
874 if (ep->me_value == NULL) {
875 set_key_error(key);
876 return -1;
877 }
878 old_key = ep->me_key;
879 Py_INCREF(dummy);
880 ep->me_key = dummy;
881 old_value = ep->me_value;
882 ep->me_value = NULL;
883 mp->ma_used--;
884 Py_DECREF(old_value);
885 Py_DECREF(old_key);
886 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000887}
888
Guido van Rossum25831651993-05-19 14:50:45 +0000889void
Tim Peters1f5871e2000-07-04 17:44:48 +0000890PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000891{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000892 PyDictObject *mp;
893 PyDictEntry *ep, *table;
894 int table_is_malloced;
895 Py_ssize_t fill;
896 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000897#ifdef Py_DEBUG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000898 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000899#endif
900
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000901 if (!PyDict_Check(op))
902 return;
903 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000904#ifdef Py_DEBUG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000905 n = mp->ma_mask + 1;
906 i = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000907#endif
908
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000909 table = mp->ma_table;
910 assert(table != NULL);
911 table_is_malloced = table != mp->ma_smalltable;
Tim Petersdea48ec2001-05-22 20:40:22 +0000912
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000913 /* This is delicate. During the process of clearing the dict,
914 * decrefs can cause the dict to mutate. To avoid fatal confusion
915 * (voice of experience), we have to make the dict empty before
916 * clearing the slots, and never refer to anything via mp->xxx while
917 * clearing.
918 */
919 fill = mp->ma_fill;
920 if (table_is_malloced)
921 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000922
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000923 else if (fill > 0) {
924 /* It's a small table with something that needs to be cleared.
925 * Afraid the only safe way is to copy the dict entries into
926 * another small table first.
927 */
928 memcpy(small_copy, table, sizeof(small_copy));
929 table = small_copy;
930 EMPTY_TO_MINSIZE(mp);
931 }
932 /* else it's a small table that's already empty */
Tim Petersdea48ec2001-05-22 20:40:22 +0000933
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000934 /* Now we can finally clear things. If C had refcounts, we could
935 * assert that the refcount on table is 1 now, i.e. that this function
936 * has unique access to it, so decref side-effects can't alter it.
937 */
938 for (ep = table; fill > 0; ++ep) {
Tim Petersdea48ec2001-05-22 20:40:22 +0000939#ifdef Py_DEBUG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000940 assert(i < n);
941 ++i;
Tim Petersdea48ec2001-05-22 20:40:22 +0000942#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000943 if (ep->me_key) {
944 --fill;
945 Py_DECREF(ep->me_key);
946 Py_XDECREF(ep->me_value);
947 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000948#ifdef Py_DEBUG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000949 else
950 assert(ep->me_value == NULL);
Tim Petersdea48ec2001-05-22 20:40:22 +0000951#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000952 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000953
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000954 if (table_is_malloced)
955 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000956}
957
Tim Peters080c88b2003-02-15 03:01:11 +0000958/*
959 * Iterate over a dict. Use like so:
960 *
Tim Peters9b10f7e2006-05-30 04:16:25 +0000961 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000962 * PyObject *key, *value;
963 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000964 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000965 * Refer to borrowed references in key and value.
966 * }
967 *
968 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000969 * mutates the dict. One exception: it is safe if the loop merely changes
970 * the values associated with the keys (but doesn't insert new keys or
971 * delete keys), via PyDict_SetItem().
972 */
Guido van Rossum25831651993-05-19 14:50:45 +0000973int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000974PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000975{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000976 register Py_ssize_t i;
977 register Py_ssize_t mask;
978 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000979
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000980 if (!PyDict_Check(op))
981 return 0;
982 i = *ppos;
983 if (i < 0)
984 return 0;
985 ep = ((PyDictObject *)op)->ma_table;
986 mask = ((PyDictObject *)op)->ma_mask;
987 while (i <= mask && ep[i].me_value == NULL)
988 i++;
989 *ppos = i+1;
990 if (i > mask)
991 return 0;
992 if (pkey)
993 *pkey = ep[i].me_key;
994 if (pvalue)
995 *pvalue = ep[i].me_value;
996 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000997}
998
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000999/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
1000int
1001_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, long *phash)
1002{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001003 register Py_ssize_t i;
1004 register Py_ssize_t mask;
1005 register PyDictEntry *ep;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00001006
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001007 if (!PyDict_Check(op))
1008 return 0;
1009 i = *ppos;
1010 if (i < 0)
1011 return 0;
1012 ep = ((PyDictObject *)op)->ma_table;
1013 mask = ((PyDictObject *)op)->ma_mask;
1014 while (i <= mask && ep[i].me_value == NULL)
1015 i++;
1016 *ppos = i+1;
1017 if (i > mask)
1018 return 0;
1019 *phash = (long)(ep[i].me_hash);
1020 if (pkey)
1021 *pkey = ep[i].me_key;
1022 if (pvalue)
1023 *pvalue = ep[i].me_value;
1024 return 1;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00001025}
1026
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001027/* Methods */
1028
1029static void
Brett Cannon77ae87c2007-10-10 00:07:50 +00001030dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001031{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001032 register PyDictEntry *ep;
1033 Py_ssize_t fill = mp->ma_fill;
1034 PyObject_GC_UnTrack(mp);
1035 Py_TRASHCAN_SAFE_BEGIN(mp)
1036 for (ep = mp->ma_table; fill > 0; ep++) {
1037 if (ep->me_key) {
1038 --fill;
1039 Py_DECREF(ep->me_key);
1040 Py_XDECREF(ep->me_value);
1041 }
1042 }
1043 if (mp->ma_table != mp->ma_smalltable)
1044 PyMem_DEL(mp->ma_table);
1045 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1046 free_list[numfree++] = mp;
1047 else
1048 Py_TYPE(mp)->tp_free((PyObject *)mp);
1049 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001050}
1051
1052static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001053dict_print(register PyDictObject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001054{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001055 register Py_ssize_t i;
1056 register Py_ssize_t any;
1057 int status;
Guido van Rossum255443b1998-04-10 22:47:14 +00001058
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001059 status = Py_ReprEnter((PyObject*)mp);
1060 if (status != 0) {
1061 if (status < 0)
1062 return status;
1063 Py_BEGIN_ALLOW_THREADS
1064 fprintf(fp, "{...}");
1065 Py_END_ALLOW_THREADS
1066 return 0;
1067 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001068
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001069 Py_BEGIN_ALLOW_THREADS
1070 fprintf(fp, "{");
1071 Py_END_ALLOW_THREADS
1072 any = 0;
1073 for (i = 0; i <= mp->ma_mask; i++) {
1074 PyDictEntry *ep = mp->ma_table + i;
1075 PyObject *pvalue = ep->me_value;
1076 if (pvalue != NULL) {
1077 /* Prevent PyObject_Repr from deleting value during
1078 key format */
1079 Py_INCREF(pvalue);
1080 if (any++ > 0) {
1081 Py_BEGIN_ALLOW_THREADS
1082 fprintf(fp, ", ");
1083 Py_END_ALLOW_THREADS
1084 }
1085 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
1086 Py_DECREF(pvalue);
1087 Py_ReprLeave((PyObject*)mp);
1088 return -1;
1089 }
1090 Py_BEGIN_ALLOW_THREADS
1091 fprintf(fp, ": ");
1092 Py_END_ALLOW_THREADS
1093 if (PyObject_Print(pvalue, fp, 0) != 0) {
1094 Py_DECREF(pvalue);
1095 Py_ReprLeave((PyObject*)mp);
1096 return -1;
1097 }
1098 Py_DECREF(pvalue);
1099 }
1100 }
1101 Py_BEGIN_ALLOW_THREADS
1102 fprintf(fp, "}");
1103 Py_END_ALLOW_THREADS
1104 Py_ReprLeave((PyObject*)mp);
1105 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001106}
1107
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001108static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001109dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001110{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001111 Py_ssize_t i;
1112 PyObject *s, *temp, *colon = NULL;
1113 PyObject *pieces = NULL, *result = NULL;
1114 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001115
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001116 i = Py_ReprEnter((PyObject *)mp);
1117 if (i != 0) {
1118 return i > 0 ? PyString_FromString("{...}") : NULL;
1119 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001120
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001121 if (mp->ma_used == 0) {
1122 result = PyString_FromString("{}");
1123 goto Done;
1124 }
Tim Petersa7259592001-06-16 05:11:17 +00001125
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001126 pieces = PyList_New(0);
1127 if (pieces == NULL)
1128 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001129
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001130 colon = PyString_FromString(": ");
1131 if (colon == NULL)
1132 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001133
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001134 /* Do repr() on each key+value pair, and insert ": " between them.
1135 Note that repr may mutate the dict. */
1136 i = 0;
1137 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
1138 int status;
1139 /* Prevent repr from deleting value during key format. */
1140 Py_INCREF(value);
1141 s = PyObject_Repr(key);
1142 PyString_Concat(&s, colon);
1143 PyString_ConcatAndDel(&s, PyObject_Repr(value));
1144 Py_DECREF(value);
1145 if (s == NULL)
1146 goto Done;
1147 status = PyList_Append(pieces, s);
1148 Py_DECREF(s); /* append created a new ref */
1149 if (status < 0)
1150 goto Done;
1151 }
Tim Petersa7259592001-06-16 05:11:17 +00001152
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001153 /* Add "{}" decorations to the first and last items. */
1154 assert(PyList_GET_SIZE(pieces) > 0);
1155 s = PyString_FromString("{");
1156 if (s == NULL)
1157 goto Done;
1158 temp = PyList_GET_ITEM(pieces, 0);
1159 PyString_ConcatAndDel(&s, temp);
1160 PyList_SET_ITEM(pieces, 0, s);
1161 if (s == NULL)
1162 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001163
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001164 s = PyString_FromString("}");
1165 if (s == NULL)
1166 goto Done;
1167 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
1168 PyString_ConcatAndDel(&temp, s);
1169 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1170 if (temp == NULL)
1171 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001172
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001173 /* Paste them all together with ", " between. */
1174 s = PyString_FromString(", ");
1175 if (s == NULL)
1176 goto Done;
1177 result = _PyString_Join(s, pieces);
1178 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001179
1180Done:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001181 Py_XDECREF(pieces);
1182 Py_XDECREF(colon);
1183 Py_ReprLeave((PyObject *)mp);
1184 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001185}
1186
Martin v. Löwis18e16552006-02-15 17:27:45 +00001187static Py_ssize_t
Brett Cannon77ae87c2007-10-10 00:07:50 +00001188dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001189{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001190 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001191}
1192
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001194dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001195{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001196 PyObject *v;
1197 long hash;
1198 PyDictEntry *ep;
1199 assert(mp->ma_table != NULL);
1200 if (!PyString_CheckExact(key) ||
1201 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1202 hash = PyObject_Hash(key);
1203 if (hash == -1)
1204 return NULL;
1205 }
1206 ep = (mp->ma_lookup)(mp, key, hash);
1207 if (ep == NULL)
1208 return NULL;
1209 v = ep->me_value;
1210 if (v == NULL) {
1211 if (!PyDict_CheckExact(mp)) {
1212 /* Look up __missing__ method if we're a subclass. */
1213 PyObject *missing, *res;
1214 static PyObject *missing_str = NULL;
1215 missing = _PyObject_LookupSpecial((PyObject *)mp,
1216 "__missing__",
1217 &missing_str);
1218 if (missing != NULL) {
1219 res = PyObject_CallFunctionObjArgs(missing,
1220 key, NULL);
1221 Py_DECREF(missing);
1222 return res;
1223 }
1224 else if (PyErr_Occurred())
1225 return NULL;
1226 }
1227 set_key_error(key);
1228 return NULL;
1229 }
1230 else
1231 Py_INCREF(v);
1232 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001233}
1234
1235static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001236dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001237{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001238 if (w == NULL)
1239 return PyDict_DelItem((PyObject *)mp, v);
1240 else
1241 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001242}
1243
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001244static PyMappingMethods dict_as_mapping = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001245 (lenfunc)dict_length, /*mp_length*/
1246 (binaryfunc)dict_subscript, /*mp_subscript*/
1247 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001248};
1249
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001251dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001252{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001253 register PyObject *v;
1254 register Py_ssize_t i, j;
1255 PyDictEntry *ep;
1256 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001257
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001258 again:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001259 n = mp->ma_used;
1260 v = PyList_New(n);
1261 if (v == NULL)
1262 return NULL;
1263 if (n != mp->ma_used) {
1264 /* Durnit. The allocations caused the dict to resize.
1265 * Just start over, this shouldn't normally happen.
1266 */
1267 Py_DECREF(v);
1268 goto again;
1269 }
1270 ep = mp->ma_table;
1271 mask = mp->ma_mask;
1272 for (i = 0, j = 0; i <= mask; i++) {
1273 if (ep[i].me_value != NULL) {
1274 PyObject *key = ep[i].me_key;
1275 Py_INCREF(key);
1276 PyList_SET_ITEM(v, j, key);
1277 j++;
1278 }
1279 }
1280 assert(j == n);
1281 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001282}
1283
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001285dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001286{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001287 register PyObject *v;
1288 register Py_ssize_t i, j;
1289 PyDictEntry *ep;
1290 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001291
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001292 again:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001293 n = mp->ma_used;
1294 v = PyList_New(n);
1295 if (v == NULL)
1296 return NULL;
1297 if (n != mp->ma_used) {
1298 /* Durnit. The allocations caused the dict to resize.
1299 * Just start over, this shouldn't normally happen.
1300 */
1301 Py_DECREF(v);
1302 goto again;
1303 }
1304 ep = mp->ma_table;
1305 mask = mp->ma_mask;
1306 for (i = 0, j = 0; i <= mask; i++) {
1307 if (ep[i].me_value != NULL) {
1308 PyObject *value = ep[i].me_value;
1309 Py_INCREF(value);
1310 PyList_SET_ITEM(v, j, value);
1311 j++;
1312 }
1313 }
1314 assert(j == n);
1315 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001316}
1317
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001319dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001320{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001321 register PyObject *v;
1322 register Py_ssize_t i, j, n;
1323 Py_ssize_t mask;
1324 PyObject *item, *key, *value;
1325 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001326
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001327 /* Preallocate the list of tuples, to avoid allocations during
1328 * the loop over the items, which could trigger GC, which
1329 * could resize the dict. :-(
1330 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001331 again:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001332 n = mp->ma_used;
1333 v = PyList_New(n);
1334 if (v == NULL)
1335 return NULL;
1336 for (i = 0; i < n; i++) {
1337 item = PyTuple_New(2);
1338 if (item == NULL) {
1339 Py_DECREF(v);
1340 return NULL;
1341 }
1342 PyList_SET_ITEM(v, i, item);
1343 }
1344 if (n != mp->ma_used) {
1345 /* Durnit. The allocations caused the dict to resize.
1346 * Just start over, this shouldn't normally happen.
1347 */
1348 Py_DECREF(v);
1349 goto again;
1350 }
1351 /* Nothing we do below makes any function calls. */
1352 ep = mp->ma_table;
1353 mask = mp->ma_mask;
1354 for (i = 0, j = 0; i <= mask; i++) {
1355 if ((value=ep[i].me_value) != NULL) {
1356 key = ep[i].me_key;
1357 item = PyList_GET_ITEM(v, j);
1358 Py_INCREF(key);
1359 PyTuple_SET_ITEM(item, 0, key);
1360 Py_INCREF(value);
1361 PyTuple_SET_ITEM(item, 1, value);
1362 j++;
1363 }
1364 }
1365 assert(j == n);
1366 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001367}
1368
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001369static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001370dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001371{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001372 PyObject *seq;
1373 PyObject *value = Py_None;
1374 PyObject *it; /* iter(seq) */
1375 PyObject *key;
1376 PyObject *d;
1377 int status;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001378
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001379 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
1380 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001381
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001382 d = PyObject_CallObject(cls, NULL);
1383 if (d == NULL)
1384 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001385
Benjamin Peterson47fa4d52012-10-31 14:22:12 -04001386 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) {
Benjamin Peterson0ec820f2012-10-31 14:05:55 -04001387 if (PyDict_CheckExact(seq)) {
1388 PyDictObject *mp = (PyDictObject *)d;
1389 PyObject *oldvalue;
1390 Py_ssize_t pos = 0;
1391 PyObject *key;
1392 long hash;
Raymond Hettingercdcf8872007-11-07 02:26:17 +00001393
Raymond Hettinger77b3ae52015-05-13 03:13:28 -07001394 if (dictresize(mp, Py_SIZE(seq) / 2 * 3)) {
Petri Lehtinen8ffbab82011-10-24 20:59:29 +03001395 Py_DECREF(d);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001396 return NULL;
Petri Lehtinen8ffbab82011-10-24 20:59:29 +03001397 }
Benjamin Peterson0ec820f2012-10-31 14:05:55 -04001398
1399 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1400 Py_INCREF(key);
1401 Py_INCREF(value);
1402 if (insertdict(mp, key, hash, value)) {
1403 Py_DECREF(d);
1404 return NULL;
1405 }
1406 }
1407 return d;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001408 }
Benjamin Peterson0ec820f2012-10-31 14:05:55 -04001409 if (PyAnySet_CheckExact(seq)) {
1410 PyDictObject *mp = (PyDictObject *)d;
1411 Py_ssize_t pos = 0;
1412 PyObject *key;
1413 long hash;
Raymond Hettingercdcf8872007-11-07 02:26:17 +00001414
Raymond Hettinger77b3ae52015-05-13 03:13:28 -07001415 if (dictresize(mp, PySet_GET_SIZE(seq) / 2 * 3)) {
Petri Lehtinen8ffbab82011-10-24 20:59:29 +03001416 Py_DECREF(d);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001417 return NULL;
Petri Lehtinen8ffbab82011-10-24 20:59:29 +03001418 }
Benjamin Peterson0ec820f2012-10-31 14:05:55 -04001419
1420 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1421 Py_INCREF(key);
1422 Py_INCREF(value);
1423 if (insertdict(mp, key, hash, value)) {
1424 Py_DECREF(d);
1425 return NULL;
1426 }
1427 }
1428 return d;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001429 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001430 }
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001431
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001432 it = PyObject_GetIter(seq);
1433 if (it == NULL){
1434 Py_DECREF(d);
1435 return NULL;
1436 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001437
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001438 if (PyDict_CheckExact(d)) {
1439 while ((key = PyIter_Next(it)) != NULL) {
1440 status = PyDict_SetItem(d, key, value);
1441 Py_DECREF(key);
1442 if (status < 0)
1443 goto Fail;
1444 }
1445 } else {
1446 while ((key = PyIter_Next(it)) != NULL) {
1447 status = PyObject_SetItem(d, key, value);
1448 Py_DECREF(key);
1449 if (status < 0)
1450 goto Fail;
1451 }
1452 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001453
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001454 if (PyErr_Occurred())
1455 goto Fail;
1456 Py_DECREF(it);
1457 return d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001458
1459Fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001460 Py_DECREF(it);
1461 Py_DECREF(d);
1462 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001463}
1464
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001465static int
1466dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001467{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001468 PyObject *arg = NULL;
1469 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001470
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001471 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1472 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001473
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001474 else if (arg != NULL) {
1475 if (PyObject_HasAttrString(arg, "keys"))
1476 result = PyDict_Merge(self, arg, 1);
1477 else
1478 result = PyDict_MergeFromSeq2(self, arg, 1);
1479 }
1480 if (result == 0 && kwds != NULL)
1481 result = PyDict_Merge(self, kwds, 1);
1482 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001483}
1484
1485static PyObject *
1486dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1487{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001488 if (dict_update_common(self, args, kwds, "update") != -1)
1489 Py_RETURN_NONE;
1490 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001491}
1492
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001493/* Update unconditionally replaces existing items.
1494 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001495 otherwise it leaves existing items unchanged.
1496
1497 PyDict_{Update,Merge} update/merge from a mapping object.
1498
Tim Petersf582b822001-12-11 18:51:08 +00001499 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001500 producing iterable objects of length 2.
1501*/
1502
Tim Petersf582b822001-12-11 18:51:08 +00001503int
Tim Peters1fc240e2001-10-26 05:06:50 +00001504PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1505{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001506 PyObject *it; /* iter(seq2) */
1507 Py_ssize_t i; /* index into seq2 of current element */
1508 PyObject *item; /* seq2[i] */
1509 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001510
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001511 assert(d != NULL);
1512 assert(PyDict_Check(d));
1513 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001514
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001515 it = PyObject_GetIter(seq2);
1516 if (it == NULL)
1517 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001518
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001519 for (i = 0; ; ++i) {
1520 PyObject *key, *value;
1521 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001522
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001523 fast = NULL;
1524 item = PyIter_Next(it);
1525 if (item == NULL) {
1526 if (PyErr_Occurred())
1527 goto Fail;
1528 break;
1529 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001530
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001531 /* Convert item to sequence, and verify length 2. */
1532 fast = PySequence_Fast(item, "");
1533 if (fast == NULL) {
1534 if (PyErr_ExceptionMatches(PyExc_TypeError))
1535 PyErr_Format(PyExc_TypeError,
1536 "cannot convert dictionary update "
1537 "sequence element #%zd to a sequence",
1538 i);
1539 goto Fail;
1540 }
1541 n = PySequence_Fast_GET_SIZE(fast);
1542 if (n != 2) {
1543 PyErr_Format(PyExc_ValueError,
1544 "dictionary update sequence element #%zd "
1545 "has length %zd; 2 is required",
1546 i, n);
1547 goto Fail;
1548 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001549
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001550 /* Update/merge with this (key, value) pair. */
1551 key = PySequence_Fast_GET_ITEM(fast, 0);
1552 value = PySequence_Fast_GET_ITEM(fast, 1);
1553 if (override || PyDict_GetItem(d, key) == NULL) {
1554 int status = PyDict_SetItem(d, key, value);
1555 if (status < 0)
1556 goto Fail;
1557 }
1558 Py_DECREF(fast);
1559 Py_DECREF(item);
1560 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001561
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001562 i = 0;
1563 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00001564Fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001565 Py_XDECREF(item);
1566 Py_XDECREF(fast);
1567 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001568Return:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001569 Py_DECREF(it);
1570 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001571}
1572
Tim Peters6d6c1a32001-08-02 04:15:00 +00001573int
1574PyDict_Update(PyObject *a, PyObject *b)
1575{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001576 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001577}
1578
1579int
1580PyDict_Merge(PyObject *a, PyObject *b, int override)
1581{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001582 register PyDictObject *mp, *other;
1583 register Py_ssize_t i;
1584 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001585
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001586 /* We accept for the argument either a concrete dictionary object,
1587 * or an abstract "mapping" object. For the former, we can do
1588 * things quite efficiently. For the latter, we only require that
1589 * PyMapping_Keys() and PyObject_GetItem() be supported.
1590 */
1591 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1592 PyErr_BadInternalCall();
1593 return -1;
1594 }
1595 mp = (PyDictObject*)a;
1596 if (PyDict_Check(b)) {
1597 other = (PyDictObject*)b;
1598 if (other == mp || other->ma_used == 0)
1599 /* a.update(a) or a.update({}); nothing to do */
1600 return 0;
1601 if (mp->ma_used == 0)
1602 /* Since the target dict is empty, PyDict_GetItem()
1603 * always returns NULL. Setting override to 1
1604 * skips the unnecessary test.
1605 */
1606 override = 1;
1607 /* Do one big resize at the start, rather than
1608 * incrementally resizing as we insert new items. Expect
1609 * that there will be no (or few) overlapping keys.
1610 */
1611 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
1612 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
1613 return -1;
1614 }
1615 for (i = 0; i <= other->ma_mask; i++) {
1616 entry = &other->ma_table[i];
1617 if (entry->me_value != NULL &&
1618 (override ||
1619 PyDict_GetItem(a, entry->me_key) == NULL)) {
1620 Py_INCREF(entry->me_key);
1621 Py_INCREF(entry->me_value);
1622 if (insertdict(mp, entry->me_key,
1623 (long)entry->me_hash,
1624 entry->me_value) != 0)
1625 return -1;
1626 }
1627 }
1628 }
1629 else {
1630 /* Do it the generic, slower way */
1631 PyObject *keys = PyMapping_Keys(b);
1632 PyObject *iter;
1633 PyObject *key, *value;
1634 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001635
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001636 if (keys == NULL)
1637 /* Docstring says this is equivalent to E.keys() so
1638 * if E doesn't have a .keys() method we want
1639 * AttributeError to percolate up. Might as well
1640 * do the same for any other error.
1641 */
1642 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001643
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001644 iter = PyObject_GetIter(keys);
1645 Py_DECREF(keys);
1646 if (iter == NULL)
1647 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001648
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001649 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
1650 if (!override && PyDict_GetItem(a, key) != NULL) {
1651 Py_DECREF(key);
1652 continue;
1653 }
1654 value = PyObject_GetItem(b, key);
1655 if (value == NULL) {
1656 Py_DECREF(iter);
1657 Py_DECREF(key);
1658 return -1;
1659 }
1660 status = PyDict_SetItem(a, key, value);
1661 Py_DECREF(key);
1662 Py_DECREF(value);
1663 if (status < 0) {
1664 Py_DECREF(iter);
1665 return -1;
1666 }
1667 }
1668 Py_DECREF(iter);
1669 if (PyErr_Occurred())
1670 /* Iterator completed, via error */
1671 return -1;
1672 }
1673 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001674}
1675
1676static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001677dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001678{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001679 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001680}
1681
1682PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001683PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001684{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001685 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001686
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001687 if (o == NULL || !PyDict_Check(o)) {
1688 PyErr_BadInternalCall();
1689 return NULL;
1690 }
1691 copy = PyDict_New();
1692 if (copy == NULL)
1693 return NULL;
1694 if (PyDict_Merge(copy, o, 1) == 0)
1695 return copy;
1696 Py_DECREF(copy);
1697 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001698}
1699
Martin v. Löwis18e16552006-02-15 17:27:45 +00001700Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001701PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001702{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001703 if (mp == NULL || !PyDict_Check(mp)) {
1704 PyErr_BadInternalCall();
1705 return -1;
1706 }
1707 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001708}
1709
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001710PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001711PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001712{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001713 if (mp == NULL || !PyDict_Check(mp)) {
1714 PyErr_BadInternalCall();
1715 return NULL;
1716 }
1717 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001718}
1719
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001720PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001721PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001722{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001723 if (mp == NULL || !PyDict_Check(mp)) {
1724 PyErr_BadInternalCall();
1725 return NULL;
1726 }
1727 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001728}
1729
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001730PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001731PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001732{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001733 if (mp == NULL || !PyDict_Check(mp)) {
1734 PyErr_BadInternalCall();
1735 return NULL;
1736 }
1737 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001738}
1739
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001740/* Subroutine which returns the smallest key in a for which b's value
1741 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001742 pval argument. Both are NULL if no key in a is found for which b's status
1743 differs. The refcounts on (and only on) non-NULL *pval and function return
1744 values must be decremented by the caller (characterize() increments them
1745 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1746 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001747
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001748static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001749characterize(PyDictObject *a, PyDictObject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001750{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001751 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1752 PyObject *aval = NULL; /* a[akey] */
1753 Py_ssize_t i;
1754 int cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001755
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001756 for (i = 0; i <= a->ma_mask; i++) {
1757 PyObject *thiskey, *thisaval, *thisbval;
1758 if (a->ma_table[i].me_value == NULL)
1759 continue;
1760 thiskey = a->ma_table[i].me_key;
1761 Py_INCREF(thiskey); /* keep alive across compares */
1762 if (akey != NULL) {
1763 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1764 if (cmp < 0) {
1765 Py_DECREF(thiskey);
1766 goto Fail;
1767 }
1768 if (cmp > 0 ||
1769 i > a->ma_mask ||
1770 a->ma_table[i].me_value == NULL)
1771 {
1772 /* Not the *smallest* a key; or maybe it is
1773 * but the compare shrunk the dict so we can't
1774 * find its associated value anymore; or
1775 * maybe it is but the compare deleted the
1776 * a[thiskey] entry.
1777 */
1778 Py_DECREF(thiskey);
1779 continue;
1780 }
1781 }
Tim Peters95bf9392001-05-10 08:32:44 +00001782
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001783 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1784 thisaval = a->ma_table[i].me_value;
1785 assert(thisaval);
1786 Py_INCREF(thisaval); /* keep alive */
1787 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1788 if (thisbval == NULL)
1789 cmp = 0;
1790 else {
1791 /* both dicts have thiskey: same values? */
1792 cmp = PyObject_RichCompareBool(
1793 thisaval, thisbval, Py_EQ);
1794 if (cmp < 0) {
1795 Py_DECREF(thiskey);
1796 Py_DECREF(thisaval);
1797 goto Fail;
1798 }
1799 }
1800 if (cmp == 0) {
1801 /* New winner. */
1802 Py_XDECREF(akey);
1803 Py_XDECREF(aval);
1804 akey = thiskey;
1805 aval = thisaval;
1806 }
1807 else {
1808 Py_DECREF(thiskey);
1809 Py_DECREF(thisaval);
1810 }
1811 }
1812 *pval = aval;
1813 return akey;
Tim Peters95bf9392001-05-10 08:32:44 +00001814
1815Fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001816 Py_XDECREF(akey);
1817 Py_XDECREF(aval);
1818 *pval = NULL;
1819 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001820}
1821
1822static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001823dict_compare(PyDictObject *a, PyDictObject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001824{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001825 PyObject *adiff, *bdiff, *aval, *bval;
1826 int res;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001827
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001828 /* Compare lengths first */
1829 if (a->ma_used < b->ma_used)
1830 return -1; /* a is shorter */
1831 else if (a->ma_used > b->ma_used)
1832 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001833
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001834 /* Same length -- check all keys */
1835 bdiff = bval = NULL;
1836 adiff = characterize(a, b, &aval);
1837 if (adiff == NULL) {
1838 assert(!aval);
1839 /* Either an error, or a is a subset with the same length so
1840 * must be equal.
1841 */
1842 res = PyErr_Occurred() ? -1 : 0;
1843 goto Finished;
1844 }
1845 bdiff = characterize(b, a, &bval);
1846 if (bdiff == NULL && PyErr_Occurred()) {
1847 assert(!bval);
1848 res = -1;
1849 goto Finished;
1850 }
1851 res = 0;
1852 if (bdiff) {
1853 /* bdiff == NULL "should be" impossible now, but perhaps
1854 * the last comparison done by the characterize() on a had
1855 * the side effect of making the dicts equal!
1856 */
1857 res = PyObject_Compare(adiff, bdiff);
1858 }
1859 if (res == 0 && bval != NULL)
1860 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001861
1862Finished:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001863 Py_XDECREF(adiff);
1864 Py_XDECREF(bdiff);
1865 Py_XDECREF(aval);
1866 Py_XDECREF(bval);
1867 return res;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001868}
1869
Tim Peterse63415e2001-05-08 04:38:29 +00001870/* Return 1 if dicts equal, 0 if not, -1 if error.
1871 * Gets out as soon as any difference is detected.
1872 * Uses only Py_EQ comparison.
1873 */
1874static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001875dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001876{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001877 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001878
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001879 if (a->ma_used != b->ma_used)
1880 /* can't be equal if # of entries differ */
1881 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001882
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001883 /* Same # of entries -- check all of 'em. Exit early on any diff. */
1884 for (i = 0; i <= a->ma_mask; i++) {
1885 PyObject *aval = a->ma_table[i].me_value;
1886 if (aval != NULL) {
1887 int cmp;
1888 PyObject *bval;
1889 PyObject *key = a->ma_table[i].me_key;
1890 /* temporarily bump aval's refcount to ensure it stays
1891 alive until we're done with it */
1892 Py_INCREF(aval);
1893 /* ditto for key */
1894 Py_INCREF(key);
1895 bval = PyDict_GetItem((PyObject *)b, key);
1896 Py_DECREF(key);
1897 if (bval == NULL) {
1898 Py_DECREF(aval);
1899 return 0;
1900 }
1901 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1902 Py_DECREF(aval);
1903 if (cmp <= 0) /* error or not equal */
1904 return cmp;
1905 }
1906 }
1907 return 1;
Tim Peterse63415e2001-05-08 04:38:29 +00001908 }
1909
1910static PyObject *
1911dict_richcompare(PyObject *v, PyObject *w, int op)
1912{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001913 int cmp;
1914 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00001915
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001916 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1917 res = Py_NotImplemented;
1918 }
1919 else if (op == Py_EQ || op == Py_NE) {
1920 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
1921 if (cmp < 0)
1922 return NULL;
1923 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1924 }
1925 else {
1926 /* Py3K warning if comparison isn't == or != */
1927 if (PyErr_WarnPy3k("dict inequality comparisons not supported "
1928 "in 3.x", 1) < 0) {
1929 return NULL;
1930 }
1931 res = Py_NotImplemented;
1932 }
1933 Py_INCREF(res);
1934 return res;
Tim Peterse63415e2001-05-08 04:38:29 +00001935 }
1936
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001937static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001938dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001939{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001940 long hash;
1941 PyDictEntry *ep;
Tim Petersd770ebd2006-06-01 15:50:44 +00001942
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001943 if (!PyString_CheckExact(key) ||
1944 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1945 hash = PyObject_Hash(key);
1946 if (hash == -1)
1947 return NULL;
1948 }
1949 ep = (mp->ma_lookup)(mp, key, hash);
1950 if (ep == NULL)
1951 return NULL;
1952 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001953}
1954
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001955static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001956dict_has_key(register PyDictObject *mp, PyObject *key)
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +00001957{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001958 if (PyErr_WarnPy3k("dict.has_key() not supported in 3.x; "
1959 "use the in operator", 1) < 0)
1960 return NULL;
1961 return dict_contains(mp, key);
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +00001962}
1963
1964static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001965dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001966{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001967 PyObject *key;
1968 PyObject *failobj = Py_None;
1969 PyObject *val = NULL;
1970 long hash;
1971 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001972
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001973 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
1974 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001975
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001976 if (!PyString_CheckExact(key) ||
1977 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1978 hash = PyObject_Hash(key);
1979 if (hash == -1)
1980 return NULL;
1981 }
1982 ep = (mp->ma_lookup)(mp, key, hash);
1983 if (ep == NULL)
1984 return NULL;
1985 val = ep->me_value;
1986 if (val == NULL)
1987 val = failobj;
1988 Py_INCREF(val);
1989 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001990}
1991
1992
1993static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001994dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001995{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001996 PyObject *key;
1997 PyObject *failobj = Py_None;
1998 PyObject *val = NULL;
1999 long hash;
2000 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00002001
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002002 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
2003 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00002004
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002005 if (!PyString_CheckExact(key) ||
2006 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
2007 hash = PyObject_Hash(key);
2008 if (hash == -1)
2009 return NULL;
2010 }
2011 ep = (mp->ma_lookup)(mp, key, hash);
2012 if (ep == NULL)
2013 return NULL;
2014 val = ep->me_value;
2015 if (val == NULL) {
Antoine Pitrou6a1cd1b2012-02-27 00:45:12 +01002016 if (dict_set_item_by_hash_or_entry((PyObject*)mp, key, hash, ep,
2017 failobj) == 0)
2018 val = failobj;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002019 }
2020 Py_XINCREF(val);
2021 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00002022}
2023
2024
2025static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002026dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002027{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002028 PyDict_Clear((PyObject *)mp);
2029 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00002030}
2031
Guido van Rossumba6ab842000-12-12 22:02:18 +00002032static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002033dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00002034{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002035 long hash;
2036 PyDictEntry *ep;
2037 PyObject *old_value, *old_key;
2038 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00002039
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002040 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
2041 return NULL;
2042 if (mp->ma_used == 0) {
2043 if (deflt) {
2044 Py_INCREF(deflt);
2045 return deflt;
2046 }
Raymond Hettinger2ad17e12010-10-30 08:17:46 +00002047 set_key_error(key);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002048 return NULL;
2049 }
2050 if (!PyString_CheckExact(key) ||
2051 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
2052 hash = PyObject_Hash(key);
2053 if (hash == -1)
2054 return NULL;
2055 }
2056 ep = (mp->ma_lookup)(mp, key, hash);
2057 if (ep == NULL)
2058 return NULL;
2059 if (ep->me_value == NULL) {
2060 if (deflt) {
2061 Py_INCREF(deflt);
2062 return deflt;
2063 }
2064 set_key_error(key);
2065 return NULL;
2066 }
2067 old_key = ep->me_key;
2068 Py_INCREF(dummy);
2069 ep->me_key = dummy;
2070 old_value = ep->me_value;
2071 ep->me_value = NULL;
2072 mp->ma_used--;
2073 Py_DECREF(old_key);
2074 return old_value;
Guido van Rossume027d982002-04-12 15:11:59 +00002075}
2076
2077static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002078dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002079{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002080 Py_ssize_t i = 0;
2081 PyDictEntry *ep;
2082 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002083
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002084 /* Allocate the result tuple before checking the size. Believe it
2085 * or not, this allocation could trigger a garbage collection which
2086 * could empty the dict, so if we checked the size first and that
2087 * happened, the result would be an infinite loop (searching for an
2088 * entry that no longer exists). Note that the usual popitem()
2089 * idiom is "while d: k, v = d.popitem()". so needing to throw the
2090 * tuple away if the dict *is* empty isn't a significant
2091 * inefficiency -- possible, but unlikely in practice.
2092 */
2093 res = PyTuple_New(2);
2094 if (res == NULL)
2095 return NULL;
2096 if (mp->ma_used == 0) {
2097 Py_DECREF(res);
2098 PyErr_SetString(PyExc_KeyError,
2099 "popitem(): dictionary is empty");
2100 return NULL;
2101 }
2102 /* Set ep to "the first" dict entry with a value. We abuse the hash
2103 * field of slot 0 to hold a search finger:
2104 * If slot 0 has a value, use slot 0.
2105 * Else slot 0 is being used to hold a search finger,
2106 * and we use its hash value as the first index to look.
2107 */
2108 ep = &mp->ma_table[0];
2109 if (ep->me_value == NULL) {
2110 i = ep->me_hash;
2111 /* The hash field may be a real hash value, or it may be a
2112 * legit search finger, or it may be a once-legit search
2113 * finger that's out of bounds now because it wrapped around
2114 * or the table shrunk -- simply make sure it's in bounds now.
2115 */
2116 if (i > mp->ma_mask || i < 1)
2117 i = 1; /* skip slot 0 */
2118 while ((ep = &mp->ma_table[i])->me_value == NULL) {
2119 i++;
2120 if (i > mp->ma_mask)
2121 i = 1;
2122 }
2123 }
2124 PyTuple_SET_ITEM(res, 0, ep->me_key);
2125 PyTuple_SET_ITEM(res, 1, ep->me_value);
2126 Py_INCREF(dummy);
2127 ep->me_key = dummy;
2128 ep->me_value = NULL;
2129 mp->ma_used--;
2130 assert(mp->ma_table[0].me_value == NULL);
2131 mp->ma_table[0].me_hash = i + 1; /* next place to start */
2132 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002133}
2134
Jeremy Hylton8caad492000-06-23 14:18:11 +00002135static int
2136dict_traverse(PyObject *op, visitproc visit, void *arg)
2137{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002138 Py_ssize_t i = 0;
2139 PyObject *pk;
2140 PyObject *pv;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002141
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002142 while (PyDict_Next(op, &i, &pk, &pv)) {
2143 Py_VISIT(pk);
2144 Py_VISIT(pv);
2145 }
2146 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002147}
2148
2149static int
2150dict_tp_clear(PyObject *op)
2151{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002152 PyDict_Clear(op);
2153 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002154}
2155
Tim Petersf7f88b12000-12-13 23:18:45 +00002156
Raymond Hettinger019a1482004-03-18 02:41:19 +00002157extern PyTypeObject PyDictIterKey_Type; /* Forward */
2158extern PyTypeObject PyDictIterValue_Type; /* Forward */
2159extern PyTypeObject PyDictIterItem_Type; /* Forward */
Brett Cannon77ae87c2007-10-10 00:07:50 +00002160static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002161
2162static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002163dict_iterkeys(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002164{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002165 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002166}
2167
2168static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002169dict_itervalues(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002170{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002171 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002172}
2173
2174static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002175dict_iteritems(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002176{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002177 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002178}
2179
Robert Schuppenies51df0642008-06-01 16:16:17 +00002180static PyObject *
2181dict_sizeof(PyDictObject *mp)
2182{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002183 Py_ssize_t res;
Robert Schuppenies51df0642008-06-01 16:16:17 +00002184
Serhiy Storchakac06a6d02015-12-19 20:07:48 +02002185 res = _PyObject_SIZE(Py_TYPE(mp));
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002186 if (mp->ma_table != mp->ma_smalltable)
2187 res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry);
2188 return PyInt_FromSsize_t(res);
Robert Schuppenies51df0642008-06-01 16:16:17 +00002189}
Guido van Rossum09e563a2001-05-01 12:10:21 +00002190
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002191PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00002192"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00002193
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002194PyDoc_STRVAR(contains__doc__,
2195"D.__contains__(k) -> True if D has a key k, else False");
2196
2197PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2198
Robert Schuppenies51df0642008-06-01 16:16:17 +00002199PyDoc_STRVAR(sizeof__doc__,
Georg Brandl7a6de8b2008-06-01 16:42:16 +00002200"D.__sizeof__() -> size of D in memory, in bytes");
Robert Schuppenies51df0642008-06-01 16:16:17 +00002201
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002202PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002203"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002204
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002205PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002206"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 +00002207
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002208PyDoc_STRVAR(pop__doc__,
Andrew M. Kuchlinga4127172008-10-04 21:51:59 +00002209"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002210If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002211
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002212PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002213"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Andrew M. Kuchlinga4127172008-10-04 21:51:59 +000022142-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002215
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002216PyDoc_STRVAR(keys__doc__,
2217"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00002218
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002219PyDoc_STRVAR(items__doc__,
2220"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00002221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002222PyDoc_STRVAR(values__doc__,
2223"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00002224
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002225PyDoc_STRVAR(update__doc__,
Georg Brandl6f14c332011-12-18 19:30:55 +01002226"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n"
2227"If E present and has a .keys() method, does: for k in E: D[k] = E[k]\n\
2228If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
Andrew M. Kuchlinga4127172008-10-04 21:51:59 +00002229In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002230
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002231PyDoc_STRVAR(fromkeys__doc__,
2232"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
2233v defaults to None.");
2234
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002235PyDoc_STRVAR(clear__doc__,
2236"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002237
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002238PyDoc_STRVAR(copy__doc__,
2239"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002240
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002241PyDoc_STRVAR(iterkeys__doc__,
2242"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002243
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002244PyDoc_STRVAR(itervalues__doc__,
2245"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002246
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002247PyDoc_STRVAR(iteritems__doc__,
2248"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002249
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002250/* Forward */
2251static PyObject *dictkeys_new(PyObject *);
2252static PyObject *dictitems_new(PyObject *);
2253static PyObject *dictvalues_new(PyObject *);
2254
2255PyDoc_STRVAR(viewkeys__doc__,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002256 "D.viewkeys() -> a set-like object providing a view on D's keys");
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002257PyDoc_STRVAR(viewitems__doc__,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002258 "D.viewitems() -> a set-like object providing a view on D's items");
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002259PyDoc_STRVAR(viewvalues__doc__,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002260 "D.viewvalues() -> an object providing a view on D's values");
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002261
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002262static PyMethodDef mapp_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002263 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
2264 contains__doc__},
2265 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2266 getitem__doc__},
2267 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2268 sizeof__doc__},
2269 {"has_key", (PyCFunction)dict_has_key, METH_O,
2270 has_key__doc__},
2271 {"get", (PyCFunction)dict_get, METH_VARARGS,
2272 get__doc__},
2273 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2274 setdefault_doc__},
2275 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2276 pop__doc__},
2277 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2278 popitem__doc__},
2279 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
2280 keys__doc__},
2281 {"items", (PyCFunction)dict_items, METH_NOARGS,
2282 items__doc__},
2283 {"values", (PyCFunction)dict_values, METH_NOARGS,
2284 values__doc__},
2285 {"viewkeys", (PyCFunction)dictkeys_new, METH_NOARGS,
2286 viewkeys__doc__},
2287 {"viewitems", (PyCFunction)dictitems_new, METH_NOARGS,
2288 viewitems__doc__},
2289 {"viewvalues", (PyCFunction)dictvalues_new, METH_NOARGS,
2290 viewvalues__doc__},
2291 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2292 update__doc__},
2293 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2294 fromkeys__doc__},
2295 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2296 clear__doc__},
2297 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2298 copy__doc__},
2299 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
2300 iterkeys__doc__},
2301 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
2302 itervalues__doc__},
2303 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
2304 iteritems__doc__},
2305 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002306};
2307
Tim Petersd770ebd2006-06-01 15:50:44 +00002308/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002309int
2310PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002311{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002312 long hash;
2313 PyDictObject *mp = (PyDictObject *)op;
2314 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002315
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002316 if (!PyString_CheckExact(key) ||
2317 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
2318 hash = PyObject_Hash(key);
2319 if (hash == -1)
2320 return -1;
2321 }
2322 ep = (mp->ma_lookup)(mp, key, hash);
2323 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002324}
2325
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00002326/* Internal version of PyDict_Contains used when the hash value is already known */
2327int
2328_PyDict_Contains(PyObject *op, PyObject *key, long hash)
2329{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002330 PyDictObject *mp = (PyDictObject *)op;
2331 PyDictEntry *ep;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00002332
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002333 ep = (mp->ma_lookup)(mp, key, hash);
2334 return ep == NULL ? -1 : (ep->me_value != NULL);
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00002335}
2336
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002337/* Hack to implement "key in dict" */
2338static PySequenceMethods dict_as_sequence = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002339 0, /* sq_length */
2340 0, /* sq_concat */
2341 0, /* sq_repeat */
2342 0, /* sq_item */
2343 0, /* sq_slice */
2344 0, /* sq_ass_item */
2345 0, /* sq_ass_slice */
2346 PyDict_Contains, /* sq_contains */
2347 0, /* sq_inplace_concat */
2348 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002349};
2350
Guido van Rossum09e563a2001-05-01 12:10:21 +00002351static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002352dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2353{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002354 PyObject *self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002355
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002356 assert(type != NULL && type->tp_alloc != NULL);
2357 self = type->tp_alloc(type, 0);
2358 if (self != NULL) {
2359 PyDictObject *d = (PyDictObject *)self;
2360 /* It's guaranteed that tp->alloc zeroed out the struct. */
2361 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2362 INIT_NONZERO_DICT_SLOTS(d);
2363 d->ma_lookup = lookdict_string;
Ezio Melottic2077b02011-03-16 12:34:31 +02002364 /* The object has been implicitly tracked by tp_alloc */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002365 if (type == &PyDict_Type)
2366 _PyObject_GC_UNTRACK(d);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002367#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002368 ++created;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002369#endif
Antoine Pitrouf8387af2009-03-23 18:41:45 +00002370#ifdef SHOW_TRACK_COUNT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002371 if (_PyObject_GC_IS_TRACKED(d))
2372 count_tracked++;
2373 else
2374 count_untracked++;
Antoine Pitrouf8387af2009-03-23 18:41:45 +00002375#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002376 }
2377 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002378}
2379
Tim Peters25786c02001-09-02 08:22:48 +00002380static int
2381dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2382{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002383 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002384}
2385
Tim Peters6d6c1a32001-08-02 04:15:00 +00002386static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002387dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002388{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002389 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002390}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002391
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002392PyDoc_STRVAR(dictionary_doc,
Ezio Melottifb501122010-02-28 23:59:00 +00002393"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002394"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melottifb501122010-02-28 23:59:00 +00002395" (key, value) pairs\n"
Georg Brandlbca11692010-02-28 18:19:17 +00002396"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002397" d = {}\n"
Georg Brandlbca11692010-02-28 18:19:17 +00002398" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002399" d[k] = v\n"
2400"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2401" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002402
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002403PyTypeObject PyDict_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002404 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2405 "dict",
2406 sizeof(PyDictObject),
2407 0,
2408 (destructor)dict_dealloc, /* tp_dealloc */
2409 (printfunc)dict_print, /* tp_print */
2410 0, /* tp_getattr */
2411 0, /* tp_setattr */
2412 (cmpfunc)dict_compare, /* tp_compare */
2413 (reprfunc)dict_repr, /* tp_repr */
2414 0, /* tp_as_number */
2415 &dict_as_sequence, /* tp_as_sequence */
2416 &dict_as_mapping, /* tp_as_mapping */
2417 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
2418 0, /* tp_call */
2419 0, /* tp_str */
2420 PyObject_GenericGetAttr, /* tp_getattro */
2421 0, /* tp_setattro */
2422 0, /* tp_as_buffer */
2423 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2424 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2425 dictionary_doc, /* tp_doc */
2426 dict_traverse, /* tp_traverse */
2427 dict_tp_clear, /* tp_clear */
2428 dict_richcompare, /* tp_richcompare */
2429 0, /* tp_weaklistoffset */
2430 (getiterfunc)dict_iter, /* tp_iter */
2431 0, /* tp_iternext */
2432 mapp_methods, /* tp_methods */
2433 0, /* tp_members */
2434 0, /* tp_getset */
2435 0, /* tp_base */
2436 0, /* tp_dict */
2437 0, /* tp_descr_get */
2438 0, /* tp_descr_set */
2439 0, /* tp_dictoffset */
2440 dict_init, /* tp_init */
2441 PyType_GenericAlloc, /* tp_alloc */
2442 dict_new, /* tp_new */
2443 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002444};
2445
Guido van Rossum3cca2451997-05-16 14:23:33 +00002446/* For backward compatibility with old dictionary interface */
2447
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002448PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002449PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002450{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002451 PyObject *kv, *rv;
2452 kv = PyString_FromString(key);
2453 if (kv == NULL)
2454 return NULL;
2455 rv = PyDict_GetItem(v, kv);
2456 Py_DECREF(kv);
2457 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002458}
2459
2460int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002461PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002462{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002463 PyObject *kv;
2464 int err;
2465 kv = PyString_FromString(key);
2466 if (kv == NULL)
2467 return -1;
2468 PyString_InternInPlace(&kv); /* XXX Should we really? */
2469 err = PyDict_SetItem(v, kv, item);
2470 Py_DECREF(kv);
2471 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002472}
2473
2474int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002475PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002476{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002477 PyObject *kv;
2478 int err;
2479 kv = PyString_FromString(key);
2480 if (kv == NULL)
2481 return -1;
2482 err = PyDict_DelItem(v, kv);
2483 Py_DECREF(kv);
2484 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002485}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002486
Raymond Hettinger019a1482004-03-18 02:41:19 +00002487/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002488
2489typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002490 PyObject_HEAD
2491 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2492 Py_ssize_t di_used;
2493 Py_ssize_t di_pos;
2494 PyObject* di_result; /* reusable result tuple for iteritems */
2495 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002496} dictiterobject;
2497
2498static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002499dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002500{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002501 dictiterobject *di;
2502 di = PyObject_GC_New(dictiterobject, itertype);
2503 if (di == NULL)
2504 return NULL;
2505 Py_INCREF(dict);
2506 di->di_dict = dict;
2507 di->di_used = dict->ma_used;
2508 di->di_pos = 0;
2509 di->len = dict->ma_used;
2510 if (itertype == &PyDictIterItem_Type) {
2511 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2512 if (di->di_result == NULL) {
2513 Py_DECREF(di);
2514 return NULL;
2515 }
2516 }
2517 else
2518 di->di_result = NULL;
2519 _PyObject_GC_TRACK(di);
2520 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002521}
2522
2523static void
2524dictiter_dealloc(dictiterobject *di)
2525{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002526 Py_XDECREF(di->di_dict);
2527 Py_XDECREF(di->di_result);
2528 PyObject_GC_Del(di);
Antoine Pitrouaa687902009-01-01 14:11:22 +00002529}
2530
2531static int
2532dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2533{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002534 Py_VISIT(di->di_dict);
2535 Py_VISIT(di->di_result);
2536 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002537}
2538
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002539static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002540dictiter_len(dictiterobject *di)
2541{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002542 Py_ssize_t len = 0;
2543 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2544 len = di->len;
2545 return PyInt_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002546}
2547
Armin Rigof5b3e362006-02-11 21:32:43 +00002548PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002549
2550static PyMethodDef dictiter_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002551 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS, length_hint_doc},
2552 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002553};
2554
Raymond Hettinger019a1482004-03-18 02:41:19 +00002555static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002556{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002557 PyObject *key;
2558 register Py_ssize_t i, mask;
2559 register PyDictEntry *ep;
2560 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002561
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002562 if (d == NULL)
2563 return NULL;
2564 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002565
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002566 if (di->di_used != d->ma_used) {
2567 PyErr_SetString(PyExc_RuntimeError,
2568 "dictionary changed size during iteration");
2569 di->di_used = -1; /* Make this state sticky */
2570 return NULL;
2571 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002572
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002573 i = di->di_pos;
2574 if (i < 0)
2575 goto fail;
2576 ep = d->ma_table;
2577 mask = d->ma_mask;
2578 while (i <= mask && ep[i].me_value == NULL)
2579 i++;
2580 di->di_pos = i+1;
2581 if (i > mask)
2582 goto fail;
2583 di->len--;
2584 key = ep[i].me_key;
2585 Py_INCREF(key);
2586 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002587
2588fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002589 di->di_dict = NULL;
Serhiy Storchaka14a7d632016-03-30 20:43:06 +03002590 Py_DECREF(d);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002591 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002592}
2593
Raymond Hettinger019a1482004-03-18 02:41:19 +00002594PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002595 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2596 "dictionary-keyiterator", /* tp_name */
2597 sizeof(dictiterobject), /* tp_basicsize */
2598 0, /* tp_itemsize */
2599 /* methods */
2600 (destructor)dictiter_dealloc, /* tp_dealloc */
2601 0, /* tp_print */
2602 0, /* tp_getattr */
2603 0, /* tp_setattr */
2604 0, /* tp_compare */
2605 0, /* tp_repr */
2606 0, /* tp_as_number */
2607 0, /* tp_as_sequence */
2608 0, /* tp_as_mapping */
2609 0, /* tp_hash */
2610 0, /* tp_call */
2611 0, /* tp_str */
2612 PyObject_GenericGetAttr, /* tp_getattro */
2613 0, /* tp_setattro */
2614 0, /* tp_as_buffer */
2615 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2616 0, /* tp_doc */
2617 (traverseproc)dictiter_traverse, /* tp_traverse */
2618 0, /* tp_clear */
2619 0, /* tp_richcompare */
2620 0, /* tp_weaklistoffset */
2621 PyObject_SelfIter, /* tp_iter */
2622 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2623 dictiter_methods, /* tp_methods */
2624 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002625};
2626
2627static PyObject *dictiter_iternextvalue(dictiterobject *di)
2628{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002629 PyObject *value;
2630 register Py_ssize_t i, mask;
2631 register PyDictEntry *ep;
2632 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002633
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002634 if (d == NULL)
2635 return NULL;
2636 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002637
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002638 if (di->di_used != d->ma_used) {
2639 PyErr_SetString(PyExc_RuntimeError,
2640 "dictionary changed size during iteration");
2641 di->di_used = -1; /* Make this state sticky */
2642 return NULL;
2643 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002644
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002645 i = di->di_pos;
2646 mask = d->ma_mask;
2647 if (i < 0 || i > mask)
2648 goto fail;
2649 ep = d->ma_table;
2650 while ((value=ep[i].me_value) == NULL) {
2651 i++;
2652 if (i > mask)
2653 goto fail;
2654 }
2655 di->di_pos = i+1;
2656 di->len--;
2657 Py_INCREF(value);
2658 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002659
2660fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002661 di->di_dict = NULL;
Serhiy Storchaka14a7d632016-03-30 20:43:06 +03002662 Py_DECREF(d);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002663 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002664}
2665
2666PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002667 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2668 "dictionary-valueiterator", /* tp_name */
2669 sizeof(dictiterobject), /* tp_basicsize */
2670 0, /* tp_itemsize */
2671 /* methods */
2672 (destructor)dictiter_dealloc, /* tp_dealloc */
2673 0, /* tp_print */
2674 0, /* tp_getattr */
2675 0, /* tp_setattr */
2676 0, /* tp_compare */
2677 0, /* tp_repr */
2678 0, /* tp_as_number */
2679 0, /* tp_as_sequence */
2680 0, /* tp_as_mapping */
2681 0, /* tp_hash */
2682 0, /* tp_call */
2683 0, /* tp_str */
2684 PyObject_GenericGetAttr, /* tp_getattro */
2685 0, /* tp_setattro */
2686 0, /* tp_as_buffer */
2687 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2688 0, /* tp_doc */
2689 (traverseproc)dictiter_traverse, /* tp_traverse */
2690 0, /* tp_clear */
2691 0, /* tp_richcompare */
2692 0, /* tp_weaklistoffset */
2693 PyObject_SelfIter, /* tp_iter */
2694 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2695 dictiter_methods, /* tp_methods */
2696 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002697};
2698
2699static PyObject *dictiter_iternextitem(dictiterobject *di)
2700{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002701 PyObject *key, *value, *result = di->di_result;
2702 register Py_ssize_t i, mask;
2703 register PyDictEntry *ep;
2704 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002705
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002706 if (d == NULL)
2707 return NULL;
2708 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002709
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002710 if (di->di_used != d->ma_used) {
2711 PyErr_SetString(PyExc_RuntimeError,
2712 "dictionary changed size during iteration");
2713 di->di_used = -1; /* Make this state sticky */
2714 return NULL;
2715 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002716
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002717 i = di->di_pos;
2718 if (i < 0)
2719 goto fail;
2720 ep = d->ma_table;
2721 mask = d->ma_mask;
2722 while (i <= mask && ep[i].me_value == NULL)
2723 i++;
2724 di->di_pos = i+1;
2725 if (i > mask)
2726 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002727
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002728 if (result->ob_refcnt == 1) {
2729 Py_INCREF(result);
2730 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2731 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2732 } else {
2733 result = PyTuple_New(2);
2734 if (result == NULL)
2735 return NULL;
2736 }
2737 di->len--;
2738 key = ep[i].me_key;
2739 value = ep[i].me_value;
2740 Py_INCREF(key);
2741 Py_INCREF(value);
2742 PyTuple_SET_ITEM(result, 0, key);
2743 PyTuple_SET_ITEM(result, 1, value);
2744 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002745
2746fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002747 di->di_dict = NULL;
Serhiy Storchaka14a7d632016-03-30 20:43:06 +03002748 Py_DECREF(d);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002749 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002750}
2751
2752PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002753 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2754 "dictionary-itemiterator", /* tp_name */
2755 sizeof(dictiterobject), /* tp_basicsize */
2756 0, /* tp_itemsize */
2757 /* methods */
2758 (destructor)dictiter_dealloc, /* tp_dealloc */
2759 0, /* tp_print */
2760 0, /* tp_getattr */
2761 0, /* tp_setattr */
2762 0, /* tp_compare */
2763 0, /* tp_repr */
2764 0, /* tp_as_number */
2765 0, /* tp_as_sequence */
2766 0, /* tp_as_mapping */
2767 0, /* tp_hash */
2768 0, /* tp_call */
2769 0, /* tp_str */
2770 PyObject_GenericGetAttr, /* tp_getattro */
2771 0, /* tp_setattro */
2772 0, /* tp_as_buffer */
2773 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2774 0, /* tp_doc */
2775 (traverseproc)dictiter_traverse, /* tp_traverse */
2776 0, /* tp_clear */
2777 0, /* tp_richcompare */
2778 0, /* tp_weaklistoffset */
2779 PyObject_SelfIter, /* tp_iter */
2780 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
2781 dictiter_methods, /* tp_methods */
2782 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002783};
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002784
2785/***********************************************/
2786/* View objects for keys(), items(), values(). */
2787/***********************************************/
2788
2789/* The instance lay-out is the same for all three; but the type differs. */
2790
2791typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002792 PyObject_HEAD
2793 PyDictObject *dv_dict;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002794} dictviewobject;
2795
2796
2797static void
2798dictview_dealloc(dictviewobject *dv)
2799{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002800 Py_XDECREF(dv->dv_dict);
2801 PyObject_GC_Del(dv);
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002802}
2803
2804static int
2805dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
2806{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002807 Py_VISIT(dv->dv_dict);
2808 return 0;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002809}
2810
2811static Py_ssize_t
2812dictview_len(dictviewobject *dv)
2813{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002814 Py_ssize_t len = 0;
2815 if (dv->dv_dict != NULL)
2816 len = dv->dv_dict->ma_used;
2817 return len;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002818}
2819
2820static PyObject *
2821dictview_new(PyObject *dict, PyTypeObject *type)
2822{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002823 dictviewobject *dv;
2824 if (dict == NULL) {
2825 PyErr_BadInternalCall();
2826 return NULL;
2827 }
2828 if (!PyDict_Check(dict)) {
2829 /* XXX Get rid of this restriction later */
2830 PyErr_Format(PyExc_TypeError,
2831 "%s() requires a dict argument, not '%s'",
2832 type->tp_name, dict->ob_type->tp_name);
2833 return NULL;
2834 }
2835 dv = PyObject_GC_New(dictviewobject, type);
2836 if (dv == NULL)
2837 return NULL;
2838 Py_INCREF(dict);
2839 dv->dv_dict = (PyDictObject *)dict;
2840 _PyObject_GC_TRACK(dv);
2841 return (PyObject *)dv;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002842}
2843
2844/* TODO(guido): The views objects are not complete:
2845
2846 * support more set operations
2847 * support arbitrary mappings?
2848 - either these should be static or exported in dictobject.h
2849 - if public then they should probably be in builtins
2850*/
2851
2852/* Return 1 if self is a subset of other, iterating over self;
2853 0 if not; -1 if an error occurred. */
2854static int
2855all_contained_in(PyObject *self, PyObject *other)
2856{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002857 PyObject *iter = PyObject_GetIter(self);
2858 int ok = 1;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002859
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002860 if (iter == NULL)
2861 return -1;
2862 for (;;) {
2863 PyObject *next = PyIter_Next(iter);
2864 if (next == NULL) {
2865 if (PyErr_Occurred())
2866 ok = -1;
2867 break;
2868 }
2869 ok = PySequence_Contains(other, next);
2870 Py_DECREF(next);
2871 if (ok <= 0)
2872 break;
2873 }
2874 Py_DECREF(iter);
2875 return ok;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002876}
2877
2878static PyObject *
2879dictview_richcompare(PyObject *self, PyObject *other, int op)
2880{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002881 Py_ssize_t len_self, len_other;
2882 int ok;
2883 PyObject *result;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002884
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002885 assert(self != NULL);
2886 assert(PyDictViewSet_Check(self));
2887 assert(other != NULL);
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002888
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002889 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other)) {
2890 Py_INCREF(Py_NotImplemented);
2891 return Py_NotImplemented;
2892 }
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002893
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002894 len_self = PyObject_Size(self);
2895 if (len_self < 0)
2896 return NULL;
2897 len_other = PyObject_Size(other);
2898 if (len_other < 0)
2899 return NULL;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002900
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002901 ok = 0;
2902 switch(op) {
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002903
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002904 case Py_NE:
2905 case Py_EQ:
2906 if (len_self == len_other)
2907 ok = all_contained_in(self, other);
2908 if (op == Py_NE && ok >= 0)
2909 ok = !ok;
2910 break;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002911
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002912 case Py_LT:
2913 if (len_self < len_other)
2914 ok = all_contained_in(self, other);
2915 break;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002916
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002917 case Py_LE:
2918 if (len_self <= len_other)
2919 ok = all_contained_in(self, other);
2920 break;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002921
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002922 case Py_GT:
2923 if (len_self > len_other)
2924 ok = all_contained_in(other, self);
2925 break;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002926
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002927 case Py_GE:
2928 if (len_self >= len_other)
2929 ok = all_contained_in(other, self);
2930 break;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002931
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002932 }
2933 if (ok < 0)
2934 return NULL;
2935 result = ok ? Py_True : Py_False;
2936 Py_INCREF(result);
2937 return result;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002938}
2939
2940static PyObject *
2941dictview_repr(dictviewobject *dv)
2942{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002943 PyObject *seq;
2944 PyObject *seq_str;
2945 PyObject *result;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002946
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002947 seq = PySequence_List((PyObject *)dv);
2948 if (seq == NULL)
2949 return NULL;
2950
2951 seq_str = PyObject_Repr(seq);
Benjamin Petersonb91ef002013-05-19 19:38:12 -07002952 if (seq_str == NULL) {
2953 Py_DECREF(seq);
2954 return NULL;
2955 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002956 result = PyString_FromFormat("%s(%s)", Py_TYPE(dv)->tp_name,
2957 PyString_AS_STRING(seq_str));
2958 Py_DECREF(seq_str);
2959 Py_DECREF(seq);
2960 return result;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002961}
2962
2963/*** dict_keys ***/
2964
2965static PyObject *
2966dictkeys_iter(dictviewobject *dv)
2967{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002968 if (dv->dv_dict == NULL) {
2969 Py_RETURN_NONE;
2970 }
2971 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002972}
2973
2974static int
2975dictkeys_contains(dictviewobject *dv, PyObject *obj)
2976{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002977 if (dv->dv_dict == NULL)
2978 return 0;
2979 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002980}
2981
2982static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002983 (lenfunc)dictview_len, /* sq_length */
2984 0, /* sq_concat */
2985 0, /* sq_repeat */
2986 0, /* sq_item */
2987 0, /* sq_slice */
2988 0, /* sq_ass_item */
2989 0, /* sq_ass_slice */
2990 (objobjproc)dictkeys_contains, /* sq_contains */
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002991};
2992
2993static PyObject*
2994dictviews_sub(PyObject* self, PyObject *other)
2995{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002996 PyObject *result = PySet_New(self);
2997 PyObject *tmp;
2998 if (result == NULL)
2999 return NULL;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003000
Benjamin Peterson4ddb44a2016-03-03 22:05:36 -08003001
3002 tmp = PyObject_CallMethod(result, "difference_update", "(O)", other);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003003 if (tmp == NULL) {
3004 Py_DECREF(result);
3005 return NULL;
3006 }
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003007
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003008 Py_DECREF(tmp);
3009 return result;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003010}
3011
3012static PyObject*
3013dictviews_and(PyObject* self, PyObject *other)
3014{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003015 PyObject *result = PySet_New(self);
3016 PyObject *tmp;
3017 if (result == NULL)
3018 return NULL;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003019
Benjamin Peterson4ddb44a2016-03-03 22:05:36 -08003020 tmp = PyObject_CallMethod(result, "intersection_update", "(O)", other);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003021 if (tmp == NULL) {
3022 Py_DECREF(result);
3023 return NULL;
3024 }
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003025
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003026 Py_DECREF(tmp);
3027 return result;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003028}
3029
3030static PyObject*
3031dictviews_or(PyObject* self, PyObject *other)
3032{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003033 PyObject *result = PySet_New(self);
3034 PyObject *tmp;
3035 if (result == NULL)
3036 return NULL;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003037
Benjamin Peterson4ddb44a2016-03-03 22:05:36 -08003038 tmp = PyObject_CallMethod(result, "update", "(O)", other);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003039 if (tmp == NULL) {
3040 Py_DECREF(result);
3041 return NULL;
3042 }
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003043
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003044 Py_DECREF(tmp);
3045 return result;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003046}
3047
3048static PyObject*
3049dictviews_xor(PyObject* self, PyObject *other)
3050{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003051 PyObject *result = PySet_New(self);
3052 PyObject *tmp;
3053 if (result == NULL)
3054 return NULL;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003055
Benjamin Peterson4ddb44a2016-03-03 22:05:36 -08003056 tmp = PyObject_CallMethod(result, "symmetric_difference_update", "(O)", other);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003057 if (tmp == NULL) {
3058 Py_DECREF(result);
3059 return NULL;
3060 }
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003061
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003062 Py_DECREF(tmp);
3063 return result;
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003064}
3065
3066static PyNumberMethods dictviews_as_number = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003067 0, /*nb_add*/
3068 (binaryfunc)dictviews_sub, /*nb_subtract*/
3069 0, /*nb_multiply*/
3070 0, /*nb_divide*/
3071 0, /*nb_remainder*/
3072 0, /*nb_divmod*/
3073 0, /*nb_power*/
3074 0, /*nb_negative*/
3075 0, /*nb_positive*/
3076 0, /*nb_absolute*/
3077 0, /*nb_nonzero*/
3078 0, /*nb_invert*/
3079 0, /*nb_lshift*/
3080 0, /*nb_rshift*/
3081 (binaryfunc)dictviews_and, /*nb_and*/
3082 (binaryfunc)dictviews_xor, /*nb_xor*/
3083 (binaryfunc)dictviews_or, /*nb_or*/
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003084};
3085
3086static PyMethodDef dictkeys_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003087 {NULL, NULL} /* sentinel */
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003088};
3089
3090PyTypeObject PyDictKeys_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003091 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3092 "dict_keys", /* tp_name */
3093 sizeof(dictviewobject), /* tp_basicsize */
3094 0, /* tp_itemsize */
3095 /* methods */
3096 (destructor)dictview_dealloc, /* tp_dealloc */
3097 0, /* tp_print */
3098 0, /* tp_getattr */
3099 0, /* tp_setattr */
3100 0, /* tp_reserved */
3101 (reprfunc)dictview_repr, /* tp_repr */
3102 &dictviews_as_number, /* tp_as_number */
3103 &dictkeys_as_sequence, /* tp_as_sequence */
3104 0, /* tp_as_mapping */
3105 0, /* tp_hash */
3106 0, /* tp_call */
3107 0, /* tp_str */
3108 PyObject_GenericGetAttr, /* tp_getattro */
3109 0, /* tp_setattro */
3110 0, /* tp_as_buffer */
3111 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3112 Py_TPFLAGS_CHECKTYPES, /* tp_flags */
3113 0, /* tp_doc */
3114 (traverseproc)dictview_traverse, /* tp_traverse */
3115 0, /* tp_clear */
3116 dictview_richcompare, /* tp_richcompare */
3117 0, /* tp_weaklistoffset */
3118 (getiterfunc)dictkeys_iter, /* tp_iter */
3119 0, /* tp_iternext */
3120 dictkeys_methods, /* tp_methods */
3121 0,
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003122};
3123
3124static PyObject *
3125dictkeys_new(PyObject *dict)
3126{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003127 return dictview_new(dict, &PyDictKeys_Type);
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003128}
3129
3130/*** dict_items ***/
3131
3132static PyObject *
3133dictitems_iter(dictviewobject *dv)
3134{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003135 if (dv->dv_dict == NULL) {
3136 Py_RETURN_NONE;
3137 }
3138 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003139}
3140
3141static int
3142dictitems_contains(dictviewobject *dv, PyObject *obj)
3143{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003144 PyObject *key, *value, *found;
3145 if (dv->dv_dict == NULL)
3146 return 0;
3147 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3148 return 0;
3149 key = PyTuple_GET_ITEM(obj, 0);
3150 value = PyTuple_GET_ITEM(obj, 1);
3151 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3152 if (found == NULL) {
3153 if (PyErr_Occurred())
3154 return -1;
3155 return 0;
3156 }
3157 return PyObject_RichCompareBool(value, found, Py_EQ);
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003158}
3159
3160static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003161 (lenfunc)dictview_len, /* sq_length */
3162 0, /* sq_concat */
3163 0, /* sq_repeat */
3164 0, /* sq_item */
3165 0, /* sq_slice */
3166 0, /* sq_ass_item */
3167 0, /* sq_ass_slice */
3168 (objobjproc)dictitems_contains, /* sq_contains */
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003169};
3170
3171static PyMethodDef dictitems_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003172 {NULL, NULL} /* sentinel */
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003173};
3174
3175PyTypeObject PyDictItems_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003176 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3177 "dict_items", /* tp_name */
3178 sizeof(dictviewobject), /* tp_basicsize */
3179 0, /* tp_itemsize */
3180 /* methods */
3181 (destructor)dictview_dealloc, /* tp_dealloc */
3182 0, /* tp_print */
3183 0, /* tp_getattr */
3184 0, /* tp_setattr */
3185 0, /* tp_reserved */
3186 (reprfunc)dictview_repr, /* tp_repr */
3187 &dictviews_as_number, /* tp_as_number */
3188 &dictitems_as_sequence, /* tp_as_sequence */
3189 0, /* tp_as_mapping */
3190 0, /* tp_hash */
3191 0, /* tp_call */
3192 0, /* tp_str */
3193 PyObject_GenericGetAttr, /* tp_getattro */
3194 0, /* tp_setattro */
3195 0, /* tp_as_buffer */
3196 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
3197 Py_TPFLAGS_CHECKTYPES, /* tp_flags */
3198 0, /* tp_doc */
3199 (traverseproc)dictview_traverse, /* tp_traverse */
3200 0, /* tp_clear */
3201 dictview_richcompare, /* tp_richcompare */
3202 0, /* tp_weaklistoffset */
3203 (getiterfunc)dictitems_iter, /* tp_iter */
3204 0, /* tp_iternext */
3205 dictitems_methods, /* tp_methods */
3206 0,
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003207};
3208
3209static PyObject *
3210dictitems_new(PyObject *dict)
3211{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003212 return dictview_new(dict, &PyDictItems_Type);
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003213}
3214
3215/*** dict_values ***/
3216
3217static PyObject *
3218dictvalues_iter(dictviewobject *dv)
3219{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003220 if (dv->dv_dict == NULL) {
3221 Py_RETURN_NONE;
3222 }
3223 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003224}
3225
3226static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003227 (lenfunc)dictview_len, /* sq_length */
3228 0, /* sq_concat */
3229 0, /* sq_repeat */
3230 0, /* sq_item */
3231 0, /* sq_slice */
3232 0, /* sq_ass_item */
3233 0, /* sq_ass_slice */
3234 (objobjproc)0, /* sq_contains */
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003235};
3236
3237static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003238 {NULL, NULL} /* sentinel */
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003239};
3240
3241PyTypeObject PyDictValues_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003242 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3243 "dict_values", /* tp_name */
3244 sizeof(dictviewobject), /* tp_basicsize */
3245 0, /* tp_itemsize */
3246 /* methods */
3247 (destructor)dictview_dealloc, /* tp_dealloc */
3248 0, /* tp_print */
3249 0, /* tp_getattr */
3250 0, /* tp_setattr */
3251 0, /* tp_reserved */
3252 (reprfunc)dictview_repr, /* tp_repr */
3253 0, /* tp_as_number */
3254 &dictvalues_as_sequence, /* tp_as_sequence */
3255 0, /* tp_as_mapping */
3256 0, /* tp_hash */
3257 0, /* tp_call */
3258 0, /* tp_str */
3259 PyObject_GenericGetAttr, /* tp_getattro */
3260 0, /* tp_setattro */
3261 0, /* tp_as_buffer */
3262 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3263 0, /* tp_doc */
3264 (traverseproc)dictview_traverse, /* tp_traverse */
3265 0, /* tp_clear */
3266 0, /* tp_richcompare */
3267 0, /* tp_weaklistoffset */
3268 (getiterfunc)dictvalues_iter, /* tp_iter */
3269 0, /* tp_iternext */
3270 dictvalues_methods, /* tp_methods */
3271 0,
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003272};
3273
3274static PyObject *
3275dictvalues_new(PyObject *dict)
3276{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003277 return dictview_new(dict, &PyDictValues_Type);
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003278}