blob: 5433ff743ba717ac3b248e43b9c06f861af6aefd [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{
20 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);
26}
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
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000055the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
56their 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{
145 return dummy;
146}
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{
160 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);
163}
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{
Christian Heimes23daade02008-02-25 12:39:23 +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);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000179 fprintf(stderr, "%.2f%% reuse rate\n\n",
180 (100.0*count_reuse/(count_alloc+count_reuse)));
181}
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{
192 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)));
198}
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
211#define INIT_NONZERO_DICT_SLOTS(mp) do { \
Tim Petersdea48ec2001-05-22 20:40:22 +0000212 (mp)->ma_table = (mp)->ma_smalltable; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000213 (mp)->ma_mask = PyDict_MINSIZE - 1; \
214 } while(0)
215
216#define EMPTY_TO_MINSIZE(mp) do { \
217 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000218 (mp)->ma_used = (mp)->ma_fill = 0; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000219 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{
232 PyDictObject *op;
233
234 while (numfree) {
235 op = free_list[--numfree];
236 assert(PyDict_CheckExact(op));
237 PyObject_GC_Del(op);
238 }
239}
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{
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000244 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000245 if (dummy == NULL) { /* Auto-initialize dummy */
Neal Norwitz53cbdaa2007-08-23 21:42:55 +0000246 dummy = PyUnicode_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000247 if (dummy == NULL)
248 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000249#ifdef SHOW_CONVERSION_COUNTS
250 Py_AtExit(show_counts);
251#endif
Christian Heimes77c02eb2008-02-09 02:18:51 +0000252#ifdef SHOW_ALLOC_COUNT
253 Py_AtExit(show_alloc);
254#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000255#ifdef SHOW_TRACK_COUNT
256 Py_AtExit(show_track);
257#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000258 }
Christian Heimes2202f872008-02-06 14:31:34 +0000259 if (numfree) {
260 mp = free_list[--numfree];
Raymond Hettinger43442782004-03-17 21:55:03 +0000261 assert (mp != NULL);
Christian Heimes90aa7642007-12-19 02:45:37 +0000262 assert (Py_TYPE(mp) == &PyDict_Type);
Raymond Hettinger43442782004-03-17 21:55:03 +0000263 _Py_NewReference((PyObject *)mp);
264 if (mp->ma_fill) {
265 EMPTY_TO_MINSIZE(mp);
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000266 } 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);
Raymond Hettinger43442782004-03-17 21:55:03 +0000270 }
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
275 count_reuse++;
276#endif
Raymond Hettinger43442782004-03-17 21:55:03 +0000277 } else {
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000278 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
Raymond Hettinger43442782004-03-17 21:55:03 +0000279 if (mp == NULL)
280 return NULL;
281 EMPTY_TO_MINSIZE(mp);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000282#ifdef SHOW_ALLOC_COUNT
283 count_alloc++;
284#endif
Raymond Hettinger43442782004-03-17 21:55:03 +0000285 }
Guido van Rossum89d8c602007-09-18 17:26:56 +0000286 mp->ma_lookup = lookdict_unicode;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000287#ifdef SHOW_TRACK_COUNT
288 count_untracked++;
289#endif
Fred Drake1bff34a2000-08-31 19:31:38 +0000290#ifdef SHOW_CONVERSION_COUNTS
291 ++created;
292#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +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{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000323 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000324 register size_t perturb;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000325 register PyDictEntry *freeslot;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000326 register size_t mask = (size_t)mp->ma_mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000327 PyDictEntry *ep0 = mp->ma_table;
328 register PyDictEntry *ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000329 register int cmp;
Tim Peters453163d2001-06-03 04:54:32 +0000330 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000331
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000332 i = (size_t)hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000333 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000334 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000335 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000336
Guido van Rossum16e93a81997-01-28 00:00:11 +0000337 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000338 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000339 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000340 if (ep->me_hash == hash) {
Tim Peters453163d2001-06-03 04:54:32 +0000341 startkey = ep->me_key;
Guido van Rossum2fd4f372007-11-29 18:43:05 +0000342 Py_INCREF(startkey);
Tim Peters453163d2001-06-03 04:54:32 +0000343 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Guido van Rossum2fd4f372007-11-29 18:43:05 +0000344 Py_DECREF(startkey);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000345 if (cmp < 0)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000346 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000347 if (ep0 == mp->ma_table && ep->me_key == startkey) {
348 if (cmp > 0)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000349 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000350 }
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 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000357 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000358 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000359 }
360 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000361 }
Tim Peters15d49292001-05-27 07:39:22 +0000362
Tim Peters342c65e2001-05-13 06:43:53 +0000363 /* In the loop, me_key == dummy is by far (factor of 100s) the
364 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000365 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
366 i = (i << 2) + i + perturb + 1;
367 ep = &ep0[i & mask];
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000368 if (ep->me_key == NULL)
369 return freeslot == NULL ? ep : freeslot;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000370 if (ep->me_key == key)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000371 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000372 if (ep->me_hash == hash && ep->me_key != dummy) {
Tim Peters453163d2001-06-03 04:54:32 +0000373 startkey = ep->me_key;
Guido van Rossum2fd4f372007-11-29 18:43:05 +0000374 Py_INCREF(startkey);
Tim Peters453163d2001-06-03 04:54:32 +0000375 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Guido van Rossum2fd4f372007-11-29 18:43:05 +0000376 Py_DECREF(startkey);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000377 if (cmp < 0)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000378 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000379 if (ep0 == mp->ma_table && ep->me_key == startkey) {
380 if (cmp > 0)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000381 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000382 }
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 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000389 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000390 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000391 }
Tim Peters342c65e2001-05-13 06:43:53 +0000392 else if (ep->me_key == dummy && freeslot == NULL)
393 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000394 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000395 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{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000412 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000413 register size_t perturb;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000414 register PyDictEntry *freeslot;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000415 register size_t mask = (size_t)mp->ma_mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000416 PyDictEntry *ep0 = mp->ma_table;
417 register PyDictEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000418
Guido van Rossum89d8c602007-09-18 17:26:56 +0000419 /* Make sure this function doesn't have to handle non-unicode keys,
Tim Peters0ab085c2001-09-14 00:25:33 +0000420 including subclasses of str; e.g., one reason to subclass
Guido van Rossum89d8c602007-09-18 17:26:56 +0000421 unicodes is to override __eq__, and for speed we don't cater to
Tim Peters0ab085c2001-09-14 00:25:33 +0000422 that here. */
Guido van Rossum89d8c602007-09-18 17:26:56 +0000423 if (!PyUnicode_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000424#ifdef SHOW_CONVERSION_COUNTS
425 ++converted;
426#endif
427 mp->ma_lookup = lookdict;
428 return lookdict(mp, key, hash);
429 }
Tim Peters2f228e72001-05-13 00:19:31 +0000430 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000431 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 {
Guido van Rossum89d8c602007-09-18 17:26:56 +0000437 if (ep->me_hash == hash && unicode_eq(ep->me_key, key))
Fred Drake1bff34a2000-08-31 19:31:38 +0000438 return ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000439 freeslot = NULL;
440 }
Tim Peters15d49292001-05-27 07:39:22 +0000441
Tim Peters342c65e2001-05-13 06:43:53 +0000442 /* In the loop, me_key == dummy is by far (factor of 100s) the
443 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000444 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
445 i = (i << 2) + i + perturb + 1;
446 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000447 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
Guido van Rossum89d8c602007-09-18 17:26:56 +0000452 && unicode_eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000453 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000454 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000455 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000456 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000457 assert(0); /* NOT REACHED */
458 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000459}
460
Benjamin Petersonfb886362010-04-24 18:21:17 +0000461int
462_PyDict_HasOnlyStringKeys(PyObject *dict)
463{
464 Py_ssize_t pos = 0;
465 PyObject *key, *value;
466 assert(PyDict_CheckExact(dict));
467 /* Shortcut */
468 if (((PyDictObject *)dict)->ma_lookup == lookdict_unicode)
469 return 1;
470 while (PyDict_Next(dict, &pos, &key, &value))
471 if (!PyUnicode_Check(key))
472 return 0;
473 return 1;
474}
475
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000476#ifdef SHOW_TRACK_COUNT
477#define INCREASE_TRACK_COUNT \
478 (count_tracked++, count_untracked--);
479#define DECREASE_TRACK_COUNT \
480 (count_tracked--, count_untracked++);
481#else
482#define INCREASE_TRACK_COUNT
483#define DECREASE_TRACK_COUNT
484#endif
485
486#define MAINTAIN_TRACKING(mp, key, value) \
487 do { \
488 if (!_PyObject_GC_IS_TRACKED(mp)) { \
489 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
490 _PyObject_GC_MAY_BE_TRACKED(value)) { \
491 _PyObject_GC_TRACK(mp); \
492 INCREASE_TRACK_COUNT \
493 } \
494 } \
495 } while(0)
496
497void
498_PyDict_MaybeUntrack(PyObject *op)
499{
500 PyDictObject *mp;
501 PyObject *value;
502 Py_ssize_t mask, i;
503 PyDictEntry *ep;
504
505 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
506 return;
507
508 mp = (PyDictObject *) op;
509 ep = mp->ma_table;
510 mask = mp->ma_mask;
511 for (i = 0; i <= mask; i++) {
512 if ((value = ep[i].me_value) == NULL)
513 continue;
514 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
515 _PyObject_GC_MAY_BE_TRACKED(ep[i].me_key))
516 return;
517 }
Antoine Pitrouacc5d6b2009-03-23 19:19:54 +0000518 DECREASE_TRACK_COUNT
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000519 _PyObject_GC_UNTRACK(op);
520}
521
522
Fred Drake1bff34a2000-08-31 19:31:38 +0000523/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000524Internal routine to insert a new item into the table.
525Used both by the internal resize routine and by the public insert routine.
526Eats a reference to key and one to value.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000527Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000528*/
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000529static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000530insertdict(register PyDictObject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000531{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 PyObject *old_value;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000533 register PyDictEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000534 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
535
536 assert(mp->ma_lookup != NULL);
537 ep = mp->ma_lookup(mp, key, hash);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000538 if (ep == NULL) {
539 Py_DECREF(key);
540 Py_DECREF(value);
541 return -1;
542 }
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000543 MAINTAIN_TRACKING(mp, key, value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000544 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000545 old_value = ep->me_value;
546 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 Py_DECREF(old_value); /* which **CAN** re-enter */
548 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000549 }
550 else {
551 if (ep->me_key == NULL)
552 mp->ma_fill++;
Raymond Hettinger07ead172005-02-05 23:42:57 +0000553 else {
554 assert(ep->me_key == dummy);
555 Py_DECREF(dummy);
556 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000557 ep->me_key = key;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000558 ep->me_hash = (Py_ssize_t)hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000559 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000560 mp->ma_used++;
561 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000562 return 0;
563}
564
565/*
566Internal routine used by dictresize() to insert an item which is
567known to be absent from the dict. This routine also assumes that
568the dict contains no deleted entries. Besides the performance benefit,
569using insertdict() in dictresize() is dangerous (SF bug #1456209).
570Note that no refcounts are changed by this routine; if needed, the caller
571is responsible for incref'ing `key` and `value`.
572*/
573static void
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000574insertdict_clean(register PyDictObject *mp, PyObject *key, long hash,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000575 PyObject *value)
576{
577 register size_t i;
578 register size_t perturb;
579 register size_t mask = (size_t)mp->ma_mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000580 PyDictEntry *ep0 = mp->ma_table;
581 register PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000582
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000583 MAINTAIN_TRACKING(mp, key, value);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000584 i = hash & mask;
585 ep = &ep0[i];
586 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
587 i = (i << 2) + i + perturb + 1;
588 ep = &ep0[i & mask];
589 }
590 assert(ep->me_value == NULL);
591 mp->ma_fill++;
592 ep->me_key = key;
593 ep->me_hash = (Py_ssize_t)hash;
594 ep->me_value = value;
595 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000596}
597
598/*
599Restructure the table by allocating a new table and reinserting all
600items again. When entries have been deleted, the new table may
601actually be smaller than the old one.
602*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000603static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000604dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000605{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000606 Py_ssize_t newsize;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000607 PyDictEntry *oldtable, *newtable, *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000608 Py_ssize_t i;
Tim Peters0c6010b2001-05-23 23:33:57 +0000609 int is_oldtable_malloced;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000610 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000611
612 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000613
Tim Peterseb28ef22001-06-02 05:27:19 +0000614 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000615 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000616 newsize <= minused && newsize > 0;
617 newsize <<= 1)
618 ;
619 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000621 return -1;
622 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000623
624 /* Get space for a new table. */
625 oldtable = mp->ma_table;
626 assert(oldtable != NULL);
627 is_oldtable_malloced = oldtable != mp->ma_smalltable;
628
Tim Peters6d6c1a32001-08-02 04:15:00 +0000629 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000630 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000631 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000632 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000633 if (mp->ma_fill == mp->ma_used) {
634 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000635 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000636 }
637 /* We're not going to resize it, but rebuild the
638 table anyway to purge old dummy entries.
639 Subtle: This is *necessary* if fill==size,
640 as lookdict needs at least one virgin slot to
641 terminate failing searches. If fill < size, it's
642 merely desirable, as dummies slow searches. */
643 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000644 memcpy(small_copy, oldtable, sizeof(small_copy));
645 oldtable = small_copy;
646 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000647 }
648 else {
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000649 newtable = PyMem_NEW(PyDictEntry, newsize);
Tim Petersdea48ec2001-05-22 20:40:22 +0000650 if (newtable == NULL) {
651 PyErr_NoMemory();
652 return -1;
653 }
654 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000655
656 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000657 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000658 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000659 mp->ma_mask = newsize - 1;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000660 memset(newtable, 0, sizeof(PyDictEntry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000661 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000662 i = mp->ma_fill;
663 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000664
Tim Peters19283142001-05-17 22:25:34 +0000665 /* Copy the data over; this is refcount-neutral for active entries;
666 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000667 for (ep = oldtable; i > 0; ep++) {
668 if (ep->me_value != NULL) { /* active entry */
669 --i;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000670 insertdict_clean(mp, ep->me_key, (long)ep->me_hash,
671 ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000672 }
Tim Peters19283142001-05-17 22:25:34 +0000673 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000674 --i;
Tim Peters19283142001-05-17 22:25:34 +0000675 assert(ep->me_key == dummy);
676 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000677 }
Tim Peters19283142001-05-17 22:25:34 +0000678 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000679 }
680
Tim Peters0c6010b2001-05-23 23:33:57 +0000681 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000682 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000683 return 0;
684}
685
Christian Heimes99170a52007-12-19 02:07:34 +0000686/* Create a new dictionary pre-sized to hold an estimated number of elements.
687 Underestimates are okay because the dictionary will resize as necessary.
688 Overestimates just mean the dictionary will be more sparse than usual.
689*/
690
691PyObject *
692_PyDict_NewPresized(Py_ssize_t minused)
693{
694 PyObject *op = PyDict_New();
695
696 if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
697 Py_DECREF(op);
698 return NULL;
699 }
700 return op;
701}
702
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000703/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
704 * that may occur (originally dicts supported only string keys, and exceptions
705 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000706 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000707 * (suppressed) occurred while computing the key's hash, or that some error
708 * (suppressed) occurred when comparing keys in the dict's internal probe
709 * sequence. A nasty example of the latter is when a Python-coded comparison
710 * function hits a stack-depth error, which can cause this to return NULL
711 * even if the key is present.
712 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000714PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000715{
716 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000717 PyDictObject *mp = (PyDictObject *)op;
718 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000719 PyThreadState *tstate;
720 if (!PyDict_Check(op))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000721 return NULL;
Guido van Rossum4d027722007-09-18 04:30:42 +0000722 if (!PyUnicode_CheckExact(key) ||
723 (hash = ((PyUnicodeObject *) key)->hash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000724 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000726 if (hash == -1) {
727 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000728 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000729 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000730 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000731
Benjamin Peterson9d7c3cd2009-07-21 14:11:27 +0000732 /* We can arrive here with a NULL tstate during initialization: try
733 running "python -Wi" for an example related to string interning.
734 Let's just hope that no exception occurs then... This must be
735 _PyThreadState_Current and not PyThreadState_GET() because in debug
Alexandre Vassalottie223eb82009-07-29 20:12:15 +0000736 mode, the latter complains if tstate is NULL. */
Benjamin Peterson9d7c3cd2009-07-21 14:11:27 +0000737 tstate = _PyThreadState_Current;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000738 if (tstate != NULL && tstate->curexc_type != NULL) {
739 /* preserve the existing exception */
740 PyObject *err_type, *err_value, *err_tb;
741 PyErr_Fetch(&err_type, &err_value, &err_tb);
742 ep = (mp->ma_lookup)(mp, key, hash);
743 /* ignore errors */
744 PyErr_Restore(err_type, err_value, err_tb);
745 if (ep == NULL)
746 return NULL;
747 }
748 else {
749 ep = (mp->ma_lookup)(mp, key, hash);
750 if (ep == NULL) {
751 PyErr_Clear();
752 return NULL;
753 }
754 }
755 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000756}
757
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000758/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
759 This returns NULL *with* an exception set if an exception occurred.
760 It returns NULL *without* an exception set if the key wasn't present.
761*/
762PyObject *
763PyDict_GetItemWithError(PyObject *op, PyObject *key)
764{
765 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000766 PyDictObject*mp = (PyDictObject *)op;
767 PyDictEntry *ep;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000768
769 if (!PyDict_Check(op)) {
770 PyErr_BadInternalCall();
771 return NULL;
772 }
Guido van Rossum89d8c602007-09-18 17:26:56 +0000773 if (!PyUnicode_CheckExact(key) ||
774 (hash = ((PyUnicodeObject *) key)->hash) == -1)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000775 {
776 hash = PyObject_Hash(key);
777 if (hash == -1) {
778 return NULL;
779 }
780 }
781
782 ep = (mp->ma_lookup)(mp, key, hash);
783 if (ep == NULL)
784 return NULL;
785 return ep->me_value;
786}
787
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000788/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000789 * dictionary if it's merely replacing the value for an existing key.
790 * This means that it's safe to loop over a dictionary with PyDict_Next()
791 * and occasionally replace a value -- but you can't insert new keys or
792 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000793 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000794int
Tim Peters1f5871e2000-07-04 17:44:48 +0000795PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000796{
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000797 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000798 register long hash;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000799 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000800
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 if (!PyDict_Check(op)) {
802 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000803 return -1;
804 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000805 assert(key);
806 assert(value);
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000807 mp = (PyDictObject *)op;
Guido van Rossum4d027722007-09-18 04:30:42 +0000808 if (!PyUnicode_CheckExact(key) ||
809 (hash = ((PyUnicodeObject *) key)->hash) == -1)
810 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000811 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000812 if (hash == -1)
813 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000814 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000815 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000816 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 Py_INCREF(value);
818 Py_INCREF(key);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000819 if (insertdict(mp, key, hash, value) != 0)
820 return -1;
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000821 /* If we added a key, we can safely resize. Otherwise just return!
822 * If fill >= 2/3 size, adjust size. Normally, this doubles or
823 * quaduples the size, but it's also possible for the dict to shrink
Tim Peters60b29962006-01-01 01:19:23 +0000824 * (if ma_fill is much larger than ma_used, meaning a lot of dict
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000825 * keys have been * deleted).
Tim Peters60b29962006-01-01 01:19:23 +0000826 *
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000827 * Quadrupling the size improves average dictionary sparseness
828 * (reducing collisions) at the cost of some memory and iteration
829 * speed (which loops over every possible entry). It also halves
830 * the number of expensive resize operations in a growing dictionary.
Tim Peters60b29962006-01-01 01:19:23 +0000831 *
832 * Very large dictionaries (over 50K items) use doubling instead.
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000833 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000834 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000835 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
836 return 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000837 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000838}
839
840int
Tim Peters1f5871e2000-07-04 17:44:48 +0000841PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000842{
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000843 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000844 register long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000845 register PyDictEntry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000847
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848 if (!PyDict_Check(op)) {
849 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000850 return -1;
851 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000852 assert(key);
Guido van Rossum89d8c602007-09-18 17:26:56 +0000853 if (!PyUnicode_CheckExact(key) ||
854 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000856 if (hash == -1)
857 return -1;
858 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000859 mp = (PyDictObject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000860 ep = (mp->ma_lookup)(mp, key, hash);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000861 if (ep == NULL)
862 return -1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000863 if (ep->me_value == NULL) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000864 set_key_error(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000865 return -1;
866 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000867 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000869 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000870 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000871 ep->me_value = NULL;
872 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000873 Py_DECREF(old_value);
874 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000875 return 0;
876}
877
Guido van Rossum25831651993-05-19 14:50:45 +0000878void
Tim Peters1f5871e2000-07-04 17:44:48 +0000879PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000880{
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000881 PyDictObject *mp;
882 PyDictEntry *ep, *table;
Tim Petersdea48ec2001-05-22 20:40:22 +0000883 int table_is_malloced;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000884 Py_ssize_t fill;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000885 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000886#ifdef Py_DEBUG
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000887 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000888#endif
889
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000891 return;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000892 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000893#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000894 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000895 i = 0;
896#endif
897
898 table = mp->ma_table;
899 assert(table != NULL);
900 table_is_malloced = table != mp->ma_smalltable;
901
902 /* This is delicate. During the process of clearing the dict,
903 * decrefs can cause the dict to mutate. To avoid fatal confusion
904 * (voice of experience), we have to make the dict empty before
905 * clearing the slots, and never refer to anything via mp->xxx while
906 * clearing.
907 */
908 fill = mp->ma_fill;
909 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000910 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000911
912 else if (fill > 0) {
913 /* It's a small table with something that needs to be cleared.
914 * Afraid the only safe way is to copy the dict entries into
915 * another small table first.
916 */
917 memcpy(small_copy, table, sizeof(small_copy));
918 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000919 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000920 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000921 /* else it's a small table that's already empty */
922
923 /* Now we can finally clear things. If C had refcounts, we could
924 * assert that the refcount on table is 1 now, i.e. that this function
925 * has unique access to it, so decref side-effects can't alter it.
926 */
927 for (ep = table; fill > 0; ++ep) {
928#ifdef Py_DEBUG
929 assert(i < n);
930 ++i;
931#endif
932 if (ep->me_key) {
933 --fill;
934 Py_DECREF(ep->me_key);
935 Py_XDECREF(ep->me_value);
936 }
937#ifdef Py_DEBUG
938 else
939 assert(ep->me_value == NULL);
940#endif
941 }
942
943 if (table_is_malloced)
944 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000945}
946
Tim Peters080c88b2003-02-15 03:01:11 +0000947/*
948 * Iterate over a dict. Use like so:
949 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000950 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000951 * PyObject *key, *value;
952 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000953 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000954 * Refer to borrowed references in key and value.
955 * }
956 *
957 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000958 * mutates the dict. One exception: it is safe if the loop merely changes
959 * the values associated with the keys (but doesn't insert new keys or
960 * delete keys), via PyDict_SetItem().
961 */
Guido van Rossum25831651993-05-19 14:50:45 +0000962int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000963PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000964{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000965 register Py_ssize_t i;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000966 register Py_ssize_t mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000967 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000968
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000970 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000971 i = *ppos;
972 if (i < 0)
973 return 0;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000974 ep = ((PyDictObject *)op)->ma_table;
975 mask = ((PyDictObject *)op)->ma_mask;
Raymond Hettinger43442782004-03-17 21:55:03 +0000976 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000977 i++;
978 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000979 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000980 return 0;
981 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000982 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000983 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000984 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000985 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000986}
987
Thomas Wouterscf297e42007-02-23 15:07:44 +0000988/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
989int
990_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, long *phash)
991{
992 register Py_ssize_t i;
993 register Py_ssize_t mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000994 register PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +0000995
996 if (!PyDict_Check(op))
997 return 0;
998 i = *ppos;
999 if (i < 0)
1000 return 0;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001001 ep = ((PyDictObject *)op)->ma_table;
1002 mask = ((PyDictObject *)op)->ma_mask;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001003 while (i <= mask && ep[i].me_value == NULL)
1004 i++;
1005 *ppos = i+1;
1006 if (i > mask)
1007 return 0;
1008 *phash = (long)(ep[i].me_hash);
1009 if (pkey)
1010 *pkey = ep[i].me_key;
1011 if (pvalue)
1012 *pvalue = ep[i].me_value;
1013 return 1;
1014}
1015
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001016/* Methods */
1017
1018static void
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001019dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001020{
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001021 register PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001022 Py_ssize_t fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +00001023 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +00001024 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +00001025 for (ep = mp->ma_table; fill > 0; ep++) {
1026 if (ep->me_key) {
1027 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +00001029 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +00001030 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001031 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001032 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001033 PyMem_DEL(mp->ma_table);
Christian Heimes2202f872008-02-06 14:31:34 +00001034 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1035 free_list[numfree++] = mp;
Tim Peters60b29962006-01-01 01:19:23 +00001036 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001037 Py_TYPE(mp)->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +00001038 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001039}
1040
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001042dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001043{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001044 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +00001045 PyObject *s, *temp, *colon = NULL;
1046 PyObject *pieces = NULL, *result = NULL;
1047 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001048
Tim Petersa7259592001-06-16 05:11:17 +00001049 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +00001050 if (i != 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +00001051 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +00001052 }
1053
Tim Petersa7259592001-06-16 05:11:17 +00001054 if (mp->ma_used == 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +00001055 result = PyUnicode_FromString("{}");
Tim Petersa7259592001-06-16 05:11:17 +00001056 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001057 }
Tim Petersa7259592001-06-16 05:11:17 +00001058
1059 pieces = PyList_New(0);
1060 if (pieces == NULL)
1061 goto Done;
1062
Walter Dörwald1ab83302007-05-18 17:15:44 +00001063 colon = PyUnicode_FromString(": ");
Tim Petersa7259592001-06-16 05:11:17 +00001064 if (colon == NULL)
1065 goto Done;
1066
1067 /* Do repr() on each key+value pair, and insert ": " between them.
1068 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +00001069 i = 0;
1070 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +00001071 int status;
1072 /* Prevent repr from deleting value during key format. */
1073 Py_INCREF(value);
1074 s = PyObject_Repr(key);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001075 PyUnicode_Append(&s, colon);
1076 PyUnicode_AppendAndDel(&s, PyObject_Repr(value));
Tim Petersa7259592001-06-16 05:11:17 +00001077 Py_DECREF(value);
1078 if (s == NULL)
1079 goto Done;
1080 status = PyList_Append(pieces, s);
1081 Py_DECREF(s); /* append created a new ref */
1082 if (status < 0)
1083 goto Done;
1084 }
1085
1086 /* Add "{}" decorations to the first and last items. */
1087 assert(PyList_GET_SIZE(pieces) > 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001088 s = PyUnicode_FromString("{");
Tim Petersa7259592001-06-16 05:11:17 +00001089 if (s == NULL)
1090 goto Done;
1091 temp = PyList_GET_ITEM(pieces, 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001092 PyUnicode_AppendAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +00001093 PyList_SET_ITEM(pieces, 0, s);
1094 if (s == NULL)
1095 goto Done;
1096
Walter Dörwald1ab83302007-05-18 17:15:44 +00001097 s = PyUnicode_FromString("}");
Tim Petersa7259592001-06-16 05:11:17 +00001098 if (s == NULL)
1099 goto Done;
1100 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001101 PyUnicode_AppendAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +00001102 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1103 if (temp == NULL)
1104 goto Done;
1105
1106 /* Paste them all together with ", " between. */
Walter Dörwald1ab83302007-05-18 17:15:44 +00001107 s = PyUnicode_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +00001108 if (s == NULL)
1109 goto Done;
Walter Dörwald1ab83302007-05-18 17:15:44 +00001110 result = PyUnicode_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +00001111 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001112
1113Done:
1114 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001115 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +00001116 Py_ReprLeave((PyObject *)mp);
1117 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001118}
1119
Martin v. Löwis18e16552006-02-15 17:27:45 +00001120static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001121dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001122{
1123 return mp->ma_used;
1124}
1125
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001126static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001127dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001128{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001129 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001130 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001131 PyDictEntry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +00001132 assert(mp->ma_table != NULL);
Guido van Rossum89d8c602007-09-18 17:26:56 +00001133 if (!PyUnicode_CheckExact(key) ||
1134 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001136 if (hash == -1)
1137 return NULL;
1138 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001139 ep = (mp->ma_lookup)(mp, key, hash);
1140 if (ep == NULL)
1141 return NULL;
1142 v = ep->me_value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001143 if (v == NULL) {
1144 if (!PyDict_CheckExact(mp)) {
1145 /* Look up __missing__ method if we're a subclass. */
Benjamin Peterson0ffaaa62009-05-27 03:18:19 +00001146 PyObject *missing, *res;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001147 static PyObject *missing_str = NULL;
Benjamin Petersona7205592009-05-27 03:08:59 +00001148 missing = _PyObject_LookupSpecial((PyObject *)mp,
1149 "__missing__",
1150 &missing_str);
Benjamin Peterson0ffaaa62009-05-27 03:18:19 +00001151 if (missing != NULL) {
1152 res = PyObject_CallFunctionObjArgs(missing,
1153 key, NULL);
1154 Py_DECREF(missing);
1155 return res;
1156 }
Benjamin Petersona7205592009-05-27 03:08:59 +00001157 else if (PyErr_Occurred())
1158 return NULL;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001159 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001160 set_key_error(key);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001161 return NULL;
1162 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001163 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001164 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001165 return v;
1166}
1167
1168static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001169dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001170{
1171 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001172 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001173 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001175}
1176
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001177static PyMappingMethods dict_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001178 (lenfunc)dict_length, /*mp_length*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001179 (binaryfunc)dict_subscript, /*mp_subscript*/
1180 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001181};
1182
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001183static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001184dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001185{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186 register PyObject *v;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001187 register Py_ssize_t i, j;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001188 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001189 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001190
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001191 again:
1192 n = mp->ma_used;
1193 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001194 if (v == NULL)
1195 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001196 if (n != mp->ma_used) {
1197 /* Durnit. The allocations caused the dict to resize.
1198 * Just start over, this shouldn't normally happen.
1199 */
1200 Py_DECREF(v);
1201 goto again;
1202 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001203 ep = mp->ma_table;
1204 mask = mp->ma_mask;
1205 for (i = 0, j = 0; i <= mask; i++) {
1206 if (ep[i].me_value != NULL) {
1207 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001209 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001210 j++;
1211 }
1212 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001213 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001214 return v;
1215}
1216
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001217static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001218dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001219{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220 register PyObject *v;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001221 register Py_ssize_t i, j;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001222 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001223 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001224
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001225 again:
1226 n = mp->ma_used;
1227 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001228 if (v == NULL)
1229 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001230 if (n != mp->ma_used) {
1231 /* Durnit. The allocations caused the dict to resize.
1232 * Just start over, this shouldn't normally happen.
1233 */
1234 Py_DECREF(v);
1235 goto again;
1236 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001237 ep = mp->ma_table;
1238 mask = mp->ma_mask;
1239 for (i = 0, j = 0; i <= mask; i++) {
1240 if (ep[i].me_value != NULL) {
1241 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001243 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001244 j++;
1245 }
1246 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001247 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001248 return v;
1249}
1250
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001252dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001253{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 register PyObject *v;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001255 register Py_ssize_t i, j, n;
1256 Py_ssize_t mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001257 PyObject *item, *key, *value;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001258 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001259
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001260 /* Preallocate the list of tuples, to avoid allocations during
1261 * the loop over the items, which could trigger GC, which
1262 * could resize the dict. :-(
1263 */
1264 again:
1265 n = mp->ma_used;
1266 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001267 if (v == NULL)
1268 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001269 for (i = 0; i < n; i++) {
1270 item = PyTuple_New(2);
1271 if (item == NULL) {
1272 Py_DECREF(v);
1273 return NULL;
1274 }
1275 PyList_SET_ITEM(v, i, item);
1276 }
1277 if (n != mp->ma_used) {
1278 /* Durnit. The allocations caused the dict to resize.
1279 * Just start over, this shouldn't normally happen.
1280 */
1281 Py_DECREF(v);
1282 goto again;
1283 }
1284 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001285 ep = mp->ma_table;
1286 mask = mp->ma_mask;
1287 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001288 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001289 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001290 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001291 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001292 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001293 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001294 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001295 j++;
1296 }
1297 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001298 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001299 return v;
1300}
1301
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001302static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001303dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001304{
1305 PyObject *seq;
1306 PyObject *value = Py_None;
1307 PyObject *it; /* iter(seq) */
1308 PyObject *key;
1309 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001310 int status;
1311
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001312 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001313 return NULL;
1314
1315 d = PyObject_CallObject(cls, NULL);
1316 if (d == NULL)
1317 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001318
Guido van Rossum58da9312007-11-10 23:39:45 +00001319 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1320 PyDictObject *mp = (PyDictObject *)d;
1321 PyObject *oldvalue;
1322 Py_ssize_t pos = 0;
1323 PyObject *key;
1324 long hash;
1325
Benjamin Peterson41181742008-07-02 20:22:54 +00001326 if (dictresize(mp, Py_SIZE(seq)))
Guido van Rossum58da9312007-11-10 23:39:45 +00001327 return NULL;
1328
1329 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1330 Py_INCREF(key);
1331 Py_INCREF(value);
1332 if (insertdict(mp, key, hash, value))
1333 return NULL;
1334 }
1335 return d;
1336 }
1337
Guido van Rossumd8faa362007-04-27 19:54:29 +00001338 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001339 PyDictObject *mp = (PyDictObject *)d;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001340 Py_ssize_t pos = 0;
1341 PyObject *key;
1342 long hash;
1343
1344 if (dictresize(mp, PySet_GET_SIZE(seq)))
1345 return NULL;
1346
1347 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1348 Py_INCREF(key);
1349 Py_INCREF(value);
1350 if (insertdict(mp, key, hash, value))
1351 return NULL;
1352 }
1353 return d;
1354 }
1355
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001356 it = PyObject_GetIter(seq);
1357 if (it == NULL){
1358 Py_DECREF(d);
1359 return NULL;
1360 }
1361
Guido van Rossum58da9312007-11-10 23:39:45 +00001362 if (PyDict_CheckExact(d)) {
1363 while ((key = PyIter_Next(it)) != NULL) {
1364 status = PyDict_SetItem(d, key, value);
1365 Py_DECREF(key);
1366 if (status < 0)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001367 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001368 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001369 } else {
1370 while ((key = PyIter_Next(it)) != NULL) {
1371 status = PyObject_SetItem(d, key, value);
1372 Py_DECREF(key);
1373 if (status < 0)
1374 goto Fail;
1375 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001376 }
1377
Guido van Rossum58da9312007-11-10 23:39:45 +00001378 if (PyErr_Occurred())
1379 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001380 Py_DECREF(it);
1381 return d;
1382
1383Fail:
1384 Py_DECREF(it);
1385 Py_DECREF(d);
1386 return NULL;
1387}
1388
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001389static int
1390dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001391{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001392 PyObject *arg = NULL;
1393 int result = 0;
1394
1395 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1396 result = -1;
1397
1398 else if (arg != NULL) {
1399 if (PyObject_HasAttrString(arg, "keys"))
1400 result = PyDict_Merge(self, arg, 1);
1401 else
1402 result = PyDict_MergeFromSeq2(self, arg, 1);
1403 }
Benjamin Petersonfb886362010-04-24 18:21:17 +00001404 if (result == 0 && kwds != NULL) {
1405 if (PyArg_ValidateKeywordArguments(kwds))
1406 result = PyDict_Merge(self, kwds, 1);
1407 else
1408 result = -1;
1409 }
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001410 return result;
1411}
1412
1413static PyObject *
1414dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1415{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001416 if (dict_update_common(self, args, kwds, "update") != -1)
1417 Py_RETURN_NONE;
1418 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001419}
1420
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001421/* Update unconditionally replaces existing items.
1422 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001423 otherwise it leaves existing items unchanged.
1424
1425 PyDict_{Update,Merge} update/merge from a mapping object.
1426
Tim Petersf582b822001-12-11 18:51:08 +00001427 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001428 producing iterable objects of length 2.
1429*/
1430
Tim Petersf582b822001-12-11 18:51:08 +00001431int
Tim Peters1fc240e2001-10-26 05:06:50 +00001432PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1433{
1434 PyObject *it; /* iter(seq2) */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001435 Py_ssize_t i; /* index into seq2 of current element */
Tim Peters1fc240e2001-10-26 05:06:50 +00001436 PyObject *item; /* seq2[i] */
1437 PyObject *fast; /* item as a 2-tuple or 2-list */
1438
1439 assert(d != NULL);
1440 assert(PyDict_Check(d));
1441 assert(seq2 != NULL);
1442
1443 it = PyObject_GetIter(seq2);
1444 if (it == NULL)
1445 return -1;
1446
1447 for (i = 0; ; ++i) {
1448 PyObject *key, *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001449 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001450
1451 fast = NULL;
1452 item = PyIter_Next(it);
1453 if (item == NULL) {
1454 if (PyErr_Occurred())
1455 goto Fail;
1456 break;
1457 }
1458
1459 /* Convert item to sequence, and verify length 2. */
1460 fast = PySequence_Fast(item, "");
1461 if (fast == NULL) {
1462 if (PyErr_ExceptionMatches(PyExc_TypeError))
1463 PyErr_Format(PyExc_TypeError,
1464 "cannot convert dictionary update "
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001465 "sequence element #%zd to a sequence",
Tim Peters1fc240e2001-10-26 05:06:50 +00001466 i);
1467 goto Fail;
1468 }
1469 n = PySequence_Fast_GET_SIZE(fast);
1470 if (n != 2) {
1471 PyErr_Format(PyExc_ValueError,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001472 "dictionary update sequence element #%zd "
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00001473 "has length %zd; 2 is required",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00001474 i, n);
Tim Peters1fc240e2001-10-26 05:06:50 +00001475 goto Fail;
1476 }
1477
1478 /* Update/merge with this (key, value) pair. */
1479 key = PySequence_Fast_GET_ITEM(fast, 0);
1480 value = PySequence_Fast_GET_ITEM(fast, 1);
1481 if (override || PyDict_GetItem(d, key) == NULL) {
1482 int status = PyDict_SetItem(d, key, value);
1483 if (status < 0)
1484 goto Fail;
1485 }
1486 Py_DECREF(fast);
1487 Py_DECREF(item);
1488 }
1489
1490 i = 0;
1491 goto Return;
1492Fail:
1493 Py_XDECREF(item);
1494 Py_XDECREF(fast);
1495 i = -1;
1496Return:
1497 Py_DECREF(it);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001498 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001499}
1500
Tim Peters6d6c1a32001-08-02 04:15:00 +00001501int
1502PyDict_Update(PyObject *a, PyObject *b)
1503{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001504 return PyDict_Merge(a, b, 1);
1505}
1506
1507int
1508PyDict_Merge(PyObject *a, PyObject *b, int override)
1509{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001510 register PyDictObject *mp, *other;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001511 register Py_ssize_t i;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001512 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001513
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001514 /* We accept for the argument either a concrete dictionary object,
1515 * or an abstract "mapping" object. For the former, we can do
1516 * things quite efficiently. For the latter, we only require that
1517 * PyMapping_Keys() and PyObject_GetItem() be supported.
1518 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001519 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1520 PyErr_BadInternalCall();
1521 return -1;
1522 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001523 mp = (PyDictObject*)a;
Christian Heimesaf98da12008-01-27 15:18:18 +00001524 if (PyDict_Check(b)) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001525 other = (PyDictObject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001526 if (other == mp || other->ma_used == 0)
1527 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001528 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001529 if (mp->ma_used == 0)
1530 /* Since the target dict is empty, PyDict_GetItem()
1531 * always returns NULL. Setting override to 1
1532 * skips the unnecessary test.
1533 */
1534 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001535 /* Do one big resize at the start, rather than
1536 * incrementally resizing as we insert new items. Expect
1537 * that there will be no (or few) overlapping keys.
1538 */
1539 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001540 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001541 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001542 }
1543 for (i = 0; i <= other->ma_mask; i++) {
1544 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001545 if (entry->me_value != NULL &&
1546 (override ||
1547 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001548 Py_INCREF(entry->me_key);
1549 Py_INCREF(entry->me_value);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001550 if (insertdict(mp, entry->me_key,
1551 (long)entry->me_hash,
1552 entry->me_value) != 0)
1553 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001554 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001555 }
1556 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001557 else {
1558 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001559 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001560 PyObject *iter;
1561 PyObject *key, *value;
1562 int status;
1563
1564 if (keys == NULL)
1565 /* Docstring says this is equivalent to E.keys() so
1566 * if E doesn't have a .keys() method we want
1567 * AttributeError to percolate up. Might as well
1568 * do the same for any other error.
1569 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001570 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001571
1572 iter = PyObject_GetIter(keys);
1573 Py_DECREF(keys);
1574 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001575 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001576
1577 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001578 if (!override && PyDict_GetItem(a, key) != NULL) {
1579 Py_DECREF(key);
1580 continue;
1581 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001582 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001583 if (value == NULL) {
1584 Py_DECREF(iter);
1585 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001586 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001587 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001588 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001589 Py_DECREF(key);
1590 Py_DECREF(value);
1591 if (status < 0) {
1592 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001593 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001594 }
1595 }
1596 Py_DECREF(iter);
1597 if (PyErr_Occurred())
1598 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001599 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001600 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001601 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001602}
1603
1604static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001605dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001606{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001607 return PyDict_Copy((PyObject*)mp);
1608}
1609
1610PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001611PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001612{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001613 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001614
1615 if (o == NULL || !PyDict_Check(o)) {
1616 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001617 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001618 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001619 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001620 if (copy == NULL)
1621 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001622 if (PyDict_Merge(copy, o, 1) == 0)
1623 return copy;
1624 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001625 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001626}
1627
Martin v. Löwis18e16552006-02-15 17:27:45 +00001628Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001629PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001630{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001631 if (mp == NULL || !PyDict_Check(mp)) {
1632 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001633 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001634 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001635 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001636}
1637
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001638PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001639PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001640{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001641 if (mp == NULL || !PyDict_Check(mp)) {
1642 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001643 return NULL;
1644 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001645 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001646}
1647
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001648PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001649PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001650{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001651 if (mp == NULL || !PyDict_Check(mp)) {
1652 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001653 return NULL;
1654 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001655 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001656}
1657
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001658PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001659PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001660{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001661 if (mp == NULL || !PyDict_Check(mp)) {
1662 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001663 return NULL;
1664 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001665 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001666}
1667
Tim Peterse63415e2001-05-08 04:38:29 +00001668/* Return 1 if dicts equal, 0 if not, -1 if error.
1669 * Gets out as soon as any difference is detected.
1670 * Uses only Py_EQ comparison.
1671 */
1672static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001673dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001674{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001675 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001676
1677 if (a->ma_used != b->ma_used)
1678 /* can't be equal if # of entries differ */
1679 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001680
Tim Peterse63415e2001-05-08 04:38:29 +00001681 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001682 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001683 PyObject *aval = a->ma_table[i].me_value;
1684 if (aval != NULL) {
1685 int cmp;
1686 PyObject *bval;
1687 PyObject *key = a->ma_table[i].me_key;
1688 /* temporarily bump aval's refcount to ensure it stays
1689 alive until we're done with it */
1690 Py_INCREF(aval);
Guido van Rossumdc5f6b22006-08-24 21:29:26 +00001691 /* ditto for key */
1692 Py_INCREF(key);
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001693 bval = PyDict_GetItemWithError((PyObject *)b, key);
Guido van Rossumdc5f6b22006-08-24 21:29:26 +00001694 Py_DECREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001695 if (bval == NULL) {
1696 Py_DECREF(aval);
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001697 if (PyErr_Occurred())
1698 return -1;
Tim Peterse63415e2001-05-08 04:38:29 +00001699 return 0;
1700 }
1701 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1702 Py_DECREF(aval);
1703 if (cmp <= 0) /* error or not equal */
1704 return cmp;
1705 }
1706 }
1707 return 1;
1708 }
1709
1710static PyObject *
1711dict_richcompare(PyObject *v, PyObject *w, int op)
1712{
1713 int cmp;
1714 PyObject *res;
1715
1716 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1717 res = Py_NotImplemented;
1718 }
1719 else if (op == Py_EQ || op == Py_NE) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001720 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
Tim Peterse63415e2001-05-08 04:38:29 +00001721 if (cmp < 0)
1722 return NULL;
1723 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1724 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001725 else
1726 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001727 Py_INCREF(res);
1728 return res;
1729 }
1730
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001731static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001732dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001733{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001734 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001735 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001736
Guido van Rossum89d8c602007-09-18 17:26:56 +00001737 if (!PyUnicode_CheckExact(key) ||
1738 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001739 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001740 if (hash == -1)
1741 return NULL;
1742 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001743 ep = (mp->ma_lookup)(mp, key, hash);
1744 if (ep == NULL)
1745 return NULL;
1746 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001747}
1748
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001749static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001750dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001751{
1752 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001753 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001754 PyObject *val = NULL;
1755 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001756 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001757
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001758 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001759 return NULL;
1760
Guido van Rossum89d8c602007-09-18 17:26:56 +00001761 if (!PyUnicode_CheckExact(key) ||
1762 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001763 hash = PyObject_Hash(key);
1764 if (hash == -1)
1765 return NULL;
1766 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001767 ep = (mp->ma_lookup)(mp, key, hash);
1768 if (ep == NULL)
1769 return NULL;
1770 val = ep->me_value;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001771 if (val == NULL)
1772 val = failobj;
1773 Py_INCREF(val);
1774 return val;
1775}
1776
1777
1778static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001779dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001780{
1781 PyObject *key;
1782 PyObject *failobj = Py_None;
1783 PyObject *val = NULL;
1784 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001785 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001786
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001787 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001788 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001789
Guido van Rossum89d8c602007-09-18 17:26:56 +00001790 if (!PyUnicode_CheckExact(key) ||
1791 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001792 hash = PyObject_Hash(key);
1793 if (hash == -1)
1794 return NULL;
1795 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001796 ep = (mp->ma_lookup)(mp, key, hash);
1797 if (ep == NULL)
1798 return NULL;
1799 val = ep->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001800 if (val == NULL) {
1801 val = failobj;
1802 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1803 val = NULL;
1804 }
1805 Py_XINCREF(val);
1806 return val;
1807}
1808
1809
1810static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001811dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001812{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001813 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001814 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001815}
1816
Guido van Rossumba6ab842000-12-12 22:02:18 +00001817static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001818dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001819{
1820 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001821 PyDictEntry *ep;
Guido van Rossume027d982002-04-12 15:11:59 +00001822 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001823 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001824
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001825 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1826 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001827 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001828 if (deflt) {
1829 Py_INCREF(deflt);
1830 return deflt;
1831 }
Guido van Rossume027d982002-04-12 15:11:59 +00001832 PyErr_SetString(PyExc_KeyError,
1833 "pop(): dictionary is empty");
1834 return NULL;
1835 }
Guido van Rossum89d8c602007-09-18 17:26:56 +00001836 if (!PyUnicode_CheckExact(key) ||
1837 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossume027d982002-04-12 15:11:59 +00001838 hash = PyObject_Hash(key);
1839 if (hash == -1)
1840 return NULL;
1841 }
1842 ep = (mp->ma_lookup)(mp, key, hash);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001843 if (ep == NULL)
1844 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001845 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001846 if (deflt) {
1847 Py_INCREF(deflt);
1848 return deflt;
1849 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001850 set_key_error(key);
Guido van Rossume027d982002-04-12 15:11:59 +00001851 return NULL;
1852 }
1853 old_key = ep->me_key;
1854 Py_INCREF(dummy);
1855 ep->me_key = dummy;
1856 old_value = ep->me_value;
1857 ep->me_value = NULL;
1858 mp->ma_used--;
1859 Py_DECREF(old_key);
1860 return old_value;
1861}
1862
1863static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001864dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001865{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001866 Py_ssize_t i = 0;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001867 PyDictEntry *ep;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001868 PyObject *res;
1869
Tim Petersf4b33f62001-06-02 05:42:29 +00001870 /* Allocate the result tuple before checking the size. Believe it
1871 * or not, this allocation could trigger a garbage collection which
1872 * could empty the dict, so if we checked the size first and that
1873 * happened, the result would be an infinite loop (searching for an
1874 * entry that no longer exists). Note that the usual popitem()
1875 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001876 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00001877 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001878 */
1879 res = PyTuple_New(2);
1880 if (res == NULL)
1881 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001882 if (mp->ma_used == 0) {
1883 Py_DECREF(res);
1884 PyErr_SetString(PyExc_KeyError,
1885 "popitem(): dictionary is empty");
1886 return NULL;
1887 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001888 /* Set ep to "the first" dict entry with a value. We abuse the hash
1889 * field of slot 0 to hold a search finger:
1890 * If slot 0 has a value, use slot 0.
1891 * Else slot 0 is being used to hold a search finger,
1892 * and we use its hash value as the first index to look.
1893 */
1894 ep = &mp->ma_table[0];
1895 if (ep->me_value == NULL) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001896 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001897 /* The hash field may be a real hash value, or it may be a
1898 * legit search finger, or it may be a once-legit search
1899 * finger that's out of bounds now because it wrapped around
1900 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001901 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001902 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001903 i = 1; /* skip slot 0 */
1904 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1905 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001906 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001907 i = 1;
1908 }
1909 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001910 PyTuple_SET_ITEM(res, 0, ep->me_key);
1911 PyTuple_SET_ITEM(res, 1, ep->me_value);
1912 Py_INCREF(dummy);
1913 ep->me_key = dummy;
1914 ep->me_value = NULL;
1915 mp->ma_used--;
1916 assert(mp->ma_table[0].me_value == NULL);
1917 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001918 return res;
1919}
1920
Jeremy Hylton8caad492000-06-23 14:18:11 +00001921static int
1922dict_traverse(PyObject *op, visitproc visit, void *arg)
1923{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001924 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001925 PyObject *pk;
1926 PyObject *pv;
1927
1928 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001929 Py_VISIT(pk);
1930 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00001931 }
1932 return 0;
1933}
1934
1935static int
1936dict_tp_clear(PyObject *op)
1937{
1938 PyDict_Clear(op);
1939 return 0;
1940}
1941
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001942static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001943
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001944static PyObject *
1945dict_sizeof(PyDictObject *mp)
1946{
1947 Py_ssize_t res;
1948
Robert Schuppenies4d45bfe2008-06-28 23:58:47 +00001949 res = sizeof(PyDictObject);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001950 if (mp->ma_table != mp->ma_smalltable)
1951 res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry);
1952 return PyLong_FromSsize_t(res);
1953}
1954
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001955PyDoc_STRVAR(contains__doc__,
1956"D.__contains__(k) -> True if D has a key k, else False");
1957
1958PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1959
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001960PyDoc_STRVAR(sizeof__doc__,
1961"D.__sizeof__() -> size of D in memory, in bytes");
1962
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001963PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001964"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001965
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001966PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001967"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 +00001968
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001969PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001970"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001971If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001972
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001973PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001974"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000019752-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001976
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001977PyDoc_STRVAR(update__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001978"D.update(E, **F) -> None. Update D from dict/iterable E and F.\n"
1979"If E has a .keys() method, does: for k in E: D[k] = E[k]\n\
1980If E lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
1981In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00001982
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001983PyDoc_STRVAR(fromkeys__doc__,
1984"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1985v defaults to None.");
1986
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001987PyDoc_STRVAR(clear__doc__,
1988"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001989
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001990PyDoc_STRVAR(copy__doc__,
1991"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001992
Guido van Rossumb90c8482007-02-10 01:11:45 +00001993/* Forward */
1994static PyObject *dictkeys_new(PyObject *);
1995static PyObject *dictitems_new(PyObject *);
1996static PyObject *dictvalues_new(PyObject *);
1997
Guido van Rossum45c85d12007-07-27 16:31:40 +00001998PyDoc_STRVAR(keys__doc__,
1999 "D.keys() -> a set-like object providing a view on D's keys");
2000PyDoc_STRVAR(items__doc__,
2001 "D.items() -> a set-like object providing a view on D's items");
2002PyDoc_STRVAR(values__doc__,
2003 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002004
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002005static PyMethodDef mapp_methods[] = {
Guido van Rossume2b70bc2006-08-18 22:13:04 +00002006 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002007 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00002008 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002009 getitem__doc__},
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002010 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2011 sizeof__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00002012 {"get", (PyCFunction)dict_get, METH_VARARGS,
2013 get__doc__},
2014 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2015 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002016 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00002017 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002018 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002019 popitem__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002020 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
Guido van Rossumeff072c2007-02-27 05:47:18 +00002021 keys__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002022 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
Guido van Rossumeff072c2007-02-27 05:47:18 +00002023 items__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002024 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
Guido van Rossumeff072c2007-02-27 05:47:18 +00002025 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002026 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002027 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002028 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2029 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002030 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002031 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002032 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002033 copy__doc__},
2034 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002035};
2036
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002037/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002038int
2039PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002040{
2041 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002042 PyDictObject *mp = (PyDictObject *)op;
2043 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002044
Guido van Rossum89d8c602007-09-18 17:26:56 +00002045 if (!PyUnicode_CheckExact(key) ||
2046 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002047 hash = PyObject_Hash(key);
2048 if (hash == -1)
2049 return -1;
2050 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002051 ep = (mp->ma_lookup)(mp, key, hash);
2052 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002053}
2054
Thomas Wouterscf297e42007-02-23 15:07:44 +00002055/* Internal version of PyDict_Contains used when the hash value is already known */
2056int
2057_PyDict_Contains(PyObject *op, PyObject *key, long hash)
2058{
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002059 PyDictObject *mp = (PyDictObject *)op;
2060 PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002061
2062 ep = (mp->ma_lookup)(mp, key, hash);
2063 return ep == NULL ? -1 : (ep->me_value != NULL);
2064}
2065
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002066/* Hack to implement "key in dict" */
2067static PySequenceMethods dict_as_sequence = {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002068 0, /* sq_length */
2069 0, /* sq_concat */
2070 0, /* sq_repeat */
2071 0, /* sq_item */
2072 0, /* sq_slice */
2073 0, /* sq_ass_item */
2074 0, /* sq_ass_slice */
2075 PyDict_Contains, /* sq_contains */
2076 0, /* sq_inplace_concat */
2077 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002078};
2079
Guido van Rossum09e563a2001-05-01 12:10:21 +00002080static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002081dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2082{
2083 PyObject *self;
2084
2085 assert(type != NULL && type->tp_alloc != NULL);
2086 self = type->tp_alloc(type, 0);
2087 if (self != NULL) {
2088 PyDictObject *d = (PyDictObject *)self;
2089 /* It's guaranteed that tp->alloc zeroed out the struct. */
2090 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2091 INIT_NONZERO_DICT_SLOTS(d);
Guido van Rossum89d8c602007-09-18 17:26:56 +00002092 d->ma_lookup = lookdict_unicode;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002093 /* The object has been implicitely tracked by tp_alloc */
2094 if (type == &PyDict_Type)
2095 _PyObject_GC_UNTRACK(d);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002096#ifdef SHOW_CONVERSION_COUNTS
2097 ++created;
2098#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002099#ifdef SHOW_TRACK_COUNT
2100 if (_PyObject_GC_IS_TRACKED(d))
2101 count_tracked++;
2102 else
2103 count_untracked++;
2104#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002105 }
2106 return self;
2107}
2108
Tim Peters25786c02001-09-02 08:22:48 +00002109static int
2110dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2111{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002112 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002113}
2114
Tim Peters6d6c1a32001-08-02 04:15:00 +00002115static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002116dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002117{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002118 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002119}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002120
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002121PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002122"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002123"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002124" (key, value) pairs\n"
2125"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002126" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002127" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002128" d[k] = v\n"
2129"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2130" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002131
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002132PyTypeObject PyDict_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002133 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Petersa427a2b2001-10-29 22:25:45 +00002134 "dict",
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002135 sizeof(PyDictObject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002136 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00002137 (destructor)dict_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00002138 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002139 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00002140 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002141 0, /* tp_reserved */
Guido van Rossumb9324202001-01-18 00:39:02 +00002142 (reprfunc)dict_repr, /* tp_repr */
2143 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002144 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00002145 &dict_as_mapping, /* tp_as_mapping */
Nick Coghland1abd252008-07-15 15:46:38 +00002146 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00002147 0, /* tp_call */
2148 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002149 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00002150 0, /* tp_setattro */
2151 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002152 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +00002153 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00002154 dictionary_doc, /* tp_doc */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002155 dict_traverse, /* tp_traverse */
2156 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00002157 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002158 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00002159 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002160 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002161 mapp_methods, /* tp_methods */
2162 0, /* tp_members */
2163 0, /* tp_getset */
2164 0, /* tp_base */
2165 0, /* tp_dict */
2166 0, /* tp_descr_get */
2167 0, /* tp_descr_set */
2168 0, /* tp_dictoffset */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002169 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002170 PyType_GenericAlloc, /* tp_alloc */
2171 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002172 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002173};
2174
Guido van Rossum3cca2451997-05-16 14:23:33 +00002175/* For backward compatibility with old dictionary interface */
2176
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002177PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002178PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002179{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002180 PyObject *kv, *rv;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002181 kv = PyUnicode_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002182 if (kv == NULL)
2183 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002184 rv = PyDict_GetItem(v, kv);
2185 Py_DECREF(kv);
2186 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002187}
2188
2189int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002190PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002191{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002192 PyObject *kv;
2193 int err;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002194 kv = PyUnicode_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002195 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002196 return -1;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002197 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002198 err = PyDict_SetItem(v, kv, item);
2199 Py_DECREF(kv);
2200 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002201}
2202
2203int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002204PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002205{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002206 PyObject *kv;
2207 int err;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002208 kv = PyUnicode_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002209 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002210 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002211 err = PyDict_DelItem(v, kv);
2212 Py_DECREF(kv);
2213 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002214}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002215
Raymond Hettinger019a1482004-03-18 02:41:19 +00002216/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002217
2218typedef struct {
2219 PyObject_HEAD
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002220 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002221 Py_ssize_t di_used;
2222 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002223 PyObject* di_result; /* reusable result tuple for iteritems */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002224 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002225} dictiterobject;
2226
2227static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002228dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002229{
2230 dictiterobject *di;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002231 di = PyObject_GC_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002232 if (di == NULL)
2233 return NULL;
2234 Py_INCREF(dict);
2235 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002236 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002237 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002238 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002239 if (itertype == &PyDictIterItem_Type) {
2240 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2241 if (di->di_result == NULL) {
2242 Py_DECREF(di);
2243 return NULL;
2244 }
2245 }
2246 else
2247 di->di_result = NULL;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002248 _PyObject_GC_TRACK(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002249 return (PyObject *)di;
2250}
2251
2252static void
2253dictiter_dealloc(dictiterobject *di)
2254{
Guido van Rossum2147df72002-07-16 20:30:22 +00002255 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002256 Py_XDECREF(di->di_result);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002257 PyObject_GC_Del(di);
2258}
2259
2260static int
2261dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2262{
2263 Py_VISIT(di->di_dict);
2264 Py_VISIT(di->di_result);
2265 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002266}
2267
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002268static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002269dictiter_len(dictiterobject *di)
2270{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002271 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002272 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002273 len = di->len;
Christian Heimes217cfd12007-12-02 14:31:20 +00002274 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002275}
2276
Guido van Rossumb90c8482007-02-10 01:11:45 +00002277PyDoc_STRVAR(length_hint_doc,
2278 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002279
2280static PyMethodDef dictiter_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002281 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2282 length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002283 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002284};
2285
Raymond Hettinger019a1482004-03-18 02:41:19 +00002286static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002287{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002288 PyObject *key;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002289 register Py_ssize_t i, mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002290 register PyDictEntry *ep;
2291 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002292
Raymond Hettinger019a1482004-03-18 02:41:19 +00002293 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002294 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002295 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002296
Raymond Hettinger019a1482004-03-18 02:41:19 +00002297 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002298 PyErr_SetString(PyExc_RuntimeError,
2299 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002300 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002301 return NULL;
2302 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002303
Raymond Hettinger019a1482004-03-18 02:41:19 +00002304 i = di->di_pos;
2305 if (i < 0)
2306 goto fail;
2307 ep = d->ma_table;
2308 mask = d->ma_mask;
2309 while (i <= mask && ep[i].me_value == NULL)
2310 i++;
2311 di->di_pos = i+1;
2312 if (i > mask)
2313 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002314 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002315 key = ep[i].me_key;
2316 Py_INCREF(key);
2317 return key;
2318
2319fail:
2320 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002321 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002322 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002323}
2324
Raymond Hettinger019a1482004-03-18 02:41:19 +00002325PyTypeObject PyDictIterKey_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002326 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002327 "dict_keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002328 sizeof(dictiterobject), /* tp_basicsize */
2329 0, /* tp_itemsize */
2330 /* methods */
2331 (destructor)dictiter_dealloc, /* tp_dealloc */
2332 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002333 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002334 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002335 0, /* tp_reserved */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002336 0, /* tp_repr */
2337 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002338 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002339 0, /* tp_as_mapping */
2340 0, /* tp_hash */
2341 0, /* tp_call */
2342 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002343 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002344 0, /* tp_setattro */
2345 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002346 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002347 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002348 (traverseproc)dictiter_traverse, /* tp_traverse */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002349 0, /* tp_clear */
2350 0, /* tp_richcompare */
2351 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002352 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002353 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002354 dictiter_methods, /* tp_methods */
2355 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002356};
2357
2358static PyObject *dictiter_iternextvalue(dictiterobject *di)
2359{
2360 PyObject *value;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002361 register Py_ssize_t i, mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002362 register PyDictEntry *ep;
2363 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002364
2365 if (d == NULL)
2366 return NULL;
2367 assert (PyDict_Check(d));
2368
2369 if (di->di_used != d->ma_used) {
2370 PyErr_SetString(PyExc_RuntimeError,
2371 "dictionary changed size during iteration");
2372 di->di_used = -1; /* Make this state sticky */
2373 return NULL;
2374 }
2375
2376 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002377 mask = d->ma_mask;
2378 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002379 goto fail;
2380 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002381 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002382 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002383 if (i > mask)
2384 goto fail;
2385 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002386 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002387 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002388 Py_INCREF(value);
2389 return value;
2390
2391fail:
2392 Py_DECREF(d);
2393 di->di_dict = NULL;
2394 return NULL;
2395}
2396
2397PyTypeObject PyDictIterValue_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002398 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002399 "dict_valueiterator", /* tp_name */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002400 sizeof(dictiterobject), /* tp_basicsize */
2401 0, /* tp_itemsize */
2402 /* methods */
2403 (destructor)dictiter_dealloc, /* tp_dealloc */
2404 0, /* tp_print */
2405 0, /* tp_getattr */
2406 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002407 0, /* tp_reserved */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002408 0, /* tp_repr */
2409 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002410 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002411 0, /* tp_as_mapping */
2412 0, /* tp_hash */
2413 0, /* tp_call */
2414 0, /* tp_str */
2415 PyObject_GenericGetAttr, /* tp_getattro */
2416 0, /* tp_setattro */
2417 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002418 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002419 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002420 (traverseproc)dictiter_traverse, /* tp_traverse */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002421 0, /* tp_clear */
2422 0, /* tp_richcompare */
2423 0, /* tp_weaklistoffset */
2424 PyObject_SelfIter, /* tp_iter */
2425 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002426 dictiter_methods, /* tp_methods */
2427 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002428};
2429
2430static PyObject *dictiter_iternextitem(dictiterobject *di)
2431{
2432 PyObject *key, *value, *result = di->di_result;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002433 register Py_ssize_t i, mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002434 register PyDictEntry *ep;
2435 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002436
2437 if (d == NULL)
2438 return NULL;
2439 assert (PyDict_Check(d));
2440
2441 if (di->di_used != d->ma_used) {
2442 PyErr_SetString(PyExc_RuntimeError,
2443 "dictionary changed size during iteration");
2444 di->di_used = -1; /* Make this state sticky */
2445 return NULL;
2446 }
2447
2448 i = di->di_pos;
2449 if (i < 0)
2450 goto fail;
2451 ep = d->ma_table;
2452 mask = d->ma_mask;
2453 while (i <= mask && ep[i].me_value == NULL)
2454 i++;
2455 di->di_pos = i+1;
2456 if (i > mask)
2457 goto fail;
2458
2459 if (result->ob_refcnt == 1) {
2460 Py_INCREF(result);
2461 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2462 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2463 } else {
2464 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002465 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002466 return NULL;
2467 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002468 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002469 key = ep[i].me_key;
2470 value = ep[i].me_value;
2471 Py_INCREF(key);
2472 Py_INCREF(value);
2473 PyTuple_SET_ITEM(result, 0, key);
2474 PyTuple_SET_ITEM(result, 1, value);
2475 return result;
2476
2477fail:
2478 Py_DECREF(d);
2479 di->di_dict = NULL;
2480 return NULL;
2481}
2482
2483PyTypeObject PyDictIterItem_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002484 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002485 "dict_itemiterator", /* tp_name */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002486 sizeof(dictiterobject), /* tp_basicsize */
2487 0, /* tp_itemsize */
2488 /* methods */
2489 (destructor)dictiter_dealloc, /* tp_dealloc */
2490 0, /* tp_print */
2491 0, /* tp_getattr */
2492 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002493 0, /* tp_reserved */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002494 0, /* tp_repr */
2495 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002496 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002497 0, /* tp_as_mapping */
2498 0, /* tp_hash */
2499 0, /* tp_call */
2500 0, /* tp_str */
2501 PyObject_GenericGetAttr, /* tp_getattro */
2502 0, /* tp_setattro */
2503 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002504 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002505 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002506 (traverseproc)dictiter_traverse, /* tp_traverse */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002507 0, /* tp_clear */
2508 0, /* tp_richcompare */
2509 0, /* tp_weaklistoffset */
2510 PyObject_SelfIter, /* tp_iter */
2511 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002512 dictiter_methods, /* tp_methods */
2513 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002514};
Guido van Rossumb90c8482007-02-10 01:11:45 +00002515
2516
Guido van Rossum3ac67412007-02-10 18:55:06 +00002517/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002518/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002519/***********************************************/
2520
Guido van Rossumb90c8482007-02-10 01:11:45 +00002521/* The instance lay-out is the same for all three; but the type differs. */
2522
2523typedef struct {
2524 PyObject_HEAD
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002525 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002526} dictviewobject;
2527
2528
2529static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00002530dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002531{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002532 Py_XDECREF(dv->dv_dict);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002533 PyObject_GC_Del(dv);
2534}
2535
2536static int
2537dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
2538{
2539 Py_VISIT(dv->dv_dict);
2540 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002541}
2542
Guido van Rossum83825ac2007-02-10 04:54:19 +00002543static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00002544dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002545{
2546 Py_ssize_t len = 0;
Guido van Rossum3ac67412007-02-10 18:55:06 +00002547 if (dv->dv_dict != NULL)
2548 len = dv->dv_dict->ma_used;
Guido van Rossum83825ac2007-02-10 04:54:19 +00002549 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002550}
2551
2552static PyObject *
2553dictview_new(PyObject *dict, PyTypeObject *type)
2554{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002555 dictviewobject *dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002556 if (dict == NULL) {
2557 PyErr_BadInternalCall();
2558 return NULL;
2559 }
2560 if (!PyDict_Check(dict)) {
2561 /* XXX Get rid of this restriction later */
2562 PyErr_Format(PyExc_TypeError,
2563 "%s() requires a dict argument, not '%s'",
2564 type->tp_name, dict->ob_type->tp_name);
2565 return NULL;
2566 }
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002567 dv = PyObject_GC_New(dictviewobject, type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002568 if (dv == NULL)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002569 return NULL;
2570 Py_INCREF(dict);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002571 dv->dv_dict = (PyDictObject *)dict;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002572 _PyObject_GC_TRACK(dv);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002573 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002574}
2575
Neal Norwitze36f2ba2007-02-26 23:12:28 +00002576/* TODO(guido): The views objects are not complete:
2577
2578 * support more set operations
2579 * support arbitrary mappings?
2580 - either these should be static or exported in dictobject.h
2581 - if public then they should probably be in builtins
2582*/
2583
Guido van Rossumaac530c2007-08-24 22:33:45 +00002584/* Return 1 if self is a subset of other, iterating over self;
2585 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002586static int
2587all_contained_in(PyObject *self, PyObject *other)
2588{
2589 PyObject *iter = PyObject_GetIter(self);
2590 int ok = 1;
2591
2592 if (iter == NULL)
2593 return -1;
2594 for (;;) {
2595 PyObject *next = PyIter_Next(iter);
2596 if (next == NULL) {
2597 if (PyErr_Occurred())
2598 ok = -1;
2599 break;
2600 }
2601 ok = PySequence_Contains(other, next);
2602 Py_DECREF(next);
2603 if (ok <= 0)
2604 break;
2605 }
2606 Py_DECREF(iter);
2607 return ok;
2608}
2609
2610static PyObject *
2611dictview_richcompare(PyObject *self, PyObject *other, int op)
2612{
Guido van Rossumaac530c2007-08-24 22:33:45 +00002613 Py_ssize_t len_self, len_other;
2614 int ok;
2615 PyObject *result;
2616
Guido van Rossumd9214d12007-02-12 02:23:40 +00002617 assert(self != NULL);
2618 assert(PyDictViewSet_Check(self));
2619 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00002620
Guido van Rossumaac530c2007-08-24 22:33:45 +00002621 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other)) {
Guido van Rossumd9214d12007-02-12 02:23:40 +00002622 Py_INCREF(Py_NotImplemented);
2623 return Py_NotImplemented;
2624 }
Guido van Rossumaac530c2007-08-24 22:33:45 +00002625
2626 len_self = PyObject_Size(self);
2627 if (len_self < 0)
2628 return NULL;
2629 len_other = PyObject_Size(other);
2630 if (len_other < 0)
2631 return NULL;
2632
2633 ok = 0;
2634 switch(op) {
2635
2636 case Py_NE:
2637 case Py_EQ:
2638 if (len_self == len_other)
2639 ok = all_contained_in(self, other);
2640 if (op == Py_NE && ok >= 0)
2641 ok = !ok;
2642 break;
2643
2644 case Py_LT:
2645 if (len_self < len_other)
2646 ok = all_contained_in(self, other);
2647 break;
2648
2649 case Py_LE:
2650 if (len_self <= len_other)
2651 ok = all_contained_in(self, other);
2652 break;
2653
2654 case Py_GT:
2655 if (len_self > len_other)
2656 ok = all_contained_in(other, self);
2657 break;
2658
2659 case Py_GE:
2660 if (len_self >= len_other)
2661 ok = all_contained_in(other, self);
2662 break;
2663
2664 }
2665 if (ok < 0)
2666 return NULL;
2667 result = ok ? Py_True : Py_False;
2668 Py_INCREF(result);
2669 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002670}
2671
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002672static PyObject *
2673dictview_repr(dictviewobject *dv)
2674{
2675 PyObject *seq;
2676 PyObject *result;
2677
2678 seq = PySequence_List((PyObject *)dv);
2679 if (seq == NULL)
2680 return NULL;
2681
2682 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
2683 Py_DECREF(seq);
2684 return result;
2685}
2686
Guido van Rossum3ac67412007-02-10 18:55:06 +00002687/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002688
2689static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002690dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002691{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002692 if (dv->dv_dict == NULL) {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002693 Py_RETURN_NONE;
2694 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002695 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
2696}
2697
2698static int
2699dictkeys_contains(dictviewobject *dv, PyObject *obj)
2700{
2701 if (dv->dv_dict == NULL)
2702 return 0;
2703 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002704}
2705
Guido van Rossum83825ac2007-02-10 04:54:19 +00002706static PySequenceMethods dictkeys_as_sequence = {
2707 (lenfunc)dictview_len, /* sq_length */
2708 0, /* sq_concat */
2709 0, /* sq_repeat */
2710 0, /* sq_item */
2711 0, /* sq_slice */
2712 0, /* sq_ass_item */
2713 0, /* sq_ass_slice */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002714 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002715};
2716
Guido van Rossum523259b2007-08-24 23:41:22 +00002717static PyObject*
2718dictviews_sub(PyObject* self, PyObject *other)
2719{
2720 PyObject *result = PySet_New(self);
2721 PyObject *tmp;
2722 if (result == NULL)
2723 return NULL;
2724
2725 tmp = PyObject_CallMethod(result, "difference_update", "O", other);
2726 if (tmp == NULL) {
2727 Py_DECREF(result);
2728 return NULL;
2729 }
2730
2731 Py_DECREF(tmp);
2732 return result;
2733}
2734
2735static PyObject*
2736dictviews_and(PyObject* self, PyObject *other)
2737{
2738 PyObject *result = PySet_New(self);
2739 PyObject *tmp;
2740 if (result == NULL)
2741 return NULL;
2742
2743 tmp = PyObject_CallMethod(result, "intersection_update", "O", other);
2744 if (tmp == NULL) {
2745 Py_DECREF(result);
2746 return NULL;
2747 }
2748
2749 Py_DECREF(tmp);
2750 return result;
2751}
2752
2753static PyObject*
2754dictviews_or(PyObject* self, PyObject *other)
2755{
2756 PyObject *result = PySet_New(self);
2757 PyObject *tmp;
2758 if (result == NULL)
2759 return NULL;
2760
2761 tmp = PyObject_CallMethod(result, "update", "O", other);
2762 if (tmp == NULL) {
2763 Py_DECREF(result);
2764 return NULL;
2765 }
2766
2767 Py_DECREF(tmp);
2768 return result;
2769}
2770
2771static PyObject*
2772dictviews_xor(PyObject* self, PyObject *other)
2773{
2774 PyObject *result = PySet_New(self);
2775 PyObject *tmp;
2776 if (result == NULL)
2777 return NULL;
2778
2779 tmp = PyObject_CallMethod(result, "symmetric_difference_update", "O",
2780 other);
2781 if (tmp == NULL) {
2782 Py_DECREF(result);
2783 return NULL;
2784 }
2785
2786 Py_DECREF(tmp);
2787 return result;
2788}
2789
2790static PyNumberMethods dictviews_as_number = {
2791 0, /*nb_add*/
2792 (binaryfunc)dictviews_sub, /*nb_subtract*/
2793 0, /*nb_multiply*/
2794 0, /*nb_remainder*/
2795 0, /*nb_divmod*/
2796 0, /*nb_power*/
2797 0, /*nb_negative*/
2798 0, /*nb_positive*/
2799 0, /*nb_absolute*/
2800 0, /*nb_bool*/
2801 0, /*nb_invert*/
2802 0, /*nb_lshift*/
2803 0, /*nb_rshift*/
2804 (binaryfunc)dictviews_and, /*nb_and*/
2805 (binaryfunc)dictviews_xor, /*nb_xor*/
2806 (binaryfunc)dictviews_or, /*nb_or*/
2807};
2808
Guido van Rossumb90c8482007-02-10 01:11:45 +00002809static PyMethodDef dictkeys_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002810 {NULL, NULL} /* sentinel */
2811};
2812
2813PyTypeObject PyDictKeys_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002814 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002815 "dict_keys", /* tp_name */
2816 sizeof(dictviewobject), /* tp_basicsize */
2817 0, /* tp_itemsize */
2818 /* methods */
2819 (destructor)dictview_dealloc, /* tp_dealloc */
2820 0, /* tp_print */
2821 0, /* tp_getattr */
2822 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002823 0, /* tp_reserved */
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002824 (reprfunc)dictview_repr, /* tp_repr */
Guido van Rossum523259b2007-08-24 23:41:22 +00002825 &dictviews_as_number, /* tp_as_number */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002826 &dictkeys_as_sequence, /* tp_as_sequence */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002827 0, /* tp_as_mapping */
2828 0, /* tp_hash */
2829 0, /* tp_call */
2830 0, /* tp_str */
2831 PyObject_GenericGetAttr, /* tp_getattro */
2832 0, /* tp_setattro */
2833 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002834 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002835 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002836 (traverseproc)dictview_traverse, /* tp_traverse */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002837 0, /* tp_clear */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002838 dictview_richcompare, /* tp_richcompare */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002839 0, /* tp_weaklistoffset */
2840 (getiterfunc)dictkeys_iter, /* tp_iter */
2841 0, /* tp_iternext */
2842 dictkeys_methods, /* tp_methods */
2843 0,
2844};
2845
2846static PyObject *
2847dictkeys_new(PyObject *dict)
2848{
2849 return dictview_new(dict, &PyDictKeys_Type);
2850}
2851
Guido van Rossum3ac67412007-02-10 18:55:06 +00002852/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002853
2854static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002855dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002856{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002857 if (dv->dv_dict == NULL) {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002858 Py_RETURN_NONE;
2859 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002860 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
2861}
2862
2863static int
2864dictitems_contains(dictviewobject *dv, PyObject *obj)
2865{
2866 PyObject *key, *value, *found;
2867 if (dv->dv_dict == NULL)
2868 return 0;
2869 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
2870 return 0;
2871 key = PyTuple_GET_ITEM(obj, 0);
2872 value = PyTuple_GET_ITEM(obj, 1);
2873 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
2874 if (found == NULL) {
2875 if (PyErr_Occurred())
2876 return -1;
2877 return 0;
2878 }
2879 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002880}
2881
Guido van Rossum83825ac2007-02-10 04:54:19 +00002882static PySequenceMethods dictitems_as_sequence = {
2883 (lenfunc)dictview_len, /* sq_length */
2884 0, /* sq_concat */
2885 0, /* sq_repeat */
2886 0, /* sq_item */
2887 0, /* sq_slice */
2888 0, /* sq_ass_item */
2889 0, /* sq_ass_slice */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002890 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002891};
2892
Guido van Rossumb90c8482007-02-10 01:11:45 +00002893static PyMethodDef dictitems_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002894 {NULL, NULL} /* sentinel */
2895};
2896
2897PyTypeObject PyDictItems_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002898 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002899 "dict_items", /* tp_name */
2900 sizeof(dictviewobject), /* tp_basicsize */
2901 0, /* tp_itemsize */
2902 /* methods */
2903 (destructor)dictview_dealloc, /* tp_dealloc */
2904 0, /* tp_print */
2905 0, /* tp_getattr */
2906 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002907 0, /* tp_reserved */
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002908 (reprfunc)dictview_repr, /* tp_repr */
Guido van Rossum523259b2007-08-24 23:41:22 +00002909 &dictviews_as_number, /* tp_as_number */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002910 &dictitems_as_sequence, /* tp_as_sequence */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002911 0, /* tp_as_mapping */
2912 0, /* tp_hash */
2913 0, /* tp_call */
2914 0, /* tp_str */
2915 PyObject_GenericGetAttr, /* tp_getattro */
2916 0, /* tp_setattro */
2917 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002918 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002919 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002920 (traverseproc)dictview_traverse, /* tp_traverse */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002921 0, /* tp_clear */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002922 dictview_richcompare, /* tp_richcompare */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002923 0, /* tp_weaklistoffset */
2924 (getiterfunc)dictitems_iter, /* tp_iter */
2925 0, /* tp_iternext */
2926 dictitems_methods, /* tp_methods */
2927 0,
2928};
2929
2930static PyObject *
2931dictitems_new(PyObject *dict)
2932{
2933 return dictview_new(dict, &PyDictItems_Type);
2934}
2935
Guido van Rossum3ac67412007-02-10 18:55:06 +00002936/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002937
2938static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002939dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002940{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002941 if (dv->dv_dict == NULL) {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002942 Py_RETURN_NONE;
2943 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002944 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002945}
2946
Guido van Rossum83825ac2007-02-10 04:54:19 +00002947static PySequenceMethods dictvalues_as_sequence = {
2948 (lenfunc)dictview_len, /* sq_length */
2949 0, /* sq_concat */
2950 0, /* sq_repeat */
2951 0, /* sq_item */
2952 0, /* sq_slice */
2953 0, /* sq_ass_item */
2954 0, /* sq_ass_slice */
2955 (objobjproc)0, /* sq_contains */
2956};
2957
Guido van Rossumb90c8482007-02-10 01:11:45 +00002958static PyMethodDef dictvalues_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002959 {NULL, NULL} /* sentinel */
2960};
2961
2962PyTypeObject PyDictValues_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002963 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002964 "dict_values", /* tp_name */
2965 sizeof(dictviewobject), /* tp_basicsize */
2966 0, /* tp_itemsize */
2967 /* methods */
2968 (destructor)dictview_dealloc, /* tp_dealloc */
2969 0, /* tp_print */
2970 0, /* tp_getattr */
2971 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002972 0, /* tp_reserved */
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002973 (reprfunc)dictview_repr, /* tp_repr */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002974 0, /* tp_as_number */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002975 &dictvalues_as_sequence, /* tp_as_sequence */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002976 0, /* tp_as_mapping */
2977 0, /* tp_hash */
2978 0, /* tp_call */
2979 0, /* tp_str */
2980 PyObject_GenericGetAttr, /* tp_getattro */
2981 0, /* tp_setattro */
2982 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002983 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002984 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002985 (traverseproc)dictview_traverse, /* tp_traverse */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002986 0, /* tp_clear */
2987 0, /* tp_richcompare */
2988 0, /* tp_weaklistoffset */
2989 (getiterfunc)dictvalues_iter, /* tp_iter */
2990 0, /* tp_iternext */
2991 dictvalues_methods, /* tp_methods */
2992 0,
2993};
2994
2995static PyObject *
2996dictvalues_new(PyObject *dict)
2997{
2998 return dictview_new(dict, &PyDictValues_Type);
2999}