blob: 2eddc8648e912c9b4ca7f7a3ec4ffd4dcf398f9d [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 Heimes23daade2008-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. */
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000737 tstate = (PyThreadState*)_Py_atomic_load_relaxed(
738 &_PyThreadState_Current);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000739 if (tstate != NULL && tstate->curexc_type != NULL) {
740 /* preserve the existing exception */
741 PyObject *err_type, *err_value, *err_tb;
742 PyErr_Fetch(&err_type, &err_value, &err_tb);
743 ep = (mp->ma_lookup)(mp, key, hash);
744 /* ignore errors */
745 PyErr_Restore(err_type, err_value, err_tb);
746 if (ep == NULL)
747 return NULL;
748 }
749 else {
750 ep = (mp->ma_lookup)(mp, key, hash);
751 if (ep == NULL) {
752 PyErr_Clear();
753 return NULL;
754 }
755 }
756 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000757}
758
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000759/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
760 This returns NULL *with* an exception set if an exception occurred.
761 It returns NULL *without* an exception set if the key wasn't present.
762*/
763PyObject *
764PyDict_GetItemWithError(PyObject *op, PyObject *key)
765{
766 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000767 PyDictObject*mp = (PyDictObject *)op;
768 PyDictEntry *ep;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000769
770 if (!PyDict_Check(op)) {
771 PyErr_BadInternalCall();
772 return NULL;
773 }
Guido van Rossum89d8c602007-09-18 17:26:56 +0000774 if (!PyUnicode_CheckExact(key) ||
775 (hash = ((PyUnicodeObject *) key)->hash) == -1)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000776 {
777 hash = PyObject_Hash(key);
778 if (hash == -1) {
779 return NULL;
780 }
781 }
782
783 ep = (mp->ma_lookup)(mp, key, hash);
784 if (ep == NULL)
785 return NULL;
786 return ep->me_value;
787}
788
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000789/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000790 * dictionary if it's merely replacing the value for an existing key.
791 * This means that it's safe to loop over a dictionary with PyDict_Next()
792 * and occasionally replace a value -- but you can't insert new keys or
793 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000794 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000795int
Tim Peters1f5871e2000-07-04 17:44:48 +0000796PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000797{
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000798 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000799 register long hash;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000800 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000801
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 if (!PyDict_Check(op)) {
803 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000804 return -1;
805 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000806 assert(key);
807 assert(value);
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000808 mp = (PyDictObject *)op;
Guido van Rossum4d027722007-09-18 04:30:42 +0000809 if (!PyUnicode_CheckExact(key) ||
810 (hash = ((PyUnicodeObject *) key)->hash) == -1)
811 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000812 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000813 if (hash == -1)
814 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000815 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000816 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000817 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818 Py_INCREF(value);
819 Py_INCREF(key);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000820 if (insertdict(mp, key, hash, value) != 0)
821 return -1;
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000822 /* If we added a key, we can safely resize. Otherwise just return!
823 * If fill >= 2/3 size, adjust size. Normally, this doubles or
824 * quaduples the size, but it's also possible for the dict to shrink
Tim Peters60b29962006-01-01 01:19:23 +0000825 * (if ma_fill is much larger than ma_used, meaning a lot of dict
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000826 * keys have been * deleted).
Tim Peters60b29962006-01-01 01:19:23 +0000827 *
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000828 * Quadrupling the size improves average dictionary sparseness
829 * (reducing collisions) at the cost of some memory and iteration
830 * speed (which loops over every possible entry). It also halves
831 * the number of expensive resize operations in a growing dictionary.
Tim Peters60b29962006-01-01 01:19:23 +0000832 *
833 * Very large dictionaries (over 50K items) use doubling instead.
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000834 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000835 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000836 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
837 return 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000838 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000839}
840
841int
Tim Peters1f5871e2000-07-04 17:44:48 +0000842PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000843{
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000844 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000845 register long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000846 register PyDictEntry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000847 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000848
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849 if (!PyDict_Check(op)) {
850 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000851 return -1;
852 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000853 assert(key);
Guido van Rossum89d8c602007-09-18 17:26:56 +0000854 if (!PyUnicode_CheckExact(key) ||
855 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000857 if (hash == -1)
858 return -1;
859 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000860 mp = (PyDictObject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000861 ep = (mp->ma_lookup)(mp, key, hash);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000862 if (ep == NULL)
863 return -1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000864 if (ep->me_value == NULL) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000865 set_key_error(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000866 return -1;
867 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000868 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000870 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000871 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000872 ep->me_value = NULL;
873 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000874 Py_DECREF(old_value);
875 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000876 return 0;
877}
878
Guido van Rossum25831651993-05-19 14:50:45 +0000879void
Tim Peters1f5871e2000-07-04 17:44:48 +0000880PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000881{
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000882 PyDictObject *mp;
883 PyDictEntry *ep, *table;
Tim Petersdea48ec2001-05-22 20:40:22 +0000884 int table_is_malloced;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000885 Py_ssize_t fill;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000886 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000887#ifdef Py_DEBUG
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000888 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000889#endif
890
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000892 return;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000893 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000894#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000895 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000896 i = 0;
897#endif
898
899 table = mp->ma_table;
900 assert(table != NULL);
901 table_is_malloced = table != mp->ma_smalltable;
902
903 /* This is delicate. During the process of clearing the dict,
904 * decrefs can cause the dict to mutate. To avoid fatal confusion
905 * (voice of experience), we have to make the dict empty before
906 * clearing the slots, and never refer to anything via mp->xxx while
907 * clearing.
908 */
909 fill = mp->ma_fill;
910 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000911 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000912
913 else if (fill > 0) {
914 /* It's a small table with something that needs to be cleared.
915 * Afraid the only safe way is to copy the dict entries into
916 * another small table first.
917 */
918 memcpy(small_copy, table, sizeof(small_copy));
919 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000920 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000921 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000922 /* else it's a small table that's already empty */
923
924 /* Now we can finally clear things. If C had refcounts, we could
925 * assert that the refcount on table is 1 now, i.e. that this function
926 * has unique access to it, so decref side-effects can't alter it.
927 */
928 for (ep = table; fill > 0; ++ep) {
929#ifdef Py_DEBUG
930 assert(i < n);
931 ++i;
932#endif
933 if (ep->me_key) {
934 --fill;
935 Py_DECREF(ep->me_key);
936 Py_XDECREF(ep->me_value);
937 }
938#ifdef Py_DEBUG
939 else
940 assert(ep->me_value == NULL);
941#endif
942 }
943
944 if (table_is_malloced)
945 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000946}
947
Tim Peters080c88b2003-02-15 03:01:11 +0000948/*
949 * Iterate over a dict. Use like so:
950 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000951 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000952 * PyObject *key, *value;
953 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000954 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000955 * Refer to borrowed references in key and value.
956 * }
957 *
958 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000959 * mutates the dict. One exception: it is safe if the loop merely changes
960 * the values associated with the keys (but doesn't insert new keys or
961 * delete keys), via PyDict_SetItem().
962 */
Guido van Rossum25831651993-05-19 14:50:45 +0000963int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000964PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000965{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000966 register Py_ssize_t i;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000967 register Py_ssize_t mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000968 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000969
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000971 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000972 i = *ppos;
973 if (i < 0)
974 return 0;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000975 ep = ((PyDictObject *)op)->ma_table;
976 mask = ((PyDictObject *)op)->ma_mask;
Raymond Hettinger43442782004-03-17 21:55:03 +0000977 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000978 i++;
979 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000980 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000981 return 0;
982 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000983 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000984 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000985 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000986 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000987}
988
Thomas Wouterscf297e42007-02-23 15:07:44 +0000989/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
990int
991_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, long *phash)
992{
993 register Py_ssize_t i;
994 register Py_ssize_t mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000995 register PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +0000996
997 if (!PyDict_Check(op))
998 return 0;
999 i = *ppos;
1000 if (i < 0)
1001 return 0;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001002 ep = ((PyDictObject *)op)->ma_table;
1003 mask = ((PyDictObject *)op)->ma_mask;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001004 while (i <= mask && ep[i].me_value == NULL)
1005 i++;
1006 *ppos = i+1;
1007 if (i > mask)
1008 return 0;
1009 *phash = (long)(ep[i].me_hash);
1010 if (pkey)
1011 *pkey = ep[i].me_key;
1012 if (pvalue)
1013 *pvalue = ep[i].me_value;
1014 return 1;
1015}
1016
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001017/* Methods */
1018
1019static void
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001020dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001021{
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001022 register PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001023 Py_ssize_t fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +00001024 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +00001025 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +00001026 for (ep = mp->ma_table; fill > 0; ep++) {
1027 if (ep->me_key) {
1028 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001029 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +00001030 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +00001031 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001032 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001033 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001034 PyMem_DEL(mp->ma_table);
Christian Heimes2202f872008-02-06 14:31:34 +00001035 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1036 free_list[numfree++] = mp;
Tim Peters60b29962006-01-01 01:19:23 +00001037 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001038 Py_TYPE(mp)->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +00001039 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001040}
1041
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001043dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001044{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001045 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +00001046 PyObject *s, *temp, *colon = NULL;
1047 PyObject *pieces = NULL, *result = NULL;
1048 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001049
Tim Petersa7259592001-06-16 05:11:17 +00001050 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +00001051 if (i != 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +00001052 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +00001053 }
1054
Tim Petersa7259592001-06-16 05:11:17 +00001055 if (mp->ma_used == 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +00001056 result = PyUnicode_FromString("{}");
Tim Petersa7259592001-06-16 05:11:17 +00001057 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001058 }
Tim Petersa7259592001-06-16 05:11:17 +00001059
1060 pieces = PyList_New(0);
1061 if (pieces == NULL)
1062 goto Done;
1063
Walter Dörwald1ab83302007-05-18 17:15:44 +00001064 colon = PyUnicode_FromString(": ");
Tim Petersa7259592001-06-16 05:11:17 +00001065 if (colon == NULL)
1066 goto Done;
1067
1068 /* Do repr() on each key+value pair, and insert ": " between them.
1069 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +00001070 i = 0;
1071 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +00001072 int status;
1073 /* Prevent repr from deleting value during key format. */
1074 Py_INCREF(value);
1075 s = PyObject_Repr(key);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001076 PyUnicode_Append(&s, colon);
1077 PyUnicode_AppendAndDel(&s, PyObject_Repr(value));
Tim Petersa7259592001-06-16 05:11:17 +00001078 Py_DECREF(value);
1079 if (s == NULL)
1080 goto Done;
1081 status = PyList_Append(pieces, s);
1082 Py_DECREF(s); /* append created a new ref */
1083 if (status < 0)
1084 goto Done;
1085 }
1086
1087 /* Add "{}" decorations to the first and last items. */
1088 assert(PyList_GET_SIZE(pieces) > 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001089 s = PyUnicode_FromString("{");
Tim Petersa7259592001-06-16 05:11:17 +00001090 if (s == NULL)
1091 goto Done;
1092 temp = PyList_GET_ITEM(pieces, 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001093 PyUnicode_AppendAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +00001094 PyList_SET_ITEM(pieces, 0, s);
1095 if (s == NULL)
1096 goto Done;
1097
Walter Dörwald1ab83302007-05-18 17:15:44 +00001098 s = PyUnicode_FromString("}");
Tim Petersa7259592001-06-16 05:11:17 +00001099 if (s == NULL)
1100 goto Done;
1101 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001102 PyUnicode_AppendAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +00001103 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1104 if (temp == NULL)
1105 goto Done;
1106
1107 /* Paste them all together with ", " between. */
Walter Dörwald1ab83302007-05-18 17:15:44 +00001108 s = PyUnicode_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +00001109 if (s == NULL)
1110 goto Done;
Walter Dörwald1ab83302007-05-18 17:15:44 +00001111 result = PyUnicode_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +00001112 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001113
1114Done:
1115 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001116 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +00001117 Py_ReprLeave((PyObject *)mp);
1118 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001119}
1120
Martin v. Löwis18e16552006-02-15 17:27:45 +00001121static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001122dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001123{
1124 return mp->ma_used;
1125}
1126
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001127static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001128dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001129{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001130 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001131 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001132 PyDictEntry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +00001133 assert(mp->ma_table != NULL);
Guido van Rossum89d8c602007-09-18 17:26:56 +00001134 if (!PyUnicode_CheckExact(key) ||
1135 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001136 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001137 if (hash == -1)
1138 return NULL;
1139 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001140 ep = (mp->ma_lookup)(mp, key, hash);
1141 if (ep == NULL)
1142 return NULL;
1143 v = ep->me_value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001144 if (v == NULL) {
1145 if (!PyDict_CheckExact(mp)) {
1146 /* Look up __missing__ method if we're a subclass. */
Benjamin Peterson0ffaaa62009-05-27 03:18:19 +00001147 PyObject *missing, *res;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001148 static PyObject *missing_str = NULL;
Benjamin Petersona7205592009-05-27 03:08:59 +00001149 missing = _PyObject_LookupSpecial((PyObject *)mp,
1150 "__missing__",
1151 &missing_str);
Benjamin Peterson0ffaaa62009-05-27 03:18:19 +00001152 if (missing != NULL) {
1153 res = PyObject_CallFunctionObjArgs(missing,
1154 key, NULL);
1155 Py_DECREF(missing);
1156 return res;
1157 }
Benjamin Petersona7205592009-05-27 03:08:59 +00001158 else if (PyErr_Occurred())
1159 return NULL;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001160 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001161 set_key_error(key);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001162 return NULL;
1163 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001164 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001165 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001166 return v;
1167}
1168
1169static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001170dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001171{
1172 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001173 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001174 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001175 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001176}
1177
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001178static PyMappingMethods dict_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001179 (lenfunc)dict_length, /*mp_length*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001180 (binaryfunc)dict_subscript, /*mp_subscript*/
1181 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001182};
1183
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001185dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001186{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187 register PyObject *v;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001188 register Py_ssize_t i, j;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001189 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001190 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001191
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001192 again:
1193 n = mp->ma_used;
1194 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001195 if (v == NULL)
1196 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001197 if (n != mp->ma_used) {
1198 /* Durnit. The allocations caused the dict to resize.
1199 * Just start over, this shouldn't normally happen.
1200 */
1201 Py_DECREF(v);
1202 goto again;
1203 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001204 ep = mp->ma_table;
1205 mask = mp->ma_mask;
1206 for (i = 0, j = 0; i <= mask; i++) {
1207 if (ep[i].me_value != NULL) {
1208 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001210 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001211 j++;
1212 }
1213 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001214 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001215 return v;
1216}
1217
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001218static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001219dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001220{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221 register PyObject *v;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001222 register Py_ssize_t i, j;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001223 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001224 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001225
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001226 again:
1227 n = mp->ma_used;
1228 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001229 if (v == NULL)
1230 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001231 if (n != mp->ma_used) {
1232 /* Durnit. The allocations caused the dict to resize.
1233 * Just start over, this shouldn't normally happen.
1234 */
1235 Py_DECREF(v);
1236 goto again;
1237 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001238 ep = mp->ma_table;
1239 mask = mp->ma_mask;
1240 for (i = 0, j = 0; i <= mask; i++) {
1241 if (ep[i].me_value != NULL) {
1242 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001244 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001245 j++;
1246 }
1247 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001248 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001249 return v;
1250}
1251
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001252static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001253dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001254{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001255 register PyObject *v;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001256 register Py_ssize_t i, j, n;
1257 Py_ssize_t mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001258 PyObject *item, *key, *value;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001259 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001260
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001261 /* Preallocate the list of tuples, to avoid allocations during
1262 * the loop over the items, which could trigger GC, which
1263 * could resize the dict. :-(
1264 */
1265 again:
1266 n = mp->ma_used;
1267 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001268 if (v == NULL)
1269 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001270 for (i = 0; i < n; i++) {
1271 item = PyTuple_New(2);
1272 if (item == NULL) {
1273 Py_DECREF(v);
1274 return NULL;
1275 }
1276 PyList_SET_ITEM(v, i, item);
1277 }
1278 if (n != mp->ma_used) {
1279 /* Durnit. The allocations caused the dict to resize.
1280 * Just start over, this shouldn't normally happen.
1281 */
1282 Py_DECREF(v);
1283 goto again;
1284 }
1285 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001286 ep = mp->ma_table;
1287 mask = mp->ma_mask;
1288 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001289 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001290 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001291 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001293 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001295 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001296 j++;
1297 }
1298 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001299 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001300 return v;
1301}
1302
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001303static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001304dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001305{
1306 PyObject *seq;
1307 PyObject *value = Py_None;
1308 PyObject *it; /* iter(seq) */
1309 PyObject *key;
1310 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001311 int status;
1312
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001313 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001314 return NULL;
1315
1316 d = PyObject_CallObject(cls, NULL);
1317 if (d == NULL)
1318 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001319
Guido van Rossum58da9312007-11-10 23:39:45 +00001320 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1321 PyDictObject *mp = (PyDictObject *)d;
1322 PyObject *oldvalue;
1323 Py_ssize_t pos = 0;
1324 PyObject *key;
1325 long hash;
1326
Benjamin Peterson41181742008-07-02 20:22:54 +00001327 if (dictresize(mp, Py_SIZE(seq)))
Guido van Rossum58da9312007-11-10 23:39:45 +00001328 return NULL;
1329
1330 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1331 Py_INCREF(key);
1332 Py_INCREF(value);
1333 if (insertdict(mp, key, hash, value))
1334 return NULL;
1335 }
1336 return d;
1337 }
1338
Guido van Rossumd8faa362007-04-27 19:54:29 +00001339 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001340 PyDictObject *mp = (PyDictObject *)d;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001341 Py_ssize_t pos = 0;
1342 PyObject *key;
1343 long hash;
1344
1345 if (dictresize(mp, PySet_GET_SIZE(seq)))
1346 return NULL;
1347
1348 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1349 Py_INCREF(key);
1350 Py_INCREF(value);
1351 if (insertdict(mp, key, hash, value))
1352 return NULL;
1353 }
1354 return d;
1355 }
1356
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001357 it = PyObject_GetIter(seq);
1358 if (it == NULL){
1359 Py_DECREF(d);
1360 return NULL;
1361 }
1362
Guido van Rossum58da9312007-11-10 23:39:45 +00001363 if (PyDict_CheckExact(d)) {
1364 while ((key = PyIter_Next(it)) != NULL) {
1365 status = PyDict_SetItem(d, key, value);
1366 Py_DECREF(key);
1367 if (status < 0)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001368 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001369 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001370 } else {
1371 while ((key = PyIter_Next(it)) != NULL) {
1372 status = PyObject_SetItem(d, key, value);
1373 Py_DECREF(key);
1374 if (status < 0)
1375 goto Fail;
1376 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001377 }
1378
Guido van Rossum58da9312007-11-10 23:39:45 +00001379 if (PyErr_Occurred())
1380 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001381 Py_DECREF(it);
1382 return d;
1383
1384Fail:
1385 Py_DECREF(it);
1386 Py_DECREF(d);
1387 return NULL;
1388}
1389
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001390static int
1391dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001392{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001393 PyObject *arg = NULL;
1394 int result = 0;
1395
1396 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1397 result = -1;
1398
1399 else if (arg != NULL) {
1400 if (PyObject_HasAttrString(arg, "keys"))
1401 result = PyDict_Merge(self, arg, 1);
1402 else
1403 result = PyDict_MergeFromSeq2(self, arg, 1);
1404 }
Benjamin Petersonfb886362010-04-24 18:21:17 +00001405 if (result == 0 && kwds != NULL) {
1406 if (PyArg_ValidateKeywordArguments(kwds))
1407 result = PyDict_Merge(self, kwds, 1);
1408 else
1409 result = -1;
1410 }
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001411 return result;
1412}
1413
1414static PyObject *
1415dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1416{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001417 if (dict_update_common(self, args, kwds, "update") != -1)
1418 Py_RETURN_NONE;
1419 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001420}
1421
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001422/* Update unconditionally replaces existing items.
1423 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001424 otherwise it leaves existing items unchanged.
1425
1426 PyDict_{Update,Merge} update/merge from a mapping object.
1427
Tim Petersf582b822001-12-11 18:51:08 +00001428 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001429 producing iterable objects of length 2.
1430*/
1431
Tim Petersf582b822001-12-11 18:51:08 +00001432int
Tim Peters1fc240e2001-10-26 05:06:50 +00001433PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1434{
1435 PyObject *it; /* iter(seq2) */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001436 Py_ssize_t i; /* index into seq2 of current element */
Tim Peters1fc240e2001-10-26 05:06:50 +00001437 PyObject *item; /* seq2[i] */
1438 PyObject *fast; /* item as a 2-tuple or 2-list */
1439
1440 assert(d != NULL);
1441 assert(PyDict_Check(d));
1442 assert(seq2 != NULL);
1443
1444 it = PyObject_GetIter(seq2);
1445 if (it == NULL)
1446 return -1;
1447
1448 for (i = 0; ; ++i) {
1449 PyObject *key, *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001450 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001451
1452 fast = NULL;
1453 item = PyIter_Next(it);
1454 if (item == NULL) {
1455 if (PyErr_Occurred())
1456 goto Fail;
1457 break;
1458 }
1459
1460 /* Convert item to sequence, and verify length 2. */
1461 fast = PySequence_Fast(item, "");
1462 if (fast == NULL) {
1463 if (PyErr_ExceptionMatches(PyExc_TypeError))
1464 PyErr_Format(PyExc_TypeError,
1465 "cannot convert dictionary update "
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001466 "sequence element #%zd to a sequence",
Tim Peters1fc240e2001-10-26 05:06:50 +00001467 i);
1468 goto Fail;
1469 }
1470 n = PySequence_Fast_GET_SIZE(fast);
1471 if (n != 2) {
1472 PyErr_Format(PyExc_ValueError,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001473 "dictionary update sequence element #%zd "
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00001474 "has length %zd; 2 is required",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00001475 i, n);
Tim Peters1fc240e2001-10-26 05:06:50 +00001476 goto Fail;
1477 }
1478
1479 /* Update/merge with this (key, value) pair. */
1480 key = PySequence_Fast_GET_ITEM(fast, 0);
1481 value = PySequence_Fast_GET_ITEM(fast, 1);
1482 if (override || PyDict_GetItem(d, key) == NULL) {
1483 int status = PyDict_SetItem(d, key, value);
1484 if (status < 0)
1485 goto Fail;
1486 }
1487 Py_DECREF(fast);
1488 Py_DECREF(item);
1489 }
1490
1491 i = 0;
1492 goto Return;
1493Fail:
1494 Py_XDECREF(item);
1495 Py_XDECREF(fast);
1496 i = -1;
1497Return:
1498 Py_DECREF(it);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001499 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001500}
1501
Tim Peters6d6c1a32001-08-02 04:15:00 +00001502int
1503PyDict_Update(PyObject *a, PyObject *b)
1504{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001505 return PyDict_Merge(a, b, 1);
1506}
1507
1508int
1509PyDict_Merge(PyObject *a, PyObject *b, int override)
1510{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001511 register PyDictObject *mp, *other;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001512 register Py_ssize_t i;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001513 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001514
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001515 /* We accept for the argument either a concrete dictionary object,
1516 * or an abstract "mapping" object. For the former, we can do
1517 * things quite efficiently. For the latter, we only require that
1518 * PyMapping_Keys() and PyObject_GetItem() be supported.
1519 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001520 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1521 PyErr_BadInternalCall();
1522 return -1;
1523 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001524 mp = (PyDictObject*)a;
Christian Heimesaf98da12008-01-27 15:18:18 +00001525 if (PyDict_Check(b)) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001526 other = (PyDictObject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001527 if (other == mp || other->ma_used == 0)
1528 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001529 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001530 if (mp->ma_used == 0)
1531 /* Since the target dict is empty, PyDict_GetItem()
1532 * always returns NULL. Setting override to 1
1533 * skips the unnecessary test.
1534 */
1535 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001536 /* Do one big resize at the start, rather than
1537 * incrementally resizing as we insert new items. Expect
1538 * that there will be no (or few) overlapping keys.
1539 */
1540 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001541 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001542 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001543 }
1544 for (i = 0; i <= other->ma_mask; i++) {
1545 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001546 if (entry->me_value != NULL &&
1547 (override ||
1548 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001549 Py_INCREF(entry->me_key);
1550 Py_INCREF(entry->me_value);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001551 if (insertdict(mp, entry->me_key,
1552 (long)entry->me_hash,
1553 entry->me_value) != 0)
1554 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001555 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001556 }
1557 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001558 else {
1559 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001560 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001561 PyObject *iter;
1562 PyObject *key, *value;
1563 int status;
1564
1565 if (keys == NULL)
1566 /* Docstring says this is equivalent to E.keys() so
1567 * if E doesn't have a .keys() method we want
1568 * AttributeError to percolate up. Might as well
1569 * do the same for any other error.
1570 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001571 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001572
1573 iter = PyObject_GetIter(keys);
1574 Py_DECREF(keys);
1575 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001576 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001577
1578 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001579 if (!override && PyDict_GetItem(a, key) != NULL) {
1580 Py_DECREF(key);
1581 continue;
1582 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001583 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001584 if (value == NULL) {
1585 Py_DECREF(iter);
1586 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001587 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001588 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001589 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001590 Py_DECREF(key);
1591 Py_DECREF(value);
1592 if (status < 0) {
1593 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001594 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001595 }
1596 }
1597 Py_DECREF(iter);
1598 if (PyErr_Occurred())
1599 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001600 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001601 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001602 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001603}
1604
1605static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001606dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001607{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001608 return PyDict_Copy((PyObject*)mp);
1609}
1610
1611PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001612PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001613{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001614 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001615
1616 if (o == NULL || !PyDict_Check(o)) {
1617 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001618 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001619 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001620 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001621 if (copy == NULL)
1622 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001623 if (PyDict_Merge(copy, o, 1) == 0)
1624 return copy;
1625 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001626 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001627}
1628
Martin v. Löwis18e16552006-02-15 17:27:45 +00001629Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001630PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001631{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632 if (mp == NULL || !PyDict_Check(mp)) {
1633 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001634 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001635 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001636 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001637}
1638
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001640PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001641{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001642 if (mp == NULL || !PyDict_Check(mp)) {
1643 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001644 return NULL;
1645 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001646 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001647}
1648
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001650PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001651{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001652 if (mp == NULL || !PyDict_Check(mp)) {
1653 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001654 return NULL;
1655 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001656 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001657}
1658
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001660PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001661{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001662 if (mp == NULL || !PyDict_Check(mp)) {
1663 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001664 return NULL;
1665 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001666 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001667}
1668
Tim Peterse63415e2001-05-08 04:38:29 +00001669/* Return 1 if dicts equal, 0 if not, -1 if error.
1670 * Gets out as soon as any difference is detected.
1671 * Uses only Py_EQ comparison.
1672 */
1673static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001674dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001675{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001676 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001677
1678 if (a->ma_used != b->ma_used)
1679 /* can't be equal if # of entries differ */
1680 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001681
Tim Peterse63415e2001-05-08 04:38:29 +00001682 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001683 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001684 PyObject *aval = a->ma_table[i].me_value;
1685 if (aval != NULL) {
1686 int cmp;
1687 PyObject *bval;
1688 PyObject *key = a->ma_table[i].me_key;
1689 /* temporarily bump aval's refcount to ensure it stays
1690 alive until we're done with it */
1691 Py_INCREF(aval);
Guido van Rossumdc5f6b22006-08-24 21:29:26 +00001692 /* ditto for key */
1693 Py_INCREF(key);
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001694 bval = PyDict_GetItemWithError((PyObject *)b, key);
Guido van Rossumdc5f6b22006-08-24 21:29:26 +00001695 Py_DECREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001696 if (bval == NULL) {
1697 Py_DECREF(aval);
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001698 if (PyErr_Occurred())
1699 return -1;
Tim Peterse63415e2001-05-08 04:38:29 +00001700 return 0;
1701 }
1702 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1703 Py_DECREF(aval);
1704 if (cmp <= 0) /* error or not equal */
1705 return cmp;
1706 }
1707 }
1708 return 1;
1709 }
1710
1711static PyObject *
1712dict_richcompare(PyObject *v, PyObject *w, int op)
1713{
1714 int cmp;
1715 PyObject *res;
1716
1717 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1718 res = Py_NotImplemented;
1719 }
1720 else if (op == Py_EQ || op == Py_NE) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001721 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
Tim Peterse63415e2001-05-08 04:38:29 +00001722 if (cmp < 0)
1723 return NULL;
1724 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1725 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001726 else
1727 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001728 Py_INCREF(res);
1729 return res;
1730 }
1731
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001732static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001733dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001734{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001735 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001736 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001737
Guido van Rossum89d8c602007-09-18 17:26:56 +00001738 if (!PyUnicode_CheckExact(key) ||
1739 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001740 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001741 if (hash == -1)
1742 return NULL;
1743 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001744 ep = (mp->ma_lookup)(mp, key, hash);
1745 if (ep == NULL)
1746 return NULL;
1747 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001748}
1749
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001750static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001751dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001752{
1753 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001754 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001755 PyObject *val = NULL;
1756 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001757 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001758
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001759 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001760 return NULL;
1761
Guido van Rossum89d8c602007-09-18 17:26:56 +00001762 if (!PyUnicode_CheckExact(key) ||
1763 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001764 hash = PyObject_Hash(key);
1765 if (hash == -1)
1766 return NULL;
1767 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001768 ep = (mp->ma_lookup)(mp, key, hash);
1769 if (ep == NULL)
1770 return NULL;
1771 val = ep->me_value;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001772 if (val == NULL)
1773 val = failobj;
1774 Py_INCREF(val);
1775 return val;
1776}
1777
1778
1779static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001780dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001781{
1782 PyObject *key;
1783 PyObject *failobj = Py_None;
1784 PyObject *val = NULL;
1785 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001786 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001787
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001788 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001789 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001790
Guido van Rossum89d8c602007-09-18 17:26:56 +00001791 if (!PyUnicode_CheckExact(key) ||
1792 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001793 hash = PyObject_Hash(key);
1794 if (hash == -1)
1795 return NULL;
1796 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001797 ep = (mp->ma_lookup)(mp, key, hash);
1798 if (ep == NULL)
1799 return NULL;
1800 val = ep->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001801 if (val == NULL) {
1802 val = failobj;
1803 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1804 val = NULL;
1805 }
1806 Py_XINCREF(val);
1807 return val;
1808}
1809
1810
1811static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001812dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001813{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001814 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001815 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001816}
1817
Guido van Rossumba6ab842000-12-12 22:02:18 +00001818static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001819dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001820{
1821 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001822 PyDictEntry *ep;
Guido van Rossume027d982002-04-12 15:11:59 +00001823 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001824 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001825
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001826 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1827 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001828 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001829 if (deflt) {
1830 Py_INCREF(deflt);
1831 return deflt;
1832 }
Guido van Rossume027d982002-04-12 15:11:59 +00001833 PyErr_SetString(PyExc_KeyError,
1834 "pop(): dictionary is empty");
1835 return NULL;
1836 }
Guido van Rossum89d8c602007-09-18 17:26:56 +00001837 if (!PyUnicode_CheckExact(key) ||
1838 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossume027d982002-04-12 15:11:59 +00001839 hash = PyObject_Hash(key);
1840 if (hash == -1)
1841 return NULL;
1842 }
1843 ep = (mp->ma_lookup)(mp, key, hash);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001844 if (ep == NULL)
1845 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001846 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001847 if (deflt) {
1848 Py_INCREF(deflt);
1849 return deflt;
1850 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001851 set_key_error(key);
Guido van Rossume027d982002-04-12 15:11:59 +00001852 return NULL;
1853 }
1854 old_key = ep->me_key;
1855 Py_INCREF(dummy);
1856 ep->me_key = dummy;
1857 old_value = ep->me_value;
1858 ep->me_value = NULL;
1859 mp->ma_used--;
1860 Py_DECREF(old_key);
1861 return old_value;
1862}
1863
1864static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001865dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001866{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001867 Py_ssize_t i = 0;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001868 PyDictEntry *ep;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001869 PyObject *res;
1870
Tim Petersf4b33f62001-06-02 05:42:29 +00001871 /* Allocate the result tuple before checking the size. Believe it
1872 * or not, this allocation could trigger a garbage collection which
1873 * could empty the dict, so if we checked the size first and that
1874 * happened, the result would be an infinite loop (searching for an
1875 * entry that no longer exists). Note that the usual popitem()
1876 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001877 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00001878 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001879 */
1880 res = PyTuple_New(2);
1881 if (res == NULL)
1882 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001883 if (mp->ma_used == 0) {
1884 Py_DECREF(res);
1885 PyErr_SetString(PyExc_KeyError,
1886 "popitem(): dictionary is empty");
1887 return NULL;
1888 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001889 /* Set ep to "the first" dict entry with a value. We abuse the hash
1890 * field of slot 0 to hold a search finger:
1891 * If slot 0 has a value, use slot 0.
1892 * Else slot 0 is being used to hold a search finger,
1893 * and we use its hash value as the first index to look.
1894 */
1895 ep = &mp->ma_table[0];
1896 if (ep->me_value == NULL) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001897 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001898 /* The hash field may be a real hash value, or it may be a
1899 * legit search finger, or it may be a once-legit search
1900 * finger that's out of bounds now because it wrapped around
1901 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001902 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001903 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001904 i = 1; /* skip slot 0 */
1905 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1906 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001907 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001908 i = 1;
1909 }
1910 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001911 PyTuple_SET_ITEM(res, 0, ep->me_key);
1912 PyTuple_SET_ITEM(res, 1, ep->me_value);
1913 Py_INCREF(dummy);
1914 ep->me_key = dummy;
1915 ep->me_value = NULL;
1916 mp->ma_used--;
1917 assert(mp->ma_table[0].me_value == NULL);
1918 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001919 return res;
1920}
1921
Jeremy Hylton8caad492000-06-23 14:18:11 +00001922static int
1923dict_traverse(PyObject *op, visitproc visit, void *arg)
1924{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001925 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001926 PyObject *pk;
1927 PyObject *pv;
1928
1929 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001930 Py_VISIT(pk);
1931 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00001932 }
1933 return 0;
1934}
1935
1936static int
1937dict_tp_clear(PyObject *op)
1938{
1939 PyDict_Clear(op);
1940 return 0;
1941}
1942
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001943static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001944
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001945static PyObject *
1946dict_sizeof(PyDictObject *mp)
1947{
1948 Py_ssize_t res;
1949
Robert Schuppenies4d45bfe2008-06-28 23:58:47 +00001950 res = sizeof(PyDictObject);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001951 if (mp->ma_table != mp->ma_smalltable)
1952 res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry);
1953 return PyLong_FromSsize_t(res);
1954}
1955
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001956PyDoc_STRVAR(contains__doc__,
1957"D.__contains__(k) -> True if D has a key k, else False");
1958
1959PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1960
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001961PyDoc_STRVAR(sizeof__doc__,
1962"D.__sizeof__() -> size of D in memory, in bytes");
1963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001964PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001965"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001966
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001967PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001968"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 +00001969
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001970PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001971"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001972If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001973
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001974PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001975"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000019762-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001977
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001978PyDoc_STRVAR(update__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001979"D.update(E, **F) -> None. Update D from dict/iterable E and F.\n"
1980"If E has a .keys() method, does: for k in E: D[k] = E[k]\n\
1981If E lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
1982In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00001983
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001984PyDoc_STRVAR(fromkeys__doc__,
1985"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1986v defaults to None.");
1987
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001988PyDoc_STRVAR(clear__doc__,
1989"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001990
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001991PyDoc_STRVAR(copy__doc__,
1992"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001993
Guido van Rossumb90c8482007-02-10 01:11:45 +00001994/* Forward */
1995static PyObject *dictkeys_new(PyObject *);
1996static PyObject *dictitems_new(PyObject *);
1997static PyObject *dictvalues_new(PyObject *);
1998
Guido van Rossum45c85d12007-07-27 16:31:40 +00001999PyDoc_STRVAR(keys__doc__,
2000 "D.keys() -> a set-like object providing a view on D's keys");
2001PyDoc_STRVAR(items__doc__,
2002 "D.items() -> a set-like object providing a view on D's items");
2003PyDoc_STRVAR(values__doc__,
2004 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002005
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002006static PyMethodDef mapp_methods[] = {
Guido van Rossume2b70bc2006-08-18 22:13:04 +00002007 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002008 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00002009 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002010 getitem__doc__},
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002011 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2012 sizeof__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00002013 {"get", (PyCFunction)dict_get, METH_VARARGS,
2014 get__doc__},
2015 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2016 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002017 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00002018 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002019 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002020 popitem__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002021 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
Guido van Rossumeff072c2007-02-27 05:47:18 +00002022 keys__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002023 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
Guido van Rossumeff072c2007-02-27 05:47:18 +00002024 items__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002025 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
Guido van Rossumeff072c2007-02-27 05:47:18 +00002026 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002027 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002028 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002029 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2030 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002031 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002032 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002033 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002034 copy__doc__},
2035 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002036};
2037
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002038/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002039int
2040PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002041{
2042 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002043 PyDictObject *mp = (PyDictObject *)op;
2044 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002045
Guido van Rossum89d8c602007-09-18 17:26:56 +00002046 if (!PyUnicode_CheckExact(key) ||
2047 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002048 hash = PyObject_Hash(key);
2049 if (hash == -1)
2050 return -1;
2051 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002052 ep = (mp->ma_lookup)(mp, key, hash);
2053 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002054}
2055
Thomas Wouterscf297e42007-02-23 15:07:44 +00002056/* Internal version of PyDict_Contains used when the hash value is already known */
2057int
2058_PyDict_Contains(PyObject *op, PyObject *key, long hash)
2059{
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002060 PyDictObject *mp = (PyDictObject *)op;
2061 PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002062
2063 ep = (mp->ma_lookup)(mp, key, hash);
2064 return ep == NULL ? -1 : (ep->me_value != NULL);
2065}
2066
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002067/* Hack to implement "key in dict" */
2068static PySequenceMethods dict_as_sequence = {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002069 0, /* sq_length */
2070 0, /* sq_concat */
2071 0, /* sq_repeat */
2072 0, /* sq_item */
2073 0, /* sq_slice */
2074 0, /* sq_ass_item */
2075 0, /* sq_ass_slice */
2076 PyDict_Contains, /* sq_contains */
2077 0, /* sq_inplace_concat */
2078 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002079};
2080
Guido van Rossum09e563a2001-05-01 12:10:21 +00002081static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002082dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2083{
2084 PyObject *self;
2085
2086 assert(type != NULL && type->tp_alloc != NULL);
2087 self = type->tp_alloc(type, 0);
2088 if (self != NULL) {
2089 PyDictObject *d = (PyDictObject *)self;
2090 /* It's guaranteed that tp->alloc zeroed out the struct. */
2091 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2092 INIT_NONZERO_DICT_SLOTS(d);
Guido van Rossum89d8c602007-09-18 17:26:56 +00002093 d->ma_lookup = lookdict_unicode;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002094 /* The object has been implicitely tracked by tp_alloc */
2095 if (type == &PyDict_Type)
2096 _PyObject_GC_UNTRACK(d);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002097#ifdef SHOW_CONVERSION_COUNTS
2098 ++created;
2099#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002100#ifdef SHOW_TRACK_COUNT
2101 if (_PyObject_GC_IS_TRACKED(d))
2102 count_tracked++;
2103 else
2104 count_untracked++;
2105#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002106 }
2107 return self;
2108}
2109
Tim Peters25786c02001-09-02 08:22:48 +00002110static int
2111dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2112{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002113 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002114}
2115
Tim Peters6d6c1a32001-08-02 04:15:00 +00002116static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002117dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002118{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002119 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002120}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002121
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002122PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002123"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002124"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002125" (key, value) pairs\n"
2126"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002127" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002128" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002129" d[k] = v\n"
2130"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2131" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002132
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002133PyTypeObject PyDict_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002134 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Petersa427a2b2001-10-29 22:25:45 +00002135 "dict",
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002136 sizeof(PyDictObject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002137 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00002138 (destructor)dict_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00002139 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002140 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00002141 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002142 0, /* tp_reserved */
Guido van Rossumb9324202001-01-18 00:39:02 +00002143 (reprfunc)dict_repr, /* tp_repr */
2144 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002145 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00002146 &dict_as_mapping, /* tp_as_mapping */
Nick Coghland1abd252008-07-15 15:46:38 +00002147 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00002148 0, /* tp_call */
2149 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002150 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00002151 0, /* tp_setattro */
2152 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002153 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +00002154 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00002155 dictionary_doc, /* tp_doc */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002156 dict_traverse, /* tp_traverse */
2157 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00002158 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002159 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00002160 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002161 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002162 mapp_methods, /* tp_methods */
2163 0, /* tp_members */
2164 0, /* tp_getset */
2165 0, /* tp_base */
2166 0, /* tp_dict */
2167 0, /* tp_descr_get */
2168 0, /* tp_descr_set */
2169 0, /* tp_dictoffset */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002170 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002171 PyType_GenericAlloc, /* tp_alloc */
2172 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002173 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002174};
2175
Guido van Rossum3cca2451997-05-16 14:23:33 +00002176/* For backward compatibility with old dictionary interface */
2177
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002178PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002179PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002180{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002181 PyObject *kv, *rv;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002182 kv = PyUnicode_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002183 if (kv == NULL)
2184 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002185 rv = PyDict_GetItem(v, kv);
2186 Py_DECREF(kv);
2187 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002188}
2189
2190int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002191PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002192{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002193 PyObject *kv;
2194 int err;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002195 kv = PyUnicode_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002196 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002197 return -1;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002198 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002199 err = PyDict_SetItem(v, kv, item);
2200 Py_DECREF(kv);
2201 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002202}
2203
2204int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002205PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002206{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002207 PyObject *kv;
2208 int err;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002209 kv = PyUnicode_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002210 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002211 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002212 err = PyDict_DelItem(v, kv);
2213 Py_DECREF(kv);
2214 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002215}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002216
Raymond Hettinger019a1482004-03-18 02:41:19 +00002217/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002218
2219typedef struct {
2220 PyObject_HEAD
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002221 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002222 Py_ssize_t di_used;
2223 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002224 PyObject* di_result; /* reusable result tuple for iteritems */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002225 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002226} dictiterobject;
2227
2228static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002229dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002230{
2231 dictiterobject *di;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002232 di = PyObject_GC_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002233 if (di == NULL)
2234 return NULL;
2235 Py_INCREF(dict);
2236 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002237 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002238 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002239 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002240 if (itertype == &PyDictIterItem_Type) {
2241 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2242 if (di->di_result == NULL) {
2243 Py_DECREF(di);
2244 return NULL;
2245 }
2246 }
2247 else
2248 di->di_result = NULL;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002249 _PyObject_GC_TRACK(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002250 return (PyObject *)di;
2251}
2252
2253static void
2254dictiter_dealloc(dictiterobject *di)
2255{
Guido van Rossum2147df72002-07-16 20:30:22 +00002256 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002257 Py_XDECREF(di->di_result);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002258 PyObject_GC_Del(di);
2259}
2260
2261static int
2262dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2263{
2264 Py_VISIT(di->di_dict);
2265 Py_VISIT(di->di_result);
2266 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002267}
2268
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002269static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002270dictiter_len(dictiterobject *di)
2271{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002272 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002273 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002274 len = di->len;
Christian Heimes217cfd12007-12-02 14:31:20 +00002275 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002276}
2277
Guido van Rossumb90c8482007-02-10 01:11:45 +00002278PyDoc_STRVAR(length_hint_doc,
2279 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002280
2281static PyMethodDef dictiter_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002282 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2283 length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002284 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002285};
2286
Raymond Hettinger019a1482004-03-18 02:41:19 +00002287static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002288{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002289 PyObject *key;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002290 register Py_ssize_t i, mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002291 register PyDictEntry *ep;
2292 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002293
Raymond Hettinger019a1482004-03-18 02:41:19 +00002294 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002295 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002296 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002297
Raymond Hettinger019a1482004-03-18 02:41:19 +00002298 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002299 PyErr_SetString(PyExc_RuntimeError,
2300 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002301 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002302 return NULL;
2303 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002304
Raymond Hettinger019a1482004-03-18 02:41:19 +00002305 i = di->di_pos;
2306 if (i < 0)
2307 goto fail;
2308 ep = d->ma_table;
2309 mask = d->ma_mask;
2310 while (i <= mask && ep[i].me_value == NULL)
2311 i++;
2312 di->di_pos = i+1;
2313 if (i > mask)
2314 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002315 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002316 key = ep[i].me_key;
2317 Py_INCREF(key);
2318 return key;
2319
2320fail:
2321 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002322 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002323 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002324}
2325
Raymond Hettinger019a1482004-03-18 02:41:19 +00002326PyTypeObject PyDictIterKey_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002327 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002328 "dict_keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002329 sizeof(dictiterobject), /* tp_basicsize */
2330 0, /* tp_itemsize */
2331 /* methods */
2332 (destructor)dictiter_dealloc, /* tp_dealloc */
2333 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002334 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002335 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002336 0, /* tp_reserved */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002337 0, /* tp_repr */
2338 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002339 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002340 0, /* tp_as_mapping */
2341 0, /* tp_hash */
2342 0, /* tp_call */
2343 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002344 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002345 0, /* tp_setattro */
2346 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002347 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002348 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002349 (traverseproc)dictiter_traverse, /* tp_traverse */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002350 0, /* tp_clear */
2351 0, /* tp_richcompare */
2352 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002353 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002354 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002355 dictiter_methods, /* tp_methods */
2356 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002357};
2358
2359static PyObject *dictiter_iternextvalue(dictiterobject *di)
2360{
2361 PyObject *value;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002362 register Py_ssize_t i, mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002363 register PyDictEntry *ep;
2364 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002365
2366 if (d == NULL)
2367 return NULL;
2368 assert (PyDict_Check(d));
2369
2370 if (di->di_used != d->ma_used) {
2371 PyErr_SetString(PyExc_RuntimeError,
2372 "dictionary changed size during iteration");
2373 di->di_used = -1; /* Make this state sticky */
2374 return NULL;
2375 }
2376
2377 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002378 mask = d->ma_mask;
2379 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002380 goto fail;
2381 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002382 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002383 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002384 if (i > mask)
2385 goto fail;
2386 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002387 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002388 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002389 Py_INCREF(value);
2390 return value;
2391
2392fail:
2393 Py_DECREF(d);
2394 di->di_dict = NULL;
2395 return NULL;
2396}
2397
2398PyTypeObject PyDictIterValue_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002399 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002400 "dict_valueiterator", /* tp_name */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002401 sizeof(dictiterobject), /* tp_basicsize */
2402 0, /* tp_itemsize */
2403 /* methods */
2404 (destructor)dictiter_dealloc, /* tp_dealloc */
2405 0, /* tp_print */
2406 0, /* tp_getattr */
2407 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002408 0, /* tp_reserved */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002409 0, /* tp_repr */
2410 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002411 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002412 0, /* tp_as_mapping */
2413 0, /* tp_hash */
2414 0, /* tp_call */
2415 0, /* tp_str */
2416 PyObject_GenericGetAttr, /* tp_getattro */
2417 0, /* tp_setattro */
2418 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002419 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002420 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002421 (traverseproc)dictiter_traverse, /* tp_traverse */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002422 0, /* tp_clear */
2423 0, /* tp_richcompare */
2424 0, /* tp_weaklistoffset */
2425 PyObject_SelfIter, /* tp_iter */
2426 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002427 dictiter_methods, /* tp_methods */
2428 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002429};
2430
2431static PyObject *dictiter_iternextitem(dictiterobject *di)
2432{
2433 PyObject *key, *value, *result = di->di_result;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002434 register Py_ssize_t i, mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002435 register PyDictEntry *ep;
2436 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002437
2438 if (d == NULL)
2439 return NULL;
2440 assert (PyDict_Check(d));
2441
2442 if (di->di_used != d->ma_used) {
2443 PyErr_SetString(PyExc_RuntimeError,
2444 "dictionary changed size during iteration");
2445 di->di_used = -1; /* Make this state sticky */
2446 return NULL;
2447 }
2448
2449 i = di->di_pos;
2450 if (i < 0)
2451 goto fail;
2452 ep = d->ma_table;
2453 mask = d->ma_mask;
2454 while (i <= mask && ep[i].me_value == NULL)
2455 i++;
2456 di->di_pos = i+1;
2457 if (i > mask)
2458 goto fail;
2459
2460 if (result->ob_refcnt == 1) {
2461 Py_INCREF(result);
2462 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2463 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2464 } else {
2465 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002466 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002467 return NULL;
2468 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002469 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002470 key = ep[i].me_key;
2471 value = ep[i].me_value;
2472 Py_INCREF(key);
2473 Py_INCREF(value);
2474 PyTuple_SET_ITEM(result, 0, key);
2475 PyTuple_SET_ITEM(result, 1, value);
2476 return result;
2477
2478fail:
2479 Py_DECREF(d);
2480 di->di_dict = NULL;
2481 return NULL;
2482}
2483
2484PyTypeObject PyDictIterItem_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002485 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002486 "dict_itemiterator", /* tp_name */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002487 sizeof(dictiterobject), /* tp_basicsize */
2488 0, /* tp_itemsize */
2489 /* methods */
2490 (destructor)dictiter_dealloc, /* tp_dealloc */
2491 0, /* tp_print */
2492 0, /* tp_getattr */
2493 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002494 0, /* tp_reserved */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002495 0, /* tp_repr */
2496 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002497 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002498 0, /* tp_as_mapping */
2499 0, /* tp_hash */
2500 0, /* tp_call */
2501 0, /* tp_str */
2502 PyObject_GenericGetAttr, /* tp_getattro */
2503 0, /* tp_setattro */
2504 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002505 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002506 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002507 (traverseproc)dictiter_traverse, /* tp_traverse */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002508 0, /* tp_clear */
2509 0, /* tp_richcompare */
2510 0, /* tp_weaklistoffset */
2511 PyObject_SelfIter, /* tp_iter */
2512 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002513 dictiter_methods, /* tp_methods */
2514 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002515};
Guido van Rossumb90c8482007-02-10 01:11:45 +00002516
2517
Guido van Rossum3ac67412007-02-10 18:55:06 +00002518/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002519/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002520/***********************************************/
2521
Guido van Rossumb90c8482007-02-10 01:11:45 +00002522/* The instance lay-out is the same for all three; but the type differs. */
2523
2524typedef struct {
2525 PyObject_HEAD
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002526 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002527} dictviewobject;
2528
2529
2530static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00002531dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002532{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002533 Py_XDECREF(dv->dv_dict);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002534 PyObject_GC_Del(dv);
2535}
2536
2537static int
2538dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
2539{
2540 Py_VISIT(dv->dv_dict);
2541 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002542}
2543
Guido van Rossum83825ac2007-02-10 04:54:19 +00002544static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00002545dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002546{
2547 Py_ssize_t len = 0;
Guido van Rossum3ac67412007-02-10 18:55:06 +00002548 if (dv->dv_dict != NULL)
2549 len = dv->dv_dict->ma_used;
Guido van Rossum83825ac2007-02-10 04:54:19 +00002550 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002551}
2552
2553static PyObject *
2554dictview_new(PyObject *dict, PyTypeObject *type)
2555{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002556 dictviewobject *dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002557 if (dict == NULL) {
2558 PyErr_BadInternalCall();
2559 return NULL;
2560 }
2561 if (!PyDict_Check(dict)) {
2562 /* XXX Get rid of this restriction later */
2563 PyErr_Format(PyExc_TypeError,
2564 "%s() requires a dict argument, not '%s'",
2565 type->tp_name, dict->ob_type->tp_name);
2566 return NULL;
2567 }
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002568 dv = PyObject_GC_New(dictviewobject, type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002569 if (dv == NULL)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002570 return NULL;
2571 Py_INCREF(dict);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002572 dv->dv_dict = (PyDictObject *)dict;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002573 _PyObject_GC_TRACK(dv);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002574 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002575}
2576
Neal Norwitze36f2ba2007-02-26 23:12:28 +00002577/* TODO(guido): The views objects are not complete:
2578
2579 * support more set operations
2580 * support arbitrary mappings?
2581 - either these should be static or exported in dictobject.h
2582 - if public then they should probably be in builtins
2583*/
2584
Guido van Rossumaac530c2007-08-24 22:33:45 +00002585/* Return 1 if self is a subset of other, iterating over self;
2586 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002587static int
2588all_contained_in(PyObject *self, PyObject *other)
2589{
2590 PyObject *iter = PyObject_GetIter(self);
2591 int ok = 1;
2592
2593 if (iter == NULL)
2594 return -1;
2595 for (;;) {
2596 PyObject *next = PyIter_Next(iter);
2597 if (next == NULL) {
2598 if (PyErr_Occurred())
2599 ok = -1;
2600 break;
2601 }
2602 ok = PySequence_Contains(other, next);
2603 Py_DECREF(next);
2604 if (ok <= 0)
2605 break;
2606 }
2607 Py_DECREF(iter);
2608 return ok;
2609}
2610
2611static PyObject *
2612dictview_richcompare(PyObject *self, PyObject *other, int op)
2613{
Guido van Rossumaac530c2007-08-24 22:33:45 +00002614 Py_ssize_t len_self, len_other;
2615 int ok;
2616 PyObject *result;
2617
Guido van Rossumd9214d12007-02-12 02:23:40 +00002618 assert(self != NULL);
2619 assert(PyDictViewSet_Check(self));
2620 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00002621
Guido van Rossumaac530c2007-08-24 22:33:45 +00002622 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other)) {
Guido van Rossumd9214d12007-02-12 02:23:40 +00002623 Py_INCREF(Py_NotImplemented);
2624 return Py_NotImplemented;
2625 }
Guido van Rossumaac530c2007-08-24 22:33:45 +00002626
2627 len_self = PyObject_Size(self);
2628 if (len_self < 0)
2629 return NULL;
2630 len_other = PyObject_Size(other);
2631 if (len_other < 0)
2632 return NULL;
2633
2634 ok = 0;
2635 switch(op) {
2636
2637 case Py_NE:
2638 case Py_EQ:
2639 if (len_self == len_other)
2640 ok = all_contained_in(self, other);
2641 if (op == Py_NE && ok >= 0)
2642 ok = !ok;
2643 break;
2644
2645 case Py_LT:
2646 if (len_self < len_other)
2647 ok = all_contained_in(self, other);
2648 break;
2649
2650 case Py_LE:
2651 if (len_self <= len_other)
2652 ok = all_contained_in(self, other);
2653 break;
2654
2655 case Py_GT:
2656 if (len_self > len_other)
2657 ok = all_contained_in(other, self);
2658 break;
2659
2660 case Py_GE:
2661 if (len_self >= len_other)
2662 ok = all_contained_in(other, self);
2663 break;
2664
2665 }
2666 if (ok < 0)
2667 return NULL;
2668 result = ok ? Py_True : Py_False;
2669 Py_INCREF(result);
2670 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002671}
2672
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002673static PyObject *
2674dictview_repr(dictviewobject *dv)
2675{
2676 PyObject *seq;
2677 PyObject *result;
2678
2679 seq = PySequence_List((PyObject *)dv);
2680 if (seq == NULL)
2681 return NULL;
2682
2683 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
2684 Py_DECREF(seq);
2685 return result;
2686}
2687
Guido van Rossum3ac67412007-02-10 18:55:06 +00002688/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002689
2690static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002691dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002692{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002693 if (dv->dv_dict == NULL) {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002694 Py_RETURN_NONE;
2695 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002696 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
2697}
2698
2699static int
2700dictkeys_contains(dictviewobject *dv, PyObject *obj)
2701{
2702 if (dv->dv_dict == NULL)
2703 return 0;
2704 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002705}
2706
Guido van Rossum83825ac2007-02-10 04:54:19 +00002707static PySequenceMethods dictkeys_as_sequence = {
2708 (lenfunc)dictview_len, /* sq_length */
2709 0, /* sq_concat */
2710 0, /* sq_repeat */
2711 0, /* sq_item */
2712 0, /* sq_slice */
2713 0, /* sq_ass_item */
2714 0, /* sq_ass_slice */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002715 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002716};
2717
Guido van Rossum523259b2007-08-24 23:41:22 +00002718static PyObject*
2719dictviews_sub(PyObject* self, PyObject *other)
2720{
2721 PyObject *result = PySet_New(self);
2722 PyObject *tmp;
2723 if (result == NULL)
2724 return NULL;
2725
2726 tmp = PyObject_CallMethod(result, "difference_update", "O", other);
2727 if (tmp == NULL) {
2728 Py_DECREF(result);
2729 return NULL;
2730 }
2731
2732 Py_DECREF(tmp);
2733 return result;
2734}
2735
2736static PyObject*
2737dictviews_and(PyObject* self, PyObject *other)
2738{
2739 PyObject *result = PySet_New(self);
2740 PyObject *tmp;
2741 if (result == NULL)
2742 return NULL;
2743
2744 tmp = PyObject_CallMethod(result, "intersection_update", "O", other);
2745 if (tmp == NULL) {
2746 Py_DECREF(result);
2747 return NULL;
2748 }
2749
2750 Py_DECREF(tmp);
2751 return result;
2752}
2753
2754static PyObject*
2755dictviews_or(PyObject* self, PyObject *other)
2756{
2757 PyObject *result = PySet_New(self);
2758 PyObject *tmp;
2759 if (result == NULL)
2760 return NULL;
2761
2762 tmp = PyObject_CallMethod(result, "update", "O", other);
2763 if (tmp == NULL) {
2764 Py_DECREF(result);
2765 return NULL;
2766 }
2767
2768 Py_DECREF(tmp);
2769 return result;
2770}
2771
2772static PyObject*
2773dictviews_xor(PyObject* self, PyObject *other)
2774{
2775 PyObject *result = PySet_New(self);
2776 PyObject *tmp;
2777 if (result == NULL)
2778 return NULL;
2779
2780 tmp = PyObject_CallMethod(result, "symmetric_difference_update", "O",
2781 other);
2782 if (tmp == NULL) {
2783 Py_DECREF(result);
2784 return NULL;
2785 }
2786
2787 Py_DECREF(tmp);
2788 return result;
2789}
2790
2791static PyNumberMethods dictviews_as_number = {
2792 0, /*nb_add*/
2793 (binaryfunc)dictviews_sub, /*nb_subtract*/
2794 0, /*nb_multiply*/
2795 0, /*nb_remainder*/
2796 0, /*nb_divmod*/
2797 0, /*nb_power*/
2798 0, /*nb_negative*/
2799 0, /*nb_positive*/
2800 0, /*nb_absolute*/
2801 0, /*nb_bool*/
2802 0, /*nb_invert*/
2803 0, /*nb_lshift*/
2804 0, /*nb_rshift*/
2805 (binaryfunc)dictviews_and, /*nb_and*/
2806 (binaryfunc)dictviews_xor, /*nb_xor*/
2807 (binaryfunc)dictviews_or, /*nb_or*/
2808};
2809
Guido van Rossumb90c8482007-02-10 01:11:45 +00002810static PyMethodDef dictkeys_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002811 {NULL, NULL} /* sentinel */
2812};
2813
2814PyTypeObject PyDictKeys_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002815 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002816 "dict_keys", /* tp_name */
2817 sizeof(dictviewobject), /* tp_basicsize */
2818 0, /* tp_itemsize */
2819 /* methods */
2820 (destructor)dictview_dealloc, /* tp_dealloc */
2821 0, /* tp_print */
2822 0, /* tp_getattr */
2823 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002824 0, /* tp_reserved */
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002825 (reprfunc)dictview_repr, /* tp_repr */
Guido van Rossum523259b2007-08-24 23:41:22 +00002826 &dictviews_as_number, /* tp_as_number */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002827 &dictkeys_as_sequence, /* tp_as_sequence */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002828 0, /* tp_as_mapping */
2829 0, /* tp_hash */
2830 0, /* tp_call */
2831 0, /* tp_str */
2832 PyObject_GenericGetAttr, /* tp_getattro */
2833 0, /* tp_setattro */
2834 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002835 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002836 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002837 (traverseproc)dictview_traverse, /* tp_traverse */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002838 0, /* tp_clear */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002839 dictview_richcompare, /* tp_richcompare */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002840 0, /* tp_weaklistoffset */
2841 (getiterfunc)dictkeys_iter, /* tp_iter */
2842 0, /* tp_iternext */
2843 dictkeys_methods, /* tp_methods */
2844 0,
2845};
2846
2847static PyObject *
2848dictkeys_new(PyObject *dict)
2849{
2850 return dictview_new(dict, &PyDictKeys_Type);
2851}
2852
Guido van Rossum3ac67412007-02-10 18:55:06 +00002853/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002854
2855static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002856dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002857{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002858 if (dv->dv_dict == NULL) {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002859 Py_RETURN_NONE;
2860 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002861 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
2862}
2863
2864static int
2865dictitems_contains(dictviewobject *dv, PyObject *obj)
2866{
2867 PyObject *key, *value, *found;
2868 if (dv->dv_dict == NULL)
2869 return 0;
2870 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
2871 return 0;
2872 key = PyTuple_GET_ITEM(obj, 0);
2873 value = PyTuple_GET_ITEM(obj, 1);
2874 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
2875 if (found == NULL) {
2876 if (PyErr_Occurred())
2877 return -1;
2878 return 0;
2879 }
2880 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002881}
2882
Guido van Rossum83825ac2007-02-10 04:54:19 +00002883static PySequenceMethods dictitems_as_sequence = {
2884 (lenfunc)dictview_len, /* sq_length */
2885 0, /* sq_concat */
2886 0, /* sq_repeat */
2887 0, /* sq_item */
2888 0, /* sq_slice */
2889 0, /* sq_ass_item */
2890 0, /* sq_ass_slice */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002891 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002892};
2893
Guido van Rossumb90c8482007-02-10 01:11:45 +00002894static PyMethodDef dictitems_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002895 {NULL, NULL} /* sentinel */
2896};
2897
2898PyTypeObject PyDictItems_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002899 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002900 "dict_items", /* tp_name */
2901 sizeof(dictviewobject), /* tp_basicsize */
2902 0, /* tp_itemsize */
2903 /* methods */
2904 (destructor)dictview_dealloc, /* tp_dealloc */
2905 0, /* tp_print */
2906 0, /* tp_getattr */
2907 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002908 0, /* tp_reserved */
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002909 (reprfunc)dictview_repr, /* tp_repr */
Guido van Rossum523259b2007-08-24 23:41:22 +00002910 &dictviews_as_number, /* tp_as_number */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002911 &dictitems_as_sequence, /* tp_as_sequence */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002912 0, /* tp_as_mapping */
2913 0, /* tp_hash */
2914 0, /* tp_call */
2915 0, /* tp_str */
2916 PyObject_GenericGetAttr, /* tp_getattro */
2917 0, /* tp_setattro */
2918 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002919 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002920 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002921 (traverseproc)dictview_traverse, /* tp_traverse */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002922 0, /* tp_clear */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002923 dictview_richcompare, /* tp_richcompare */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002924 0, /* tp_weaklistoffset */
2925 (getiterfunc)dictitems_iter, /* tp_iter */
2926 0, /* tp_iternext */
2927 dictitems_methods, /* tp_methods */
2928 0,
2929};
2930
2931static PyObject *
2932dictitems_new(PyObject *dict)
2933{
2934 return dictview_new(dict, &PyDictItems_Type);
2935}
2936
Guido van Rossum3ac67412007-02-10 18:55:06 +00002937/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002938
2939static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002940dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002941{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002942 if (dv->dv_dict == NULL) {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002943 Py_RETURN_NONE;
2944 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002945 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002946}
2947
Guido van Rossum83825ac2007-02-10 04:54:19 +00002948static PySequenceMethods dictvalues_as_sequence = {
2949 (lenfunc)dictview_len, /* sq_length */
2950 0, /* sq_concat */
2951 0, /* sq_repeat */
2952 0, /* sq_item */
2953 0, /* sq_slice */
2954 0, /* sq_ass_item */
2955 0, /* sq_ass_slice */
2956 (objobjproc)0, /* sq_contains */
2957};
2958
Guido van Rossumb90c8482007-02-10 01:11:45 +00002959static PyMethodDef dictvalues_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002960 {NULL, NULL} /* sentinel */
2961};
2962
2963PyTypeObject PyDictValues_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002964 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002965 "dict_values", /* tp_name */
2966 sizeof(dictviewobject), /* tp_basicsize */
2967 0, /* tp_itemsize */
2968 /* methods */
2969 (destructor)dictview_dealloc, /* tp_dealloc */
2970 0, /* tp_print */
2971 0, /* tp_getattr */
2972 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002973 0, /* tp_reserved */
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002974 (reprfunc)dictview_repr, /* tp_repr */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002975 0, /* tp_as_number */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002976 &dictvalues_as_sequence, /* tp_as_sequence */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002977 0, /* tp_as_mapping */
2978 0, /* tp_hash */
2979 0, /* tp_call */
2980 0, /* tp_str */
2981 PyObject_GenericGetAttr, /* tp_getattro */
2982 0, /* tp_setattro */
2983 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002984 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002985 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002986 (traverseproc)dictview_traverse, /* tp_traverse */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002987 0, /* tp_clear */
2988 0, /* tp_richcompare */
2989 0, /* tp_weaklistoffset */
2990 (getiterfunc)dictvalues_iter, /* tp_iter */
2991 0, /* tp_iternext */
2992 dictvalues_methods, /* tp_methods */
2993 0,
2994};
2995
2996static PyObject *
2997dictvalues_new(PyObject *dict)
2998{
2999 return dictview_new(dict, &PyDictValues_Type);
3000}