blob: 8d0e6a4a73e2591f49ee9982b24b266d4d7d41f9 [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"
Christian Heimes0ded5b52007-12-10 15:50:56 +000011#include "stringlib/eq.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000012
Guido van Rossum16e93a81997-01-28 00:00:11 +000013
Thomas Wouters89f507f2006-12-13 04:49:30 +000014/* Set a key error with the specified argument, wrapping it in a
15 * tuple automatically so that tuple keys are not unpacked as the
16 * exception arguments. */
17static void
18set_key_error(PyObject *arg)
19{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000020 PyObject *tup;
21 tup = PyTuple_Pack(1, arg);
22 if (!tup)
23 return; /* caller will expect error to be set anyway */
24 PyErr_SetObject(PyExc_KeyError, tup);
25 Py_DECREF(tup);
Thomas Wouters89f507f2006-12-13 04:49:30 +000026}
27
Tim Peterseb28ef22001-06-02 05:27:19 +000028/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000029#undef SHOW_CONVERSION_COUNTS
30
Tim Peterseb28ef22001-06-02 05:27:19 +000031/* See large comment block below. This must be >= 1. */
32#define PERTURB_SHIFT 5
33
Guido van Rossum16e93a81997-01-28 00:00:11 +000034/*
Tim Peterseb28ef22001-06-02 05:27:19 +000035Major subtleties ahead: Most hash schemes depend on having a "good" hash
36function, in the sense of simulating randomness. Python doesn't: its most
37important hash functions (for strings and ints) are very regular in common
38cases:
Tim Peters15d49292001-05-27 07:39:22 +000039
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000040 >>> map(hash, (0, 1, 2, 3))
41 [0, 1, 2, 3]
42 >>> map(hash, ("namea", "nameb", "namec", "named"))
43 [-1658398457, -1658398460, -1658398459, -1658398462]
44 >>>
Tim Peters15d49292001-05-27 07:39:22 +000045
Tim Peterseb28ef22001-06-02 05:27:19 +000046This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
47the low-order i bits as the initial table index is extremely fast, and there
48are no collisions at all for dicts indexed by a contiguous range of ints.
49The same is approximately true when keys are "consecutive" strings. So this
50gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000051
Tim Peterseb28ef22001-06-02 05:27:19 +000052OTOH, when collisions occur, the tendency to fill contiguous slices of the
53hash table makes a good collision resolution strategy crucial. Taking only
54the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000055the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000056their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
57 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000058
Tim Peterseb28ef22001-06-02 05:27:19 +000059But catering to unusual cases should not slow the usual ones, so we just take
60the last i bits anyway. It's up to collision resolution to do the rest. If
61we *usually* find the key we're looking for on the first try (and, it turns
62out, we usually do -- the table load factor is kept under 2/3, so the odds
63are solidly in our favor), then it makes best sense to keep the initial index
64computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000065
Tim Peterseb28ef22001-06-02 05:27:19 +000066The first half of collision resolution is to visit table indices via this
67recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000068
Tim Peterseb28ef22001-06-02 05:27:19 +000069 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000070
Tim Peterseb28ef22001-06-02 05:27:19 +000071For any initial j in range(2**i), repeating that 2**i times generates each
72int in range(2**i) exactly once (see any text on random-number generation for
73proof). By itself, this doesn't help much: like linear probing (setting
74j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
75order. This would be bad, except that's not the only thing we do, and it's
76actually *good* in the common cases where hash keys are consecutive. In an
77example that's really too small to make this entirely clear, for a table of
78size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000079
Tim Peterseb28ef22001-06-02 05:27:19 +000080 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
81
82If two things come in at index 5, the first place we look after is index 2,
83not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
84Linear probing is deadly in this case because there the fixed probe order
85is the *same* as the order consecutive keys are likely to arrive. But it's
86extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
87and certain that consecutive hash codes do not.
88
89The other half of the strategy is to get the other bits of the hash code
90into play. This is done by initializing a (unsigned) vrbl "perturb" to the
91full hash code, and changing the recurrence to:
92
93 j = (5*j) + 1 + perturb;
94 perturb >>= PERTURB_SHIFT;
95 use j % 2**i as the next table index;
96
97Now the probe sequence depends (eventually) on every bit in the hash code,
98and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
99because it quickly magnifies small differences in the bits that didn't affect
100the initial index. Note that because perturb is unsigned, if the recurrence
101is executed often enough perturb eventually becomes and remains 0. At that
102point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
103that's certain to find an empty slot eventually (since it generates every int
104in range(2**i), and we make sure there's always at least one empty slot).
105
106Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
107small so that the high bits of the hash code continue to affect the probe
108sequence across iterations; but you want it large so that in really bad cases
109the high-order hash bits have an effect on early iterations. 5 was "the
110best" in minimizing total collisions across experiments Tim Peters ran (on
111both normal and pathological cases), but 4 and 6 weren't significantly worse.
112
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000113Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000114approach, using repeated multiplication by x in GF(2**n) where an irreducible
115polynomial for each table size was chosen such that x was a primitive root.
116Christian Tismer later extended that to use division by x instead, as an
117efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000118also gave excellent collision statistics, but was more expensive: two
119if-tests were required inside the loop; computing "the next" index took about
120the same number of operations but without as much potential parallelism
121(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
122above, and then shifting perturb can be done while the table index is being
123masked); and the PyDictObject struct required a member to hold the table's
124polynomial. In Tim's experiments the current scheme ran faster, produced
125equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000126
127Theoretical Python 2.5 headache: hash codes are only C "long", but
128sizeof(Py_ssize_t) > sizeof(long) may be possible. In that case, and if a
129dict is genuinely huge, then only the slots directly reachable via indexing
130by a C long can be the first slot in a probe sequence. The probe sequence
131will still eventually reach every slot in the table, but the collision rate
132on initial probes may be much higher than this scheme was designed for.
133Getting a hash code as fat as Py_ssize_t is the only real cure. But in
134practice, this probably won't make a lick of difference for many years (at
135which point everyone will have terabytes of RAM on 64-bit boxes).
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000136*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000137
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000138/* Object used as dummy key to fill deleted entries */
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000139static PyObject *dummy = NULL; /* Initialized by first call to newPyDictObject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000140
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000141#ifdef Py_REF_DEBUG
142PyObject *
143_PyDict_Dummy(void)
144{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000145 return dummy;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000146}
147#endif
148
Fred Drake1bff34a2000-08-31 19:31:38 +0000149/* forward declarations */
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000150static PyDictEntry *
151lookdict_unicode(PyDictObject *mp, PyObject *key, long hash);
Fred Drake1bff34a2000-08-31 19:31:38 +0000152
153#ifdef SHOW_CONVERSION_COUNTS
154static long created = 0L;
155static long converted = 0L;
156
157static void
158show_counts(void)
159{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000160 fprintf(stderr, "created %ld string dicts\n", created);
161 fprintf(stderr, "converted %ld to normal dicts\n", converted);
162 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
Fred Drake1bff34a2000-08-31 19:31:38 +0000163}
164#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000165
Christian Heimes77c02eb2008-02-09 02:18:51 +0000166/* Debug statistic to compare allocations with reuse through the free list */
167#undef SHOW_ALLOC_COUNT
168#ifdef SHOW_ALLOC_COUNT
169static size_t count_alloc = 0;
170static size_t count_reuse = 0;
171
172static void
173show_alloc(void)
174{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000175 fprintf(stderr, "Dict allocations: %" PY_FORMAT_SIZE_T "d\n",
176 count_alloc);
177 fprintf(stderr, "Dict reuse through freelist: %" PY_FORMAT_SIZE_T
178 "d\n", count_reuse);
179 fprintf(stderr, "%.2f%% reuse rate\n\n",
180 (100.0*count_reuse/(count_alloc+count_reuse)));
Christian Heimes77c02eb2008-02-09 02:18:51 +0000181}
182#endif
183
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000184/* Debug statistic to count GC tracking of dicts */
185#ifdef SHOW_TRACK_COUNT
186static Py_ssize_t count_untracked = 0;
187static Py_ssize_t count_tracked = 0;
188
189static void
190show_track(void)
191{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000192 fprintf(stderr, "Dicts created: %" PY_FORMAT_SIZE_T "d\n",
193 count_tracked + count_untracked);
194 fprintf(stderr, "Dicts tracked by the GC: %" PY_FORMAT_SIZE_T
195 "d\n", count_tracked);
196 fprintf(stderr, "%.2f%% dict tracking rate\n\n",
197 (100.0*count_tracked/(count_untracked+count_tracked)));
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000198}
199#endif
200
201
Tim Peters6d6c1a32001-08-02 04:15:00 +0000202/* Initialization macros.
203 There are two ways to create a dict: PyDict_New() is the main C API
204 function, and the tp_new slot maps to dict_new(). In the latter case we
205 can save a little time over what PyDict_New does because it's guaranteed
206 that the PyDictObject struct is already zeroed out.
207 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
208 an excellent reason not to).
209*/
210
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000211#define INIT_NONZERO_DICT_SLOTS(mp) do { \
212 (mp)->ma_table = (mp)->ma_smalltable; \
213 (mp)->ma_mask = PyDict_MINSIZE - 1; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000214 } while(0)
215
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000216#define EMPTY_TO_MINSIZE(mp) do { \
217 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
218 (mp)->ma_used = (mp)->ma_fill = 0; \
219 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000220 } while(0)
221
Raymond Hettinger43442782004-03-17 21:55:03 +0000222/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes2202f872008-02-06 14:31:34 +0000223#ifndef PyDict_MAXFREELIST
224#define PyDict_MAXFREELIST 80
225#endif
226static PyDictObject *free_list[PyDict_MAXFREELIST];
227static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000228
Christian Heimes77c02eb2008-02-09 02:18:51 +0000229void
230PyDict_Fini(void)
231{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000232 PyDictObject *op;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000233
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000234 while (numfree) {
235 op = free_list[--numfree];
236 assert(PyDict_CheckExact(op));
237 PyObject_GC_Del(op);
238 }
Christian Heimes77c02eb2008-02-09 02:18:51 +0000239}
240
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000242PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000243{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000244 register PyDictObject *mp;
245 if (dummy == NULL) { /* Auto-initialize dummy */
246 dummy = PyUnicode_FromString("<dummy key>");
247 if (dummy == NULL)
248 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000249#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000250 Py_AtExit(show_counts);
Fred Drake1bff34a2000-08-31 19:31:38 +0000251#endif
Christian Heimes77c02eb2008-02-09 02:18:51 +0000252#ifdef SHOW_ALLOC_COUNT
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000253 Py_AtExit(show_alloc);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000254#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000255#ifdef SHOW_TRACK_COUNT
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000256 Py_AtExit(show_track);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000257#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000258 }
259 if (numfree) {
260 mp = free_list[--numfree];
261 assert (mp != NULL);
262 assert (Py_TYPE(mp) == &PyDict_Type);
263 _Py_NewReference((PyObject *)mp);
264 if (mp->ma_fill) {
265 EMPTY_TO_MINSIZE(mp);
266 } else {
267 /* At least set ma_table and ma_mask; these are wrong
268 if an empty but presized dict is added to freelist */
269 INIT_NONZERO_DICT_SLOTS(mp);
270 }
271 assert (mp->ma_used == 0);
272 assert (mp->ma_table == mp->ma_smalltable);
273 assert (mp->ma_mask == PyDict_MINSIZE - 1);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000274#ifdef SHOW_ALLOC_COUNT
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000275 count_reuse++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000276#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000277 } else {
278 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
279 if (mp == NULL)
280 return NULL;
281 EMPTY_TO_MINSIZE(mp);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000282#ifdef SHOW_ALLOC_COUNT
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000283 count_alloc++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000284#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000285 }
286 mp->ma_lookup = lookdict_unicode;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000287#ifdef SHOW_TRACK_COUNT
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000288 count_untracked++;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000289#endif
Fred Drake1bff34a2000-08-31 19:31:38 +0000290#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000291 ++created;
Fred Drake1bff34a2000-08-31 19:31:38 +0000292#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000293 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000294}
295
296/*
297The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000298This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000299Open addressing is preferred over chaining since the link overhead for
300chaining would be substantial (100% with typical malloc overhead).
301
Tim Peterseb28ef22001-06-02 05:27:19 +0000302The initial probe index is computed as hash mod the table size. Subsequent
303probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000304
305All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000306
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000307The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000308contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000309Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000310
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000311lookdict() is general-purpose, and may return NULL if (and only if) a
312comparison raises an exception (this was new in Python 2.5).
Guido van Rossum89d8c602007-09-18 17:26:56 +0000313lookdict_unicode() below is specialized to string keys, comparison of which can
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000314never raise an exception; that function can never return NULL. For both, when
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000315the key isn't found a PyDictEntry* is returned for which the me_value field is
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000316NULL; this is the slot in the dict at which the key would have been found, and
317the caller can (if it wishes) add the <key, value> pair to the returned
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000318PyDictEntry*.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000319*/
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000320static PyDictEntry *
321lookdict(PyDictObject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000322{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000323 register size_t i;
324 register size_t perturb;
325 register PyDictEntry *freeslot;
326 register size_t mask = (size_t)mp->ma_mask;
327 PyDictEntry *ep0 = mp->ma_table;
328 register PyDictEntry *ep;
329 register int cmp;
330 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000331
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000332 i = (size_t)hash & mask;
333 ep = &ep0[i];
334 if (ep->me_key == NULL || ep->me_key == key)
335 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000336
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000337 if (ep->me_key == dummy)
338 freeslot = ep;
339 else {
340 if (ep->me_hash == hash) {
341 startkey = ep->me_key;
342 Py_INCREF(startkey);
343 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
344 Py_DECREF(startkey);
345 if (cmp < 0)
346 return NULL;
347 if (ep0 == mp->ma_table && ep->me_key == startkey) {
348 if (cmp > 0)
349 return ep;
350 }
351 else {
352 /* The compare did major nasty stuff to the
353 * dict: start over.
354 * XXX A clever adversary could prevent this
355 * XXX from terminating.
356 */
357 return lookdict(mp, key, hash);
358 }
359 }
360 freeslot = NULL;
361 }
Tim Peters15d49292001-05-27 07:39:22 +0000362
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000363 /* In the loop, me_key == dummy is by far (factor of 100s) the
364 least likely outcome, so test for that last. */
365 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
366 i = (i << 2) + i + perturb + 1;
367 ep = &ep0[i & mask];
368 if (ep->me_key == NULL)
369 return freeslot == NULL ? ep : freeslot;
370 if (ep->me_key == key)
371 return ep;
372 if (ep->me_hash == hash && ep->me_key != dummy) {
373 startkey = ep->me_key;
374 Py_INCREF(startkey);
375 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
376 Py_DECREF(startkey);
377 if (cmp < 0)
378 return NULL;
379 if (ep0 == mp->ma_table && ep->me_key == startkey) {
380 if (cmp > 0)
381 return ep;
382 }
383 else {
384 /* The compare did major nasty stuff to the
385 * dict: start over.
386 * XXX A clever adversary could prevent this
387 * XXX from terminating.
388 */
389 return lookdict(mp, key, hash);
390 }
391 }
392 else if (ep->me_key == dummy && freeslot == NULL)
393 freeslot = ep;
394 }
395 assert(0); /* NOT REACHED */
396 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000397}
398
399/*
Guido van Rossum89d8c602007-09-18 17:26:56 +0000400 * Hacked up version of lookdict which can assume keys are always
401 * unicodes; this assumption allows testing for errors during
402 * PyObject_RichCompareBool() to be dropped; unicode-unicode
403 * comparisons never raise exceptions. This also means we don't need
404 * to go through PyObject_RichCompareBool(); we can always use
405 * unicode_eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000406 *
Guido van Rossum89d8c602007-09-18 17:26:56 +0000407 * This is valuable because dicts with only unicode keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000408 */
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000409static PyDictEntry *
410lookdict_unicode(PyDictObject *mp, PyObject *key, register long hash)
Fred Drake1bff34a2000-08-31 19:31:38 +0000411{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000412 register size_t i;
413 register size_t perturb;
414 register PyDictEntry *freeslot;
415 register size_t mask = (size_t)mp->ma_mask;
416 PyDictEntry *ep0 = mp->ma_table;
417 register PyDictEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000418
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000419 /* Make sure this function doesn't have to handle non-unicode keys,
420 including subclasses of str; e.g., one reason to subclass
421 unicodes is to override __eq__, and for speed we don't cater to
422 that here. */
423 if (!PyUnicode_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000424#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000425 ++converted;
Fred Drake1bff34a2000-08-31 19:31:38 +0000426#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000427 mp->ma_lookup = lookdict;
428 return lookdict(mp, key, hash);
429 }
430 i = hash & mask;
431 ep = &ep0[i];
432 if (ep->me_key == NULL || ep->me_key == key)
433 return ep;
434 if (ep->me_key == dummy)
435 freeslot = ep;
436 else {
437 if (ep->me_hash == hash && unicode_eq(ep->me_key, key))
438 return ep;
439 freeslot = NULL;
440 }
Tim Peters15d49292001-05-27 07:39:22 +0000441
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000442 /* In the loop, me_key == dummy is by far (factor of 100s) the
443 least likely outcome, so test for that last. */
444 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
445 i = (i << 2) + i + perturb + 1;
446 ep = &ep0[i & mask];
447 if (ep->me_key == NULL)
448 return freeslot == NULL ? ep : freeslot;
449 if (ep->me_key == key
450 || (ep->me_hash == hash
451 && ep->me_key != dummy
452 && unicode_eq(ep->me_key, key)))
453 return ep;
454 if (ep->me_key == dummy && freeslot == NULL)
455 freeslot = ep;
456 }
457 assert(0); /* NOT REACHED */
458 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000459}
460
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000461#ifdef SHOW_TRACK_COUNT
462#define INCREASE_TRACK_COUNT \
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000463 (count_tracked++, count_untracked--);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000464#define DECREASE_TRACK_COUNT \
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000465 (count_tracked--, count_untracked++);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000466#else
467#define INCREASE_TRACK_COUNT
468#define DECREASE_TRACK_COUNT
469#endif
470
471#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000472 do { \
473 if (!_PyObject_GC_IS_TRACKED(mp)) { \
474 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
475 _PyObject_GC_MAY_BE_TRACKED(value)) { \
476 _PyObject_GC_TRACK(mp); \
477 INCREASE_TRACK_COUNT \
478 } \
479 } \
480 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000481
482void
483_PyDict_MaybeUntrack(PyObject *op)
484{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000485 PyDictObject *mp;
486 PyObject *value;
487 Py_ssize_t mask, i;
488 PyDictEntry *ep;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000489
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000490 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
491 return;
492
493 mp = (PyDictObject *) op;
494 ep = mp->ma_table;
495 mask = mp->ma_mask;
496 for (i = 0; i <= mask; i++) {
497 if ((value = ep[i].me_value) == NULL)
498 continue;
499 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
500 _PyObject_GC_MAY_BE_TRACKED(ep[i].me_key))
501 return;
502 }
503 DECREASE_TRACK_COUNT
504 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000505}
506
507
Fred Drake1bff34a2000-08-31 19:31:38 +0000508/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000509Internal routine to insert a new item into the table.
510Used both by the internal resize routine and by the public insert routine.
511Eats a reference to key and one to value.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000512Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000513*/
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000514static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000515insertdict(register PyDictObject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000516{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000517 PyObject *old_value;
518 register PyDictEntry *ep;
519 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000520
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000521 assert(mp->ma_lookup != NULL);
522 ep = mp->ma_lookup(mp, key, hash);
523 if (ep == NULL) {
524 Py_DECREF(key);
525 Py_DECREF(value);
526 return -1;
527 }
528 MAINTAIN_TRACKING(mp, key, value);
529 if (ep->me_value != NULL) {
530 old_value = ep->me_value;
531 ep->me_value = value;
532 Py_DECREF(old_value); /* which **CAN** re-enter */
533 Py_DECREF(key);
534 }
535 else {
536 if (ep->me_key == NULL)
537 mp->ma_fill++;
538 else {
539 assert(ep->me_key == dummy);
540 Py_DECREF(dummy);
541 }
542 ep->me_key = key;
543 ep->me_hash = (Py_ssize_t)hash;
544 ep->me_value = value;
545 mp->ma_used++;
546 }
547 return 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000548}
549
550/*
551Internal routine used by dictresize() to insert an item which is
552known to be absent from the dict. This routine also assumes that
553the dict contains no deleted entries. Besides the performance benefit,
554using insertdict() in dictresize() is dangerous (SF bug #1456209).
555Note that no refcounts are changed by this routine; if needed, the caller
556is responsible for incref'ing `key` and `value`.
557*/
558static void
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000559insertdict_clean(register PyDictObject *mp, PyObject *key, long hash,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000560 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000561{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000562 register size_t i;
563 register size_t perturb;
564 register size_t mask = (size_t)mp->ma_mask;
565 PyDictEntry *ep0 = mp->ma_table;
566 register PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000567
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000568 MAINTAIN_TRACKING(mp, key, value);
569 i = hash & mask;
570 ep = &ep0[i];
571 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
572 i = (i << 2) + i + perturb + 1;
573 ep = &ep0[i & mask];
574 }
575 assert(ep->me_value == NULL);
576 mp->ma_fill++;
577 ep->me_key = key;
578 ep->me_hash = (Py_ssize_t)hash;
579 ep->me_value = value;
580 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000581}
582
583/*
584Restructure the table by allocating a new table and reinserting all
585items again. When entries have been deleted, the new table may
586actually be smaller than the old one.
587*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000588static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000589dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000590{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000591 Py_ssize_t newsize;
592 PyDictEntry *oldtable, *newtable, *ep;
593 Py_ssize_t i;
594 int is_oldtable_malloced;
595 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000596
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000597 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000598
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000599 /* Find the smallest table size > minused. */
600 for (newsize = PyDict_MINSIZE;
601 newsize <= minused && newsize > 0;
602 newsize <<= 1)
603 ;
604 if (newsize <= 0) {
605 PyErr_NoMemory();
606 return -1;
607 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000608
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000609 /* Get space for a new table. */
610 oldtable = mp->ma_table;
611 assert(oldtable != NULL);
612 is_oldtable_malloced = oldtable != mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000613
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000614 if (newsize == PyDict_MINSIZE) {
615 /* A large table is shrinking, or we can't get any smaller. */
616 newtable = mp->ma_smalltable;
617 if (newtable == oldtable) {
618 if (mp->ma_fill == mp->ma_used) {
619 /* No dummies, so no point doing anything. */
620 return 0;
621 }
622 /* We're not going to resize it, but rebuild the
623 table anyway to purge old dummy entries.
624 Subtle: This is *necessary* if fill==size,
625 as lookdict needs at least one virgin slot to
626 terminate failing searches. If fill < size, it's
627 merely desirable, as dummies slow searches. */
628 assert(mp->ma_fill > mp->ma_used);
629 memcpy(small_copy, oldtable, sizeof(small_copy));
630 oldtable = small_copy;
631 }
632 }
633 else {
634 newtable = PyMem_NEW(PyDictEntry, newsize);
635 if (newtable == NULL) {
636 PyErr_NoMemory();
637 return -1;
638 }
639 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000640
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000641 /* Make the dict empty, using the new table. */
642 assert(newtable != oldtable);
643 mp->ma_table = newtable;
644 mp->ma_mask = newsize - 1;
645 memset(newtable, 0, sizeof(PyDictEntry) * newsize);
646 mp->ma_used = 0;
647 i = mp->ma_fill;
648 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000649
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000650 /* Copy the data over; this is refcount-neutral for active entries;
651 dummy entries aren't copied over, of course */
652 for (ep = oldtable; i > 0; ep++) {
653 if (ep->me_value != NULL) { /* active entry */
654 --i;
655 insertdict_clean(mp, ep->me_key, (long)ep->me_hash,
656 ep->me_value);
657 }
658 else if (ep->me_key != NULL) { /* dummy entry */
659 --i;
660 assert(ep->me_key == dummy);
661 Py_DECREF(ep->me_key);
662 }
663 /* else key == value == NULL: nothing to do */
664 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000665
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000666 if (is_oldtable_malloced)
667 PyMem_DEL(oldtable);
668 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000669}
670
Christian Heimes99170a52007-12-19 02:07:34 +0000671/* Create a new dictionary pre-sized to hold an estimated number of elements.
672 Underestimates are okay because the dictionary will resize as necessary.
673 Overestimates just mean the dictionary will be more sparse than usual.
674*/
675
676PyObject *
677_PyDict_NewPresized(Py_ssize_t minused)
678{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000679 PyObject *op = PyDict_New();
Christian Heimes99170a52007-12-19 02:07:34 +0000680
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000681 if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
682 Py_DECREF(op);
683 return NULL;
684 }
685 return op;
Christian Heimes99170a52007-12-19 02:07:34 +0000686}
687
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000688/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
689 * that may occur (originally dicts supported only string keys, and exceptions
690 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000691 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000692 * (suppressed) occurred while computing the key's hash, or that some error
693 * (suppressed) occurred when comparing keys in the dict's internal probe
694 * sequence. A nasty example of the latter is when a Python-coded comparison
695 * function hits a stack-depth error, which can cause this to return NULL
696 * even if the key is present.
697 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000698PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000699PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000700{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000701 long hash;
702 PyDictObject *mp = (PyDictObject *)op;
703 PyDictEntry *ep;
704 PyThreadState *tstate;
705 if (!PyDict_Check(op))
706 return NULL;
707 if (!PyUnicode_CheckExact(key) ||
708 (hash = ((PyUnicodeObject *) key)->hash) == -1)
709 {
710 hash = PyObject_Hash(key);
711 if (hash == -1) {
712 PyErr_Clear();
713 return NULL;
714 }
715 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000716
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000717 /* We can arrive here with a NULL tstate during initialization: try
718 running "python -Wi" for an example related to string interning.
719 Let's just hope that no exception occurs then... This must be
720 _PyThreadState_Current and not PyThreadState_GET() because in debug
721 mode, the latter complains if tstate is NULL. */
722 tstate = _PyThreadState_Current;
723 if (tstate != NULL && tstate->curexc_type != NULL) {
724 /* preserve the existing exception */
725 PyObject *err_type, *err_value, *err_tb;
726 PyErr_Fetch(&err_type, &err_value, &err_tb);
727 ep = (mp->ma_lookup)(mp, key, hash);
728 /* ignore errors */
729 PyErr_Restore(err_type, err_value, err_tb);
730 if (ep == NULL)
731 return NULL;
732 }
733 else {
734 ep = (mp->ma_lookup)(mp, key, hash);
735 if (ep == NULL) {
736 PyErr_Clear();
737 return NULL;
738 }
739 }
740 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000741}
742
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000743/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
744 This returns NULL *with* an exception set if an exception occurred.
745 It returns NULL *without* an exception set if the key wasn't present.
746*/
747PyObject *
748PyDict_GetItemWithError(PyObject *op, PyObject *key)
749{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000750 long hash;
751 PyDictObject*mp = (PyDictObject *)op;
752 PyDictEntry *ep;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000753
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000754 if (!PyDict_Check(op)) {
755 PyErr_BadInternalCall();
756 return NULL;
757 }
758 if (!PyUnicode_CheckExact(key) ||
759 (hash = ((PyUnicodeObject *) key)->hash) == -1)
760 {
761 hash = PyObject_Hash(key);
762 if (hash == -1) {
763 return NULL;
764 }
765 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000766
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000767 ep = (mp->ma_lookup)(mp, key, hash);
768 if (ep == NULL)
769 return NULL;
770 return ep->me_value;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000771}
772
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000773/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000774 * dictionary if it's merely replacing the value for an existing key.
775 * This means that it's safe to loop over a dictionary with PyDict_Next()
776 * and occasionally replace a value -- but you can't insert new keys or
777 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000778 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000779int
Tim Peters1f5871e2000-07-04 17:44:48 +0000780PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000781{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000782 register PyDictObject *mp;
783 register long hash;
784 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000785
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000786 if (!PyDict_Check(op)) {
787 PyErr_BadInternalCall();
788 return -1;
789 }
790 assert(key);
791 assert(value);
792 mp = (PyDictObject *)op;
793 if (!PyUnicode_CheckExact(key) ||
794 (hash = ((PyUnicodeObject *) key)->hash) == -1)
795 {
796 hash = PyObject_Hash(key);
797 if (hash == -1)
798 return -1;
799 }
800 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
801 n_used = mp->ma_used;
802 Py_INCREF(value);
803 Py_INCREF(key);
804 if (insertdict(mp, key, hash, value) != 0)
805 return -1;
806 /* If we added a key, we can safely resize. Otherwise just return!
807 * If fill >= 2/3 size, adjust size. Normally, this doubles or
808 * quaduples the size, but it's also possible for the dict to shrink
809 * (if ma_fill is much larger than ma_used, meaning a lot of dict
810 * keys have been * deleted).
811 *
812 * Quadrupling the size improves average dictionary sparseness
813 * (reducing collisions) at the cost of some memory and iteration
814 * speed (which loops over every possible entry). It also halves
815 * the number of expensive resize operations in a growing dictionary.
816 *
817 * Very large dictionaries (over 50K items) use doubling instead.
818 * This may help applications with severe memory constraints.
819 */
820 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
821 return 0;
822 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000823}
824
825int
Tim Peters1f5871e2000-07-04 17:44:48 +0000826PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000827{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000828 register PyDictObject *mp;
829 register long hash;
830 register PyDictEntry *ep;
831 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000832
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000833 if (!PyDict_Check(op)) {
834 PyErr_BadInternalCall();
835 return -1;
836 }
837 assert(key);
838 if (!PyUnicode_CheckExact(key) ||
839 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
840 hash = PyObject_Hash(key);
841 if (hash == -1)
842 return -1;
843 }
844 mp = (PyDictObject *)op;
845 ep = (mp->ma_lookup)(mp, key, hash);
846 if (ep == NULL)
847 return -1;
848 if (ep->me_value == NULL) {
849 set_key_error(key);
850 return -1;
851 }
852 old_key = ep->me_key;
853 Py_INCREF(dummy);
854 ep->me_key = dummy;
855 old_value = ep->me_value;
856 ep->me_value = NULL;
857 mp->ma_used--;
858 Py_DECREF(old_value);
859 Py_DECREF(old_key);
860 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000861}
862
Guido van Rossum25831651993-05-19 14:50:45 +0000863void
Tim Peters1f5871e2000-07-04 17:44:48 +0000864PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000865{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000866 PyDictObject *mp;
867 PyDictEntry *ep, *table;
868 int table_is_malloced;
869 Py_ssize_t fill;
870 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000871#ifdef Py_DEBUG
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000872 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000873#endif
874
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000875 if (!PyDict_Check(op))
876 return;
877 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000878#ifdef Py_DEBUG
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000879 n = mp->ma_mask + 1;
880 i = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000881#endif
882
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000883 table = mp->ma_table;
884 assert(table != NULL);
885 table_is_malloced = table != mp->ma_smalltable;
Tim Petersdea48ec2001-05-22 20:40:22 +0000886
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000887 /* This is delicate. During the process of clearing the dict,
888 * decrefs can cause the dict to mutate. To avoid fatal confusion
889 * (voice of experience), we have to make the dict empty before
890 * clearing the slots, and never refer to anything via mp->xxx while
891 * clearing.
892 */
893 fill = mp->ma_fill;
894 if (table_is_malloced)
895 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000896
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000897 else if (fill > 0) {
898 /* It's a small table with something that needs to be cleared.
899 * Afraid the only safe way is to copy the dict entries into
900 * another small table first.
901 */
902 memcpy(small_copy, table, sizeof(small_copy));
903 table = small_copy;
904 EMPTY_TO_MINSIZE(mp);
905 }
906 /* else it's a small table that's already empty */
Tim Petersdea48ec2001-05-22 20:40:22 +0000907
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000908 /* Now we can finally clear things. If C had refcounts, we could
909 * assert that the refcount on table is 1 now, i.e. that this function
910 * has unique access to it, so decref side-effects can't alter it.
911 */
912 for (ep = table; fill > 0; ++ep) {
Tim Petersdea48ec2001-05-22 20:40:22 +0000913#ifdef Py_DEBUG
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000914 assert(i < n);
915 ++i;
Tim Petersdea48ec2001-05-22 20:40:22 +0000916#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000917 if (ep->me_key) {
918 --fill;
919 Py_DECREF(ep->me_key);
920 Py_XDECREF(ep->me_value);
921 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000922#ifdef Py_DEBUG
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000923 else
924 assert(ep->me_value == NULL);
Tim Petersdea48ec2001-05-22 20:40:22 +0000925#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000926 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000927
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000928 if (table_is_malloced)
929 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000930}
931
Tim Peters080c88b2003-02-15 03:01:11 +0000932/*
933 * Iterate over a dict. Use like so:
934 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000935 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000936 * PyObject *key, *value;
937 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000938 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000939 * Refer to borrowed references in key and value.
940 * }
941 *
942 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000943 * mutates the dict. One exception: it is safe if the loop merely changes
944 * the values associated with the keys (but doesn't insert new keys or
945 * delete keys), via PyDict_SetItem().
946 */
Guido van Rossum25831651993-05-19 14:50:45 +0000947int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000948PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000949{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000950 register Py_ssize_t i;
951 register Py_ssize_t mask;
952 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000953
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000954 if (!PyDict_Check(op))
955 return 0;
956 i = *ppos;
957 if (i < 0)
958 return 0;
959 ep = ((PyDictObject *)op)->ma_table;
960 mask = ((PyDictObject *)op)->ma_mask;
961 while (i <= mask && ep[i].me_value == NULL)
962 i++;
963 *ppos = i+1;
964 if (i > mask)
965 return 0;
966 if (pkey)
967 *pkey = ep[i].me_key;
968 if (pvalue)
969 *pvalue = ep[i].me_value;
970 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000971}
972
Thomas Wouterscf297e42007-02-23 15:07:44 +0000973/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
974int
975_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, long *phash)
976{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000977 register Py_ssize_t i;
978 register Py_ssize_t mask;
979 register PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +0000980
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000981 if (!PyDict_Check(op))
982 return 0;
983 i = *ppos;
984 if (i < 0)
985 return 0;
986 ep = ((PyDictObject *)op)->ma_table;
987 mask = ((PyDictObject *)op)->ma_mask;
988 while (i <= mask && ep[i].me_value == NULL)
989 i++;
990 *ppos = i+1;
991 if (i > mask)
992 return 0;
993 *phash = (long)(ep[i].me_hash);
994 if (pkey)
995 *pkey = ep[i].me_key;
996 if (pvalue)
997 *pvalue = ep[i].me_value;
998 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +0000999}
1000
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001001/* Methods */
1002
1003static void
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001004dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001005{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001006 register PyDictEntry *ep;
1007 Py_ssize_t fill = mp->ma_fill;
1008 PyObject_GC_UnTrack(mp);
1009 Py_TRASHCAN_SAFE_BEGIN(mp)
1010 for (ep = mp->ma_table; fill > 0; ep++) {
1011 if (ep->me_key) {
1012 --fill;
1013 Py_DECREF(ep->me_key);
1014 Py_XDECREF(ep->me_value);
1015 }
1016 }
1017 if (mp->ma_table != mp->ma_smalltable)
1018 PyMem_DEL(mp->ma_table);
1019 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1020 free_list[numfree++] = mp;
1021 else
1022 Py_TYPE(mp)->tp_free((PyObject *)mp);
1023 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001024}
1025
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001027dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001028{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001029 Py_ssize_t i;
1030 PyObject *s, *temp, *colon = NULL;
1031 PyObject *pieces = NULL, *result = NULL;
1032 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001033
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001034 i = Py_ReprEnter((PyObject *)mp);
1035 if (i != 0) {
1036 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1037 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001038
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001039 if (mp->ma_used == 0) {
1040 result = PyUnicode_FromString("{}");
1041 goto Done;
1042 }
Tim Petersa7259592001-06-16 05:11:17 +00001043
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001044 pieces = PyList_New(0);
1045 if (pieces == NULL)
1046 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001047
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001048 colon = PyUnicode_FromString(": ");
1049 if (colon == NULL)
1050 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001051
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001052 /* Do repr() on each key+value pair, and insert ": " between them.
1053 Note that repr may mutate the dict. */
1054 i = 0;
1055 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
1056 int status;
1057 /* Prevent repr from deleting value during key format. */
1058 Py_INCREF(value);
1059 s = PyObject_Repr(key);
1060 PyUnicode_Append(&s, colon);
1061 PyUnicode_AppendAndDel(&s, PyObject_Repr(value));
1062 Py_DECREF(value);
1063 if (s == NULL)
1064 goto Done;
1065 status = PyList_Append(pieces, s);
1066 Py_DECREF(s); /* append created a new ref */
1067 if (status < 0)
1068 goto Done;
1069 }
Tim Petersa7259592001-06-16 05:11:17 +00001070
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001071 /* Add "{}" decorations to the first and last items. */
1072 assert(PyList_GET_SIZE(pieces) > 0);
1073 s = PyUnicode_FromString("{");
1074 if (s == NULL)
1075 goto Done;
1076 temp = PyList_GET_ITEM(pieces, 0);
1077 PyUnicode_AppendAndDel(&s, temp);
1078 PyList_SET_ITEM(pieces, 0, s);
1079 if (s == NULL)
1080 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001081
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001082 s = PyUnicode_FromString("}");
1083 if (s == NULL)
1084 goto Done;
1085 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
1086 PyUnicode_AppendAndDel(&temp, s);
1087 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1088 if (temp == NULL)
1089 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001090
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001091 /* Paste them all together with ", " between. */
1092 s = PyUnicode_FromString(", ");
1093 if (s == NULL)
1094 goto Done;
1095 result = PyUnicode_Join(s, pieces);
1096 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001097
1098Done:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001099 Py_XDECREF(pieces);
1100 Py_XDECREF(colon);
1101 Py_ReprLeave((PyObject *)mp);
1102 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001103}
1104
Martin v. Löwis18e16552006-02-15 17:27:45 +00001105static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001106dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001107{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001108 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001109}
1110
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001111static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001112dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001113{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001114 PyObject *v;
1115 long hash;
1116 PyDictEntry *ep;
1117 assert(mp->ma_table != NULL);
1118 if (!PyUnicode_CheckExact(key) ||
1119 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1120 hash = PyObject_Hash(key);
1121 if (hash == -1)
1122 return NULL;
1123 }
1124 ep = (mp->ma_lookup)(mp, key, hash);
1125 if (ep == NULL)
1126 return NULL;
1127 v = ep->me_value;
1128 if (v == NULL) {
1129 if (!PyDict_CheckExact(mp)) {
1130 /* Look up __missing__ method if we're a subclass. */
1131 PyObject *missing, *res;
1132 static PyObject *missing_str = NULL;
1133 missing = _PyObject_LookupSpecial((PyObject *)mp,
1134 "__missing__",
1135 &missing_str);
1136 if (missing != NULL) {
1137 res = PyObject_CallFunctionObjArgs(missing,
1138 key, NULL);
1139 Py_DECREF(missing);
1140 return res;
1141 }
1142 else if (PyErr_Occurred())
1143 return NULL;
1144 }
1145 set_key_error(key);
1146 return NULL;
1147 }
1148 else
1149 Py_INCREF(v);
1150 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001151}
1152
1153static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001154dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001155{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001156 if (w == NULL)
1157 return PyDict_DelItem((PyObject *)mp, v);
1158 else
1159 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001160}
1161
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001162static PyMappingMethods dict_as_mapping = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001163 (lenfunc)dict_length, /*mp_length*/
1164 (binaryfunc)dict_subscript, /*mp_subscript*/
1165 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001166};
1167
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001168static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001169dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001170{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001171 register PyObject *v;
1172 register Py_ssize_t i, j;
1173 PyDictEntry *ep;
1174 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001175
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001176 again:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001177 n = mp->ma_used;
1178 v = PyList_New(n);
1179 if (v == NULL)
1180 return NULL;
1181 if (n != mp->ma_used) {
1182 /* Durnit. The allocations caused the dict to resize.
1183 * Just start over, this shouldn't normally happen.
1184 */
1185 Py_DECREF(v);
1186 goto again;
1187 }
1188 ep = mp->ma_table;
1189 mask = mp->ma_mask;
1190 for (i = 0, j = 0; i <= mask; i++) {
1191 if (ep[i].me_value != NULL) {
1192 PyObject *key = ep[i].me_key;
1193 Py_INCREF(key);
1194 PyList_SET_ITEM(v, j, key);
1195 j++;
1196 }
1197 }
1198 assert(j == n);
1199 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001200}
1201
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001203dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001204{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001205 register PyObject *v;
1206 register Py_ssize_t i, j;
1207 PyDictEntry *ep;
1208 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001209
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001210 again:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001211 n = mp->ma_used;
1212 v = PyList_New(n);
1213 if (v == NULL)
1214 return NULL;
1215 if (n != mp->ma_used) {
1216 /* Durnit. The allocations caused the dict to resize.
1217 * Just start over, this shouldn't normally happen.
1218 */
1219 Py_DECREF(v);
1220 goto again;
1221 }
1222 ep = mp->ma_table;
1223 mask = mp->ma_mask;
1224 for (i = 0, j = 0; i <= mask; i++) {
1225 if (ep[i].me_value != NULL) {
1226 PyObject *value = ep[i].me_value;
1227 Py_INCREF(value);
1228 PyList_SET_ITEM(v, j, value);
1229 j++;
1230 }
1231 }
1232 assert(j == n);
1233 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001234}
1235
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001237dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001238{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001239 register PyObject *v;
1240 register Py_ssize_t i, j, n;
1241 Py_ssize_t mask;
1242 PyObject *item, *key, *value;
1243 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001244
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001245 /* Preallocate the list of tuples, to avoid allocations during
1246 * the loop over the items, which could trigger GC, which
1247 * could resize the dict. :-(
1248 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001249 again:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001250 n = mp->ma_used;
1251 v = PyList_New(n);
1252 if (v == NULL)
1253 return NULL;
1254 for (i = 0; i < n; i++) {
1255 item = PyTuple_New(2);
1256 if (item == NULL) {
1257 Py_DECREF(v);
1258 return NULL;
1259 }
1260 PyList_SET_ITEM(v, i, item);
1261 }
1262 if (n != mp->ma_used) {
1263 /* Durnit. The allocations caused the dict to resize.
1264 * Just start over, this shouldn't normally happen.
1265 */
1266 Py_DECREF(v);
1267 goto again;
1268 }
1269 /* Nothing we do below makes any function calls. */
1270 ep = mp->ma_table;
1271 mask = mp->ma_mask;
1272 for (i = 0, j = 0; i <= mask; i++) {
1273 if ((value=ep[i].me_value) != NULL) {
1274 key = ep[i].me_key;
1275 item = PyList_GET_ITEM(v, j);
1276 Py_INCREF(key);
1277 PyTuple_SET_ITEM(item, 0, key);
1278 Py_INCREF(value);
1279 PyTuple_SET_ITEM(item, 1, value);
1280 j++;
1281 }
1282 }
1283 assert(j == n);
1284 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001285}
1286
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001287static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001288dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001289{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001290 PyObject *seq;
1291 PyObject *value = Py_None;
1292 PyObject *it; /* iter(seq) */
1293 PyObject *key;
1294 PyObject *d;
1295 int status;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001296
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001297 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
1298 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001299
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001300 d = PyObject_CallObject(cls, NULL);
1301 if (d == NULL)
1302 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001303
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001304 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1305 PyDictObject *mp = (PyDictObject *)d;
1306 PyObject *oldvalue;
1307 Py_ssize_t pos = 0;
1308 PyObject *key;
1309 long hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001310
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001311 if (dictresize(mp, Py_SIZE(seq)))
1312 return NULL;
Guido van Rossum58da9312007-11-10 23:39:45 +00001313
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001314 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1315 Py_INCREF(key);
1316 Py_INCREF(value);
1317 if (insertdict(mp, key, hash, value))
1318 return NULL;
1319 }
1320 return d;
1321 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001322
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001323 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
1324 PyDictObject *mp = (PyDictObject *)d;
1325 Py_ssize_t pos = 0;
1326 PyObject *key;
1327 long hash;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001328
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001329 if (dictresize(mp, PySet_GET_SIZE(seq)))
1330 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001331
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001332 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1333 Py_INCREF(key);
1334 Py_INCREF(value);
1335 if (insertdict(mp, key, hash, value))
1336 return NULL;
1337 }
1338 return d;
1339 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001340
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001341 it = PyObject_GetIter(seq);
1342 if (it == NULL){
1343 Py_DECREF(d);
1344 return NULL;
1345 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001346
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001347 if (PyDict_CheckExact(d)) {
1348 while ((key = PyIter_Next(it)) != NULL) {
1349 status = PyDict_SetItem(d, key, value);
1350 Py_DECREF(key);
1351 if (status < 0)
1352 goto Fail;
1353 }
1354 } else {
1355 while ((key = PyIter_Next(it)) != NULL) {
1356 status = PyObject_SetItem(d, key, value);
1357 Py_DECREF(key);
1358 if (status < 0)
1359 goto Fail;
1360 }
1361 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001362
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001363 if (PyErr_Occurred())
1364 goto Fail;
1365 Py_DECREF(it);
1366 return d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001367
1368Fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001369 Py_DECREF(it);
1370 Py_DECREF(d);
1371 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001372}
1373
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001374static int
1375dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001376{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001377 PyObject *arg = NULL;
1378 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001379
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001380 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1381 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001382
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001383 else if (arg != NULL) {
1384 if (PyObject_HasAttrString(arg, "keys"))
1385 result = PyDict_Merge(self, arg, 1);
1386 else
1387 result = PyDict_MergeFromSeq2(self, arg, 1);
1388 }
1389 if (result == 0 && kwds != NULL)
1390 result = PyDict_Merge(self, kwds, 1);
1391 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001392}
1393
1394static PyObject *
1395dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1396{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001397 if (dict_update_common(self, args, kwds, "update") != -1)
1398 Py_RETURN_NONE;
1399 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001400}
1401
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001402/* Update unconditionally replaces existing items.
1403 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001404 otherwise it leaves existing items unchanged.
1405
1406 PyDict_{Update,Merge} update/merge from a mapping object.
1407
Tim Petersf582b822001-12-11 18:51:08 +00001408 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001409 producing iterable objects of length 2.
1410*/
1411
Tim Petersf582b822001-12-11 18:51:08 +00001412int
Tim Peters1fc240e2001-10-26 05:06:50 +00001413PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1414{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001415 PyObject *it; /* iter(seq2) */
1416 Py_ssize_t i; /* index into seq2 of current element */
1417 PyObject *item; /* seq2[i] */
1418 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001419
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001420 assert(d != NULL);
1421 assert(PyDict_Check(d));
1422 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001423
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001424 it = PyObject_GetIter(seq2);
1425 if (it == NULL)
1426 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001427
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001428 for (i = 0; ; ++i) {
1429 PyObject *key, *value;
1430 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001431
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001432 fast = NULL;
1433 item = PyIter_Next(it);
1434 if (item == NULL) {
1435 if (PyErr_Occurred())
1436 goto Fail;
1437 break;
1438 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001439
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001440 /* Convert item to sequence, and verify length 2. */
1441 fast = PySequence_Fast(item, "");
1442 if (fast == NULL) {
1443 if (PyErr_ExceptionMatches(PyExc_TypeError))
1444 PyErr_Format(PyExc_TypeError,
1445 "cannot convert dictionary update "
1446 "sequence element #%zd to a sequence",
1447 i);
1448 goto Fail;
1449 }
1450 n = PySequence_Fast_GET_SIZE(fast);
1451 if (n != 2) {
1452 PyErr_Format(PyExc_ValueError,
1453 "dictionary update sequence element #%zd "
1454 "has length %zd; 2 is required",
1455 i, n);
1456 goto Fail;
1457 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001458
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001459 /* Update/merge with this (key, value) pair. */
1460 key = PySequence_Fast_GET_ITEM(fast, 0);
1461 value = PySequence_Fast_GET_ITEM(fast, 1);
1462 if (override || PyDict_GetItem(d, key) == NULL) {
1463 int status = PyDict_SetItem(d, key, value);
1464 if (status < 0)
1465 goto Fail;
1466 }
1467 Py_DECREF(fast);
1468 Py_DECREF(item);
1469 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001470
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001471 i = 0;
1472 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00001473Fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001474 Py_XDECREF(item);
1475 Py_XDECREF(fast);
1476 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001477Return:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001478 Py_DECREF(it);
1479 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001480}
1481
Tim Peters6d6c1a32001-08-02 04:15:00 +00001482int
1483PyDict_Update(PyObject *a, PyObject *b)
1484{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001485 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001486}
1487
1488int
1489PyDict_Merge(PyObject *a, PyObject *b, int override)
1490{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001491 register PyDictObject *mp, *other;
1492 register Py_ssize_t i;
1493 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001494
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001495 /* We accept for the argument either a concrete dictionary object,
1496 * or an abstract "mapping" object. For the former, we can do
1497 * things quite efficiently. For the latter, we only require that
1498 * PyMapping_Keys() and PyObject_GetItem() be supported.
1499 */
1500 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1501 PyErr_BadInternalCall();
1502 return -1;
1503 }
1504 mp = (PyDictObject*)a;
1505 if (PyDict_Check(b)) {
1506 other = (PyDictObject*)b;
1507 if (other == mp || other->ma_used == 0)
1508 /* a.update(a) or a.update({}); nothing to do */
1509 return 0;
1510 if (mp->ma_used == 0)
1511 /* Since the target dict is empty, PyDict_GetItem()
1512 * always returns NULL. Setting override to 1
1513 * skips the unnecessary test.
1514 */
1515 override = 1;
1516 /* Do one big resize at the start, rather than
1517 * incrementally resizing as we insert new items. Expect
1518 * that there will be no (or few) overlapping keys.
1519 */
1520 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
1521 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
1522 return -1;
1523 }
1524 for (i = 0; i <= other->ma_mask; i++) {
1525 entry = &other->ma_table[i];
1526 if (entry->me_value != NULL &&
1527 (override ||
1528 PyDict_GetItem(a, entry->me_key) == NULL)) {
1529 Py_INCREF(entry->me_key);
1530 Py_INCREF(entry->me_value);
1531 if (insertdict(mp, entry->me_key,
1532 (long)entry->me_hash,
1533 entry->me_value) != 0)
1534 return -1;
1535 }
1536 }
1537 }
1538 else {
1539 /* Do it the generic, slower way */
1540 PyObject *keys = PyMapping_Keys(b);
1541 PyObject *iter;
1542 PyObject *key, *value;
1543 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001544
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001545 if (keys == NULL)
1546 /* Docstring says this is equivalent to E.keys() so
1547 * if E doesn't have a .keys() method we want
1548 * AttributeError to percolate up. Might as well
1549 * do the same for any other error.
1550 */
1551 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001552
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001553 iter = PyObject_GetIter(keys);
1554 Py_DECREF(keys);
1555 if (iter == NULL)
1556 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001557
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001558 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
1559 if (!override && PyDict_GetItem(a, key) != NULL) {
1560 Py_DECREF(key);
1561 continue;
1562 }
1563 value = PyObject_GetItem(b, key);
1564 if (value == NULL) {
1565 Py_DECREF(iter);
1566 Py_DECREF(key);
1567 return -1;
1568 }
1569 status = PyDict_SetItem(a, key, value);
1570 Py_DECREF(key);
1571 Py_DECREF(value);
1572 if (status < 0) {
1573 Py_DECREF(iter);
1574 return -1;
1575 }
1576 }
1577 Py_DECREF(iter);
1578 if (PyErr_Occurred())
1579 /* Iterator completed, via error */
1580 return -1;
1581 }
1582 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001583}
1584
1585static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001586dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001587{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001588 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001589}
1590
1591PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001592PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001593{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001594 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001595
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001596 if (o == NULL || !PyDict_Check(o)) {
1597 PyErr_BadInternalCall();
1598 return NULL;
1599 }
1600 copy = PyDict_New();
1601 if (copy == NULL)
1602 return NULL;
1603 if (PyDict_Merge(copy, o, 1) == 0)
1604 return copy;
1605 Py_DECREF(copy);
1606 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001607}
1608
Martin v. Löwis18e16552006-02-15 17:27:45 +00001609Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001610PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001611{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001612 if (mp == NULL || !PyDict_Check(mp)) {
1613 PyErr_BadInternalCall();
1614 return -1;
1615 }
1616 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001617}
1618
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001619PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001620PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001621{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001622 if (mp == NULL || !PyDict_Check(mp)) {
1623 PyErr_BadInternalCall();
1624 return NULL;
1625 }
1626 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001627}
1628
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001629PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001630PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001631{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001632 if (mp == NULL || !PyDict_Check(mp)) {
1633 PyErr_BadInternalCall();
1634 return NULL;
1635 }
1636 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001637}
1638
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001640PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001641{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001642 if (mp == NULL || !PyDict_Check(mp)) {
1643 PyErr_BadInternalCall();
1644 return NULL;
1645 }
1646 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001647}
1648
Tim Peterse63415e2001-05-08 04:38:29 +00001649/* Return 1 if dicts equal, 0 if not, -1 if error.
1650 * Gets out as soon as any difference is detected.
1651 * Uses only Py_EQ comparison.
1652 */
1653static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001654dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001655{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001656 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001657
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001658 if (a->ma_used != b->ma_used)
1659 /* can't be equal if # of entries differ */
1660 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001661
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001662 /* Same # of entries -- check all of 'em. Exit early on any diff. */
1663 for (i = 0; i <= a->ma_mask; i++) {
1664 PyObject *aval = a->ma_table[i].me_value;
1665 if (aval != NULL) {
1666 int cmp;
1667 PyObject *bval;
1668 PyObject *key = a->ma_table[i].me_key;
1669 /* temporarily bump aval's refcount to ensure it stays
1670 alive until we're done with it */
1671 Py_INCREF(aval);
1672 /* ditto for key */
1673 Py_INCREF(key);
1674 bval = PyDict_GetItemWithError((PyObject *)b, key);
1675 Py_DECREF(key);
1676 if (bval == NULL) {
1677 Py_DECREF(aval);
1678 if (PyErr_Occurred())
1679 return -1;
1680 return 0;
1681 }
1682 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1683 Py_DECREF(aval);
1684 if (cmp <= 0) /* error or not equal */
1685 return cmp;
1686 }
1687 }
1688 return 1;
Tim Peterse63415e2001-05-08 04:38:29 +00001689 }
1690
1691static PyObject *
1692dict_richcompare(PyObject *v, PyObject *w, int op)
1693{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001694 int cmp;
1695 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00001696
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001697 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1698 res = Py_NotImplemented;
1699 }
1700 else if (op == Py_EQ || op == Py_NE) {
1701 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
1702 if (cmp < 0)
1703 return NULL;
1704 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1705 }
1706 else
1707 res = Py_NotImplemented;
1708 Py_INCREF(res);
1709 return res;
Tim Peterse63415e2001-05-08 04:38:29 +00001710 }
1711
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001712static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001713dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001714{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001715 long hash;
1716 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001717
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001718 if (!PyUnicode_CheckExact(key) ||
1719 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1720 hash = PyObject_Hash(key);
1721 if (hash == -1)
1722 return NULL;
1723 }
1724 ep = (mp->ma_lookup)(mp, key, hash);
1725 if (ep == NULL)
1726 return NULL;
1727 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001728}
1729
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001730static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001731dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001732{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001733 PyObject *key;
1734 PyObject *failobj = Py_None;
1735 PyObject *val = NULL;
1736 long hash;
1737 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001738
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001739 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
1740 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001741
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001742 if (!PyUnicode_CheckExact(key) ||
1743 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1744 hash = PyObject_Hash(key);
1745 if (hash == -1)
1746 return NULL;
1747 }
1748 ep = (mp->ma_lookup)(mp, key, hash);
1749 if (ep == NULL)
1750 return NULL;
1751 val = ep->me_value;
1752 if (val == NULL)
1753 val = failobj;
1754 Py_INCREF(val);
1755 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001756}
1757
1758
1759static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001760dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001761{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001762 PyObject *key;
1763 PyObject *failobj = Py_None;
1764 PyObject *val = NULL;
1765 long hash;
1766 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001767
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001768 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
1769 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001770
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001771 if (!PyUnicode_CheckExact(key) ||
1772 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1773 hash = PyObject_Hash(key);
1774 if (hash == -1)
1775 return NULL;
1776 }
1777 ep = (mp->ma_lookup)(mp, key, hash);
1778 if (ep == NULL)
1779 return NULL;
1780 val = ep->me_value;
1781 if (val == NULL) {
1782 val = failobj;
1783 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1784 val = NULL;
1785 }
1786 Py_XINCREF(val);
1787 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00001788}
1789
1790
1791static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001792dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001793{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001794 PyDict_Clear((PyObject *)mp);
1795 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001796}
1797
Guido van Rossumba6ab842000-12-12 22:02:18 +00001798static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001799dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001800{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001801 long hash;
1802 PyDictEntry *ep;
1803 PyObject *old_value, *old_key;
1804 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001805
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001806 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1807 return NULL;
1808 if (mp->ma_used == 0) {
1809 if (deflt) {
1810 Py_INCREF(deflt);
1811 return deflt;
1812 }
1813 PyErr_SetString(PyExc_KeyError,
1814 "pop(): dictionary is empty");
1815 return NULL;
1816 }
1817 if (!PyUnicode_CheckExact(key) ||
1818 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
1819 hash = PyObject_Hash(key);
1820 if (hash == -1)
1821 return NULL;
1822 }
1823 ep = (mp->ma_lookup)(mp, key, hash);
1824 if (ep == NULL)
1825 return NULL;
1826 if (ep->me_value == NULL) {
1827 if (deflt) {
1828 Py_INCREF(deflt);
1829 return deflt;
1830 }
1831 set_key_error(key);
1832 return NULL;
1833 }
1834 old_key = ep->me_key;
1835 Py_INCREF(dummy);
1836 ep->me_key = dummy;
1837 old_value = ep->me_value;
1838 ep->me_value = NULL;
1839 mp->ma_used--;
1840 Py_DECREF(old_key);
1841 return old_value;
Guido van Rossume027d982002-04-12 15:11:59 +00001842}
1843
1844static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001845dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001846{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001847 Py_ssize_t i = 0;
1848 PyDictEntry *ep;
1849 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001850
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001851 /* Allocate the result tuple before checking the size. Believe it
1852 * or not, this allocation could trigger a garbage collection which
1853 * could empty the dict, so if we checked the size first and that
1854 * happened, the result would be an infinite loop (searching for an
1855 * entry that no longer exists). Note that the usual popitem()
1856 * idiom is "while d: k, v = d.popitem()". so needing to throw the
1857 * tuple away if the dict *is* empty isn't a significant
1858 * inefficiency -- possible, but unlikely in practice.
1859 */
1860 res = PyTuple_New(2);
1861 if (res == NULL)
1862 return NULL;
1863 if (mp->ma_used == 0) {
1864 Py_DECREF(res);
1865 PyErr_SetString(PyExc_KeyError,
1866 "popitem(): dictionary is empty");
1867 return NULL;
1868 }
1869 /* Set ep to "the first" dict entry with a value. We abuse the hash
1870 * field of slot 0 to hold a search finger:
1871 * If slot 0 has a value, use slot 0.
1872 * Else slot 0 is being used to hold a search finger,
1873 * and we use its hash value as the first index to look.
1874 */
1875 ep = &mp->ma_table[0];
1876 if (ep->me_value == NULL) {
1877 i = ep->me_hash;
1878 /* The hash field may be a real hash value, or it may be a
1879 * legit search finger, or it may be a once-legit search
1880 * finger that's out of bounds now because it wrapped around
1881 * or the table shrunk -- simply make sure it's in bounds now.
1882 */
1883 if (i > mp->ma_mask || i < 1)
1884 i = 1; /* skip slot 0 */
1885 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1886 i++;
1887 if (i > mp->ma_mask)
1888 i = 1;
1889 }
1890 }
1891 PyTuple_SET_ITEM(res, 0, ep->me_key);
1892 PyTuple_SET_ITEM(res, 1, ep->me_value);
1893 Py_INCREF(dummy);
1894 ep->me_key = dummy;
1895 ep->me_value = NULL;
1896 mp->ma_used--;
1897 assert(mp->ma_table[0].me_value == NULL);
1898 mp->ma_table[0].me_hash = i + 1; /* next place to start */
1899 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001900}
1901
Jeremy Hylton8caad492000-06-23 14:18:11 +00001902static int
1903dict_traverse(PyObject *op, visitproc visit, void *arg)
1904{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001905 Py_ssize_t i = 0;
1906 PyObject *pk;
1907 PyObject *pv;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001908
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001909 while (PyDict_Next(op, &i, &pk, &pv)) {
1910 Py_VISIT(pk);
1911 Py_VISIT(pv);
1912 }
1913 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001914}
1915
1916static int
1917dict_tp_clear(PyObject *op)
1918{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001919 PyDict_Clear(op);
1920 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001921}
1922
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001923static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001924
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001925static PyObject *
1926dict_sizeof(PyDictObject *mp)
1927{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001928 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001929
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001930 res = sizeof(PyDictObject);
1931 if (mp->ma_table != mp->ma_smalltable)
1932 res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry);
1933 return PyLong_FromSsize_t(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001934}
1935
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001936PyDoc_STRVAR(contains__doc__,
1937"D.__contains__(k) -> True if D has a key k, else False");
1938
1939PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1940
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001941PyDoc_STRVAR(sizeof__doc__,
1942"D.__sizeof__() -> size of D in memory, in bytes");
1943
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001944PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001945"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001946
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001947PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001948"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 +00001949
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001950PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001951"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001952If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001953
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001954PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001955"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000019562-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001958PyDoc_STRVAR(update__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001959"D.update(E, **F) -> None. Update D from dict/iterable E and F.\n"
1960"If E has a .keys() method, does: for k in E: D[k] = E[k]\n\
1961If E lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
1962In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00001963
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001964PyDoc_STRVAR(fromkeys__doc__,
1965"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1966v defaults to None.");
1967
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001968PyDoc_STRVAR(clear__doc__,
1969"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001971PyDoc_STRVAR(copy__doc__,
1972"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001973
Guido van Rossumb90c8482007-02-10 01:11:45 +00001974/* Forward */
1975static PyObject *dictkeys_new(PyObject *);
1976static PyObject *dictitems_new(PyObject *);
1977static PyObject *dictvalues_new(PyObject *);
1978
Guido van Rossum45c85d12007-07-27 16:31:40 +00001979PyDoc_STRVAR(keys__doc__,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001980 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00001981PyDoc_STRVAR(items__doc__,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001982 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00001983PyDoc_STRVAR(values__doc__,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001984 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00001985
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001986static PyMethodDef mapp_methods[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001987 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
1988 contains__doc__},
1989 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
1990 getitem__doc__},
1991 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
1992 sizeof__doc__},
1993 {"get", (PyCFunction)dict_get, METH_VARARGS,
1994 get__doc__},
1995 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1996 setdefault_doc__},
1997 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
1998 pop__doc__},
1999 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2000 popitem__doc__},
2001 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2002 keys__doc__},
2003 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2004 items__doc__},
2005 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2006 values__doc__},
2007 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2008 update__doc__},
2009 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2010 fromkeys__doc__},
2011 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2012 clear__doc__},
2013 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2014 copy__doc__},
2015 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002016};
2017
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002018/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002019int
2020PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002021{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002022 long hash;
2023 PyDictObject *mp = (PyDictObject *)op;
2024 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002025
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002026 if (!PyUnicode_CheckExact(key) ||
2027 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
2028 hash = PyObject_Hash(key);
2029 if (hash == -1)
2030 return -1;
2031 }
2032 ep = (mp->ma_lookup)(mp, key, hash);
2033 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002034}
2035
Thomas Wouterscf297e42007-02-23 15:07:44 +00002036/* Internal version of PyDict_Contains used when the hash value is already known */
2037int
2038_PyDict_Contains(PyObject *op, PyObject *key, long hash)
2039{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002040 PyDictObject *mp = (PyDictObject *)op;
2041 PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002042
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002043 ep = (mp->ma_lookup)(mp, key, hash);
2044 return ep == NULL ? -1 : (ep->me_value != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002045}
2046
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002047/* Hack to implement "key in dict" */
2048static PySequenceMethods dict_as_sequence = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002049 0, /* sq_length */
2050 0, /* sq_concat */
2051 0, /* sq_repeat */
2052 0, /* sq_item */
2053 0, /* sq_slice */
2054 0, /* sq_ass_item */
2055 0, /* sq_ass_slice */
2056 PyDict_Contains, /* sq_contains */
2057 0, /* sq_inplace_concat */
2058 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002059};
2060
Guido van Rossum09e563a2001-05-01 12:10:21 +00002061static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002062dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2063{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002064 PyObject *self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002065
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002066 assert(type != NULL && type->tp_alloc != NULL);
2067 self = type->tp_alloc(type, 0);
2068 if (self != NULL) {
2069 PyDictObject *d = (PyDictObject *)self;
2070 /* It's guaranteed that tp->alloc zeroed out the struct. */
2071 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2072 INIT_NONZERO_DICT_SLOTS(d);
2073 d->ma_lookup = lookdict_unicode;
2074 /* The object has been implicitely tracked by tp_alloc */
2075 if (type == &PyDict_Type)
2076 _PyObject_GC_UNTRACK(d);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002077#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002078 ++created;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002079#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002080#ifdef SHOW_TRACK_COUNT
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002081 if (_PyObject_GC_IS_TRACKED(d))
2082 count_tracked++;
2083 else
2084 count_untracked++;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002085#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002086 }
2087 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002088}
2089
Tim Peters25786c02001-09-02 08:22:48 +00002090static int
2091dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2092{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002093 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002094}
2095
Tim Peters6d6c1a32001-08-02 04:15:00 +00002096static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002097dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002098{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002099 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002100}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002101
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002102PyDoc_STRVAR(dictionary_doc,
Ezio Melotti807e98e2010-03-01 04:10:55 +00002103"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002104"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti807e98e2010-03-01 04:10:55 +00002105" (key, value) pairs\n"
2106"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002107" d = {}\n"
Ezio Melotti807e98e2010-03-01 04:10:55 +00002108" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002109" d[k] = v\n"
2110"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2111" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002112
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002113PyTypeObject PyDict_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002114 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2115 "dict",
2116 sizeof(PyDictObject),
2117 0,
2118 (destructor)dict_dealloc, /* tp_dealloc */
2119 0, /* tp_print */
2120 0, /* tp_getattr */
2121 0, /* tp_setattr */
2122 0, /* tp_reserved */
2123 (reprfunc)dict_repr, /* tp_repr */
2124 0, /* tp_as_number */
2125 &dict_as_sequence, /* tp_as_sequence */
2126 &dict_as_mapping, /* tp_as_mapping */
2127 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
2128 0, /* tp_call */
2129 0, /* tp_str */
2130 PyObject_GenericGetAttr, /* tp_getattro */
2131 0, /* tp_setattro */
2132 0, /* tp_as_buffer */
2133 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2134 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2135 dictionary_doc, /* tp_doc */
2136 dict_traverse, /* tp_traverse */
2137 dict_tp_clear, /* tp_clear */
2138 dict_richcompare, /* tp_richcompare */
2139 0, /* tp_weaklistoffset */
2140 (getiterfunc)dict_iter, /* tp_iter */
2141 0, /* tp_iternext */
2142 mapp_methods, /* tp_methods */
2143 0, /* tp_members */
2144 0, /* tp_getset */
2145 0, /* tp_base */
2146 0, /* tp_dict */
2147 0, /* tp_descr_get */
2148 0, /* tp_descr_set */
2149 0, /* tp_dictoffset */
2150 dict_init, /* tp_init */
2151 PyType_GenericAlloc, /* tp_alloc */
2152 dict_new, /* tp_new */
2153 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002154};
2155
Guido van Rossum3cca2451997-05-16 14:23:33 +00002156/* For backward compatibility with old dictionary interface */
2157
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002158PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002159PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002160{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002161 PyObject *kv, *rv;
2162 kv = PyUnicode_FromString(key);
2163 if (kv == NULL)
2164 return NULL;
2165 rv = PyDict_GetItem(v, kv);
2166 Py_DECREF(kv);
2167 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002168}
2169
2170int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002171PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002172{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002173 PyObject *kv;
2174 int err;
2175 kv = PyUnicode_FromString(key);
2176 if (kv == NULL)
2177 return -1;
2178 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2179 err = PyDict_SetItem(v, kv, item);
2180 Py_DECREF(kv);
2181 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002182}
2183
2184int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002185PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002186{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002187 PyObject *kv;
2188 int err;
2189 kv = PyUnicode_FromString(key);
2190 if (kv == NULL)
2191 return -1;
2192 err = PyDict_DelItem(v, kv);
2193 Py_DECREF(kv);
2194 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002195}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002196
Raymond Hettinger019a1482004-03-18 02:41:19 +00002197/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002198
2199typedef struct {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002200 PyObject_HEAD
2201 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2202 Py_ssize_t di_used;
2203 Py_ssize_t di_pos;
2204 PyObject* di_result; /* reusable result tuple for iteritems */
2205 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002206} dictiterobject;
2207
2208static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002209dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002210{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002211 dictiterobject *di;
2212 di = PyObject_GC_New(dictiterobject, itertype);
2213 if (di == NULL)
2214 return NULL;
2215 Py_INCREF(dict);
2216 di->di_dict = dict;
2217 di->di_used = dict->ma_used;
2218 di->di_pos = 0;
2219 di->len = dict->ma_used;
2220 if (itertype == &PyDictIterItem_Type) {
2221 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2222 if (di->di_result == NULL) {
2223 Py_DECREF(di);
2224 return NULL;
2225 }
2226 }
2227 else
2228 di->di_result = NULL;
2229 _PyObject_GC_TRACK(di);
2230 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002231}
2232
2233static void
2234dictiter_dealloc(dictiterobject *di)
2235{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002236 Py_XDECREF(di->di_dict);
2237 Py_XDECREF(di->di_result);
2238 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002239}
2240
2241static int
2242dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2243{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002244 Py_VISIT(di->di_dict);
2245 Py_VISIT(di->di_result);
2246 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002247}
2248
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002249static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002250dictiter_len(dictiterobject *di)
2251{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002252 Py_ssize_t len = 0;
2253 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2254 len = di->len;
2255 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002256}
2257
Guido van Rossumb90c8482007-02-10 01:11:45 +00002258PyDoc_STRVAR(length_hint_doc,
2259 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002260
2261static PyMethodDef dictiter_methods[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002262 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2263 length_hint_doc},
2264 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002265};
2266
Raymond Hettinger019a1482004-03-18 02:41:19 +00002267static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002268{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002269 PyObject *key;
2270 register Py_ssize_t i, mask;
2271 register PyDictEntry *ep;
2272 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002273
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002274 if (d == NULL)
2275 return NULL;
2276 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002277
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002278 if (di->di_used != d->ma_used) {
2279 PyErr_SetString(PyExc_RuntimeError,
2280 "dictionary changed size during iteration");
2281 di->di_used = -1; /* Make this state sticky */
2282 return NULL;
2283 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002284
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002285 i = di->di_pos;
2286 if (i < 0)
2287 goto fail;
2288 ep = d->ma_table;
2289 mask = d->ma_mask;
2290 while (i <= mask && ep[i].me_value == NULL)
2291 i++;
2292 di->di_pos = i+1;
2293 if (i > mask)
2294 goto fail;
2295 di->len--;
2296 key = ep[i].me_key;
2297 Py_INCREF(key);
2298 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002299
2300fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002301 Py_DECREF(d);
2302 di->di_dict = NULL;
2303 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002304}
2305
Raymond Hettinger019a1482004-03-18 02:41:19 +00002306PyTypeObject PyDictIterKey_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002307 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2308 "dict_keyiterator", /* tp_name */
2309 sizeof(dictiterobject), /* tp_basicsize */
2310 0, /* tp_itemsize */
2311 /* methods */
2312 (destructor)dictiter_dealloc, /* tp_dealloc */
2313 0, /* tp_print */
2314 0, /* tp_getattr */
2315 0, /* tp_setattr */
2316 0, /* tp_reserved */
2317 0, /* tp_repr */
2318 0, /* tp_as_number */
2319 0, /* tp_as_sequence */
2320 0, /* tp_as_mapping */
2321 0, /* tp_hash */
2322 0, /* tp_call */
2323 0, /* tp_str */
2324 PyObject_GenericGetAttr, /* tp_getattro */
2325 0, /* tp_setattro */
2326 0, /* tp_as_buffer */
2327 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2328 0, /* tp_doc */
2329 (traverseproc)dictiter_traverse, /* tp_traverse */
2330 0, /* tp_clear */
2331 0, /* tp_richcompare */
2332 0, /* tp_weaklistoffset */
2333 PyObject_SelfIter, /* tp_iter */
2334 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2335 dictiter_methods, /* tp_methods */
2336 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002337};
2338
2339static PyObject *dictiter_iternextvalue(dictiterobject *di)
2340{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002341 PyObject *value;
2342 register Py_ssize_t i, mask;
2343 register PyDictEntry *ep;
2344 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002345
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002346 if (d == NULL)
2347 return NULL;
2348 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002349
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002350 if (di->di_used != d->ma_used) {
2351 PyErr_SetString(PyExc_RuntimeError,
2352 "dictionary changed size during iteration");
2353 di->di_used = -1; /* Make this state sticky */
2354 return NULL;
2355 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002356
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002357 i = di->di_pos;
2358 mask = d->ma_mask;
2359 if (i < 0 || i > mask)
2360 goto fail;
2361 ep = d->ma_table;
2362 while ((value=ep[i].me_value) == NULL) {
2363 i++;
2364 if (i > mask)
2365 goto fail;
2366 }
2367 di->di_pos = i+1;
2368 di->len--;
2369 Py_INCREF(value);
2370 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002371
2372fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002373 Py_DECREF(d);
2374 di->di_dict = NULL;
2375 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002376}
2377
2378PyTypeObject PyDictIterValue_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002379 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2380 "dict_valueiterator", /* tp_name */
2381 sizeof(dictiterobject), /* tp_basicsize */
2382 0, /* tp_itemsize */
2383 /* methods */
2384 (destructor)dictiter_dealloc, /* tp_dealloc */
2385 0, /* tp_print */
2386 0, /* tp_getattr */
2387 0, /* tp_setattr */
2388 0, /* tp_reserved */
2389 0, /* tp_repr */
2390 0, /* tp_as_number */
2391 0, /* tp_as_sequence */
2392 0, /* tp_as_mapping */
2393 0, /* tp_hash */
2394 0, /* tp_call */
2395 0, /* tp_str */
2396 PyObject_GenericGetAttr, /* tp_getattro */
2397 0, /* tp_setattro */
2398 0, /* tp_as_buffer */
2399 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2400 0, /* tp_doc */
2401 (traverseproc)dictiter_traverse, /* tp_traverse */
2402 0, /* tp_clear */
2403 0, /* tp_richcompare */
2404 0, /* tp_weaklistoffset */
2405 PyObject_SelfIter, /* tp_iter */
2406 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2407 dictiter_methods, /* tp_methods */
2408 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002409};
2410
2411static PyObject *dictiter_iternextitem(dictiterobject *di)
2412{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002413 PyObject *key, *value, *result = di->di_result;
2414 register Py_ssize_t i, mask;
2415 register PyDictEntry *ep;
2416 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002417
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002418 if (d == NULL)
2419 return NULL;
2420 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002421
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002422 if (di->di_used != d->ma_used) {
2423 PyErr_SetString(PyExc_RuntimeError,
2424 "dictionary changed size during iteration");
2425 di->di_used = -1; /* Make this state sticky */
2426 return NULL;
2427 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002428
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002429 i = di->di_pos;
2430 if (i < 0)
2431 goto fail;
2432 ep = d->ma_table;
2433 mask = d->ma_mask;
2434 while (i <= mask && ep[i].me_value == NULL)
2435 i++;
2436 di->di_pos = i+1;
2437 if (i > mask)
2438 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002439
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002440 if (result->ob_refcnt == 1) {
2441 Py_INCREF(result);
2442 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2443 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2444 } else {
2445 result = PyTuple_New(2);
2446 if (result == NULL)
2447 return NULL;
2448 }
2449 di->len--;
2450 key = ep[i].me_key;
2451 value = ep[i].me_value;
2452 Py_INCREF(key);
2453 Py_INCREF(value);
2454 PyTuple_SET_ITEM(result, 0, key);
2455 PyTuple_SET_ITEM(result, 1, value);
2456 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002457
2458fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002459 Py_DECREF(d);
2460 di->di_dict = NULL;
2461 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002462}
2463
2464PyTypeObject PyDictIterItem_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002465 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2466 "dict_itemiterator", /* tp_name */
2467 sizeof(dictiterobject), /* tp_basicsize */
2468 0, /* tp_itemsize */
2469 /* methods */
2470 (destructor)dictiter_dealloc, /* tp_dealloc */
2471 0, /* tp_print */
2472 0, /* tp_getattr */
2473 0, /* tp_setattr */
2474 0, /* tp_reserved */
2475 0, /* tp_repr */
2476 0, /* tp_as_number */
2477 0, /* tp_as_sequence */
2478 0, /* tp_as_mapping */
2479 0, /* tp_hash */
2480 0, /* tp_call */
2481 0, /* tp_str */
2482 PyObject_GenericGetAttr, /* tp_getattro */
2483 0, /* tp_setattro */
2484 0, /* tp_as_buffer */
2485 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2486 0, /* tp_doc */
2487 (traverseproc)dictiter_traverse, /* tp_traverse */
2488 0, /* tp_clear */
2489 0, /* tp_richcompare */
2490 0, /* tp_weaklistoffset */
2491 PyObject_SelfIter, /* tp_iter */
2492 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
2493 dictiter_methods, /* tp_methods */
2494 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002495};
Guido van Rossumb90c8482007-02-10 01:11:45 +00002496
2497
Guido van Rossum3ac67412007-02-10 18:55:06 +00002498/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002499/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002500/***********************************************/
2501
Guido van Rossumb90c8482007-02-10 01:11:45 +00002502/* The instance lay-out is the same for all three; but the type differs. */
2503
2504typedef struct {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002505 PyObject_HEAD
2506 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002507} dictviewobject;
2508
2509
2510static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00002511dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002512{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002513 Py_XDECREF(dv->dv_dict);
2514 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002515}
2516
2517static int
2518dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
2519{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002520 Py_VISIT(dv->dv_dict);
2521 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002522}
2523
Guido van Rossum83825ac2007-02-10 04:54:19 +00002524static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00002525dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002526{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002527 Py_ssize_t len = 0;
2528 if (dv->dv_dict != NULL)
2529 len = dv->dv_dict->ma_used;
2530 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002531}
2532
2533static PyObject *
2534dictview_new(PyObject *dict, PyTypeObject *type)
2535{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002536 dictviewobject *dv;
2537 if (dict == NULL) {
2538 PyErr_BadInternalCall();
2539 return NULL;
2540 }
2541 if (!PyDict_Check(dict)) {
2542 /* XXX Get rid of this restriction later */
2543 PyErr_Format(PyExc_TypeError,
2544 "%s() requires a dict argument, not '%s'",
2545 type->tp_name, dict->ob_type->tp_name);
2546 return NULL;
2547 }
2548 dv = PyObject_GC_New(dictviewobject, type);
2549 if (dv == NULL)
2550 return NULL;
2551 Py_INCREF(dict);
2552 dv->dv_dict = (PyDictObject *)dict;
2553 _PyObject_GC_TRACK(dv);
2554 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002555}
2556
Neal Norwitze36f2ba2007-02-26 23:12:28 +00002557/* TODO(guido): The views objects are not complete:
2558
2559 * support more set operations
2560 * support arbitrary mappings?
2561 - either these should be static or exported in dictobject.h
2562 - if public then they should probably be in builtins
2563*/
2564
Guido van Rossumaac530c2007-08-24 22:33:45 +00002565/* Return 1 if self is a subset of other, iterating over self;
2566 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002567static int
2568all_contained_in(PyObject *self, PyObject *other)
2569{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002570 PyObject *iter = PyObject_GetIter(self);
2571 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002572
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002573 if (iter == NULL)
2574 return -1;
2575 for (;;) {
2576 PyObject *next = PyIter_Next(iter);
2577 if (next == NULL) {
2578 if (PyErr_Occurred())
2579 ok = -1;
2580 break;
2581 }
2582 ok = PySequence_Contains(other, next);
2583 Py_DECREF(next);
2584 if (ok <= 0)
2585 break;
2586 }
2587 Py_DECREF(iter);
2588 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002589}
2590
2591static PyObject *
2592dictview_richcompare(PyObject *self, PyObject *other, int op)
2593{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002594 Py_ssize_t len_self, len_other;
2595 int ok;
2596 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002597
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002598 assert(self != NULL);
2599 assert(PyDictViewSet_Check(self));
2600 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00002601
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002602 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other)) {
2603 Py_INCREF(Py_NotImplemented);
2604 return Py_NotImplemented;
2605 }
Guido van Rossumaac530c2007-08-24 22:33:45 +00002606
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002607 len_self = PyObject_Size(self);
2608 if (len_self < 0)
2609 return NULL;
2610 len_other = PyObject_Size(other);
2611 if (len_other < 0)
2612 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002613
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002614 ok = 0;
2615 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00002616
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002617 case Py_NE:
2618 case Py_EQ:
2619 if (len_self == len_other)
2620 ok = all_contained_in(self, other);
2621 if (op == Py_NE && ok >= 0)
2622 ok = !ok;
2623 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002624
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002625 case Py_LT:
2626 if (len_self < len_other)
2627 ok = all_contained_in(self, other);
2628 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002629
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002630 case Py_LE:
2631 if (len_self <= len_other)
2632 ok = all_contained_in(self, other);
2633 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002634
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002635 case Py_GT:
2636 if (len_self > len_other)
2637 ok = all_contained_in(other, self);
2638 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002639
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002640 case Py_GE:
2641 if (len_self >= len_other)
2642 ok = all_contained_in(other, self);
2643 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002644
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002645 }
2646 if (ok < 0)
2647 return NULL;
2648 result = ok ? Py_True : Py_False;
2649 Py_INCREF(result);
2650 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002651}
2652
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002653static PyObject *
2654dictview_repr(dictviewobject *dv)
2655{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002656 PyObject *seq;
2657 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002658
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002659 seq = PySequence_List((PyObject *)dv);
2660 if (seq == NULL)
2661 return NULL;
2662
2663 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
2664 Py_DECREF(seq);
2665 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002666}
2667
Guido van Rossum3ac67412007-02-10 18:55:06 +00002668/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002669
2670static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002671dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002672{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002673 if (dv->dv_dict == NULL) {
2674 Py_RETURN_NONE;
2675 }
2676 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002677}
2678
2679static int
2680dictkeys_contains(dictviewobject *dv, PyObject *obj)
2681{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002682 if (dv->dv_dict == NULL)
2683 return 0;
2684 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002685}
2686
Guido van Rossum83825ac2007-02-10 04:54:19 +00002687static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002688 (lenfunc)dictview_len, /* sq_length */
2689 0, /* sq_concat */
2690 0, /* sq_repeat */
2691 0, /* sq_item */
2692 0, /* sq_slice */
2693 0, /* sq_ass_item */
2694 0, /* sq_ass_slice */
2695 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002696};
2697
Guido van Rossum523259b2007-08-24 23:41:22 +00002698static PyObject*
2699dictviews_sub(PyObject* self, PyObject *other)
2700{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002701 PyObject *result = PySet_New(self);
2702 PyObject *tmp;
2703 if (result == NULL)
2704 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002705
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002706 tmp = PyObject_CallMethod(result, "difference_update", "O", other);
2707 if (tmp == NULL) {
2708 Py_DECREF(result);
2709 return NULL;
2710 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002711
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002712 Py_DECREF(tmp);
2713 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002714}
2715
2716static PyObject*
2717dictviews_and(PyObject* self, PyObject *other)
2718{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002719 PyObject *result = PySet_New(self);
2720 PyObject *tmp;
2721 if (result == NULL)
2722 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002723
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002724 tmp = PyObject_CallMethod(result, "intersection_update", "O", other);
2725 if (tmp == NULL) {
2726 Py_DECREF(result);
2727 return NULL;
2728 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002729
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002730 Py_DECREF(tmp);
2731 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002732}
2733
2734static PyObject*
2735dictviews_or(PyObject* self, PyObject *other)
2736{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002737 PyObject *result = PySet_New(self);
2738 PyObject *tmp;
2739 if (result == NULL)
2740 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002741
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002742 tmp = PyObject_CallMethod(result, "update", "O", other);
2743 if (tmp == NULL) {
2744 Py_DECREF(result);
2745 return NULL;
2746 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002747
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002748 Py_DECREF(tmp);
2749 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002750}
2751
2752static PyObject*
2753dictviews_xor(PyObject* self, PyObject *other)
2754{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002755 PyObject *result = PySet_New(self);
2756 PyObject *tmp;
2757 if (result == NULL)
2758 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002759
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002760 tmp = PyObject_CallMethod(result, "symmetric_difference_update", "O",
2761 other);
2762 if (tmp == NULL) {
2763 Py_DECREF(result);
2764 return NULL;
2765 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002766
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002767 Py_DECREF(tmp);
2768 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002769}
2770
2771static PyNumberMethods dictviews_as_number = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002772 0, /*nb_add*/
2773 (binaryfunc)dictviews_sub, /*nb_subtract*/
2774 0, /*nb_multiply*/
2775 0, /*nb_remainder*/
2776 0, /*nb_divmod*/
2777 0, /*nb_power*/
2778 0, /*nb_negative*/
2779 0, /*nb_positive*/
2780 0, /*nb_absolute*/
2781 0, /*nb_bool*/
2782 0, /*nb_invert*/
2783 0, /*nb_lshift*/
2784 0, /*nb_rshift*/
2785 (binaryfunc)dictviews_and, /*nb_and*/
2786 (binaryfunc)dictviews_xor, /*nb_xor*/
2787 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00002788};
2789
Guido van Rossumb90c8482007-02-10 01:11:45 +00002790static PyMethodDef dictkeys_methods[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002791 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002792};
2793
2794PyTypeObject PyDictKeys_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002795 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2796 "dict_keys", /* tp_name */
2797 sizeof(dictviewobject), /* tp_basicsize */
2798 0, /* tp_itemsize */
2799 /* methods */
2800 (destructor)dictview_dealloc, /* tp_dealloc */
2801 0, /* tp_print */
2802 0, /* tp_getattr */
2803 0, /* tp_setattr */
2804 0, /* tp_reserved */
2805 (reprfunc)dictview_repr, /* tp_repr */
2806 &dictviews_as_number, /* tp_as_number */
2807 &dictkeys_as_sequence, /* tp_as_sequence */
2808 0, /* tp_as_mapping */
2809 0, /* tp_hash */
2810 0, /* tp_call */
2811 0, /* tp_str */
2812 PyObject_GenericGetAttr, /* tp_getattro */
2813 0, /* tp_setattro */
2814 0, /* tp_as_buffer */
2815 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2816 0, /* tp_doc */
2817 (traverseproc)dictview_traverse, /* tp_traverse */
2818 0, /* tp_clear */
2819 dictview_richcompare, /* tp_richcompare */
2820 0, /* tp_weaklistoffset */
2821 (getiterfunc)dictkeys_iter, /* tp_iter */
2822 0, /* tp_iternext */
2823 dictkeys_methods, /* tp_methods */
2824 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00002825};
2826
2827static PyObject *
2828dictkeys_new(PyObject *dict)
2829{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002830 return dictview_new(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002831}
2832
Guido van Rossum3ac67412007-02-10 18:55:06 +00002833/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002834
2835static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002836dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002837{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002838 if (dv->dv_dict == NULL) {
2839 Py_RETURN_NONE;
2840 }
2841 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002842}
2843
2844static int
2845dictitems_contains(dictviewobject *dv, PyObject *obj)
2846{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002847 PyObject *key, *value, *found;
2848 if (dv->dv_dict == NULL)
2849 return 0;
2850 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
2851 return 0;
2852 key = PyTuple_GET_ITEM(obj, 0);
2853 value = PyTuple_GET_ITEM(obj, 1);
2854 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
2855 if (found == NULL) {
2856 if (PyErr_Occurred())
2857 return -1;
2858 return 0;
2859 }
2860 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002861}
2862
Guido van Rossum83825ac2007-02-10 04:54:19 +00002863static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002864 (lenfunc)dictview_len, /* sq_length */
2865 0, /* sq_concat */
2866 0, /* sq_repeat */
2867 0, /* sq_item */
2868 0, /* sq_slice */
2869 0, /* sq_ass_item */
2870 0, /* sq_ass_slice */
2871 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002872};
2873
Guido van Rossumb90c8482007-02-10 01:11:45 +00002874static PyMethodDef dictitems_methods[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002875 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002876};
2877
2878PyTypeObject PyDictItems_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002879 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2880 "dict_items", /* tp_name */
2881 sizeof(dictviewobject), /* tp_basicsize */
2882 0, /* tp_itemsize */
2883 /* methods */
2884 (destructor)dictview_dealloc, /* tp_dealloc */
2885 0, /* tp_print */
2886 0, /* tp_getattr */
2887 0, /* tp_setattr */
2888 0, /* tp_reserved */
2889 (reprfunc)dictview_repr, /* tp_repr */
2890 &dictviews_as_number, /* tp_as_number */
2891 &dictitems_as_sequence, /* tp_as_sequence */
2892 0, /* tp_as_mapping */
2893 0, /* tp_hash */
2894 0, /* tp_call */
2895 0, /* tp_str */
2896 PyObject_GenericGetAttr, /* tp_getattro */
2897 0, /* tp_setattro */
2898 0, /* tp_as_buffer */
2899 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2900 0, /* tp_doc */
2901 (traverseproc)dictview_traverse, /* tp_traverse */
2902 0, /* tp_clear */
2903 dictview_richcompare, /* tp_richcompare */
2904 0, /* tp_weaklistoffset */
2905 (getiterfunc)dictitems_iter, /* tp_iter */
2906 0, /* tp_iternext */
2907 dictitems_methods, /* tp_methods */
2908 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00002909};
2910
2911static PyObject *
2912dictitems_new(PyObject *dict)
2913{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002914 return dictview_new(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002915}
2916
Guido van Rossum3ac67412007-02-10 18:55:06 +00002917/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002918
2919static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002920dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002921{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002922 if (dv->dv_dict == NULL) {
2923 Py_RETURN_NONE;
2924 }
2925 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002926}
2927
Guido van Rossum83825ac2007-02-10 04:54:19 +00002928static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002929 (lenfunc)dictview_len, /* sq_length */
2930 0, /* sq_concat */
2931 0, /* sq_repeat */
2932 0, /* sq_item */
2933 0, /* sq_slice */
2934 0, /* sq_ass_item */
2935 0, /* sq_ass_slice */
2936 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002937};
2938
Guido van Rossumb90c8482007-02-10 01:11:45 +00002939static PyMethodDef dictvalues_methods[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002940 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002941};
2942
2943PyTypeObject PyDictValues_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002944 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2945 "dict_values", /* tp_name */
2946 sizeof(dictviewobject), /* tp_basicsize */
2947 0, /* tp_itemsize */
2948 /* methods */
2949 (destructor)dictview_dealloc, /* tp_dealloc */
2950 0, /* tp_print */
2951 0, /* tp_getattr */
2952 0, /* tp_setattr */
2953 0, /* tp_reserved */
2954 (reprfunc)dictview_repr, /* tp_repr */
2955 0, /* tp_as_number */
2956 &dictvalues_as_sequence, /* tp_as_sequence */
2957 0, /* tp_as_mapping */
2958 0, /* tp_hash */
2959 0, /* tp_call */
2960 0, /* tp_str */
2961 PyObject_GenericGetAttr, /* tp_getattro */
2962 0, /* tp_setattro */
2963 0, /* tp_as_buffer */
2964 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2965 0, /* tp_doc */
2966 (traverseproc)dictview_traverse, /* tp_traverse */
2967 0, /* tp_clear */
2968 0, /* tp_richcompare */
2969 0, /* tp_weaklistoffset */
2970 (getiterfunc)dictvalues_iter, /* tp_iter */
2971 0, /* tp_iternext */
2972 dictvalues_methods, /* tp_methods */
2973 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00002974};
2975
2976static PyObject *
2977dictvalues_new(PyObject *dict)
2978{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002979 return dictview_new(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002980}