blob: 1d36e1d4dc299ad5e5526d6b16951daa6baa965b [file] [log] [blame]
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001
Guido van Rossum2bc13791999-03-24 19:06:42 +00002/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003
Raymond Hettinger930427b2003-05-03 06:51:59 +00004/* The distribution includes a separate file, Objects/dictnotes.txt,
Tim Peters60b29962006-01-01 01:19:23 +00005 describing explorations into dictionary design and optimization.
Raymond Hettinger930427b2003-05-03 06:51:59 +00006 It covers typical dictionary use patterns, the parameters for
7 tuning dictionaries, and several ideas for possible optimizations.
8*/
9
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010#include "Python.h"
Christian Heimes0ded5b52007-12-10 15:50:56 +000011#include "stringlib/eq.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000012
Guido van Rossum16e93a81997-01-28 00:00:11 +000013
Thomas Wouters89f507f2006-12-13 04:49:30 +000014/* Set a key error with the specified argument, wrapping it in a
15 * tuple automatically so that tuple keys are not unpacked as the
16 * exception arguments. */
17static void
18set_key_error(PyObject *arg)
19{
20 PyObject *tup;
21 tup = PyTuple_Pack(1, arg);
22 if (!tup)
23 return; /* caller will expect error to be set anyway */
24 PyErr_SetObject(PyExc_KeyError, tup);
25 Py_DECREF(tup);
26}
27
Tim Peterseb28ef22001-06-02 05:27:19 +000028/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000029#undef SHOW_CONVERSION_COUNTS
30
Tim Peterseb28ef22001-06-02 05:27:19 +000031/* See large comment block below. This must be >= 1. */
32#define PERTURB_SHIFT 5
33
Guido van Rossum16e93a81997-01-28 00:00:11 +000034/*
Tim Peterseb28ef22001-06-02 05:27:19 +000035Major subtleties ahead: Most hash schemes depend on having a "good" hash
36function, in the sense of simulating randomness. Python doesn't: its most
37important hash functions (for strings and ints) are very regular in common
38cases:
Tim Peters15d49292001-05-27 07:39:22 +000039
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000040 >>> map(hash, (0, 1, 2, 3))
41 [0, 1, 2, 3]
42 >>> map(hash, ("namea", "nameb", "namec", "named"))
43 [-1658398457, -1658398460, -1658398459, -1658398462]
44 >>>
Tim Peters15d49292001-05-27 07:39:22 +000045
Tim Peterseb28ef22001-06-02 05:27:19 +000046This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
47the low-order i bits as the initial table index is extremely fast, and there
48are no collisions at all for dicts indexed by a contiguous range of ints.
49The same is approximately true when keys are "consecutive" strings. So this
50gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000051
Tim Peterseb28ef22001-06-02 05:27:19 +000052OTOH, when collisions occur, the tendency to fill contiguous slices of the
53hash table makes a good collision resolution strategy crucial. Taking only
54the last i bits of the hash code is also vulnerable: for example, consider
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000055the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
56their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
57 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000058
Tim Peterseb28ef22001-06-02 05:27:19 +000059But catering to unusual cases should not slow the usual ones, so we just take
60the last i bits anyway. It's up to collision resolution to do the rest. If
61we *usually* find the key we're looking for on the first try (and, it turns
62out, we usually do -- the table load factor is kept under 2/3, so the odds
63are solidly in our favor), then it makes best sense to keep the initial index
64computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000065
Tim Peterseb28ef22001-06-02 05:27:19 +000066The first half of collision resolution is to visit table indices via this
67recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000068
Tim Peterseb28ef22001-06-02 05:27:19 +000069 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000070
Tim Peterseb28ef22001-06-02 05:27:19 +000071For any initial j in range(2**i), repeating that 2**i times generates each
72int in range(2**i) exactly once (see any text on random-number generation for
73proof). By itself, this doesn't help much: like linear probing (setting
74j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
75order. This would be bad, except that's not the only thing we do, and it's
76actually *good* in the common cases where hash keys are consecutive. In an
77example that's really too small to make this entirely clear, for a table of
78size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000079
Tim Peterseb28ef22001-06-02 05:27:19 +000080 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
81
82If two things come in at index 5, the first place we look after is index 2,
83not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
84Linear probing is deadly in this case because there the fixed probe order
85is the *same* as the order consecutive keys are likely to arrive. But it's
86extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
87and certain that consecutive hash codes do not.
88
89The other half of the strategy is to get the other bits of the hash code
90into play. This is done by initializing a (unsigned) vrbl "perturb" to the
91full hash code, and changing the recurrence to:
92
93 j = (5*j) + 1 + perturb;
94 perturb >>= PERTURB_SHIFT;
95 use j % 2**i as the next table index;
96
97Now the probe sequence depends (eventually) on every bit in the hash code,
98and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
99because it quickly magnifies small differences in the bits that didn't affect
100the initial index. Note that because perturb is unsigned, if the recurrence
101is executed often enough perturb eventually becomes and remains 0. At that
102point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
103that's certain to find an empty slot eventually (since it generates every int
104in range(2**i), and we make sure there's always at least one empty slot).
105
106Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
107small so that the high bits of the hash code continue to affect the probe
108sequence across iterations; but you want it large so that in really bad cases
109the high-order hash bits have an effect on early iterations. 5 was "the
110best" in minimizing total collisions across experiments Tim Peters ran (on
111both normal and pathological cases), but 4 and 6 weren't significantly worse.
112
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000113Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000114approach, using repeated multiplication by x in GF(2**n) where an irreducible
115polynomial for each table size was chosen such that x was a primitive root.
116Christian Tismer later extended that to use division by x instead, as an
117efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000118also gave excellent collision statistics, but was more expensive: two
119if-tests were required inside the loop; computing "the next" index took about
120the same number of operations but without as much potential parallelism
121(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
122above, and then shifting perturb can be done while the table index is being
123masked); and the PyDictObject struct required a member to hold the table's
124polynomial. In Tim's experiments the current scheme ran faster, produced
125equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000126
127Theoretical Python 2.5 headache: hash codes are only C "long", but
128sizeof(Py_ssize_t) > sizeof(long) may be possible. In that case, and if a
129dict is genuinely huge, then only the slots directly reachable via indexing
130by a C long can be the first slot in a probe sequence. The probe sequence
131will still eventually reach every slot in the table, but the collision rate
132on initial probes may be much higher than this scheme was designed for.
133Getting a hash code as fat as Py_ssize_t is the only real cure. But in
134practice, this probably won't make a lick of difference for many years (at
135which point everyone will have terabytes of RAM on 64-bit boxes).
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000136*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000137
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000138/* Object used as dummy key to fill deleted entries */
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000139static PyObject *dummy = NULL; /* Initialized by first call to newPyDictObject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000140
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000141#ifdef Py_REF_DEBUG
142PyObject *
143_PyDict_Dummy(void)
144{
145 return dummy;
146}
147#endif
148
Fred Drake1bff34a2000-08-31 19:31:38 +0000149/* forward declarations */
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000150static PyDictEntry *
151lookdict_unicode(PyDictObject *mp, PyObject *key, long hash);
Fred Drake1bff34a2000-08-31 19:31:38 +0000152
153#ifdef SHOW_CONVERSION_COUNTS
154static long created = 0L;
155static long converted = 0L;
156
157static void
158show_counts(void)
159{
160 fprintf(stderr, "created %ld string dicts\n", created);
161 fprintf(stderr, "converted %ld to normal dicts\n", converted);
162 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
163}
164#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000165
Christian Heimes77c02eb2008-02-09 02:18:51 +0000166/* Debug statistic to compare allocations with reuse through the free list */
167#undef SHOW_ALLOC_COUNT
168#ifdef SHOW_ALLOC_COUNT
169static size_t count_alloc = 0;
170static size_t count_reuse = 0;
171
172static void
173show_alloc(void)
174{
Christian Heimes23daade02008-02-25 12:39:23 +0000175 fprintf(stderr, "Dict allocations: %" PY_FORMAT_SIZE_T "d\n",
176 count_alloc);
177 fprintf(stderr, "Dict reuse through freelist: %" PY_FORMAT_SIZE_T
178 "d\n", count_reuse);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000179 fprintf(stderr, "%.2f%% reuse rate\n\n",
180 (100.0*count_reuse/(count_alloc+count_reuse)));
181}
182#endif
183
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000184/* Debug statistic to count GC tracking of dicts */
185#ifdef SHOW_TRACK_COUNT
186static Py_ssize_t count_untracked = 0;
187static Py_ssize_t count_tracked = 0;
188
189static void
190show_track(void)
191{
192 fprintf(stderr, "Dicts created: %" PY_FORMAT_SIZE_T "d\n",
193 count_tracked + count_untracked);
194 fprintf(stderr, "Dicts tracked by the GC: %" PY_FORMAT_SIZE_T
195 "d\n", count_tracked);
196 fprintf(stderr, "%.2f%% dict tracking rate\n\n",
197 (100.0*count_tracked/(count_untracked+count_tracked)));
198}
199#endif
200
201
Tim Peters6d6c1a32001-08-02 04:15:00 +0000202/* Initialization macros.
203 There are two ways to create a dict: PyDict_New() is the main C API
204 function, and the tp_new slot maps to dict_new(). In the latter case we
205 can save a little time over what PyDict_New does because it's guaranteed
206 that the PyDictObject struct is already zeroed out.
207 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
208 an excellent reason not to).
209*/
210
211#define INIT_NONZERO_DICT_SLOTS(mp) do { \
Tim Petersdea48ec2001-05-22 20:40:22 +0000212 (mp)->ma_table = (mp)->ma_smalltable; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000213 (mp)->ma_mask = PyDict_MINSIZE - 1; \
214 } while(0)
215
216#define EMPTY_TO_MINSIZE(mp) do { \
217 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000218 (mp)->ma_used = (mp)->ma_fill = 0; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000219 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000220 } while(0)
221
Raymond Hettinger43442782004-03-17 21:55:03 +0000222/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes2202f872008-02-06 14:31:34 +0000223#ifndef PyDict_MAXFREELIST
224#define PyDict_MAXFREELIST 80
225#endif
226static PyDictObject *free_list[PyDict_MAXFREELIST];
227static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000228
Christian Heimes77c02eb2008-02-09 02:18:51 +0000229void
230PyDict_Fini(void)
231{
232 PyDictObject *op;
233
234 while (numfree) {
235 op = free_list[--numfree];
236 assert(PyDict_CheckExact(op));
237 PyObject_GC_Del(op);
238 }
239}
240
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000242PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000243{
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000244 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000245 if (dummy == NULL) { /* Auto-initialize dummy */
Neal Norwitz53cbdaa2007-08-23 21:42:55 +0000246 dummy = PyUnicode_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000247 if (dummy == NULL)
248 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000249#ifdef SHOW_CONVERSION_COUNTS
250 Py_AtExit(show_counts);
251#endif
Christian Heimes77c02eb2008-02-09 02:18:51 +0000252#ifdef SHOW_ALLOC_COUNT
253 Py_AtExit(show_alloc);
254#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000255#ifdef SHOW_TRACK_COUNT
256 Py_AtExit(show_track);
257#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000258 }
Christian Heimes2202f872008-02-06 14:31:34 +0000259 if (numfree) {
260 mp = free_list[--numfree];
Raymond Hettinger43442782004-03-17 21:55:03 +0000261 assert (mp != NULL);
Christian Heimes90aa7642007-12-19 02:45:37 +0000262 assert (Py_TYPE(mp) == &PyDict_Type);
Raymond Hettinger43442782004-03-17 21:55:03 +0000263 _Py_NewReference((PyObject *)mp);
264 if (mp->ma_fill) {
265 EMPTY_TO_MINSIZE(mp);
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000266 } else {
267 /* At least set ma_table and ma_mask; these are wrong
268 if an empty but presized dict is added to freelist */
269 INIT_NONZERO_DICT_SLOTS(mp);
Raymond Hettinger43442782004-03-17 21:55:03 +0000270 }
271 assert (mp->ma_used == 0);
272 assert (mp->ma_table == mp->ma_smalltable);
273 assert (mp->ma_mask == PyDict_MINSIZE - 1);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000274#ifdef SHOW_ALLOC_COUNT
275 count_reuse++;
276#endif
Raymond Hettinger43442782004-03-17 21:55:03 +0000277 } else {
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000278 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
Raymond Hettinger43442782004-03-17 21:55:03 +0000279 if (mp == NULL)
280 return NULL;
281 EMPTY_TO_MINSIZE(mp);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000282#ifdef SHOW_ALLOC_COUNT
283 count_alloc++;
284#endif
Raymond Hettinger43442782004-03-17 21:55:03 +0000285 }
Guido van Rossum89d8c602007-09-18 17:26:56 +0000286 mp->ma_lookup = lookdict_unicode;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000287#ifdef SHOW_TRACK_COUNT
288 count_untracked++;
289#endif
Fred Drake1bff34a2000-08-31 19:31:38 +0000290#ifdef SHOW_CONVERSION_COUNTS
291 ++created;
292#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000293 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000294}
295
296/*
297The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000298This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000299Open addressing is preferred over chaining since the link overhead for
300chaining would be substantial (100% with typical malloc overhead).
301
Tim Peterseb28ef22001-06-02 05:27:19 +0000302The initial probe index is computed as hash mod the table size. Subsequent
303probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000304
305All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000306
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000307The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000308contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000309Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000310
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000311lookdict() is general-purpose, and may return NULL if (and only if) a
312comparison raises an exception (this was new in Python 2.5).
Guido van Rossum89d8c602007-09-18 17:26:56 +0000313lookdict_unicode() below is specialized to string keys, comparison of which can
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000314never raise an exception; that function can never return NULL. For both, when
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000315the key isn't found a PyDictEntry* is returned for which the me_value field is
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000316NULL; this is the slot in the dict at which the key would have been found, and
317the caller can (if it wishes) add the <key, value> pair to the returned
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000318PyDictEntry*.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000319*/
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000320static PyDictEntry *
321lookdict(PyDictObject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000322{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000323 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000324 register size_t perturb;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000325 register PyDictEntry *freeslot;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000326 register size_t mask = (size_t)mp->ma_mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000327 PyDictEntry *ep0 = mp->ma_table;
328 register PyDictEntry *ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000329 register int cmp;
Tim Peters453163d2001-06-03 04:54:32 +0000330 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000331
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000332 i = (size_t)hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000333 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000334 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000335 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000336
Guido van Rossum16e93a81997-01-28 00:00:11 +0000337 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000338 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000339 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000340 if (ep->me_hash == hash) {
Tim Peters453163d2001-06-03 04:54:32 +0000341 startkey = ep->me_key;
Guido van Rossum2fd4f372007-11-29 18:43:05 +0000342 Py_INCREF(startkey);
Tim Peters453163d2001-06-03 04:54:32 +0000343 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Guido van Rossum2fd4f372007-11-29 18:43:05 +0000344 Py_DECREF(startkey);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000345 if (cmp < 0)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000346 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000347 if (ep0 == mp->ma_table && ep->me_key == startkey) {
348 if (cmp > 0)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000349 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000350 }
351 else {
352 /* The compare did major nasty stuff to the
353 * dict: start over.
354 * XXX A clever adversary could prevent this
355 * XXX from terminating.
356 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000357 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000358 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000359 }
360 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000361 }
Tim Peters15d49292001-05-27 07:39:22 +0000362
Tim Peters342c65e2001-05-13 06:43:53 +0000363 /* In the loop, me_key == dummy is by far (factor of 100s) the
364 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000365 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
366 i = (i << 2) + i + perturb + 1;
367 ep = &ep0[i & mask];
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000368 if (ep->me_key == NULL)
369 return freeslot == NULL ? ep : freeslot;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000370 if (ep->me_key == key)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000371 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000372 if (ep->me_hash == hash && ep->me_key != dummy) {
Tim Peters453163d2001-06-03 04:54:32 +0000373 startkey = ep->me_key;
Guido van Rossum2fd4f372007-11-29 18:43:05 +0000374 Py_INCREF(startkey);
Tim Peters453163d2001-06-03 04:54:32 +0000375 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Guido van Rossum2fd4f372007-11-29 18:43:05 +0000376 Py_DECREF(startkey);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000377 if (cmp < 0)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000378 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000379 if (ep0 == mp->ma_table && ep->me_key == startkey) {
380 if (cmp > 0)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000381 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000382 }
383 else {
384 /* The compare did major nasty stuff to the
385 * dict: start over.
386 * XXX A clever adversary could prevent this
387 * XXX from terminating.
388 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000389 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000390 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000391 }
Tim Peters342c65e2001-05-13 06:43:53 +0000392 else if (ep->me_key == dummy && freeslot == NULL)
393 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000394 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000395 assert(0); /* NOT REACHED */
396 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000397}
398
399/*
Guido van Rossum89d8c602007-09-18 17:26:56 +0000400 * Hacked up version of lookdict which can assume keys are always
401 * unicodes; this assumption allows testing for errors during
402 * PyObject_RichCompareBool() to be dropped; unicode-unicode
403 * comparisons never raise exceptions. This also means we don't need
404 * to go through PyObject_RichCompareBool(); we can always use
405 * unicode_eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000406 *
Guido van Rossum89d8c602007-09-18 17:26:56 +0000407 * This is valuable because dicts with only unicode keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000408 */
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000409static PyDictEntry *
410lookdict_unicode(PyDictObject *mp, PyObject *key, register long hash)
Fred Drake1bff34a2000-08-31 19:31:38 +0000411{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000412 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000413 register size_t perturb;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000414 register PyDictEntry *freeslot;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000415 register size_t mask = (size_t)mp->ma_mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000416 PyDictEntry *ep0 = mp->ma_table;
417 register PyDictEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000418
Guido van Rossum89d8c602007-09-18 17:26:56 +0000419 /* Make sure this function doesn't have to handle non-unicode keys,
Tim Peters0ab085c2001-09-14 00:25:33 +0000420 including subclasses of str; e.g., one reason to subclass
Guido van Rossum89d8c602007-09-18 17:26:56 +0000421 unicodes is to override __eq__, and for speed we don't cater to
Tim Peters0ab085c2001-09-14 00:25:33 +0000422 that here. */
Guido van Rossum89d8c602007-09-18 17:26:56 +0000423 if (!PyUnicode_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000424#ifdef SHOW_CONVERSION_COUNTS
425 ++converted;
426#endif
427 mp->ma_lookup = lookdict;
428 return lookdict(mp, key, hash);
429 }
Tim Peters2f228e72001-05-13 00:19:31 +0000430 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000431 ep = &ep0[i];
432 if (ep->me_key == NULL || ep->me_key == key)
433 return ep;
434 if (ep->me_key == dummy)
435 freeslot = ep;
436 else {
Guido van Rossum89d8c602007-09-18 17:26:56 +0000437 if (ep->me_hash == hash && unicode_eq(ep->me_key, key))
Fred Drake1bff34a2000-08-31 19:31:38 +0000438 return ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000439 freeslot = NULL;
440 }
Tim Peters15d49292001-05-27 07:39:22 +0000441
Tim Peters342c65e2001-05-13 06:43:53 +0000442 /* In the loop, me_key == dummy is by far (factor of 100s) the
443 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000444 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
445 i = (i << 2) + i + perturb + 1;
446 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000447 if (ep->me_key == NULL)
448 return freeslot == NULL ? ep : freeslot;
449 if (ep->me_key == key
450 || (ep->me_hash == hash
451 && ep->me_key != dummy
Guido van Rossum89d8c602007-09-18 17:26:56 +0000452 && unicode_eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000453 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000454 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000455 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000456 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000457 assert(0); /* NOT REACHED */
458 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000459}
460
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000461#ifdef SHOW_TRACK_COUNT
462#define INCREASE_TRACK_COUNT \
463 (count_tracked++, count_untracked--);
464#define DECREASE_TRACK_COUNT \
465 (count_tracked--, count_untracked++);
466#else
467#define INCREASE_TRACK_COUNT
468#define DECREASE_TRACK_COUNT
469#endif
470
471#define MAINTAIN_TRACKING(mp, key, value) \
472 do { \
473 if (!_PyObject_GC_IS_TRACKED(mp)) { \
474 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
475 _PyObject_GC_MAY_BE_TRACKED(value)) { \
476 _PyObject_GC_TRACK(mp); \
477 INCREASE_TRACK_COUNT \
478 } \
479 } \
480 } while(0)
481
482void
483_PyDict_MaybeUntrack(PyObject *op)
484{
485 PyDictObject *mp;
486 PyObject *value;
487 Py_ssize_t mask, i;
488 PyDictEntry *ep;
489
490 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
491 return;
492
493 mp = (PyDictObject *) op;
494 ep = mp->ma_table;
495 mask = mp->ma_mask;
496 for (i = 0; i <= mask; i++) {
497 if ((value = ep[i].me_value) == NULL)
498 continue;
499 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
500 _PyObject_GC_MAY_BE_TRACKED(ep[i].me_key))
501 return;
502 }
Antoine Pitrouacc5d6b2009-03-23 19:19:54 +0000503 DECREASE_TRACK_COUNT
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000504 _PyObject_GC_UNTRACK(op);
505}
506
507
Fred Drake1bff34a2000-08-31 19:31:38 +0000508/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000509Internal routine to insert a new item into the table.
510Used both by the internal resize routine and by the public insert routine.
511Eats a reference to key and one to value.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000512Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000513*/
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000514static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000515insertdict(register PyDictObject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000516{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 PyObject *old_value;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000518 register PyDictEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000519 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
520
521 assert(mp->ma_lookup != NULL);
522 ep = mp->ma_lookup(mp, key, hash);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000523 if (ep == NULL) {
524 Py_DECREF(key);
525 Py_DECREF(value);
526 return -1;
527 }
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000528 MAINTAIN_TRACKING(mp, key, value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000529 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000530 old_value = ep->me_value;
531 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 Py_DECREF(old_value); /* which **CAN** re-enter */
533 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000534 }
535 else {
536 if (ep->me_key == NULL)
537 mp->ma_fill++;
Raymond Hettinger07ead172005-02-05 23:42:57 +0000538 else {
539 assert(ep->me_key == dummy);
540 Py_DECREF(dummy);
541 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000542 ep->me_key = key;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000543 ep->me_hash = (Py_ssize_t)hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000544 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000545 mp->ma_used++;
546 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000547 return 0;
548}
549
550/*
551Internal routine used by dictresize() to insert an item which is
552known to be absent from the dict. This routine also assumes that
553the dict contains no deleted entries. Besides the performance benefit,
554using insertdict() in dictresize() is dangerous (SF bug #1456209).
555Note that no refcounts are changed by this routine; if needed, the caller
556is responsible for incref'ing `key` and `value`.
557*/
558static void
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000559insertdict_clean(register PyDictObject *mp, PyObject *key, long hash,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000560 PyObject *value)
561{
562 register size_t i;
563 register size_t perturb;
564 register size_t mask = (size_t)mp->ma_mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000565 PyDictEntry *ep0 = mp->ma_table;
566 register PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000567
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000568 MAINTAIN_TRACKING(mp, key, value);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000569 i = hash & mask;
570 ep = &ep0[i];
571 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
572 i = (i << 2) + i + perturb + 1;
573 ep = &ep0[i & mask];
574 }
575 assert(ep->me_value == NULL);
576 mp->ma_fill++;
577 ep->me_key = key;
578 ep->me_hash = (Py_ssize_t)hash;
579 ep->me_value = value;
580 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000581}
582
583/*
584Restructure the table by allocating a new table and reinserting all
585items again. When entries have been deleted, the new table may
586actually be smaller than the old one.
587*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000588static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000589dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000590{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000591 Py_ssize_t newsize;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000592 PyDictEntry *oldtable, *newtable, *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000593 Py_ssize_t i;
Tim Peters0c6010b2001-05-23 23:33:57 +0000594 int is_oldtable_malloced;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000595 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000596
597 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000598
Tim Peterseb28ef22001-06-02 05:27:19 +0000599 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000600 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000601 newsize <= minused && newsize > 0;
602 newsize <<= 1)
603 ;
604 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000606 return -1;
607 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000608
609 /* Get space for a new table. */
610 oldtable = mp->ma_table;
611 assert(oldtable != NULL);
612 is_oldtable_malloced = oldtable != mp->ma_smalltable;
613
Tim Peters6d6c1a32001-08-02 04:15:00 +0000614 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000615 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000616 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000617 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000618 if (mp->ma_fill == mp->ma_used) {
619 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000620 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000621 }
622 /* We're not going to resize it, but rebuild the
623 table anyway to purge old dummy entries.
624 Subtle: This is *necessary* if fill==size,
625 as lookdict needs at least one virgin slot to
626 terminate failing searches. If fill < size, it's
627 merely desirable, as dummies slow searches. */
628 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000629 memcpy(small_copy, oldtable, sizeof(small_copy));
630 oldtable = small_copy;
631 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000632 }
633 else {
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000634 newtable = PyMem_NEW(PyDictEntry, newsize);
Tim Petersdea48ec2001-05-22 20:40:22 +0000635 if (newtable == NULL) {
636 PyErr_NoMemory();
637 return -1;
638 }
639 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000640
641 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000642 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000643 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000644 mp->ma_mask = newsize - 1;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000645 memset(newtable, 0, sizeof(PyDictEntry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000646 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000647 i = mp->ma_fill;
648 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000649
Tim Peters19283142001-05-17 22:25:34 +0000650 /* Copy the data over; this is refcount-neutral for active entries;
651 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000652 for (ep = oldtable; i > 0; ep++) {
653 if (ep->me_value != NULL) { /* active entry */
654 --i;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000655 insertdict_clean(mp, ep->me_key, (long)ep->me_hash,
656 ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000657 }
Tim Peters19283142001-05-17 22:25:34 +0000658 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000659 --i;
Tim Peters19283142001-05-17 22:25:34 +0000660 assert(ep->me_key == dummy);
661 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000662 }
Tim Peters19283142001-05-17 22:25:34 +0000663 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000664 }
665
Tim Peters0c6010b2001-05-23 23:33:57 +0000666 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000667 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000668 return 0;
669}
670
Christian Heimes99170a52007-12-19 02:07:34 +0000671/* Create a new dictionary pre-sized to hold an estimated number of elements.
672 Underestimates are okay because the dictionary will resize as necessary.
673 Overestimates just mean the dictionary will be more sparse than usual.
674*/
675
676PyObject *
677_PyDict_NewPresized(Py_ssize_t minused)
678{
679 PyObject *op = PyDict_New();
680
681 if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
682 Py_DECREF(op);
683 return NULL;
684 }
685 return op;
686}
687
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000688/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
689 * that may occur (originally dicts supported only string keys, and exceptions
690 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000691 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000692 * (suppressed) occurred while computing the key's hash, or that some error
693 * (suppressed) occurred when comparing keys in the dict's internal probe
694 * sequence. A nasty example of the latter is when a Python-coded comparison
695 * function hits a stack-depth error, which can cause this to return NULL
696 * even if the key is present.
697 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000698PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000699PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000700{
701 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000702 PyDictObject *mp = (PyDictObject *)op;
703 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000704 PyThreadState *tstate;
705 if (!PyDict_Check(op))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000706 return NULL;
Guido van Rossum4d027722007-09-18 04:30:42 +0000707 if (!PyUnicode_CheckExact(key) ||
708 (hash = ((PyUnicodeObject *) key)->hash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000709 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000711 if (hash == -1) {
712 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000713 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000714 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000715 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000716
Benjamin Petersone5caf102009-07-21 14:16:13 +0000717 /* We can arrive here with a NULL tstate during initialization: try
718 running "python -Wi" for an example related to string interning.
719 Let's just hope that no exception occurs then... This must be
720 _PyThreadState_Current and not PyThreadState_GET() because in debug
Georg Brandl01a30522009-08-13 08:37:59 +0000721 mode, the latter complains if tstate is NULL. */
Benjamin Petersone5caf102009-07-21 14:16:13 +0000722 tstate = _PyThreadState_Current;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000723 if (tstate != NULL && tstate->curexc_type != NULL) {
724 /* preserve the existing exception */
725 PyObject *err_type, *err_value, *err_tb;
726 PyErr_Fetch(&err_type, &err_value, &err_tb);
727 ep = (mp->ma_lookup)(mp, key, hash);
728 /* ignore errors */
729 PyErr_Restore(err_type, err_value, err_tb);
730 if (ep == NULL)
731 return NULL;
732 }
733 else {
734 ep = (mp->ma_lookup)(mp, key, hash);
735 if (ep == NULL) {
736 PyErr_Clear();
737 return NULL;
738 }
739 }
740 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000741}
742
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000743/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
744 This returns NULL *with* an exception set if an exception occurred.
745 It returns NULL *without* an exception set if the key wasn't present.
746*/
747PyObject *
748PyDict_GetItemWithError(PyObject *op, PyObject *key)
749{
750 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000751 PyDictObject*mp = (PyDictObject *)op;
752 PyDictEntry *ep;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000753
754 if (!PyDict_Check(op)) {
755 PyErr_BadInternalCall();
756 return NULL;
757 }
Guido van Rossum89d8c602007-09-18 17:26:56 +0000758 if (!PyUnicode_CheckExact(key) ||
759 (hash = ((PyUnicodeObject *) key)->hash) == -1)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000760 {
761 hash = PyObject_Hash(key);
762 if (hash == -1) {
763 return NULL;
764 }
765 }
766
767 ep = (mp->ma_lookup)(mp, key, hash);
768 if (ep == NULL)
769 return NULL;
770 return ep->me_value;
771}
772
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000773/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000774 * dictionary if it's merely replacing the value for an existing key.
775 * This means that it's safe to loop over a dictionary with PyDict_Next()
776 * and occasionally replace a value -- but you can't insert new keys or
777 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000778 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000779int
Tim Peters1f5871e2000-07-04 17:44:48 +0000780PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000781{
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000782 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000783 register long hash;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000784 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000785
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 if (!PyDict_Check(op)) {
787 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000788 return -1;
789 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000790 assert(key);
791 assert(value);
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000792 mp = (PyDictObject *)op;
Guido van Rossum4d027722007-09-18 04:30:42 +0000793 if (!PyUnicode_CheckExact(key) ||
794 (hash = ((PyUnicodeObject *) key)->hash) == -1)
795 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000797 if (hash == -1)
798 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000799 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000800 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000801 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 Py_INCREF(value);
803 Py_INCREF(key);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000804 if (insertdict(mp, key, hash, value) != 0)
805 return -1;
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000806 /* If we added a key, we can safely resize. Otherwise just return!
807 * If fill >= 2/3 size, adjust size. Normally, this doubles or
808 * quaduples the size, but it's also possible for the dict to shrink
Tim Peters60b29962006-01-01 01:19:23 +0000809 * (if ma_fill is much larger than ma_used, meaning a lot of dict
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000810 * keys have been * deleted).
Tim Peters60b29962006-01-01 01:19:23 +0000811 *
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000812 * Quadrupling the size improves average dictionary sparseness
813 * (reducing collisions) at the cost of some memory and iteration
814 * speed (which loops over every possible entry). It also halves
815 * the number of expensive resize operations in a growing dictionary.
Tim Peters60b29962006-01-01 01:19:23 +0000816 *
817 * Very large dictionaries (over 50K items) use doubling instead.
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000818 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000819 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000820 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
821 return 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000822 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000823}
824
825int
Tim Peters1f5871e2000-07-04 17:44:48 +0000826PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000827{
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000828 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000829 register long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000830 register PyDictEntry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000832
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 if (!PyDict_Check(op)) {
834 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000835 return -1;
836 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000837 assert(key);
Guido van Rossum89d8c602007-09-18 17:26:56 +0000838 if (!PyUnicode_CheckExact(key) ||
839 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000841 if (hash == -1)
842 return -1;
843 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000844 mp = (PyDictObject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000845 ep = (mp->ma_lookup)(mp, key, hash);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000846 if (ep == NULL)
847 return -1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000848 if (ep->me_value == NULL) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000849 set_key_error(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000850 return -1;
851 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000852 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000854 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000855 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000856 ep->me_value = NULL;
857 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000858 Py_DECREF(old_value);
859 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000860 return 0;
861}
862
Guido van Rossum25831651993-05-19 14:50:45 +0000863void
Tim Peters1f5871e2000-07-04 17:44:48 +0000864PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000865{
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000866 PyDictObject *mp;
867 PyDictEntry *ep, *table;
Tim Petersdea48ec2001-05-22 20:40:22 +0000868 int table_is_malloced;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000869 Py_ssize_t fill;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000870 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000871#ifdef Py_DEBUG
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000872 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000873#endif
874
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000875 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000876 return;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000877 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000878#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000879 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000880 i = 0;
881#endif
882
883 table = mp->ma_table;
884 assert(table != NULL);
885 table_is_malloced = table != mp->ma_smalltable;
886
887 /* This is delicate. During the process of clearing the dict,
888 * decrefs can cause the dict to mutate. To avoid fatal confusion
889 * (voice of experience), we have to make the dict empty before
890 * clearing the slots, and never refer to anything via mp->xxx while
891 * clearing.
892 */
893 fill = mp->ma_fill;
894 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000895 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000896
897 else if (fill > 0) {
898 /* It's a small table with something that needs to be cleared.
899 * Afraid the only safe way is to copy the dict entries into
900 * another small table first.
901 */
902 memcpy(small_copy, table, sizeof(small_copy));
903 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000904 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000905 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000906 /* else it's a small table that's already empty */
907
908 /* Now we can finally clear things. If C had refcounts, we could
909 * assert that the refcount on table is 1 now, i.e. that this function
910 * has unique access to it, so decref side-effects can't alter it.
911 */
912 for (ep = table; fill > 0; ++ep) {
913#ifdef Py_DEBUG
914 assert(i < n);
915 ++i;
916#endif
917 if (ep->me_key) {
918 --fill;
919 Py_DECREF(ep->me_key);
920 Py_XDECREF(ep->me_value);
921 }
922#ifdef Py_DEBUG
923 else
924 assert(ep->me_value == NULL);
925#endif
926 }
927
928 if (table_is_malloced)
929 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000930}
931
Tim Peters080c88b2003-02-15 03:01:11 +0000932/*
933 * Iterate over a dict. Use like so:
934 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000935 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000936 * PyObject *key, *value;
937 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000938 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000939 * Refer to borrowed references in key and value.
940 * }
941 *
942 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000943 * mutates the dict. One exception: it is safe if the loop merely changes
944 * the values associated with the keys (but doesn't insert new keys or
945 * delete keys), via PyDict_SetItem().
946 */
Guido van Rossum25831651993-05-19 14:50:45 +0000947int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000948PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000949{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000950 register Py_ssize_t i;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000951 register Py_ssize_t mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000952 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000953
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000954 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000955 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000956 i = *ppos;
957 if (i < 0)
958 return 0;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000959 ep = ((PyDictObject *)op)->ma_table;
960 mask = ((PyDictObject *)op)->ma_mask;
Raymond Hettinger43442782004-03-17 21:55:03 +0000961 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000962 i++;
963 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000964 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000965 return 0;
966 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000967 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000968 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000969 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000970 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000971}
972
Thomas Wouterscf297e42007-02-23 15:07:44 +0000973/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
974int
975_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, long *phash)
976{
977 register Py_ssize_t i;
978 register Py_ssize_t mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000979 register PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +0000980
981 if (!PyDict_Check(op))
982 return 0;
983 i = *ppos;
984 if (i < 0)
985 return 0;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000986 ep = ((PyDictObject *)op)->ma_table;
987 mask = ((PyDictObject *)op)->ma_mask;
Thomas Wouterscf297e42007-02-23 15:07:44 +0000988 while (i <= mask && ep[i].me_value == NULL)
989 i++;
990 *ppos = i+1;
991 if (i > mask)
992 return 0;
993 *phash = (long)(ep[i].me_hash);
994 if (pkey)
995 *pkey = ep[i].me_key;
996 if (pvalue)
997 *pvalue = ep[i].me_value;
998 return 1;
999}
1000
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001001/* Methods */
1002
1003static void
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001004dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001005{
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001006 register PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001007 Py_ssize_t fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +00001008 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +00001009 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +00001010 for (ep = mp->ma_table; fill > 0; ep++) {
1011 if (ep->me_key) {
1012 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +00001014 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +00001015 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001016 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001017 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001018 PyMem_DEL(mp->ma_table);
Christian Heimes2202f872008-02-06 14:31:34 +00001019 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1020 free_list[numfree++] = mp;
Tim Peters60b29962006-01-01 01:19:23 +00001021 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001022 Py_TYPE(mp)->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +00001023 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001024}
1025
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001027dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001028{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001029 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +00001030 PyObject *s, *temp, *colon = NULL;
1031 PyObject *pieces = NULL, *result = NULL;
1032 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001033
Tim Petersa7259592001-06-16 05:11:17 +00001034 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +00001035 if (i != 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +00001036 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +00001037 }
1038
Tim Petersa7259592001-06-16 05:11:17 +00001039 if (mp->ma_used == 0) {
Walter Dörwald1ab83302007-05-18 17:15:44 +00001040 result = PyUnicode_FromString("{}");
Tim Petersa7259592001-06-16 05:11:17 +00001041 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001042 }
Tim Petersa7259592001-06-16 05:11:17 +00001043
1044 pieces = PyList_New(0);
1045 if (pieces == NULL)
1046 goto Done;
1047
Walter Dörwald1ab83302007-05-18 17:15:44 +00001048 colon = PyUnicode_FromString(": ");
Tim Petersa7259592001-06-16 05:11:17 +00001049 if (colon == NULL)
1050 goto Done;
1051
1052 /* Do repr() on each key+value pair, and insert ": " between them.
1053 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +00001054 i = 0;
1055 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +00001056 int status;
1057 /* Prevent repr from deleting value during key format. */
1058 Py_INCREF(value);
1059 s = PyObject_Repr(key);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001060 PyUnicode_Append(&s, colon);
1061 PyUnicode_AppendAndDel(&s, PyObject_Repr(value));
Tim Petersa7259592001-06-16 05:11:17 +00001062 Py_DECREF(value);
1063 if (s == NULL)
1064 goto Done;
1065 status = PyList_Append(pieces, s);
1066 Py_DECREF(s); /* append created a new ref */
1067 if (status < 0)
1068 goto Done;
1069 }
1070
1071 /* Add "{}" decorations to the first and last items. */
1072 assert(PyList_GET_SIZE(pieces) > 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001073 s = PyUnicode_FromString("{");
Tim Petersa7259592001-06-16 05:11:17 +00001074 if (s == NULL)
1075 goto Done;
1076 temp = PyList_GET_ITEM(pieces, 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001077 PyUnicode_AppendAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +00001078 PyList_SET_ITEM(pieces, 0, s);
1079 if (s == NULL)
1080 goto Done;
1081
Walter Dörwald1ab83302007-05-18 17:15:44 +00001082 s = PyUnicode_FromString("}");
Tim Petersa7259592001-06-16 05:11:17 +00001083 if (s == NULL)
1084 goto Done;
1085 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001086 PyUnicode_AppendAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +00001087 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1088 if (temp == NULL)
1089 goto Done;
1090
1091 /* Paste them all together with ", " between. */
Walter Dörwald1ab83302007-05-18 17:15:44 +00001092 s = PyUnicode_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +00001093 if (s == NULL)
1094 goto Done;
Walter Dörwald1ab83302007-05-18 17:15:44 +00001095 result = PyUnicode_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +00001096 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001097
1098Done:
1099 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +00001101 Py_ReprLeave((PyObject *)mp);
1102 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001103}
1104
Martin v. Löwis18e16552006-02-15 17:27:45 +00001105static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001106dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001107{
1108 return mp->ma_used;
1109}
1110
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001111static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001112dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001113{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001114 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001115 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001116 PyDictEntry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +00001117 assert(mp->ma_table != NULL);
Guido van Rossum89d8c602007-09-18 17:26:56 +00001118 if (!PyUnicode_CheckExact(key) ||
1119 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001120 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001121 if (hash == -1)
1122 return NULL;
1123 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001124 ep = (mp->ma_lookup)(mp, key, hash);
1125 if (ep == NULL)
1126 return NULL;
1127 v = ep->me_value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001128 if (v == NULL) {
1129 if (!PyDict_CheckExact(mp)) {
1130 /* Look up __missing__ method if we're a subclass. */
Benjamin Peterson0ffaaa62009-05-27 03:18:19 +00001131 PyObject *missing, *res;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001132 static PyObject *missing_str = NULL;
Benjamin Petersona7205592009-05-27 03:08:59 +00001133 missing = _PyObject_LookupSpecial((PyObject *)mp,
1134 "__missing__",
1135 &missing_str);
Benjamin Peterson0ffaaa62009-05-27 03:18:19 +00001136 if (missing != NULL) {
1137 res = PyObject_CallFunctionObjArgs(missing,
1138 key, NULL);
1139 Py_DECREF(missing);
1140 return res;
1141 }
Benjamin Petersona7205592009-05-27 03:08:59 +00001142 else if (PyErr_Occurred())
1143 return NULL;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001144 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001145 set_key_error(key);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001146 return NULL;
1147 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001148 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001150 return v;
1151}
1152
1153static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001154dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001155{
1156 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001158 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001159 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001160}
1161
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001162static PyMappingMethods dict_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001163 (lenfunc)dict_length, /*mp_length*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001164 (binaryfunc)dict_subscript, /*mp_subscript*/
1165 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001166};
1167
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001168static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001169dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001170{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001171 register PyObject *v;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001172 register Py_ssize_t i, j;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001173 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001174 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001175
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001176 again:
1177 n = mp->ma_used;
1178 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001179 if (v == NULL)
1180 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001181 if (n != mp->ma_used) {
1182 /* Durnit. The allocations caused the dict to resize.
1183 * Just start over, this shouldn't normally happen.
1184 */
1185 Py_DECREF(v);
1186 goto again;
1187 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001188 ep = mp->ma_table;
1189 mask = mp->ma_mask;
1190 for (i = 0, j = 0; i <= mask; i++) {
1191 if (ep[i].me_value != NULL) {
1192 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001194 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001195 j++;
1196 }
1197 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001198 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001199 return v;
1200}
1201
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001203dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001204{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001205 register PyObject *v;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001206 register Py_ssize_t i, j;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001207 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001208 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001209
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001210 again:
1211 n = mp->ma_used;
1212 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001213 if (v == NULL)
1214 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001215 if (n != mp->ma_used) {
1216 /* Durnit. The allocations caused the dict to resize.
1217 * Just start over, this shouldn't normally happen.
1218 */
1219 Py_DECREF(v);
1220 goto again;
1221 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001222 ep = mp->ma_table;
1223 mask = mp->ma_mask;
1224 for (i = 0, j = 0; i <= mask; i++) {
1225 if (ep[i].me_value != NULL) {
1226 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001227 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001228 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001229 j++;
1230 }
1231 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001232 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001233 return v;
1234}
1235
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001237dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001238{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 register PyObject *v;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001240 register Py_ssize_t i, j, n;
1241 Py_ssize_t mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001242 PyObject *item, *key, *value;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001243 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001244
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001245 /* Preallocate the list of tuples, to avoid allocations during
1246 * the loop over the items, which could trigger GC, which
1247 * could resize the dict. :-(
1248 */
1249 again:
1250 n = mp->ma_used;
1251 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001252 if (v == NULL)
1253 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001254 for (i = 0; i < n; i++) {
1255 item = PyTuple_New(2);
1256 if (item == NULL) {
1257 Py_DECREF(v);
1258 return NULL;
1259 }
1260 PyList_SET_ITEM(v, i, item);
1261 }
1262 if (n != mp->ma_used) {
1263 /* Durnit. The allocations caused the dict to resize.
1264 * Just start over, this shouldn't normally happen.
1265 */
1266 Py_DECREF(v);
1267 goto again;
1268 }
1269 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001270 ep = mp->ma_table;
1271 mask = mp->ma_mask;
1272 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001273 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001274 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001275 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001276 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001277 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001279 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001280 j++;
1281 }
1282 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001283 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001284 return v;
1285}
1286
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001287static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001288dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001289{
1290 PyObject *seq;
1291 PyObject *value = Py_None;
1292 PyObject *it; /* iter(seq) */
1293 PyObject *key;
1294 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001295 int status;
1296
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001297 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001298 return NULL;
1299
1300 d = PyObject_CallObject(cls, NULL);
1301 if (d == NULL)
1302 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001303
Guido van Rossum58da9312007-11-10 23:39:45 +00001304 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1305 PyDictObject *mp = (PyDictObject *)d;
1306 PyObject *oldvalue;
1307 Py_ssize_t pos = 0;
1308 PyObject *key;
1309 long hash;
1310
Benjamin Peterson41181742008-07-02 20:22:54 +00001311 if (dictresize(mp, Py_SIZE(seq)))
Guido van Rossum58da9312007-11-10 23:39:45 +00001312 return NULL;
1313
1314 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1315 Py_INCREF(key);
1316 Py_INCREF(value);
1317 if (insertdict(mp, key, hash, value))
1318 return NULL;
1319 }
1320 return d;
1321 }
1322
Guido van Rossumd8faa362007-04-27 19:54:29 +00001323 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001324 PyDictObject *mp = (PyDictObject *)d;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001325 Py_ssize_t pos = 0;
1326 PyObject *key;
1327 long hash;
1328
1329 if (dictresize(mp, PySet_GET_SIZE(seq)))
1330 return NULL;
1331
1332 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1333 Py_INCREF(key);
1334 Py_INCREF(value);
1335 if (insertdict(mp, key, hash, value))
1336 return NULL;
1337 }
1338 return d;
1339 }
1340
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001341 it = PyObject_GetIter(seq);
1342 if (it == NULL){
1343 Py_DECREF(d);
1344 return NULL;
1345 }
1346
Guido van Rossum58da9312007-11-10 23:39:45 +00001347 if (PyDict_CheckExact(d)) {
1348 while ((key = PyIter_Next(it)) != NULL) {
1349 status = PyDict_SetItem(d, key, value);
1350 Py_DECREF(key);
1351 if (status < 0)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001352 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001353 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001354 } else {
1355 while ((key = PyIter_Next(it)) != NULL) {
1356 status = PyObject_SetItem(d, key, value);
1357 Py_DECREF(key);
1358 if (status < 0)
1359 goto Fail;
1360 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001361 }
1362
Guido van Rossum58da9312007-11-10 23:39:45 +00001363 if (PyErr_Occurred())
1364 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001365 Py_DECREF(it);
1366 return d;
1367
1368Fail:
1369 Py_DECREF(it);
1370 Py_DECREF(d);
1371 return NULL;
1372}
1373
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001374static int
1375dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001376{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001377 PyObject *arg = NULL;
1378 int result = 0;
1379
1380 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1381 result = -1;
1382
1383 else if (arg != NULL) {
1384 if (PyObject_HasAttrString(arg, "keys"))
1385 result = PyDict_Merge(self, arg, 1);
1386 else
1387 result = PyDict_MergeFromSeq2(self, arg, 1);
1388 }
1389 if (result == 0 && kwds != NULL)
1390 result = PyDict_Merge(self, kwds, 1);
1391 return result;
1392}
1393
1394static PyObject *
1395dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1396{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001397 if (dict_update_common(self, args, kwds, "update") != -1)
1398 Py_RETURN_NONE;
1399 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001400}
1401
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001402/* Update unconditionally replaces existing items.
1403 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001404 otherwise it leaves existing items unchanged.
1405
1406 PyDict_{Update,Merge} update/merge from a mapping object.
1407
Tim Petersf582b822001-12-11 18:51:08 +00001408 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001409 producing iterable objects of length 2.
1410*/
1411
Tim Petersf582b822001-12-11 18:51:08 +00001412int
Tim Peters1fc240e2001-10-26 05:06:50 +00001413PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1414{
1415 PyObject *it; /* iter(seq2) */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001416 Py_ssize_t i; /* index into seq2 of current element */
Tim Peters1fc240e2001-10-26 05:06:50 +00001417 PyObject *item; /* seq2[i] */
1418 PyObject *fast; /* item as a 2-tuple or 2-list */
1419
1420 assert(d != NULL);
1421 assert(PyDict_Check(d));
1422 assert(seq2 != NULL);
1423
1424 it = PyObject_GetIter(seq2);
1425 if (it == NULL)
1426 return -1;
1427
1428 for (i = 0; ; ++i) {
1429 PyObject *key, *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001430 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001431
1432 fast = NULL;
1433 item = PyIter_Next(it);
1434 if (item == NULL) {
1435 if (PyErr_Occurred())
1436 goto Fail;
1437 break;
1438 }
1439
1440 /* Convert item to sequence, and verify length 2. */
1441 fast = PySequence_Fast(item, "");
1442 if (fast == NULL) {
1443 if (PyErr_ExceptionMatches(PyExc_TypeError))
1444 PyErr_Format(PyExc_TypeError,
1445 "cannot convert dictionary update "
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001446 "sequence element #%zd to a sequence",
Tim Peters1fc240e2001-10-26 05:06:50 +00001447 i);
1448 goto Fail;
1449 }
1450 n = PySequence_Fast_GET_SIZE(fast);
1451 if (n != 2) {
1452 PyErr_Format(PyExc_ValueError,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001453 "dictionary update sequence element #%zd "
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00001454 "has length %zd; 2 is required",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00001455 i, n);
Tim Peters1fc240e2001-10-26 05:06:50 +00001456 goto Fail;
1457 }
1458
1459 /* Update/merge with this (key, value) pair. */
1460 key = PySequence_Fast_GET_ITEM(fast, 0);
1461 value = PySequence_Fast_GET_ITEM(fast, 1);
1462 if (override || PyDict_GetItem(d, key) == NULL) {
1463 int status = PyDict_SetItem(d, key, value);
1464 if (status < 0)
1465 goto Fail;
1466 }
1467 Py_DECREF(fast);
1468 Py_DECREF(item);
1469 }
1470
1471 i = 0;
1472 goto Return;
1473Fail:
1474 Py_XDECREF(item);
1475 Py_XDECREF(fast);
1476 i = -1;
1477Return:
1478 Py_DECREF(it);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001479 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001480}
1481
Tim Peters6d6c1a32001-08-02 04:15:00 +00001482int
1483PyDict_Update(PyObject *a, PyObject *b)
1484{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001485 return PyDict_Merge(a, b, 1);
1486}
1487
1488int
1489PyDict_Merge(PyObject *a, PyObject *b, int override)
1490{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001491 register PyDictObject *mp, *other;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001492 register Py_ssize_t i;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001493 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001494
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001495 /* We accept for the argument either a concrete dictionary object,
1496 * or an abstract "mapping" object. For the former, we can do
1497 * things quite efficiently. For the latter, we only require that
1498 * PyMapping_Keys() and PyObject_GetItem() be supported.
1499 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001500 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1501 PyErr_BadInternalCall();
1502 return -1;
1503 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001504 mp = (PyDictObject*)a;
Christian Heimesaf98da12008-01-27 15:18:18 +00001505 if (PyDict_Check(b)) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001506 other = (PyDictObject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001507 if (other == mp || other->ma_used == 0)
1508 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001509 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001510 if (mp->ma_used == 0)
1511 /* Since the target dict is empty, PyDict_GetItem()
1512 * always returns NULL. Setting override to 1
1513 * skips the unnecessary test.
1514 */
1515 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001516 /* Do one big resize at the start, rather than
1517 * incrementally resizing as we insert new items. Expect
1518 * that there will be no (or few) overlapping keys.
1519 */
1520 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001521 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001522 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001523 }
1524 for (i = 0; i <= other->ma_mask; i++) {
1525 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001526 if (entry->me_value != NULL &&
1527 (override ||
1528 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001529 Py_INCREF(entry->me_key);
1530 Py_INCREF(entry->me_value);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001531 if (insertdict(mp, entry->me_key,
1532 (long)entry->me_hash,
1533 entry->me_value) != 0)
1534 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001535 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001536 }
1537 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001538 else {
1539 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001540 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001541 PyObject *iter;
1542 PyObject *key, *value;
1543 int status;
1544
1545 if (keys == NULL)
1546 /* Docstring says this is equivalent to E.keys() so
1547 * if E doesn't have a .keys() method we want
1548 * AttributeError to percolate up. Might as well
1549 * do the same for any other error.
1550 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001551 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001552
1553 iter = PyObject_GetIter(keys);
1554 Py_DECREF(keys);
1555 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001556 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001557
1558 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001559 if (!override && PyDict_GetItem(a, key) != NULL) {
1560 Py_DECREF(key);
1561 continue;
1562 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001563 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001564 if (value == NULL) {
1565 Py_DECREF(iter);
1566 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001567 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001568 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001569 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001570 Py_DECREF(key);
1571 Py_DECREF(value);
1572 if (status < 0) {
1573 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001574 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001575 }
1576 }
1577 Py_DECREF(iter);
1578 if (PyErr_Occurred())
1579 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001580 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001581 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001582 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001583}
1584
1585static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001586dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001587{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001588 return PyDict_Copy((PyObject*)mp);
1589}
1590
1591PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001592PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001593{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001594 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001595
1596 if (o == NULL || !PyDict_Check(o)) {
1597 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001598 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001599 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001600 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001601 if (copy == NULL)
1602 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001603 if (PyDict_Merge(copy, o, 1) == 0)
1604 return copy;
1605 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001606 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001607}
1608
Martin v. Löwis18e16552006-02-15 17:27:45 +00001609Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001610PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001611{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001612 if (mp == NULL || !PyDict_Check(mp)) {
1613 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001614 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001615 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001616 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001617}
1618
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001619PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001620PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001621{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001622 if (mp == NULL || !PyDict_Check(mp)) {
1623 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001624 return NULL;
1625 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001626 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001627}
1628
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001629PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001630PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001631{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632 if (mp == NULL || !PyDict_Check(mp)) {
1633 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001634 return NULL;
1635 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001636 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001637}
1638
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001640PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001641{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001642 if (mp == NULL || !PyDict_Check(mp)) {
1643 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001644 return NULL;
1645 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001646 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001647}
1648
Tim Peterse63415e2001-05-08 04:38:29 +00001649/* Return 1 if dicts equal, 0 if not, -1 if error.
1650 * Gets out as soon as any difference is detected.
1651 * Uses only Py_EQ comparison.
1652 */
1653static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001654dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001655{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001656 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001657
1658 if (a->ma_used != b->ma_used)
1659 /* can't be equal if # of entries differ */
1660 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001661
Tim Peterse63415e2001-05-08 04:38:29 +00001662 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001663 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001664 PyObject *aval = a->ma_table[i].me_value;
1665 if (aval != NULL) {
1666 int cmp;
1667 PyObject *bval;
1668 PyObject *key = a->ma_table[i].me_key;
1669 /* temporarily bump aval's refcount to ensure it stays
1670 alive until we're done with it */
1671 Py_INCREF(aval);
Guido van Rossumdc5f6b22006-08-24 21:29:26 +00001672 /* ditto for key */
1673 Py_INCREF(key);
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001674 bval = PyDict_GetItemWithError((PyObject *)b, key);
Guido van Rossumdc5f6b22006-08-24 21:29:26 +00001675 Py_DECREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001676 if (bval == NULL) {
1677 Py_DECREF(aval);
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001678 if (PyErr_Occurred())
1679 return -1;
Tim Peterse63415e2001-05-08 04:38:29 +00001680 return 0;
1681 }
1682 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1683 Py_DECREF(aval);
1684 if (cmp <= 0) /* error or not equal */
1685 return cmp;
1686 }
1687 }
1688 return 1;
1689 }
1690
1691static PyObject *
1692dict_richcompare(PyObject *v, PyObject *w, int op)
1693{
1694 int cmp;
1695 PyObject *res;
1696
1697 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1698 res = Py_NotImplemented;
1699 }
1700 else if (op == Py_EQ || op == Py_NE) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001701 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
Tim Peterse63415e2001-05-08 04:38:29 +00001702 if (cmp < 0)
1703 return NULL;
1704 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1705 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001706 else
1707 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001708 Py_INCREF(res);
1709 return res;
1710 }
1711
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001712static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001713dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001714{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001715 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001716 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001717
Guido van Rossum89d8c602007-09-18 17:26:56 +00001718 if (!PyUnicode_CheckExact(key) ||
1719 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001720 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001721 if (hash == -1)
1722 return NULL;
1723 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001724 ep = (mp->ma_lookup)(mp, key, hash);
1725 if (ep == NULL)
1726 return NULL;
1727 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001728}
1729
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001730static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001731dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001732{
1733 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001734 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001735 PyObject *val = NULL;
1736 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001737 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001738
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001739 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001740 return NULL;
1741
Guido van Rossum89d8c602007-09-18 17:26:56 +00001742 if (!PyUnicode_CheckExact(key) ||
1743 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001744 hash = PyObject_Hash(key);
1745 if (hash == -1)
1746 return NULL;
1747 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001748 ep = (mp->ma_lookup)(mp, key, hash);
1749 if (ep == NULL)
1750 return NULL;
1751 val = ep->me_value;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001752 if (val == NULL)
1753 val = failobj;
1754 Py_INCREF(val);
1755 return val;
1756}
1757
1758
1759static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001760dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001761{
1762 PyObject *key;
1763 PyObject *failobj = Py_None;
1764 PyObject *val = NULL;
1765 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001766 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001767
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001768 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001769 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001770
Guido van Rossum89d8c602007-09-18 17:26:56 +00001771 if (!PyUnicode_CheckExact(key) ||
1772 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001773 hash = PyObject_Hash(key);
1774 if (hash == -1)
1775 return NULL;
1776 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001777 ep = (mp->ma_lookup)(mp, key, hash);
1778 if (ep == NULL)
1779 return NULL;
1780 val = ep->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001781 if (val == NULL) {
1782 val = failobj;
1783 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1784 val = NULL;
1785 }
1786 Py_XINCREF(val);
1787 return val;
1788}
1789
1790
1791static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001792dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001793{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001794 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001795 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001796}
1797
Guido van Rossumba6ab842000-12-12 22:02:18 +00001798static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001799dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001800{
1801 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001802 PyDictEntry *ep;
Guido van Rossume027d982002-04-12 15:11:59 +00001803 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001804 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001805
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001806 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1807 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001808 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001809 if (deflt) {
1810 Py_INCREF(deflt);
1811 return deflt;
1812 }
Guido van Rossume027d982002-04-12 15:11:59 +00001813 PyErr_SetString(PyExc_KeyError,
1814 "pop(): dictionary is empty");
1815 return NULL;
1816 }
Guido van Rossum89d8c602007-09-18 17:26:56 +00001817 if (!PyUnicode_CheckExact(key) ||
1818 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossume027d982002-04-12 15:11:59 +00001819 hash = PyObject_Hash(key);
1820 if (hash == -1)
1821 return NULL;
1822 }
1823 ep = (mp->ma_lookup)(mp, key, hash);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001824 if (ep == NULL)
1825 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001826 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001827 if (deflt) {
1828 Py_INCREF(deflt);
1829 return deflt;
1830 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001831 set_key_error(key);
Guido van Rossume027d982002-04-12 15:11:59 +00001832 return NULL;
1833 }
1834 old_key = ep->me_key;
1835 Py_INCREF(dummy);
1836 ep->me_key = dummy;
1837 old_value = ep->me_value;
1838 ep->me_value = NULL;
1839 mp->ma_used--;
1840 Py_DECREF(old_key);
1841 return old_value;
1842}
1843
1844static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001845dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001846{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001847 Py_ssize_t i = 0;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001848 PyDictEntry *ep;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001849 PyObject *res;
1850
Tim Petersf4b33f62001-06-02 05:42:29 +00001851 /* Allocate the result tuple before checking the size. Believe it
1852 * or not, this allocation could trigger a garbage collection which
1853 * could empty the dict, so if we checked the size first and that
1854 * happened, the result would be an infinite loop (searching for an
1855 * entry that no longer exists). Note that the usual popitem()
1856 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001857 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00001858 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001859 */
1860 res = PyTuple_New(2);
1861 if (res == NULL)
1862 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001863 if (mp->ma_used == 0) {
1864 Py_DECREF(res);
1865 PyErr_SetString(PyExc_KeyError,
1866 "popitem(): dictionary is empty");
1867 return NULL;
1868 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001869 /* Set ep to "the first" dict entry with a value. We abuse the hash
1870 * field of slot 0 to hold a search finger:
1871 * If slot 0 has a value, use slot 0.
1872 * Else slot 0 is being used to hold a search finger,
1873 * and we use its hash value as the first index to look.
1874 */
1875 ep = &mp->ma_table[0];
1876 if (ep->me_value == NULL) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001877 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001878 /* The hash field may be a real hash value, or it may be a
1879 * legit search finger, or it may be a once-legit search
1880 * finger that's out of bounds now because it wrapped around
1881 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001882 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001883 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001884 i = 1; /* skip slot 0 */
1885 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1886 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001887 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001888 i = 1;
1889 }
1890 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001891 PyTuple_SET_ITEM(res, 0, ep->me_key);
1892 PyTuple_SET_ITEM(res, 1, ep->me_value);
1893 Py_INCREF(dummy);
1894 ep->me_key = dummy;
1895 ep->me_value = NULL;
1896 mp->ma_used--;
1897 assert(mp->ma_table[0].me_value == NULL);
1898 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001899 return res;
1900}
1901
Jeremy Hylton8caad492000-06-23 14:18:11 +00001902static int
1903dict_traverse(PyObject *op, visitproc visit, void *arg)
1904{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001905 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001906 PyObject *pk;
1907 PyObject *pv;
1908
1909 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001910 Py_VISIT(pk);
1911 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00001912 }
1913 return 0;
1914}
1915
1916static int
1917dict_tp_clear(PyObject *op)
1918{
1919 PyDict_Clear(op);
1920 return 0;
1921}
1922
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001923static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001924
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001925static PyObject *
1926dict_sizeof(PyDictObject *mp)
1927{
1928 Py_ssize_t res;
1929
Robert Schuppenies4d45bfe2008-06-28 23:58:47 +00001930 res = sizeof(PyDictObject);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001931 if (mp->ma_table != mp->ma_smalltable)
1932 res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry);
1933 return PyLong_FromSsize_t(res);
1934}
1935
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001936PyDoc_STRVAR(contains__doc__,
1937"D.__contains__(k) -> True if D has a key k, else False");
1938
1939PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1940
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001941PyDoc_STRVAR(sizeof__doc__,
1942"D.__sizeof__() -> size of D in memory, in bytes");
1943
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001944PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001945"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001946
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001947PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001948"D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001949
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001950PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001951"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001952If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001953
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001954PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001955"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000019562-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001958PyDoc_STRVAR(update__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001959"D.update(E, **F) -> None. Update D from dict/iterable E and F.\n"
1960"If E has a .keys() method, does: for k in E: D[k] = E[k]\n\
1961If E lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
1962In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00001963
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001964PyDoc_STRVAR(fromkeys__doc__,
1965"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1966v defaults to None.");
1967
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001968PyDoc_STRVAR(clear__doc__,
1969"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001971PyDoc_STRVAR(copy__doc__,
1972"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001973
Guido van Rossumb90c8482007-02-10 01:11:45 +00001974/* Forward */
1975static PyObject *dictkeys_new(PyObject *);
1976static PyObject *dictitems_new(PyObject *);
1977static PyObject *dictvalues_new(PyObject *);
1978
Guido van Rossum45c85d12007-07-27 16:31:40 +00001979PyDoc_STRVAR(keys__doc__,
1980 "D.keys() -> a set-like object providing a view on D's keys");
1981PyDoc_STRVAR(items__doc__,
1982 "D.items() -> a set-like object providing a view on D's items");
1983PyDoc_STRVAR(values__doc__,
1984 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00001985
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001986static PyMethodDef mapp_methods[] = {
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001987 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001988 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00001989 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001990 getitem__doc__},
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001991 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
1992 sizeof__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00001993 {"get", (PyCFunction)dict_get, METH_VARARGS,
1994 get__doc__},
1995 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1996 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001997 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00001998 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001999 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002000 popitem__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002001 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
Guido van Rossumeff072c2007-02-27 05:47:18 +00002002 keys__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002003 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
Guido van Rossumeff072c2007-02-27 05:47:18 +00002004 items__doc__},
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002005 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
Guido van Rossumeff072c2007-02-27 05:47:18 +00002006 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002007 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002008 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002009 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2010 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002011 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002012 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002013 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002014 copy__doc__},
2015 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002016};
2017
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002018/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002019int
2020PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002021{
2022 long hash;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002023 PyDictObject *mp = (PyDictObject *)op;
2024 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002025
Guido van Rossum89d8c602007-09-18 17:26:56 +00002026 if (!PyUnicode_CheckExact(key) ||
2027 (hash = ((PyUnicodeObject *) key)->hash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002028 hash = PyObject_Hash(key);
2029 if (hash == -1)
2030 return -1;
2031 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002032 ep = (mp->ma_lookup)(mp, key, hash);
2033 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002034}
2035
Thomas Wouterscf297e42007-02-23 15:07:44 +00002036/* Internal version of PyDict_Contains used when the hash value is already known */
2037int
2038_PyDict_Contains(PyObject *op, PyObject *key, long hash)
2039{
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002040 PyDictObject *mp = (PyDictObject *)op;
2041 PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002042
2043 ep = (mp->ma_lookup)(mp, key, hash);
2044 return ep == NULL ? -1 : (ep->me_value != NULL);
2045}
2046
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002047/* Hack to implement "key in dict" */
2048static PySequenceMethods dict_as_sequence = {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002049 0, /* sq_length */
2050 0, /* sq_concat */
2051 0, /* sq_repeat */
2052 0, /* sq_item */
2053 0, /* sq_slice */
2054 0, /* sq_ass_item */
2055 0, /* sq_ass_slice */
2056 PyDict_Contains, /* sq_contains */
2057 0, /* sq_inplace_concat */
2058 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002059};
2060
Guido van Rossum09e563a2001-05-01 12:10:21 +00002061static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002062dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2063{
2064 PyObject *self;
2065
2066 assert(type != NULL && type->tp_alloc != NULL);
2067 self = type->tp_alloc(type, 0);
2068 if (self != NULL) {
2069 PyDictObject *d = (PyDictObject *)self;
2070 /* It's guaranteed that tp->alloc zeroed out the struct. */
2071 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2072 INIT_NONZERO_DICT_SLOTS(d);
Guido van Rossum89d8c602007-09-18 17:26:56 +00002073 d->ma_lookup = lookdict_unicode;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002074 /* The object has been implicitely tracked by tp_alloc */
2075 if (type == &PyDict_Type)
2076 _PyObject_GC_UNTRACK(d);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002077#ifdef SHOW_CONVERSION_COUNTS
2078 ++created;
2079#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002080#ifdef SHOW_TRACK_COUNT
2081 if (_PyObject_GC_IS_TRACKED(d))
2082 count_tracked++;
2083 else
2084 count_untracked++;
2085#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002086 }
2087 return self;
2088}
2089
Tim Peters25786c02001-09-02 08:22:48 +00002090static int
2091dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2092{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002093 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002094}
2095
Tim Peters6d6c1a32001-08-02 04:15:00 +00002096static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002097dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002098{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002099 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002100}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002101
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002102PyDoc_STRVAR(dictionary_doc,
Ezio Melotti807e98e2010-03-01 04:10:55 +00002103"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002104"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti807e98e2010-03-01 04:10:55 +00002105" (key, value) pairs\n"
2106"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002107" d = {}\n"
Ezio Melotti807e98e2010-03-01 04:10:55 +00002108" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002109" d[k] = v\n"
2110"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2111" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002112
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002113PyTypeObject PyDict_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002114 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Petersa427a2b2001-10-29 22:25:45 +00002115 "dict",
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002116 sizeof(PyDictObject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002117 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00002118 (destructor)dict_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00002119 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002120 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00002121 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002122 0, /* tp_reserved */
Guido van Rossumb9324202001-01-18 00:39:02 +00002123 (reprfunc)dict_repr, /* tp_repr */
2124 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002125 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00002126 &dict_as_mapping, /* tp_as_mapping */
Nick Coghland1abd252008-07-15 15:46:38 +00002127 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00002128 0, /* tp_call */
2129 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002130 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00002131 0, /* tp_setattro */
2132 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002133 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +00002134 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00002135 dictionary_doc, /* tp_doc */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002136 dict_traverse, /* tp_traverse */
2137 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00002138 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002139 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00002140 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002141 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002142 mapp_methods, /* tp_methods */
2143 0, /* tp_members */
2144 0, /* tp_getset */
2145 0, /* tp_base */
2146 0, /* tp_dict */
2147 0, /* tp_descr_get */
2148 0, /* tp_descr_set */
2149 0, /* tp_dictoffset */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002150 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002151 PyType_GenericAlloc, /* tp_alloc */
2152 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002153 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002154};
2155
Guido van Rossum3cca2451997-05-16 14:23:33 +00002156/* For backward compatibility with old dictionary interface */
2157
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002158PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002159PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002160{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002161 PyObject *kv, *rv;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002162 kv = PyUnicode_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002163 if (kv == NULL)
2164 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002165 rv = PyDict_GetItem(v, kv);
2166 Py_DECREF(kv);
2167 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002168}
2169
2170int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002171PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002172{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002173 PyObject *kv;
2174 int err;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002175 kv = PyUnicode_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002176 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002177 return -1;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002178 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002179 err = PyDict_SetItem(v, kv, item);
2180 Py_DECREF(kv);
2181 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002182}
2183
2184int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002185PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002186{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002187 PyObject *kv;
2188 int err;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002189 kv = PyUnicode_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002190 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002191 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002192 err = PyDict_DelItem(v, kv);
2193 Py_DECREF(kv);
2194 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002195}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002196
Raymond Hettinger019a1482004-03-18 02:41:19 +00002197/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002198
2199typedef struct {
2200 PyObject_HEAD
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002201 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002202 Py_ssize_t di_used;
2203 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002204 PyObject* di_result; /* reusable result tuple for iteritems */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002205 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002206} dictiterobject;
2207
2208static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002209dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002210{
2211 dictiterobject *di;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002212 di = PyObject_GC_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002213 if (di == NULL)
2214 return NULL;
2215 Py_INCREF(dict);
2216 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002217 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002218 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002219 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002220 if (itertype == &PyDictIterItem_Type) {
2221 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2222 if (di->di_result == NULL) {
2223 Py_DECREF(di);
2224 return NULL;
2225 }
2226 }
2227 else
2228 di->di_result = NULL;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002229 _PyObject_GC_TRACK(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002230 return (PyObject *)di;
2231}
2232
2233static void
2234dictiter_dealloc(dictiterobject *di)
2235{
Guido van Rossum2147df72002-07-16 20:30:22 +00002236 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002237 Py_XDECREF(di->di_result);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002238 PyObject_GC_Del(di);
2239}
2240
2241static int
2242dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2243{
2244 Py_VISIT(di->di_dict);
2245 Py_VISIT(di->di_result);
2246 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002247}
2248
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002249static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002250dictiter_len(dictiterobject *di)
2251{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002252 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002253 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002254 len = di->len;
Christian Heimes217cfd12007-12-02 14:31:20 +00002255 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002256}
2257
Guido van Rossumb90c8482007-02-10 01:11:45 +00002258PyDoc_STRVAR(length_hint_doc,
2259 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002260
2261static PyMethodDef dictiter_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002262 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2263 length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002264 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002265};
2266
Raymond Hettinger019a1482004-03-18 02:41:19 +00002267static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002268{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002269 PyObject *key;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002270 register Py_ssize_t i, mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002271 register PyDictEntry *ep;
2272 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002273
Raymond Hettinger019a1482004-03-18 02:41:19 +00002274 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002275 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002276 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002277
Raymond Hettinger019a1482004-03-18 02:41:19 +00002278 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002279 PyErr_SetString(PyExc_RuntimeError,
2280 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002281 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002282 return NULL;
2283 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002284
Raymond Hettinger019a1482004-03-18 02:41:19 +00002285 i = di->di_pos;
2286 if (i < 0)
2287 goto fail;
2288 ep = d->ma_table;
2289 mask = d->ma_mask;
2290 while (i <= mask && ep[i].me_value == NULL)
2291 i++;
2292 di->di_pos = i+1;
2293 if (i > mask)
2294 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002295 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002296 key = ep[i].me_key;
2297 Py_INCREF(key);
2298 return key;
2299
2300fail:
2301 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002302 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002303 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002304}
2305
Raymond Hettinger019a1482004-03-18 02:41:19 +00002306PyTypeObject PyDictIterKey_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002307 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002308 "dict_keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002309 sizeof(dictiterobject), /* tp_basicsize */
2310 0, /* tp_itemsize */
2311 /* methods */
2312 (destructor)dictiter_dealloc, /* tp_dealloc */
2313 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002314 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002315 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002316 0, /* tp_reserved */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002317 0, /* tp_repr */
2318 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002319 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002320 0, /* tp_as_mapping */
2321 0, /* tp_hash */
2322 0, /* tp_call */
2323 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002324 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002325 0, /* tp_setattro */
2326 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002327 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002328 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002329 (traverseproc)dictiter_traverse, /* tp_traverse */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002330 0, /* tp_clear */
2331 0, /* tp_richcompare */
2332 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002333 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002334 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002335 dictiter_methods, /* tp_methods */
2336 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002337};
2338
2339static PyObject *dictiter_iternextvalue(dictiterobject *di)
2340{
2341 PyObject *value;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002342 register Py_ssize_t i, mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002343 register PyDictEntry *ep;
2344 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002345
2346 if (d == NULL)
2347 return NULL;
2348 assert (PyDict_Check(d));
2349
2350 if (di->di_used != d->ma_used) {
2351 PyErr_SetString(PyExc_RuntimeError,
2352 "dictionary changed size during iteration");
2353 di->di_used = -1; /* Make this state sticky */
2354 return NULL;
2355 }
2356
2357 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002358 mask = d->ma_mask;
2359 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002360 goto fail;
2361 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002362 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002363 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002364 if (i > mask)
2365 goto fail;
2366 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002367 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002368 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002369 Py_INCREF(value);
2370 return value;
2371
2372fail:
2373 Py_DECREF(d);
2374 di->di_dict = NULL;
2375 return NULL;
2376}
2377
2378PyTypeObject PyDictIterValue_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002379 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002380 "dict_valueiterator", /* tp_name */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002381 sizeof(dictiterobject), /* tp_basicsize */
2382 0, /* tp_itemsize */
2383 /* methods */
2384 (destructor)dictiter_dealloc, /* tp_dealloc */
2385 0, /* tp_print */
2386 0, /* tp_getattr */
2387 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002388 0, /* tp_reserved */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002389 0, /* tp_repr */
2390 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002391 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002392 0, /* tp_as_mapping */
2393 0, /* tp_hash */
2394 0, /* tp_call */
2395 0, /* tp_str */
2396 PyObject_GenericGetAttr, /* tp_getattro */
2397 0, /* tp_setattro */
2398 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002399 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002400 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002401 (traverseproc)dictiter_traverse, /* tp_traverse */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002402 0, /* tp_clear */
2403 0, /* tp_richcompare */
2404 0, /* tp_weaklistoffset */
2405 PyObject_SelfIter, /* tp_iter */
2406 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002407 dictiter_methods, /* tp_methods */
2408 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002409};
2410
2411static PyObject *dictiter_iternextitem(dictiterobject *di)
2412{
2413 PyObject *key, *value, *result = di->di_result;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002414 register Py_ssize_t i, mask;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002415 register PyDictEntry *ep;
2416 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002417
2418 if (d == NULL)
2419 return NULL;
2420 assert (PyDict_Check(d));
2421
2422 if (di->di_used != d->ma_used) {
2423 PyErr_SetString(PyExc_RuntimeError,
2424 "dictionary changed size during iteration");
2425 di->di_used = -1; /* Make this state sticky */
2426 return NULL;
2427 }
2428
2429 i = di->di_pos;
2430 if (i < 0)
2431 goto fail;
2432 ep = d->ma_table;
2433 mask = d->ma_mask;
2434 while (i <= mask && ep[i].me_value == NULL)
2435 i++;
2436 di->di_pos = i+1;
2437 if (i > mask)
2438 goto fail;
2439
2440 if (result->ob_refcnt == 1) {
2441 Py_INCREF(result);
2442 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2443 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2444 } else {
2445 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002446 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002447 return NULL;
2448 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002449 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002450 key = ep[i].me_key;
2451 value = ep[i].me_value;
2452 Py_INCREF(key);
2453 Py_INCREF(value);
2454 PyTuple_SET_ITEM(result, 0, key);
2455 PyTuple_SET_ITEM(result, 1, value);
2456 return result;
2457
2458fail:
2459 Py_DECREF(d);
2460 di->di_dict = NULL;
2461 return NULL;
2462}
2463
2464PyTypeObject PyDictIterItem_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002465 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesf83be4e2007-11-28 09:44:38 +00002466 "dict_itemiterator", /* tp_name */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002467 sizeof(dictiterobject), /* tp_basicsize */
2468 0, /* tp_itemsize */
2469 /* methods */
2470 (destructor)dictiter_dealloc, /* tp_dealloc */
2471 0, /* tp_print */
2472 0, /* tp_getattr */
2473 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002474 0, /* tp_reserved */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002475 0, /* tp_repr */
2476 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002477 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002478 0, /* tp_as_mapping */
2479 0, /* tp_hash */
2480 0, /* tp_call */
2481 0, /* tp_str */
2482 PyObject_GenericGetAttr, /* tp_getattro */
2483 0, /* tp_setattro */
2484 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002485 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002486 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002487 (traverseproc)dictiter_traverse, /* tp_traverse */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002488 0, /* tp_clear */
2489 0, /* tp_richcompare */
2490 0, /* tp_weaklistoffset */
2491 PyObject_SelfIter, /* tp_iter */
2492 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002493 dictiter_methods, /* tp_methods */
2494 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002495};
Guido van Rossumb90c8482007-02-10 01:11:45 +00002496
2497
Guido van Rossum3ac67412007-02-10 18:55:06 +00002498/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002499/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002500/***********************************************/
2501
Guido van Rossumb90c8482007-02-10 01:11:45 +00002502/* The instance lay-out is the same for all three; but the type differs. */
2503
2504typedef struct {
2505 PyObject_HEAD
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002506 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002507} dictviewobject;
2508
2509
2510static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00002511dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002512{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002513 Py_XDECREF(dv->dv_dict);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002514 PyObject_GC_Del(dv);
2515}
2516
2517static int
2518dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
2519{
2520 Py_VISIT(dv->dv_dict);
2521 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002522}
2523
Guido van Rossum83825ac2007-02-10 04:54:19 +00002524static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00002525dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002526{
2527 Py_ssize_t len = 0;
Guido van Rossum3ac67412007-02-10 18:55:06 +00002528 if (dv->dv_dict != NULL)
2529 len = dv->dv_dict->ma_used;
Guido van Rossum83825ac2007-02-10 04:54:19 +00002530 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002531}
2532
2533static PyObject *
2534dictview_new(PyObject *dict, PyTypeObject *type)
2535{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002536 dictviewobject *dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002537 if (dict == NULL) {
2538 PyErr_BadInternalCall();
2539 return NULL;
2540 }
2541 if (!PyDict_Check(dict)) {
2542 /* XXX Get rid of this restriction later */
2543 PyErr_Format(PyExc_TypeError,
2544 "%s() requires a dict argument, not '%s'",
2545 type->tp_name, dict->ob_type->tp_name);
2546 return NULL;
2547 }
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002548 dv = PyObject_GC_New(dictviewobject, type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002549 if (dv == NULL)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002550 return NULL;
2551 Py_INCREF(dict);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002552 dv->dv_dict = (PyDictObject *)dict;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002553 _PyObject_GC_TRACK(dv);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002554 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002555}
2556
Neal Norwitze36f2ba2007-02-26 23:12:28 +00002557/* TODO(guido): The views objects are not complete:
2558
2559 * support more set operations
2560 * support arbitrary mappings?
2561 - either these should be static or exported in dictobject.h
2562 - if public then they should probably be in builtins
2563*/
2564
Guido van Rossumaac530c2007-08-24 22:33:45 +00002565/* Return 1 if self is a subset of other, iterating over self;
2566 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002567static int
2568all_contained_in(PyObject *self, PyObject *other)
2569{
2570 PyObject *iter = PyObject_GetIter(self);
2571 int ok = 1;
2572
2573 if (iter == NULL)
2574 return -1;
2575 for (;;) {
2576 PyObject *next = PyIter_Next(iter);
2577 if (next == NULL) {
2578 if (PyErr_Occurred())
2579 ok = -1;
2580 break;
2581 }
2582 ok = PySequence_Contains(other, next);
2583 Py_DECREF(next);
2584 if (ok <= 0)
2585 break;
2586 }
2587 Py_DECREF(iter);
2588 return ok;
2589}
2590
2591static PyObject *
2592dictview_richcompare(PyObject *self, PyObject *other, int op)
2593{
Guido van Rossumaac530c2007-08-24 22:33:45 +00002594 Py_ssize_t len_self, len_other;
2595 int ok;
2596 PyObject *result;
2597
Guido van Rossumd9214d12007-02-12 02:23:40 +00002598 assert(self != NULL);
2599 assert(PyDictViewSet_Check(self));
2600 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00002601
Guido van Rossumaac530c2007-08-24 22:33:45 +00002602 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other)) {
Guido van Rossumd9214d12007-02-12 02:23:40 +00002603 Py_INCREF(Py_NotImplemented);
2604 return Py_NotImplemented;
2605 }
Guido van Rossumaac530c2007-08-24 22:33:45 +00002606
2607 len_self = PyObject_Size(self);
2608 if (len_self < 0)
2609 return NULL;
2610 len_other = PyObject_Size(other);
2611 if (len_other < 0)
2612 return NULL;
2613
2614 ok = 0;
2615 switch(op) {
2616
2617 case Py_NE:
2618 case Py_EQ:
2619 if (len_self == len_other)
2620 ok = all_contained_in(self, other);
2621 if (op == Py_NE && ok >= 0)
2622 ok = !ok;
2623 break;
2624
2625 case Py_LT:
2626 if (len_self < len_other)
2627 ok = all_contained_in(self, other);
2628 break;
2629
2630 case Py_LE:
2631 if (len_self <= len_other)
2632 ok = all_contained_in(self, other);
2633 break;
2634
2635 case Py_GT:
2636 if (len_self > len_other)
2637 ok = all_contained_in(other, self);
2638 break;
2639
2640 case Py_GE:
2641 if (len_self >= len_other)
2642 ok = all_contained_in(other, self);
2643 break;
2644
2645 }
2646 if (ok < 0)
2647 return NULL;
2648 result = ok ? Py_True : Py_False;
2649 Py_INCREF(result);
2650 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002651}
2652
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002653static PyObject *
2654dictview_repr(dictviewobject *dv)
2655{
2656 PyObject *seq;
2657 PyObject *result;
2658
2659 seq = PySequence_List((PyObject *)dv);
2660 if (seq == NULL)
2661 return NULL;
2662
2663 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
2664 Py_DECREF(seq);
2665 return result;
2666}
2667
Guido van Rossum3ac67412007-02-10 18:55:06 +00002668/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002669
2670static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002671dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002672{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002673 if (dv->dv_dict == NULL) {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002674 Py_RETURN_NONE;
2675 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002676 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
2677}
2678
2679static int
2680dictkeys_contains(dictviewobject *dv, PyObject *obj)
2681{
2682 if (dv->dv_dict == NULL)
2683 return 0;
2684 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002685}
2686
Guido van Rossum83825ac2007-02-10 04:54:19 +00002687static PySequenceMethods dictkeys_as_sequence = {
2688 (lenfunc)dictview_len, /* sq_length */
2689 0, /* sq_concat */
2690 0, /* sq_repeat */
2691 0, /* sq_item */
2692 0, /* sq_slice */
2693 0, /* sq_ass_item */
2694 0, /* sq_ass_slice */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002695 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002696};
2697
Guido van Rossum523259b2007-08-24 23:41:22 +00002698static PyObject*
2699dictviews_sub(PyObject* self, PyObject *other)
2700{
2701 PyObject *result = PySet_New(self);
2702 PyObject *tmp;
2703 if (result == NULL)
2704 return NULL;
2705
2706 tmp = PyObject_CallMethod(result, "difference_update", "O", other);
2707 if (tmp == NULL) {
2708 Py_DECREF(result);
2709 return NULL;
2710 }
2711
2712 Py_DECREF(tmp);
2713 return result;
2714}
2715
2716static PyObject*
2717dictviews_and(PyObject* self, PyObject *other)
2718{
2719 PyObject *result = PySet_New(self);
2720 PyObject *tmp;
2721 if (result == NULL)
2722 return NULL;
2723
2724 tmp = PyObject_CallMethod(result, "intersection_update", "O", other);
2725 if (tmp == NULL) {
2726 Py_DECREF(result);
2727 return NULL;
2728 }
2729
2730 Py_DECREF(tmp);
2731 return result;
2732}
2733
2734static PyObject*
2735dictviews_or(PyObject* self, PyObject *other)
2736{
2737 PyObject *result = PySet_New(self);
2738 PyObject *tmp;
2739 if (result == NULL)
2740 return NULL;
2741
2742 tmp = PyObject_CallMethod(result, "update", "O", other);
2743 if (tmp == NULL) {
2744 Py_DECREF(result);
2745 return NULL;
2746 }
2747
2748 Py_DECREF(tmp);
2749 return result;
2750}
2751
2752static PyObject*
2753dictviews_xor(PyObject* self, PyObject *other)
2754{
2755 PyObject *result = PySet_New(self);
2756 PyObject *tmp;
2757 if (result == NULL)
2758 return NULL;
2759
2760 tmp = PyObject_CallMethod(result, "symmetric_difference_update", "O",
2761 other);
2762 if (tmp == NULL) {
2763 Py_DECREF(result);
2764 return NULL;
2765 }
2766
2767 Py_DECREF(tmp);
2768 return result;
2769}
2770
2771static PyNumberMethods dictviews_as_number = {
2772 0, /*nb_add*/
2773 (binaryfunc)dictviews_sub, /*nb_subtract*/
2774 0, /*nb_multiply*/
2775 0, /*nb_remainder*/
2776 0, /*nb_divmod*/
2777 0, /*nb_power*/
2778 0, /*nb_negative*/
2779 0, /*nb_positive*/
2780 0, /*nb_absolute*/
2781 0, /*nb_bool*/
2782 0, /*nb_invert*/
2783 0, /*nb_lshift*/
2784 0, /*nb_rshift*/
2785 (binaryfunc)dictviews_and, /*nb_and*/
2786 (binaryfunc)dictviews_xor, /*nb_xor*/
2787 (binaryfunc)dictviews_or, /*nb_or*/
2788};
2789
Guido van Rossumb90c8482007-02-10 01:11:45 +00002790static PyMethodDef dictkeys_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002791 {NULL, NULL} /* sentinel */
2792};
2793
2794PyTypeObject PyDictKeys_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002795 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002796 "dict_keys", /* tp_name */
2797 sizeof(dictviewobject), /* tp_basicsize */
2798 0, /* tp_itemsize */
2799 /* methods */
2800 (destructor)dictview_dealloc, /* tp_dealloc */
2801 0, /* tp_print */
2802 0, /* tp_getattr */
2803 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002804 0, /* tp_reserved */
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002805 (reprfunc)dictview_repr, /* tp_repr */
Guido van Rossum523259b2007-08-24 23:41:22 +00002806 &dictviews_as_number, /* tp_as_number */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002807 &dictkeys_as_sequence, /* tp_as_sequence */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002808 0, /* tp_as_mapping */
2809 0, /* tp_hash */
2810 0, /* tp_call */
2811 0, /* tp_str */
2812 PyObject_GenericGetAttr, /* tp_getattro */
2813 0, /* tp_setattro */
2814 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002815 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002816 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002817 (traverseproc)dictview_traverse, /* tp_traverse */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002818 0, /* tp_clear */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002819 dictview_richcompare, /* tp_richcompare */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002820 0, /* tp_weaklistoffset */
2821 (getiterfunc)dictkeys_iter, /* tp_iter */
2822 0, /* tp_iternext */
2823 dictkeys_methods, /* tp_methods */
2824 0,
2825};
2826
2827static PyObject *
2828dictkeys_new(PyObject *dict)
2829{
2830 return dictview_new(dict, &PyDictKeys_Type);
2831}
2832
Guido van Rossum3ac67412007-02-10 18:55:06 +00002833/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002834
2835static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002836dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002837{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002838 if (dv->dv_dict == NULL) {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002839 Py_RETURN_NONE;
2840 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002841 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
2842}
2843
2844static int
2845dictitems_contains(dictviewobject *dv, PyObject *obj)
2846{
2847 PyObject *key, *value, *found;
2848 if (dv->dv_dict == NULL)
2849 return 0;
2850 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
2851 return 0;
2852 key = PyTuple_GET_ITEM(obj, 0);
2853 value = PyTuple_GET_ITEM(obj, 1);
2854 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
2855 if (found == NULL) {
2856 if (PyErr_Occurred())
2857 return -1;
2858 return 0;
2859 }
2860 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002861}
2862
Guido van Rossum83825ac2007-02-10 04:54:19 +00002863static PySequenceMethods dictitems_as_sequence = {
2864 (lenfunc)dictview_len, /* sq_length */
2865 0, /* sq_concat */
2866 0, /* sq_repeat */
2867 0, /* sq_item */
2868 0, /* sq_slice */
2869 0, /* sq_ass_item */
2870 0, /* sq_ass_slice */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002871 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002872};
2873
Guido van Rossumb90c8482007-02-10 01:11:45 +00002874static PyMethodDef dictitems_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002875 {NULL, NULL} /* sentinel */
2876};
2877
2878PyTypeObject PyDictItems_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002879 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002880 "dict_items", /* tp_name */
2881 sizeof(dictviewobject), /* tp_basicsize */
2882 0, /* tp_itemsize */
2883 /* methods */
2884 (destructor)dictview_dealloc, /* tp_dealloc */
2885 0, /* tp_print */
2886 0, /* tp_getattr */
2887 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002888 0, /* tp_reserved */
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002889 (reprfunc)dictview_repr, /* tp_repr */
Guido van Rossum523259b2007-08-24 23:41:22 +00002890 &dictviews_as_number, /* tp_as_number */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002891 &dictitems_as_sequence, /* tp_as_sequence */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002892 0, /* tp_as_mapping */
2893 0, /* tp_hash */
2894 0, /* tp_call */
2895 0, /* tp_str */
2896 PyObject_GenericGetAttr, /* tp_getattro */
2897 0, /* tp_setattro */
2898 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002899 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002900 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002901 (traverseproc)dictview_traverse, /* tp_traverse */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002902 0, /* tp_clear */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002903 dictview_richcompare, /* tp_richcompare */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002904 0, /* tp_weaklistoffset */
2905 (getiterfunc)dictitems_iter, /* tp_iter */
2906 0, /* tp_iternext */
2907 dictitems_methods, /* tp_methods */
2908 0,
2909};
2910
2911static PyObject *
2912dictitems_new(PyObject *dict)
2913{
2914 return dictview_new(dict, &PyDictItems_Type);
2915}
2916
Guido van Rossum3ac67412007-02-10 18:55:06 +00002917/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002918
2919static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002920dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002921{
Guido van Rossum3ac67412007-02-10 18:55:06 +00002922 if (dv->dv_dict == NULL) {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002923 Py_RETURN_NONE;
2924 }
Guido van Rossum3ac67412007-02-10 18:55:06 +00002925 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002926}
2927
Guido van Rossum83825ac2007-02-10 04:54:19 +00002928static PySequenceMethods dictvalues_as_sequence = {
2929 (lenfunc)dictview_len, /* sq_length */
2930 0, /* sq_concat */
2931 0, /* sq_repeat */
2932 0, /* sq_item */
2933 0, /* sq_slice */
2934 0, /* sq_ass_item */
2935 0, /* sq_ass_slice */
2936 (objobjproc)0, /* sq_contains */
2937};
2938
Guido van Rossumb90c8482007-02-10 01:11:45 +00002939static PyMethodDef dictvalues_methods[] = {
Guido van Rossumb90c8482007-02-10 01:11:45 +00002940 {NULL, NULL} /* sentinel */
2941};
2942
2943PyTypeObject PyDictValues_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002944 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002945 "dict_values", /* tp_name */
2946 sizeof(dictviewobject), /* tp_basicsize */
2947 0, /* tp_itemsize */
2948 /* methods */
2949 (destructor)dictview_dealloc, /* tp_dealloc */
2950 0, /* tp_print */
2951 0, /* tp_getattr */
2952 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002953 0, /* tp_reserved */
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002954 (reprfunc)dictview_repr, /* tp_repr */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002955 0, /* tp_as_number */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002956 &dictvalues_as_sequence, /* tp_as_sequence */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002957 0, /* tp_as_mapping */
2958 0, /* tp_hash */
2959 0, /* tp_call */
2960 0, /* tp_str */
2961 PyObject_GenericGetAttr, /* tp_getattro */
2962 0, /* tp_setattro */
2963 0, /* tp_as_buffer */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002964 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002965 0, /* tp_doc */
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002966 (traverseproc)dictview_traverse, /* tp_traverse */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002967 0, /* tp_clear */
2968 0, /* tp_richcompare */
2969 0, /* tp_weaklistoffset */
2970 (getiterfunc)dictvalues_iter, /* tp_iter */
2971 0, /* tp_iternext */
2972 dictvalues_methods, /* tp_methods */
2973 0,
2974};
2975
2976static PyObject *
2977dictvalues_new(PyObject *dict)
2978{
2979 return dictview_new(dict, &PyDictValues_Type);
2980}