blob: 5069c76398c57a1f1d73741d80136b067db648a7 [file] [log] [blame]
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001
Guido van Rossum2bc13791999-03-24 19:06:42 +00002/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003
Raymond Hettinger930427b2003-05-03 06:51:59 +00004/* The distribution includes a separate file, Objects/dictnotes.txt,
Tim Peters60b29962006-01-01 01:19:23 +00005 describing explorations into dictionary design and optimization.
Raymond Hettinger930427b2003-05-03 06:51:59 +00006 It covers typical dictionary use patterns, the parameters for
7 tuning dictionaries, and several ideas for possible optimizations.
8*/
9
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010#include "Python.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000011
Guido van Rossum16e93a81997-01-28 00:00:11 +000012
Georg Brandlb9f4ad32006-10-29 18:31:42 +000013/* Set a key error with the specified argument, wrapping it in a
14 * tuple automatically so that tuple keys are not unpacked as the
15 * exception arguments. */
16static void
17set_key_error(PyObject *arg)
18{
19 PyObject *tup;
20 tup = PyTuple_Pack(1, arg);
21 if (!tup)
22 return; /* caller will expect error to be set anyway */
23 PyErr_SetObject(PyExc_KeyError, tup);
Neal Norwitz7b932da2006-10-29 23:39:03 +000024 Py_DECREF(tup);
Georg Brandlb9f4ad32006-10-29 18:31:42 +000025}
26
Tim Peterseb28ef22001-06-02 05:27:19 +000027/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000028#undef SHOW_CONVERSION_COUNTS
29
Tim Peterseb28ef22001-06-02 05:27:19 +000030/* See large comment block below. This must be >= 1. */
31#define PERTURB_SHIFT 5
32
Guido van Rossum16e93a81997-01-28 00:00:11 +000033/*
Tim Peterseb28ef22001-06-02 05:27:19 +000034Major subtleties ahead: Most hash schemes depend on having a "good" hash
35function, in the sense of simulating randomness. Python doesn't: its most
36important hash functions (for strings and ints) are very regular in common
37cases:
Tim Peters15d49292001-05-27 07:39:22 +000038
Tim Peterseb28ef22001-06-02 05:27:19 +000039>>> map(hash, (0, 1, 2, 3))
40[0, 1, 2, 3]
41>>> map(hash, ("namea", "nameb", "namec", "named"))
42[-1658398457, -1658398460, -1658398459, -1658398462]
43>>>
Tim Peters15d49292001-05-27 07:39:22 +000044
Tim Peterseb28ef22001-06-02 05:27:19 +000045This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
46the low-order i bits as the initial table index is extremely fast, and there
47are no collisions at all for dicts indexed by a contiguous range of ints.
48The same is approximately true when keys are "consecutive" strings. So this
49gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000050
Tim Peterseb28ef22001-06-02 05:27:19 +000051OTOH, when collisions occur, the tendency to fill contiguous slices of the
52hash table makes a good collision resolution strategy crucial. Taking only
53the last i bits of the hash code is also vulnerable: for example, consider
54[i << 16 for i in range(20000)] as a set of keys. Since ints are their own
55hash codes, and this fits in a dict of size 2**15, the last 15 bits of every
56hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000057
Tim Peterseb28ef22001-06-02 05:27:19 +000058But catering to unusual cases should not slow the usual ones, so we just take
59the last i bits anyway. It's up to collision resolution to do the rest. If
60we *usually* find the key we're looking for on the first try (and, it turns
61out, we usually do -- the table load factor is kept under 2/3, so the odds
62are solidly in our favor), then it makes best sense to keep the initial index
63computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000064
Tim Peterseb28ef22001-06-02 05:27:19 +000065The first half of collision resolution is to visit table indices via this
66recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000067
Tim Peterseb28ef22001-06-02 05:27:19 +000068 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000069
Tim Peterseb28ef22001-06-02 05:27:19 +000070For any initial j in range(2**i), repeating that 2**i times generates each
71int in range(2**i) exactly once (see any text on random-number generation for
72proof). By itself, this doesn't help much: like linear probing (setting
73j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
74order. This would be bad, except that's not the only thing we do, and it's
75actually *good* in the common cases where hash keys are consecutive. In an
76example that's really too small to make this entirely clear, for a table of
77size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000078
Tim Peterseb28ef22001-06-02 05:27:19 +000079 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
80
81If two things come in at index 5, the first place we look after is index 2,
82not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
83Linear probing is deadly in this case because there the fixed probe order
84is the *same* as the order consecutive keys are likely to arrive. But it's
85extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
86and certain that consecutive hash codes do not.
87
88The other half of the strategy is to get the other bits of the hash code
89into play. This is done by initializing a (unsigned) vrbl "perturb" to the
90full hash code, and changing the recurrence to:
91
92 j = (5*j) + 1 + perturb;
93 perturb >>= PERTURB_SHIFT;
94 use j % 2**i as the next table index;
95
96Now the probe sequence depends (eventually) on every bit in the hash code,
97and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
98because it quickly magnifies small differences in the bits that didn't affect
99the initial index. Note that because perturb is unsigned, if the recurrence
100is executed often enough perturb eventually becomes and remains 0. At that
101point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
102that's certain to find an empty slot eventually (since it generates every int
103in range(2**i), and we make sure there's always at least one empty slot).
104
105Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
106small so that the high bits of the hash code continue to affect the probe
107sequence across iterations; but you want it large so that in really bad cases
108the high-order hash bits have an effect on early iterations. 5 was "the
109best" in minimizing total collisions across experiments Tim Peters ran (on
110both normal and pathological cases), but 4 and 6 weren't significantly worse.
111
112Historical: Reimer Behrends contributed the idea of using a polynomial-based
113approach, using repeated multiplication by x in GF(2**n) where an irreducible
114polynomial for each table size was chosen such that x was a primitive root.
115Christian Tismer later extended that to use division by x instead, as an
116efficient way to get the high bits of the hash code into play. This scheme
117also gave excellent collision statistics, but was more expensive: two
118if-tests were required inside the loop; computing "the next" index took about
119the same number of operations but without as much potential parallelism
120(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
121above, and then shifting perturb can be done while the table index is being
Brett Cannon77ae87c2007-10-10 00:07:50 +0000122masked); and the PyDictObject struct required a member to hold the table's
Tim Peterseb28ef22001-06-02 05:27:19 +0000123polynomial. In Tim's experiments the current scheme ran faster, produced
124equally good collision statistics, needed less code & used less memory.
Tim Peters9b10f7e2006-05-30 04:16:25 +0000125
126Theoretical Python 2.5 headache: hash codes are only C "long", but
127sizeof(Py_ssize_t) > sizeof(long) may be possible. In that case, and if a
128dict is genuinely huge, then only the slots directly reachable via indexing
129by a C long can be the first slot in a probe sequence. The probe sequence
130will still eventually reach every slot in the table, but the collision rate
131on initial probes may be much higher than this scheme was designed for.
132Getting a hash code as fat as Py_ssize_t is the only real cure. But in
133practice, this probably won't make a lick of difference for many years (at
134which point everyone will have terabytes of RAM on 64-bit boxes).
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000135*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000136
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000137/* Object used as dummy key to fill deleted entries */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000138static PyObject *dummy = NULL; /* Initialized by first call to newPyDictObject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000139
Armin Rigoe1709372006-04-12 17:06:05 +0000140#ifdef Py_REF_DEBUG
141PyObject *
142_PyDict_Dummy(void)
143{
144 return dummy;
145}
146#endif
147
Fred Drake1bff34a2000-08-31 19:31:38 +0000148/* forward declarations */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000149static PyDictEntry *
150lookdict_string(PyDictObject *mp, PyObject *key, long hash);
Fred Drake1bff34a2000-08-31 19:31:38 +0000151
152#ifdef SHOW_CONVERSION_COUNTS
153static long created = 0L;
154static long converted = 0L;
155
156static void
157show_counts(void)
158{
159 fprintf(stderr, "created %ld string dicts\n", created);
160 fprintf(stderr, "converted %ld to normal dicts\n", converted);
161 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
162}
163#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000164
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000165/* Debug statistic to compare allocations with reuse through the free list */
166#undef SHOW_ALLOC_COUNT
167#ifdef SHOW_ALLOC_COUNT
168static size_t count_alloc = 0;
169static size_t count_reuse = 0;
170
171static void
172show_alloc(void)
173{
Christian Heimes09bde042008-02-24 12:26:16 +0000174 fprintf(stderr, "Dict allocations: %" PY_FORMAT_SIZE_T "d\n",
175 count_alloc);
176 fprintf(stderr, "Dict reuse through freelist: %" PY_FORMAT_SIZE_T
177 "d\n", count_reuse);
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000178 fprintf(stderr, "%.2f%% reuse rate\n\n",
179 (100.0*count_reuse/(count_alloc+count_reuse)));
180}
181#endif
182
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000183/* Debug statistic to count GC tracking of dicts */
184#ifdef SHOW_TRACK_COUNT
185static Py_ssize_t count_untracked = 0;
186static Py_ssize_t count_tracked = 0;
187
188static void
189show_track(void)
190{
191 fprintf(stderr, "Dicts created: %" PY_FORMAT_SIZE_T "d\n",
192 count_tracked + count_untracked);
193 fprintf(stderr, "Dicts tracked by the GC: %" PY_FORMAT_SIZE_T
194 "d\n", count_tracked);
195 fprintf(stderr, "%.2f%% dict tracking rate\n\n",
196 (100.0*count_tracked/(count_untracked+count_tracked)));
197}
198#endif
199
200
Tim Peters6d6c1a32001-08-02 04:15:00 +0000201/* Initialization macros.
202 There are two ways to create a dict: PyDict_New() is the main C API
203 function, and the tp_new slot maps to dict_new(). In the latter case we
204 can save a little time over what PyDict_New does because it's guaranteed
205 that the PyDictObject struct is already zeroed out.
206 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
207 an excellent reason not to).
208*/
209
210#define INIT_NONZERO_DICT_SLOTS(mp) do { \
Tim Petersdea48ec2001-05-22 20:40:22 +0000211 (mp)->ma_table = (mp)->ma_smalltable; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 (mp)->ma_mask = PyDict_MINSIZE - 1; \
213 } while(0)
214
215#define EMPTY_TO_MINSIZE(mp) do { \
216 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000217 (mp)->ma_used = (mp)->ma_fill = 0; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000218 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000219 } while(0)
220
Raymond Hettinger43442782004-03-17 21:55:03 +0000221/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes5b970ad2008-02-06 13:33:44 +0000222#ifndef PyDict_MAXFREELIST
223#define PyDict_MAXFREELIST 80
224#endif
225static PyDictObject *free_list[PyDict_MAXFREELIST];
226static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000227
Christian Heimesf75dbef2008-02-08 00:11:31 +0000228void
229PyDict_Fini(void)
230{
Christian Heimes48397d62008-02-08 00:14:34 +0000231 PyDictObject *op;
Christian Heimesf75dbef2008-02-08 00:11:31 +0000232
233 while (numfree) {
Christian Heimes48397d62008-02-08 00:14:34 +0000234 op = free_list[--numfree];
Christian Heimesf75dbef2008-02-08 00:11:31 +0000235 assert(PyDict_CheckExact(op));
236 PyObject_GC_Del(op);
237 }
238}
239
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000241PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000242{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000243 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000244 if (dummy == NULL) { /* Auto-initialize dummy */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000245 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000246 if (dummy == NULL)
247 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000248#ifdef SHOW_CONVERSION_COUNTS
249 Py_AtExit(show_counts);
250#endif
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000251#ifdef SHOW_ALLOC_COUNT
252 Py_AtExit(show_alloc);
253#endif
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000254#ifdef SHOW_TRACK_COUNT
255 Py_AtExit(show_track);
256#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000257 }
Christian Heimes5b970ad2008-02-06 13:33:44 +0000258 if (numfree) {
259 mp = free_list[--numfree];
Raymond Hettinger43442782004-03-17 21:55:03 +0000260 assert (mp != NULL);
Christian Heimese93237d2007-12-19 02:37:44 +0000261 assert (Py_TYPE(mp) == &PyDict_Type);
Raymond Hettinger43442782004-03-17 21:55:03 +0000262 _Py_NewReference((PyObject *)mp);
263 if (mp->ma_fill) {
264 EMPTY_TO_MINSIZE(mp);
Georg Brandl1e13ea92008-08-11 09:07:59 +0000265 } else {
266 /* At least set ma_table and ma_mask; these are wrong
267 if an empty but presized dict is added to freelist */
268 INIT_NONZERO_DICT_SLOTS(mp);
Raymond Hettinger43442782004-03-17 21:55:03 +0000269 }
270 assert (mp->ma_used == 0);
271 assert (mp->ma_table == mp->ma_smalltable);
272 assert (mp->ma_mask == PyDict_MINSIZE - 1);
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000273#ifdef SHOW_ALLOC_COUNT
274 count_reuse++;
275#endif
Raymond Hettinger43442782004-03-17 21:55:03 +0000276 } else {
Brett Cannon77ae87c2007-10-10 00:07:50 +0000277 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
Raymond Hettinger43442782004-03-17 21:55:03 +0000278 if (mp == NULL)
279 return NULL;
280 EMPTY_TO_MINSIZE(mp);
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000281#ifdef SHOW_ALLOC_COUNT
282 count_alloc++;
283#endif
Raymond Hettinger43442782004-03-17 21:55:03 +0000284 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000285 mp->ma_lookup = lookdict_string;
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000286#ifdef SHOW_TRACK_COUNT
287 count_untracked++;
288#endif
Fred Drake1bff34a2000-08-31 19:31:38 +0000289#ifdef SHOW_CONVERSION_COUNTS
290 ++created;
291#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000293}
294
295/*
296The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000297This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000298Open addressing is preferred over chaining since the link overhead for
299chaining would be substantial (100% with typical malloc overhead).
300
Tim Peterseb28ef22001-06-02 05:27:19 +0000301The initial probe index is computed as hash mod the table size. Subsequent
302probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000303
304All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000305
Tim Peterseb28ef22001-06-02 05:27:19 +0000306(The details in this version are due to Tim Peters, building on many past
307contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
308Christian Tismer).
Fred Drake1bff34a2000-08-31 19:31:38 +0000309
Tim Petersd770ebd2006-06-01 15:50:44 +0000310lookdict() is general-purpose, and may return NULL if (and only if) a
311comparison raises an exception (this was new in Python 2.5).
312lookdict_string() below is specialized to string keys, comparison of which can
313never raise an exception; that function can never return NULL. For both, when
Brett Cannon77ae87c2007-10-10 00:07:50 +0000314the key isn't found a PyDictEntry* is returned for which the me_value field is
Tim Petersd770ebd2006-06-01 15:50:44 +0000315NULL; this is the slot in the dict at which the key would have been found, and
316the caller can (if it wishes) add the <key, value> pair to the returned
Brett Cannon77ae87c2007-10-10 00:07:50 +0000317PyDictEntry*.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000318*/
Brett Cannon77ae87c2007-10-10 00:07:50 +0000319static PyDictEntry *
320lookdict(PyDictObject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000321{
Tim Petersd770ebd2006-06-01 15:50:44 +0000322 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000323 register size_t perturb;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000324 register PyDictEntry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000325 register size_t mask = (size_t)mp->ma_mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000326 PyDictEntry *ep0 = mp->ma_table;
327 register PyDictEntry *ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000328 register int cmp;
Tim Peters453163d2001-06-03 04:54:32 +0000329 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000330
Tim Petersd770ebd2006-06-01 15:50:44 +0000331 i = (size_t)hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000332 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000333 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000334 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000335
Guido van Rossum16e93a81997-01-28 00:00:11 +0000336 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000337 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000338 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000339 if (ep->me_hash == hash) {
Tim Peters453163d2001-06-03 04:54:32 +0000340 startkey = ep->me_key;
Georg Brandlede3a322007-11-29 18:33:01 +0000341 Py_INCREF(startkey);
Tim Peters453163d2001-06-03 04:54:32 +0000342 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Georg Brandlede3a322007-11-29 18:33:01 +0000343 Py_DECREF(startkey);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000344 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000345 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000346 if (ep0 == mp->ma_table && ep->me_key == startkey) {
347 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000348 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000349 }
350 else {
351 /* The compare did major nasty stuff to the
352 * dict: start over.
353 * XXX A clever adversary could prevent this
354 * XXX from terminating.
355 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000356 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000357 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000358 }
359 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000360 }
Tim Peters15d49292001-05-27 07:39:22 +0000361
Tim Peters342c65e2001-05-13 06:43:53 +0000362 /* In the loop, me_key == dummy is by far (factor of 100s) the
363 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000364 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
365 i = (i << 2) + i + perturb + 1;
366 ep = &ep0[i & mask];
Armin Rigo35f6d362006-06-01 13:19:12 +0000367 if (ep->me_key == NULL)
368 return freeslot == NULL ? ep : freeslot;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000369 if (ep->me_key == key)
Armin Rigo35f6d362006-06-01 13:19:12 +0000370 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000371 if (ep->me_hash == hash && ep->me_key != dummy) {
Tim Peters453163d2001-06-03 04:54:32 +0000372 startkey = ep->me_key;
Georg Brandlede3a322007-11-29 18:33:01 +0000373 Py_INCREF(startkey);
Tim Peters453163d2001-06-03 04:54:32 +0000374 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Georg Brandlede3a322007-11-29 18:33:01 +0000375 Py_DECREF(startkey);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000376 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000377 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000378 if (ep0 == mp->ma_table && ep->me_key == startkey) {
379 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000380 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000381 }
382 else {
383 /* The compare did major nasty stuff to the
384 * dict: start over.
385 * XXX A clever adversary could prevent this
386 * XXX from terminating.
387 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000388 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000389 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000390 }
Tim Peters342c65e2001-05-13 06:43:53 +0000391 else if (ep->me_key == dummy && freeslot == NULL)
392 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000393 }
Neal Norwitza5ccda92006-10-28 21:16:54 +0000394 assert(0); /* NOT REACHED */
395 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000396}
397
398/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000399 * Hacked up version of lookdict which can assume keys are always strings;
Tim Petersd770ebd2006-06-01 15:50:44 +0000400 * this assumption allows testing for errors during PyObject_RichCompareBool()
401 * to be dropped; string-string comparisons never raise exceptions. This also
402 * means we don't need to go through PyObject_RichCompareBool(); we can always
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000403 * use _PyString_Eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000404 *
Tim Petersd770ebd2006-06-01 15:50:44 +0000405 * This is valuable because dicts with only string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000406 */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000407static PyDictEntry *
408lookdict_string(PyDictObject *mp, PyObject *key, register long hash)
Fred Drake1bff34a2000-08-31 19:31:38 +0000409{
Tim Petersd770ebd2006-06-01 15:50:44 +0000410 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000411 register size_t perturb;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000412 register PyDictEntry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000413 register size_t mask = (size_t)mp->ma_mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000414 PyDictEntry *ep0 = mp->ma_table;
415 register PyDictEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000416
Tim Peters0ab085c2001-09-14 00:25:33 +0000417 /* Make sure this function doesn't have to handle non-string keys,
418 including subclasses of str; e.g., one reason to subclass
419 strings is to override __eq__, and for speed we don't cater to
420 that here. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000421 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000422#ifdef SHOW_CONVERSION_COUNTS
423 ++converted;
424#endif
425 mp->ma_lookup = lookdict;
426 return lookdict(mp, key, hash);
427 }
Tim Peters2f228e72001-05-13 00:19:31 +0000428 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000429 ep = &ep0[i];
430 if (ep->me_key == NULL || ep->me_key == key)
431 return ep;
432 if (ep->me_key == dummy)
433 freeslot = ep;
434 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000435 if (ep->me_hash == hash && _PyString_Eq(ep->me_key, key))
Fred Drake1bff34a2000-08-31 19:31:38 +0000436 return ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000437 freeslot = NULL;
438 }
Tim Peters15d49292001-05-27 07:39:22 +0000439
Tim Peters342c65e2001-05-13 06:43:53 +0000440 /* In the loop, me_key == dummy is by far (factor of 100s) the
441 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000442 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
443 i = (i << 2) + i + perturb + 1;
444 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000445 if (ep->me_key == NULL)
446 return freeslot == NULL ? ep : freeslot;
447 if (ep->me_key == key
448 || (ep->me_hash == hash
449 && ep->me_key != dummy
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000450 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000451 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000452 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000453 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000454 }
Neal Norwitza5ccda92006-10-28 21:16:54 +0000455 assert(0); /* NOT REACHED */
456 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000457}
458
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000459#ifdef SHOW_TRACK_COUNT
460#define INCREASE_TRACK_COUNT \
461 (count_tracked++, count_untracked--);
462#define DECREASE_TRACK_COUNT \
463 (count_tracked--, count_untracked++);
464#else
465#define INCREASE_TRACK_COUNT
466#define DECREASE_TRACK_COUNT
467#endif
468
469#define MAINTAIN_TRACKING(mp, key, value) \
470 do { \
471 if (!_PyObject_GC_IS_TRACKED(mp)) { \
472 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
473 _PyObject_GC_MAY_BE_TRACKED(value)) { \
474 _PyObject_GC_TRACK(mp); \
475 INCREASE_TRACK_COUNT \
476 } \
477 } \
478 } while(0)
479
480void
481_PyDict_MaybeUntrack(PyObject *op)
482{
483 PyDictObject *mp;
484 PyObject *value;
485 Py_ssize_t mask, i;
486 PyDictEntry *ep;
487
488 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
489 return;
490
491 mp = (PyDictObject *) op;
492 ep = mp->ma_table;
493 mask = mp->ma_mask;
494 for (i = 0; i <= mask; i++) {
495 if ((value = ep[i].me_value) == NULL)
496 continue;
497 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
498 _PyObject_GC_MAY_BE_TRACKED(ep[i].me_key))
499 return;
500 }
501 _PyObject_GC_UNTRACK(op);
502}
503
504
Fred Drake1bff34a2000-08-31 19:31:38 +0000505/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000506Internal routine to insert a new item into the table.
507Used both by the internal resize routine and by the public insert routine.
508Eats a reference to key and one to value.
Tim Petersd770ebd2006-06-01 15:50:44 +0000509Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000510*/
Armin Rigo35f6d362006-06-01 13:19:12 +0000511static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000512insertdict(register PyDictObject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000513{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 PyObject *old_value;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000515 register PyDictEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000516 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
517
518 assert(mp->ma_lookup != NULL);
519 ep = mp->ma_lookup(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000520 if (ep == NULL) {
521 Py_DECREF(key);
522 Py_DECREF(value);
523 return -1;
524 }
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000525 MAINTAIN_TRACKING(mp, key, value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000526 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000527 old_value = ep->me_value;
528 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000529 Py_DECREF(old_value); /* which **CAN** re-enter */
530 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000531 }
532 else {
533 if (ep->me_key == NULL)
534 mp->ma_fill++;
Raymond Hettinger07ead172005-02-05 23:42:57 +0000535 else {
536 assert(ep->me_key == dummy);
537 Py_DECREF(dummy);
538 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000539 ep->me_key = key;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000540 ep->me_hash = (Py_ssize_t)hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000541 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000542 mp->ma_used++;
543 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000544 return 0;
545}
546
547/*
548Internal routine used by dictresize() to insert an item which is
549known to be absent from the dict. This routine also assumes that
550the dict contains no deleted entries. Besides the performance benefit,
551using insertdict() in dictresize() is dangerous (SF bug #1456209).
Tim Petersd770ebd2006-06-01 15:50:44 +0000552Note that no refcounts are changed by this routine; if needed, the caller
553is responsible for incref'ing `key` and `value`.
Armin Rigo35f6d362006-06-01 13:19:12 +0000554*/
555static void
Brett Cannon77ae87c2007-10-10 00:07:50 +0000556insertdict_clean(register PyDictObject *mp, PyObject *key, long hash,
Armin Rigo35f6d362006-06-01 13:19:12 +0000557 PyObject *value)
558{
Tim Petersd770ebd2006-06-01 15:50:44 +0000559 register size_t i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000560 register size_t perturb;
Tim Petersd770ebd2006-06-01 15:50:44 +0000561 register size_t mask = (size_t)mp->ma_mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000562 PyDictEntry *ep0 = mp->ma_table;
563 register PyDictEntry *ep;
Armin Rigo35f6d362006-06-01 13:19:12 +0000564
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000565 MAINTAIN_TRACKING(mp, key, value);
Armin Rigo35f6d362006-06-01 13:19:12 +0000566 i = hash & mask;
567 ep = &ep0[i];
568 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
569 i = (i << 2) + i + perturb + 1;
570 ep = &ep0[i & mask];
571 }
Tim Petersd770ebd2006-06-01 15:50:44 +0000572 assert(ep->me_value == NULL);
Armin Rigo35f6d362006-06-01 13:19:12 +0000573 mp->ma_fill++;
574 ep->me_key = key;
575 ep->me_hash = (Py_ssize_t)hash;
576 ep->me_value = value;
577 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000578}
579
580/*
581Restructure the table by allocating a new table and reinserting all
582items again. When entries have been deleted, the new table may
583actually be smaller than the old one.
584*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000585static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000586dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000587{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000588 Py_ssize_t newsize;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000589 PyDictEntry *oldtable, *newtable, *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000590 Py_ssize_t i;
Tim Peters0c6010b2001-05-23 23:33:57 +0000591 int is_oldtable_malloced;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000592 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000593
594 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000595
Tim Peterseb28ef22001-06-02 05:27:19 +0000596 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000597 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000598 newsize <= minused && newsize > 0;
599 newsize <<= 1)
600 ;
601 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000603 return -1;
604 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000605
606 /* Get space for a new table. */
607 oldtable = mp->ma_table;
608 assert(oldtable != NULL);
609 is_oldtable_malloced = oldtable != mp->ma_smalltable;
610
Tim Peters6d6c1a32001-08-02 04:15:00 +0000611 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000612 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000613 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000614 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000615 if (mp->ma_fill == mp->ma_used) {
616 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000617 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000618 }
619 /* We're not going to resize it, but rebuild the
620 table anyway to purge old dummy entries.
621 Subtle: This is *necessary* if fill==size,
622 as lookdict needs at least one virgin slot to
623 terminate failing searches. If fill < size, it's
624 merely desirable, as dummies slow searches. */
625 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000626 memcpy(small_copy, oldtable, sizeof(small_copy));
627 oldtable = small_copy;
628 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000629 }
630 else {
Brett Cannon77ae87c2007-10-10 00:07:50 +0000631 newtable = PyMem_NEW(PyDictEntry, newsize);
Tim Petersdea48ec2001-05-22 20:40:22 +0000632 if (newtable == NULL) {
633 PyErr_NoMemory();
634 return -1;
635 }
636 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000637
638 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000639 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000640 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000641 mp->ma_mask = newsize - 1;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000642 memset(newtable, 0, sizeof(PyDictEntry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000643 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000644 i = mp->ma_fill;
645 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000646
Tim Peters19283142001-05-17 22:25:34 +0000647 /* Copy the data over; this is refcount-neutral for active entries;
648 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000649 for (ep = oldtable; i > 0; ep++) {
650 if (ep->me_value != NULL) { /* active entry */
651 --i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000652 insertdict_clean(mp, ep->me_key, (long)ep->me_hash,
653 ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000654 }
Tim Peters19283142001-05-17 22:25:34 +0000655 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000656 --i;
Tim Peters19283142001-05-17 22:25:34 +0000657 assert(ep->me_key == dummy);
658 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000659 }
Tim Peters19283142001-05-17 22:25:34 +0000660 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000661 }
662
Tim Peters0c6010b2001-05-23 23:33:57 +0000663 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000664 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000665 return 0;
666}
667
Raymond Hettingerfd7ed402007-12-18 21:24:09 +0000668/* Create a new dictionary pre-sized to hold an estimated number of elements.
669 Underestimates are okay because the dictionary will resize as necessary.
670 Overestimates just mean the dictionary will be more sparse than usual.
671*/
672
673PyObject *
674_PyDict_NewPresized(Py_ssize_t minused)
675{
676 PyObject *op = PyDict_New();
677
678 if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
679 Py_DECREF(op);
680 return NULL;
681 }
682 return op;
683}
684
Tim Petersd770ebd2006-06-01 15:50:44 +0000685/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
686 * that may occur (originally dicts supported only string keys, and exceptions
687 * weren't possible). So, while the original intent was that a NULL return
Andrew M. Kuchling0067b5f2006-08-04 20:37:43 +0000688 * meant the key wasn't present, in reality it can mean that, or that an error
Tim Petersd770ebd2006-06-01 15:50:44 +0000689 * (suppressed) occurred while computing the key's hash, or that some error
690 * (suppressed) occurred when comparing keys in the dict's internal probe
691 * sequence. A nasty example of the latter is when a Python-coded comparison
692 * function hits a stack-depth error, which can cause this to return NULL
693 * even if the key is present.
694 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000696PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000697{
698 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000699 PyDictObject *mp = (PyDictObject *)op;
700 PyDictEntry *ep;
Armin Rigo35f6d362006-06-01 13:19:12 +0000701 PyThreadState *tstate;
Tim Petersd770ebd2006-06-01 15:50:44 +0000702 if (!PyDict_Check(op))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000703 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000704 if (!PyString_CheckExact(key) ||
705 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000706 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000708 if (hash == -1) {
709 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000710 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000711 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000712 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000713
714 /* We can arrive here with a NULL tstate during initialization:
715 try running "python -Wi" for an example related to string
716 interning. Let's just hope that no exception occurs then... */
Armin Rigoacd0d6d2006-06-10 10:57:40 +0000717 tstate = _PyThreadState_Current;
Armin Rigo35f6d362006-06-01 13:19:12 +0000718 if (tstate != NULL && tstate->curexc_type != NULL) {
719 /* preserve the existing exception */
720 PyObject *err_type, *err_value, *err_tb;
721 PyErr_Fetch(&err_type, &err_value, &err_tb);
722 ep = (mp->ma_lookup)(mp, key, hash);
723 /* ignore errors */
724 PyErr_Restore(err_type, err_value, err_tb);
725 if (ep == NULL)
726 return NULL;
727 }
728 else {
729 ep = (mp->ma_lookup)(mp, key, hash);
730 if (ep == NULL) {
731 PyErr_Clear();
732 return NULL;
733 }
734 }
735 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000736}
737
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000738/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000739 * dictionary if it's merely replacing the value for an existing key.
740 * This means that it's safe to loop over a dictionary with PyDict_Next()
741 * and occasionally replace a value -- but you can't insert new keys or
742 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000743 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000744int
Tim Peters1f5871e2000-07-04 17:44:48 +0000745PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000746{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000747 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000748 register long hash;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000749 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000750
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000751 if (!PyDict_Check(op)) {
752 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000753 return -1;
754 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000755 assert(key);
756 assert(value);
Brett Cannon77ae87c2007-10-10 00:07:50 +0000757 mp = (PyDictObject *)op;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000758 if (PyString_CheckExact(key)) {
759 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000760 if (hash == -1)
761 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000762 }
Tim Peters1f7df352002-03-29 03:29:08 +0000763 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000765 if (hash == -1)
766 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000767 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000768 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000769 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770 Py_INCREF(value);
771 Py_INCREF(key);
Armin Rigo35f6d362006-06-01 13:19:12 +0000772 if (insertdict(mp, key, hash, value) != 0)
773 return -1;
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000774 /* If we added a key, we can safely resize. Otherwise just return!
775 * If fill >= 2/3 size, adjust size. Normally, this doubles or
776 * quaduples the size, but it's also possible for the dict to shrink
Tim Peters60b29962006-01-01 01:19:23 +0000777 * (if ma_fill is much larger than ma_used, meaning a lot of dict
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000778 * keys have been * deleted).
Tim Peters60b29962006-01-01 01:19:23 +0000779 *
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000780 * Quadrupling the size improves average dictionary sparseness
781 * (reducing collisions) at the cost of some memory and iteration
782 * speed (which loops over every possible entry). It also halves
Neal Norwitz80af59c2006-05-30 04:19:21 +0000783 * the number of expensive resize operations in a growing dictionary.
Tim Peters60b29962006-01-01 01:19:23 +0000784 *
785 * Very large dictionaries (over 50K items) use doubling instead.
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000786 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000787 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000788 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
789 return 0;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000790 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000791}
792
793int
Tim Peters1f5871e2000-07-04 17:44:48 +0000794PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000795{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000796 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000797 register long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000798 register PyDictEntry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000799 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000800
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 if (!PyDict_Check(op)) {
802 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000803 return -1;
804 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000805 assert(key);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000806 if (!PyString_CheckExact(key) ||
807 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000808 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000809 if (hash == -1)
810 return -1;
811 }
Brett Cannon77ae87c2007-10-10 00:07:50 +0000812 mp = (PyDictObject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000813 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000814 if (ep == NULL)
815 return -1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000816 if (ep->me_value == NULL) {
Georg Brandlb9f4ad32006-10-29 18:31:42 +0000817 set_key_error(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000818 return -1;
819 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000820 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000821 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000822 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000823 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000824 ep->me_value = NULL;
825 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000826 Py_DECREF(old_value);
827 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000828 return 0;
829}
830
Guido van Rossum25831651993-05-19 14:50:45 +0000831void
Tim Peters1f5871e2000-07-04 17:44:48 +0000832PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000833{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000834 PyDictObject *mp;
835 PyDictEntry *ep, *table;
Tim Petersdea48ec2001-05-22 20:40:22 +0000836 int table_is_malloced;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000837 Py_ssize_t fill;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000838 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000839#ifdef Py_DEBUG
Tim Peters9b10f7e2006-05-30 04:16:25 +0000840 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000841#endif
842
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000843 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000844 return;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000845 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000846#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000847 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000848 i = 0;
849#endif
850
851 table = mp->ma_table;
852 assert(table != NULL);
853 table_is_malloced = table != mp->ma_smalltable;
854
855 /* This is delicate. During the process of clearing the dict,
856 * decrefs can cause the dict to mutate. To avoid fatal confusion
857 * (voice of experience), we have to make the dict empty before
858 * clearing the slots, and never refer to anything via mp->xxx while
859 * clearing.
860 */
861 fill = mp->ma_fill;
862 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000863 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000864
865 else if (fill > 0) {
866 /* It's a small table with something that needs to be cleared.
867 * Afraid the only safe way is to copy the dict entries into
868 * another small table first.
869 */
870 memcpy(small_copy, table, sizeof(small_copy));
871 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000872 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000873 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000874 /* else it's a small table that's already empty */
875
876 /* Now we can finally clear things. If C had refcounts, we could
877 * assert that the refcount on table is 1 now, i.e. that this function
878 * has unique access to it, so decref side-effects can't alter it.
879 */
880 for (ep = table; fill > 0; ++ep) {
881#ifdef Py_DEBUG
882 assert(i < n);
883 ++i;
884#endif
885 if (ep->me_key) {
886 --fill;
887 Py_DECREF(ep->me_key);
888 Py_XDECREF(ep->me_value);
889 }
890#ifdef Py_DEBUG
891 else
892 assert(ep->me_value == NULL);
893#endif
894 }
895
896 if (table_is_malloced)
897 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000898}
899
Tim Peters080c88b2003-02-15 03:01:11 +0000900/*
901 * Iterate over a dict. Use like so:
902 *
Tim Peters9b10f7e2006-05-30 04:16:25 +0000903 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000904 * PyObject *key, *value;
905 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000906 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000907 * Refer to borrowed references in key and value.
908 * }
909 *
910 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000911 * mutates the dict. One exception: it is safe if the loop merely changes
912 * the values associated with the keys (but doesn't insert new keys or
913 * delete keys), via PyDict_SetItem().
914 */
Guido van Rossum25831651993-05-19 14:50:45 +0000915int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000916PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000917{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000918 register Py_ssize_t i;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000919 register Py_ssize_t mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000920 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000921
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000923 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000924 i = *ppos;
925 if (i < 0)
926 return 0;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000927 ep = ((PyDictObject *)op)->ma_table;
928 mask = ((PyDictObject *)op)->ma_mask;
Raymond Hettinger43442782004-03-17 21:55:03 +0000929 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000930 i++;
931 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000932 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000933 return 0;
934 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000935 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000936 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000937 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000938 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000939}
940
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000941/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
942int
943_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, long *phash)
944{
945 register Py_ssize_t i;
946 register Py_ssize_t mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000947 register PyDictEntry *ep;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000948
949 if (!PyDict_Check(op))
950 return 0;
951 i = *ppos;
952 if (i < 0)
953 return 0;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000954 ep = ((PyDictObject *)op)->ma_table;
955 mask = ((PyDictObject *)op)->ma_mask;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000956 while (i <= mask && ep[i].me_value == NULL)
957 i++;
958 *ppos = i+1;
959 if (i > mask)
960 return 0;
961 *phash = (long)(ep[i].me_hash);
962 if (pkey)
963 *pkey = ep[i].me_key;
964 if (pvalue)
965 *pvalue = ep[i].me_value;
966 return 1;
967}
968
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000969/* Methods */
970
971static void
Brett Cannon77ae87c2007-10-10 00:07:50 +0000972dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000973{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000974 register PyDictEntry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000975 Py_ssize_t fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000976 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000977 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000978 for (ep = mp->ma_table; fill > 0; ep++) {
979 if (ep->me_key) {
980 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000982 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000983 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000984 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000985 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000986 PyMem_DEL(mp->ma_table);
Christian Heimes5b970ad2008-02-06 13:33:44 +0000987 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
988 free_list[numfree++] = mp;
Tim Peters60b29962006-01-01 01:19:23 +0000989 else
Christian Heimese93237d2007-12-19 02:37:44 +0000990 Py_TYPE(mp)->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000991 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000992}
993
994static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000995dict_print(register PyDictObject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000996{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000997 register Py_ssize_t i;
998 register Py_ssize_t any;
Tim Peters33f4a6a2006-05-30 05:23:59 +0000999 int status;
Guido van Rossum255443b1998-04-10 22:47:14 +00001000
Tim Peters33f4a6a2006-05-30 05:23:59 +00001001 status = Py_ReprEnter((PyObject*)mp);
1002 if (status != 0) {
1003 if (status < 0)
1004 return status;
Brett Cannon01531592007-09-17 03:28:34 +00001005 Py_BEGIN_ALLOW_THREADS
Guido van Rossum255443b1998-04-10 22:47:14 +00001006 fprintf(fp, "{...}");
Brett Cannon01531592007-09-17 03:28:34 +00001007 Py_END_ALLOW_THREADS
Guido van Rossum255443b1998-04-10 22:47:14 +00001008 return 0;
1009 }
1010
Brett Cannon01531592007-09-17 03:28:34 +00001011 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001012 fprintf(fp, "{");
Brett Cannon01531592007-09-17 03:28:34 +00001013 Py_END_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001014 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +00001015 for (i = 0; i <= mp->ma_mask; i++) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001016 PyDictEntry *ep = mp->ma_table + i;
Tim Peters23cf6be2001-06-02 08:02:56 +00001017 PyObject *pvalue = ep->me_value;
1018 if (pvalue != NULL) {
1019 /* Prevent PyObject_Repr from deleting value during
1020 key format */
1021 Py_INCREF(pvalue);
Brett Cannon01531592007-09-17 03:28:34 +00001022 if (any++ > 0) {
1023 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001024 fprintf(fp, ", ");
Brett Cannon01531592007-09-17 03:28:34 +00001025 Py_END_ALLOW_THREADS
1026 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001027 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +00001028 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +00001029 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001030 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +00001031 }
Brett Cannon01531592007-09-17 03:28:34 +00001032 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001033 fprintf(fp, ": ");
Brett Cannon01531592007-09-17 03:28:34 +00001034 Py_END_ALLOW_THREADS
Tim Peters19b77cf2001-06-02 08:27:39 +00001035 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +00001036 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +00001037 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001038 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +00001039 }
Tim Peters23cf6be2001-06-02 08:02:56 +00001040 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001041 }
1042 }
Brett Cannon01531592007-09-17 03:28:34 +00001043 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001044 fprintf(fp, "}");
Brett Cannon01531592007-09-17 03:28:34 +00001045 Py_END_ALLOW_THREADS
Guido van Rossum255443b1998-04-10 22:47:14 +00001046 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001047 return 0;
1048}
1049
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001051dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001052{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001053 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +00001054 PyObject *s, *temp, *colon = NULL;
1055 PyObject *pieces = NULL, *result = NULL;
1056 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001057
Tim Petersa7259592001-06-16 05:11:17 +00001058 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +00001059 if (i != 0) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001060 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +00001061 }
1062
Tim Petersa7259592001-06-16 05:11:17 +00001063 if (mp->ma_used == 0) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001064 result = PyString_FromString("{}");
Tim Petersa7259592001-06-16 05:11:17 +00001065 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001066 }
Tim Petersa7259592001-06-16 05:11:17 +00001067
1068 pieces = PyList_New(0);
1069 if (pieces == NULL)
1070 goto Done;
1071
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001072 colon = PyString_FromString(": ");
Tim Petersa7259592001-06-16 05:11:17 +00001073 if (colon == NULL)
1074 goto Done;
1075
1076 /* Do repr() on each key+value pair, and insert ": " between them.
1077 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +00001078 i = 0;
1079 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +00001080 int status;
1081 /* Prevent repr from deleting value during key format. */
1082 Py_INCREF(value);
1083 s = PyObject_Repr(key);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001084 PyString_Concat(&s, colon);
1085 PyString_ConcatAndDel(&s, PyObject_Repr(value));
Tim Petersa7259592001-06-16 05:11:17 +00001086 Py_DECREF(value);
1087 if (s == NULL)
1088 goto Done;
1089 status = PyList_Append(pieces, s);
1090 Py_DECREF(s); /* append created a new ref */
1091 if (status < 0)
1092 goto Done;
1093 }
1094
1095 /* Add "{}" decorations to the first and last items. */
1096 assert(PyList_GET_SIZE(pieces) > 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001097 s = PyString_FromString("{");
Tim Petersa7259592001-06-16 05:11:17 +00001098 if (s == NULL)
1099 goto Done;
1100 temp = PyList_GET_ITEM(pieces, 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001101 PyString_ConcatAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +00001102 PyList_SET_ITEM(pieces, 0, s);
1103 if (s == NULL)
1104 goto Done;
1105
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001106 s = PyString_FromString("}");
Tim Petersa7259592001-06-16 05:11:17 +00001107 if (s == NULL)
1108 goto Done;
1109 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001110 PyString_ConcatAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +00001111 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1112 if (temp == NULL)
1113 goto Done;
1114
1115 /* Paste them all together with ", " between. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001116 s = PyString_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +00001117 if (s == NULL)
1118 goto Done;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001119 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +00001120 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001121
1122Done:
1123 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001124 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +00001125 Py_ReprLeave((PyObject *)mp);
1126 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001127}
1128
Martin v. Löwis18e16552006-02-15 17:27:45 +00001129static Py_ssize_t
Brett Cannon77ae87c2007-10-10 00:07:50 +00001130dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001131{
1132 return mp->ma_used;
1133}
1134
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001136dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001137{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001139 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001140 PyDictEntry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +00001141 assert(mp->ma_table != NULL);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001142 if (!PyString_CheckExact(key) ||
1143 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001144 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001145 if (hash == -1)
1146 return NULL;
1147 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001148 ep = (mp->ma_lookup)(mp, key, hash);
1149 if (ep == NULL)
1150 return NULL;
1151 v = ep->me_value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001152 if (v == NULL) {
1153 if (!PyDict_CheckExact(mp)) {
1154 /* Look up __missing__ method if we're a subclass. */
Guido van Rossum4b92a822006-02-25 23:32:30 +00001155 PyObject *missing;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001156 static PyObject *missing_str = NULL;
1157 if (missing_str == NULL)
Tim Peters9b10f7e2006-05-30 04:16:25 +00001158 missing_str =
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001159 PyString_InternFromString("__missing__");
Christian Heimese93237d2007-12-19 02:37:44 +00001160 missing = _PyType_Lookup(Py_TYPE(mp), missing_str);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001161 if (missing != NULL)
1162 return PyObject_CallFunctionObjArgs(missing,
1163 (PyObject *)mp, key, NULL);
1164 }
Georg Brandlb9f4ad32006-10-29 18:31:42 +00001165 set_key_error(key);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001166 return NULL;
1167 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001168 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001169 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001170 return v;
1171}
1172
1173static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001174dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001175{
1176 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001177 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001178 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001179 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001180}
1181
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001182static PyMappingMethods dict_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001183 (lenfunc)dict_length, /*mp_length*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001184 (binaryfunc)dict_subscript, /*mp_subscript*/
1185 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001186};
1187
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001188static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001189dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001190{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001192 register Py_ssize_t i, j;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001193 PyDictEntry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001194 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001195
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001196 again:
1197 n = mp->ma_used;
1198 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001199 if (v == NULL)
1200 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001201 if (n != mp->ma_used) {
1202 /* Durnit. The allocations caused the dict to resize.
1203 * Just start over, this shouldn't normally happen.
1204 */
1205 Py_DECREF(v);
1206 goto again;
1207 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001208 ep = mp->ma_table;
1209 mask = mp->ma_mask;
1210 for (i = 0, j = 0; i <= mask; i++) {
1211 if (ep[i].me_value != NULL) {
1212 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001214 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001215 j++;
1216 }
1217 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001218 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001219 return v;
1220}
1221
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001222static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001223dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001224{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001225 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001226 register Py_ssize_t i, j;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001227 PyDictEntry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001228 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001229
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001230 again:
1231 n = mp->ma_used;
1232 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001233 if (v == NULL)
1234 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001235 if (n != mp->ma_used) {
1236 /* Durnit. The allocations caused the dict to resize.
1237 * Just start over, this shouldn't normally happen.
1238 */
1239 Py_DECREF(v);
1240 goto again;
1241 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001242 ep = mp->ma_table;
1243 mask = mp->ma_mask;
1244 for (i = 0, j = 0; i <= mask; i++) {
1245 if (ep[i].me_value != NULL) {
1246 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001247 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001248 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001249 j++;
1250 }
1251 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001252 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001253 return v;
1254}
1255
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001257dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001258{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001260 register Py_ssize_t i, j, n;
1261 Py_ssize_t mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001262 PyObject *item, *key, *value;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001263 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001264
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001265 /* Preallocate the list of tuples, to avoid allocations during
1266 * the loop over the items, which could trigger GC, which
1267 * could resize the dict. :-(
1268 */
1269 again:
1270 n = mp->ma_used;
1271 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001272 if (v == NULL)
1273 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001274 for (i = 0; i < n; i++) {
1275 item = PyTuple_New(2);
1276 if (item == NULL) {
1277 Py_DECREF(v);
1278 return NULL;
1279 }
1280 PyList_SET_ITEM(v, i, item);
1281 }
1282 if (n != mp->ma_used) {
1283 /* Durnit. The allocations caused the dict to resize.
1284 * Just start over, this shouldn't normally happen.
1285 */
1286 Py_DECREF(v);
1287 goto again;
1288 }
1289 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001290 ep = mp->ma_table;
1291 mask = mp->ma_mask;
1292 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001293 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001294 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001295 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001296 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001297 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001299 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001300 j++;
1301 }
1302 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001303 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001304 return v;
1305}
1306
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001307static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001308dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001309{
1310 PyObject *seq;
1311 PyObject *value = Py_None;
1312 PyObject *it; /* iter(seq) */
1313 PyObject *key;
1314 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001315 int status;
1316
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001317 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001318 return NULL;
1319
1320 d = PyObject_CallObject(cls, NULL);
1321 if (d == NULL)
1322 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001323
Raymond Hettingercdcf8872007-11-07 02:26:17 +00001324 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1325 PyDictObject *mp = (PyDictObject *)d;
1326 PyObject *oldvalue;
1327 Py_ssize_t pos = 0;
1328 PyObject *key;
1329 long hash;
1330
Raymond Hettingera27474c2008-06-28 22:16:53 +00001331 if (dictresize(mp, Py_SIZE(seq)))
Raymond Hettingercdcf8872007-11-07 02:26:17 +00001332 return NULL;
1333
1334 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1335 Py_INCREF(key);
1336 Py_INCREF(value);
1337 if (insertdict(mp, key, hash, value))
1338 return NULL;
1339 }
1340 return d;
1341 }
1342
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001343 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001344 PyDictObject *mp = (PyDictObject *)d;
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001345 Py_ssize_t pos = 0;
1346 PyObject *key;
1347 long hash;
1348
1349 if (dictresize(mp, PySet_GET_SIZE(seq)))
1350 return NULL;
1351
1352 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1353 Py_INCREF(key);
Raymond Hettingere3146f52007-03-21 20:33:57 +00001354 Py_INCREF(value);
1355 if (insertdict(mp, key, hash, value))
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001356 return NULL;
1357 }
1358 return d;
1359 }
1360
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001361 it = PyObject_GetIter(seq);
1362 if (it == NULL){
1363 Py_DECREF(d);
1364 return NULL;
1365 }
1366
Raymond Hettinger34448792007-11-09 23:14:44 +00001367 if (PyDict_CheckExact(d)) {
1368 while ((key = PyIter_Next(it)) != NULL) {
1369 status = PyDict_SetItem(d, key, value);
1370 Py_DECREF(key);
1371 if (status < 0)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001372 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001373 }
Raymond Hettinger34448792007-11-09 23:14:44 +00001374 } else {
1375 while ((key = PyIter_Next(it)) != NULL) {
1376 status = PyObject_SetItem(d, key, value);
1377 Py_DECREF(key);
1378 if (status < 0)
1379 goto Fail;
1380 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001381 }
1382
Raymond Hettinger34448792007-11-09 23:14:44 +00001383 if (PyErr_Occurred())
1384 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001385 Py_DECREF(it);
1386 return d;
1387
1388Fail:
1389 Py_DECREF(it);
1390 Py_DECREF(d);
1391 return NULL;
1392}
1393
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001394static int
1395dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001396{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001397 PyObject *arg = NULL;
1398 int result = 0;
1399
1400 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1401 result = -1;
1402
1403 else if (arg != NULL) {
1404 if (PyObject_HasAttrString(arg, "keys"))
1405 result = PyDict_Merge(self, arg, 1);
1406 else
1407 result = PyDict_MergeFromSeq2(self, arg, 1);
1408 }
1409 if (result == 0 && kwds != NULL)
1410 result = PyDict_Merge(self, kwds, 1);
1411 return result;
1412}
1413
1414static PyObject *
1415dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1416{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001417 if (dict_update_common(self, args, kwds, "update") != -1)
1418 Py_RETURN_NONE;
1419 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001420}
1421
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001422/* Update unconditionally replaces existing items.
1423 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001424 otherwise it leaves existing items unchanged.
1425
1426 PyDict_{Update,Merge} update/merge from a mapping object.
1427
Tim Petersf582b822001-12-11 18:51:08 +00001428 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001429 producing iterable objects of length 2.
1430*/
1431
Tim Petersf582b822001-12-11 18:51:08 +00001432int
Tim Peters1fc240e2001-10-26 05:06:50 +00001433PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1434{
1435 PyObject *it; /* iter(seq2) */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001436 Py_ssize_t i; /* index into seq2 of current element */
Tim Peters1fc240e2001-10-26 05:06:50 +00001437 PyObject *item; /* seq2[i] */
1438 PyObject *fast; /* item as a 2-tuple or 2-list */
1439
1440 assert(d != NULL);
1441 assert(PyDict_Check(d));
1442 assert(seq2 != NULL);
1443
1444 it = PyObject_GetIter(seq2);
1445 if (it == NULL)
1446 return -1;
1447
1448 for (i = 0; ; ++i) {
1449 PyObject *key, *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001450 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001451
1452 fast = NULL;
1453 item = PyIter_Next(it);
1454 if (item == NULL) {
1455 if (PyErr_Occurred())
1456 goto Fail;
1457 break;
1458 }
1459
1460 /* Convert item to sequence, and verify length 2. */
1461 fast = PySequence_Fast(item, "");
1462 if (fast == NULL) {
1463 if (PyErr_ExceptionMatches(PyExc_TypeError))
1464 PyErr_Format(PyExc_TypeError,
1465 "cannot convert dictionary update "
Neal Norwitzd3881b02006-05-30 04:25:05 +00001466 "sequence element #%zd to a sequence",
Tim Peters1fc240e2001-10-26 05:06:50 +00001467 i);
1468 goto Fail;
1469 }
1470 n = PySequence_Fast_GET_SIZE(fast);
1471 if (n != 2) {
1472 PyErr_Format(PyExc_ValueError,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001473 "dictionary update sequence element #%zd "
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00001474 "has length %zd; 2 is required",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00001475 i, n);
Tim Peters1fc240e2001-10-26 05:06:50 +00001476 goto Fail;
1477 }
1478
1479 /* Update/merge with this (key, value) pair. */
1480 key = PySequence_Fast_GET_ITEM(fast, 0);
1481 value = PySequence_Fast_GET_ITEM(fast, 1);
1482 if (override || PyDict_GetItem(d, key) == NULL) {
1483 int status = PyDict_SetItem(d, key, value);
1484 if (status < 0)
1485 goto Fail;
1486 }
1487 Py_DECREF(fast);
1488 Py_DECREF(item);
1489 }
1490
1491 i = 0;
1492 goto Return;
1493Fail:
1494 Py_XDECREF(item);
1495 Py_XDECREF(fast);
1496 i = -1;
1497Return:
1498 Py_DECREF(it);
Neal Norwitzd3881b02006-05-30 04:25:05 +00001499 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001500}
1501
Tim Peters6d6c1a32001-08-02 04:15:00 +00001502int
1503PyDict_Update(PyObject *a, PyObject *b)
1504{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001505 return PyDict_Merge(a, b, 1);
1506}
1507
1508int
1509PyDict_Merge(PyObject *a, PyObject *b, int override)
1510{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001511 register PyDictObject *mp, *other;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001512 register Py_ssize_t i;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001513 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001514
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001515 /* We accept for the argument either a concrete dictionary object,
1516 * or an abstract "mapping" object. For the former, we can do
1517 * things quite efficiently. For the latter, we only require that
1518 * PyMapping_Keys() and PyObject_GetItem() be supported.
1519 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001520 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1521 PyErr_BadInternalCall();
1522 return -1;
1523 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001524 mp = (PyDictObject*)a;
Raymond Hettinger3dbd4c52008-01-25 19:24:46 +00001525 if (PyDict_Check(b)) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001526 other = (PyDictObject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001527 if (other == mp || other->ma_used == 0)
1528 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001529 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001530 if (mp->ma_used == 0)
1531 /* Since the target dict is empty, PyDict_GetItem()
1532 * always returns NULL. Setting override to 1
1533 * skips the unnecessary test.
1534 */
1535 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001536 /* Do one big resize at the start, rather than
1537 * incrementally resizing as we insert new items. Expect
1538 * that there will be no (or few) overlapping keys.
1539 */
1540 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001541 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001542 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001543 }
1544 for (i = 0; i <= other->ma_mask; i++) {
1545 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001546 if (entry->me_value != NULL &&
1547 (override ||
1548 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001549 Py_INCREF(entry->me_key);
1550 Py_INCREF(entry->me_value);
Armin Rigo35f6d362006-06-01 13:19:12 +00001551 if (insertdict(mp, entry->me_key,
1552 (long)entry->me_hash,
1553 entry->me_value) != 0)
1554 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001555 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001556 }
1557 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001558 else {
1559 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001560 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001561 PyObject *iter;
1562 PyObject *key, *value;
1563 int status;
1564
1565 if (keys == NULL)
1566 /* Docstring says this is equivalent to E.keys() so
1567 * if E doesn't have a .keys() method we want
1568 * AttributeError to percolate up. Might as well
1569 * do the same for any other error.
1570 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001571 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001572
1573 iter = PyObject_GetIter(keys);
1574 Py_DECREF(keys);
1575 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001576 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001577
1578 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001579 if (!override && PyDict_GetItem(a, key) != NULL) {
1580 Py_DECREF(key);
1581 continue;
1582 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001583 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001584 if (value == NULL) {
1585 Py_DECREF(iter);
1586 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001587 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001588 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001589 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001590 Py_DECREF(key);
1591 Py_DECREF(value);
1592 if (status < 0) {
1593 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001594 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001595 }
1596 }
1597 Py_DECREF(iter);
1598 if (PyErr_Occurred())
1599 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001600 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001601 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001602 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001603}
1604
1605static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001606dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001607{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001608 return PyDict_Copy((PyObject*)mp);
1609}
1610
1611PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001612PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001613{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001614 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001615
1616 if (o == NULL || !PyDict_Check(o)) {
1617 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001618 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001619 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001620 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001621 if (copy == NULL)
1622 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001623 if (PyDict_Merge(copy, o, 1) == 0)
1624 return copy;
1625 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001626 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001627}
1628
Martin v. Löwis18e16552006-02-15 17:27:45 +00001629Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001630PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001631{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632 if (mp == NULL || !PyDict_Check(mp)) {
1633 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001634 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001635 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001636 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001637}
1638
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001640PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001641{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001642 if (mp == NULL || !PyDict_Check(mp)) {
1643 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001644 return NULL;
1645 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001646 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001647}
1648
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001650PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001651{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001652 if (mp == NULL || !PyDict_Check(mp)) {
1653 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001654 return NULL;
1655 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001656 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001657}
1658
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001660PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001661{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001662 if (mp == NULL || !PyDict_Check(mp)) {
1663 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001664 return NULL;
1665 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001666 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001667}
1668
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001669/* Subroutine which returns the smallest key in a for which b's value
1670 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001671 pval argument. Both are NULL if no key in a is found for which b's status
1672 differs. The refcounts on (and only on) non-NULL *pval and function return
1673 values must be decremented by the caller (characterize() increments them
1674 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1675 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001676
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001677static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001678characterize(PyDictObject *a, PyDictObject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001679{
Tim Peters95bf9392001-05-10 08:32:44 +00001680 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1681 PyObject *aval = NULL; /* a[akey] */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001682 Py_ssize_t i;
1683 int cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001684
Tim Petersafb6ae82001-06-04 21:00:21 +00001685 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001686 PyObject *thiskey, *thisaval, *thisbval;
1687 if (a->ma_table[i].me_value == NULL)
1688 continue;
1689 thiskey = a->ma_table[i].me_key;
1690 Py_INCREF(thiskey); /* keep alive across compares */
1691 if (akey != NULL) {
1692 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1693 if (cmp < 0) {
1694 Py_DECREF(thiskey);
1695 goto Fail;
1696 }
1697 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001698 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001699 a->ma_table[i].me_value == NULL)
1700 {
1701 /* Not the *smallest* a key; or maybe it is
1702 * but the compare shrunk the dict so we can't
1703 * find its associated value anymore; or
1704 * maybe it is but the compare deleted the
1705 * a[thiskey] entry.
Neal Norwitzd3881b02006-05-30 04:25:05 +00001706 */
Tim Peters95bf9392001-05-10 08:32:44 +00001707 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001708 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001709 }
Tim Peters95bf9392001-05-10 08:32:44 +00001710 }
1711
1712 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1713 thisaval = a->ma_table[i].me_value;
1714 assert(thisaval);
1715 Py_INCREF(thisaval); /* keep alive */
1716 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1717 if (thisbval == NULL)
1718 cmp = 0;
1719 else {
1720 /* both dicts have thiskey: same values? */
1721 cmp = PyObject_RichCompareBool(
1722 thisaval, thisbval, Py_EQ);
1723 if (cmp < 0) {
1724 Py_DECREF(thiskey);
1725 Py_DECREF(thisaval);
1726 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001727 }
1728 }
Tim Peters95bf9392001-05-10 08:32:44 +00001729 if (cmp == 0) {
1730 /* New winner. */
1731 Py_XDECREF(akey);
1732 Py_XDECREF(aval);
1733 akey = thiskey;
1734 aval = thisaval;
1735 }
1736 else {
1737 Py_DECREF(thiskey);
1738 Py_DECREF(thisaval);
1739 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001740 }
Tim Peters95bf9392001-05-10 08:32:44 +00001741 *pval = aval;
1742 return akey;
1743
1744Fail:
1745 Py_XDECREF(akey);
1746 Py_XDECREF(aval);
1747 *pval = NULL;
1748 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001749}
1750
1751static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001752dict_compare(PyDictObject *a, PyDictObject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001753{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001754 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001755 int res;
1756
1757 /* Compare lengths first */
1758 if (a->ma_used < b->ma_used)
1759 return -1; /* a is shorter */
1760 else if (a->ma_used > b->ma_used)
1761 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001762
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001763 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001764 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001765 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001766 if (adiff == NULL) {
1767 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001768 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001769 * must be equal.
1770 */
1771 res = PyErr_Occurred() ? -1 : 0;
1772 goto Finished;
1773 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001774 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001775 if (bdiff == NULL && PyErr_Occurred()) {
1776 assert(!bval);
1777 res = -1;
1778 goto Finished;
1779 }
1780 res = 0;
1781 if (bdiff) {
1782 /* bdiff == NULL "should be" impossible now, but perhaps
1783 * the last comparison done by the characterize() on a had
1784 * the side effect of making the dicts equal!
1785 */
1786 res = PyObject_Compare(adiff, bdiff);
1787 }
1788 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001789 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001790
1791Finished:
1792 Py_XDECREF(adiff);
1793 Py_XDECREF(bdiff);
1794 Py_XDECREF(aval);
1795 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001796 return res;
1797}
1798
Tim Peterse63415e2001-05-08 04:38:29 +00001799/* Return 1 if dicts equal, 0 if not, -1 if error.
1800 * Gets out as soon as any difference is detected.
1801 * Uses only Py_EQ comparison.
1802 */
1803static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001804dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001805{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001806 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001807
1808 if (a->ma_used != b->ma_used)
1809 /* can't be equal if # of entries differ */
1810 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001811
Tim Peterse63415e2001-05-08 04:38:29 +00001812 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001813 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001814 PyObject *aval = a->ma_table[i].me_value;
1815 if (aval != NULL) {
1816 int cmp;
1817 PyObject *bval;
1818 PyObject *key = a->ma_table[i].me_key;
1819 /* temporarily bump aval's refcount to ensure it stays
1820 alive until we're done with it */
1821 Py_INCREF(aval);
Neal Norwitza22975f2006-09-05 02:24:03 +00001822 /* ditto for key */
1823 Py_INCREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001824 bval = PyDict_GetItem((PyObject *)b, key);
Neal Norwitza22975f2006-09-05 02:24:03 +00001825 Py_DECREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001826 if (bval == NULL) {
1827 Py_DECREF(aval);
1828 return 0;
1829 }
1830 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1831 Py_DECREF(aval);
1832 if (cmp <= 0) /* error or not equal */
1833 return cmp;
1834 }
1835 }
1836 return 1;
1837 }
1838
1839static PyObject *
1840dict_richcompare(PyObject *v, PyObject *w, int op)
1841{
1842 int cmp;
1843 PyObject *res;
1844
1845 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1846 res = Py_NotImplemented;
1847 }
1848 else if (op == Py_EQ || op == Py_NE) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001849 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
Tim Peterse63415e2001-05-08 04:38:29 +00001850 if (cmp < 0)
1851 return NULL;
1852 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1853 }
Steven Bethardae42f332008-03-18 17:26:10 +00001854 else {
1855 /* Py3K warning if comparison isn't == or != */
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001856 if (PyErr_WarnPy3k("dict inequality comparisons not supported "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001857 "in 3.x", 1) < 0) {
Steven Bethardae42f332008-03-18 17:26:10 +00001858 return NULL;
1859 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001860 res = Py_NotImplemented;
Steven Bethardae42f332008-03-18 17:26:10 +00001861 }
Tim Peterse63415e2001-05-08 04:38:29 +00001862 Py_INCREF(res);
1863 return res;
1864 }
1865
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001866static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001867dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001868{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001869 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001870 PyDictEntry *ep;
Tim Petersd770ebd2006-06-01 15:50:44 +00001871
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001872 if (!PyString_CheckExact(key) ||
1873 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001874 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001875 if (hash == -1)
1876 return NULL;
1877 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001878 ep = (mp->ma_lookup)(mp, key, hash);
1879 if (ep == NULL)
1880 return NULL;
Tim Petersd770ebd2006-06-01 15:50:44 +00001881 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001882}
1883
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001884static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001885dict_has_key(register PyDictObject *mp, PyObject *key)
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +00001886{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001887 if (PyErr_WarnPy3k("dict.has_key() not supported in 3.x; "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001888 "use the in operator", 1) < 0)
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +00001889 return NULL;
1890 return dict_contains(mp, key);
1891}
1892
1893static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001894dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001895{
1896 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001897 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001898 PyObject *val = NULL;
1899 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001900 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001901
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001902 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001903 return NULL;
1904
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001905 if (!PyString_CheckExact(key) ||
1906 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001907 hash = PyObject_Hash(key);
1908 if (hash == -1)
1909 return NULL;
1910 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001911 ep = (mp->ma_lookup)(mp, key, hash);
1912 if (ep == NULL)
1913 return NULL;
1914 val = ep->me_value;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001915 if (val == NULL)
1916 val = failobj;
1917 Py_INCREF(val);
1918 return val;
1919}
1920
1921
1922static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001923dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001924{
1925 PyObject *key;
1926 PyObject *failobj = Py_None;
1927 PyObject *val = NULL;
1928 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001929 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001930
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001931 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001932 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001933
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001934 if (!PyString_CheckExact(key) ||
1935 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001936 hash = PyObject_Hash(key);
1937 if (hash == -1)
1938 return NULL;
1939 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001940 ep = (mp->ma_lookup)(mp, key, hash);
1941 if (ep == NULL)
1942 return NULL;
1943 val = ep->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001944 if (val == NULL) {
1945 val = failobj;
1946 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1947 val = NULL;
1948 }
1949 Py_XINCREF(val);
1950 return val;
1951}
1952
1953
1954static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001955dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001956{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001957 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001958 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001959}
1960
Guido van Rossumba6ab842000-12-12 22:02:18 +00001961static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001962dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001963{
1964 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001965 PyDictEntry *ep;
Guido van Rossume027d982002-04-12 15:11:59 +00001966 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001967 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001968
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001969 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1970 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001971 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001972 if (deflt) {
1973 Py_INCREF(deflt);
1974 return deflt;
1975 }
Guido van Rossume027d982002-04-12 15:11:59 +00001976 PyErr_SetString(PyExc_KeyError,
1977 "pop(): dictionary is empty");
1978 return NULL;
1979 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001980 if (!PyString_CheckExact(key) ||
1981 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossume027d982002-04-12 15:11:59 +00001982 hash = PyObject_Hash(key);
1983 if (hash == -1)
1984 return NULL;
1985 }
1986 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +00001987 if (ep == NULL)
1988 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001989 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001990 if (deflt) {
1991 Py_INCREF(deflt);
1992 return deflt;
1993 }
Georg Brandlb9f4ad32006-10-29 18:31:42 +00001994 set_key_error(key);
Guido van Rossume027d982002-04-12 15:11:59 +00001995 return NULL;
1996 }
1997 old_key = ep->me_key;
1998 Py_INCREF(dummy);
1999 ep->me_key = dummy;
2000 old_value = ep->me_value;
2001 ep->me_value = NULL;
2002 mp->ma_used--;
2003 Py_DECREF(old_key);
2004 return old_value;
2005}
2006
2007static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002008dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002009{
Tim Peters9b10f7e2006-05-30 04:16:25 +00002010 Py_ssize_t i = 0;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002011 PyDictEntry *ep;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002012 PyObject *res;
2013
Tim Petersf4b33f62001-06-02 05:42:29 +00002014 /* Allocate the result tuple before checking the size. Believe it
2015 * or not, this allocation could trigger a garbage collection which
2016 * could empty the dict, so if we checked the size first and that
2017 * happened, the result would be an infinite loop (searching for an
2018 * entry that no longer exists). Note that the usual popitem()
2019 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Tim Peters9b10f7e2006-05-30 04:16:25 +00002020 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00002021 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002022 */
2023 res = PyTuple_New(2);
2024 if (res == NULL)
2025 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00002026 if (mp->ma_used == 0) {
2027 Py_DECREF(res);
2028 PyErr_SetString(PyExc_KeyError,
2029 "popitem(): dictionary is empty");
2030 return NULL;
2031 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00002032 /* Set ep to "the first" dict entry with a value. We abuse the hash
2033 * field of slot 0 to hold a search finger:
2034 * If slot 0 has a value, use slot 0.
2035 * Else slot 0 is being used to hold a search finger,
Neal Norwitzd3881b02006-05-30 04:25:05 +00002036 * and we use its hash value as the first index to look.
Guido van Rossumba6ab842000-12-12 22:02:18 +00002037 */
2038 ep = &mp->ma_table[0];
2039 if (ep->me_value == NULL) {
Tim Peters9b10f7e2006-05-30 04:16:25 +00002040 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00002041 /* The hash field may be a real hash value, or it may be a
2042 * legit search finger, or it may be a once-legit search
2043 * finger that's out of bounds now because it wrapped around
2044 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00002045 */
Tim Petersafb6ae82001-06-04 21:00:21 +00002046 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002047 i = 1; /* skip slot 0 */
2048 while ((ep = &mp->ma_table[i])->me_value == NULL) {
2049 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00002050 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002051 i = 1;
2052 }
2053 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002054 PyTuple_SET_ITEM(res, 0, ep->me_key);
2055 PyTuple_SET_ITEM(res, 1, ep->me_value);
2056 Py_INCREF(dummy);
2057 ep->me_key = dummy;
2058 ep->me_value = NULL;
2059 mp->ma_used--;
2060 assert(mp->ma_table[0].me_value == NULL);
2061 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00002062 return res;
2063}
2064
Jeremy Hylton8caad492000-06-23 14:18:11 +00002065static int
2066dict_traverse(PyObject *op, visitproc visit, void *arg)
2067{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002068 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002069 PyObject *pk;
2070 PyObject *pv;
2071
2072 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Woutersc6e55062006-04-15 21:47:09 +00002073 Py_VISIT(pk);
2074 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002075 }
2076 return 0;
2077}
2078
2079static int
2080dict_tp_clear(PyObject *op)
2081{
2082 PyDict_Clear(op);
2083 return 0;
2084}
2085
Tim Petersf7f88b12000-12-13 23:18:45 +00002086
Raymond Hettinger019a1482004-03-18 02:41:19 +00002087extern PyTypeObject PyDictIterKey_Type; /* Forward */
2088extern PyTypeObject PyDictIterValue_Type; /* Forward */
2089extern PyTypeObject PyDictIterItem_Type; /* Forward */
Brett Cannon77ae87c2007-10-10 00:07:50 +00002090static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002091
2092static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002093dict_iterkeys(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002094{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002095 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002096}
2097
2098static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002099dict_itervalues(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002100{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002101 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002102}
2103
2104static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002105dict_iteritems(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002106{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002107 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002108}
2109
Robert Schuppenies51df0642008-06-01 16:16:17 +00002110static PyObject *
2111dict_sizeof(PyDictObject *mp)
2112{
2113 Py_ssize_t res;
2114
Robert Schuppenies161b9212008-06-26 15:20:35 +00002115 res = sizeof(PyDictObject);
Robert Schuppenies51df0642008-06-01 16:16:17 +00002116 if (mp->ma_table != mp->ma_smalltable)
2117 res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry);
2118 return PyInt_FromSsize_t(res);
2119}
Guido van Rossum09e563a2001-05-01 12:10:21 +00002120
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002121PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00002122"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00002123
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002124PyDoc_STRVAR(contains__doc__,
2125"D.__contains__(k) -> True if D has a key k, else False");
2126
2127PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2128
Robert Schuppenies51df0642008-06-01 16:16:17 +00002129PyDoc_STRVAR(sizeof__doc__,
Georg Brandl7a6de8b2008-06-01 16:42:16 +00002130"D.__sizeof__() -> size of D in memory, in bytes");
Robert Schuppenies51df0642008-06-01 16:16:17 +00002131
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002132PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002133"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002134
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002135PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002136"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 +00002137
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002138PyDoc_STRVAR(pop__doc__,
Andrew M. Kuchlinga4127172008-10-04 21:51:59 +00002139"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002140If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002141
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002142PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002143"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Andrew M. Kuchlinga4127172008-10-04 21:51:59 +000021442-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002145
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002146PyDoc_STRVAR(keys__doc__,
2147"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00002148
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002149PyDoc_STRVAR(items__doc__,
2150"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00002151
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002152PyDoc_STRVAR(values__doc__,
2153"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00002154
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002155PyDoc_STRVAR(update__doc__,
Andrew M. Kuchlinga4127172008-10-04 21:51:59 +00002156"D.update(E, **F) -> None. Update D from dict/iterable E and F.\n"
2157"If E has a .keys() method, does: for k in E: D[k] = E[k]\n\
2158If E lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
2159In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002160
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002161PyDoc_STRVAR(fromkeys__doc__,
2162"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
2163v defaults to None.");
2164
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002165PyDoc_STRVAR(clear__doc__,
2166"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002167
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002168PyDoc_STRVAR(copy__doc__,
2169"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002170
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002171PyDoc_STRVAR(iterkeys__doc__,
2172"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002173
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002174PyDoc_STRVAR(itervalues__doc__,
2175"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002176
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002177PyDoc_STRVAR(iteritems__doc__,
2178"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002179
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002180static PyMethodDef mapp_methods[] = {
Neal Norwitzc7926292007-05-23 06:57:35 +00002181 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002182 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00002183 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002184 getitem__doc__},
Robert Schuppenies51df0642008-06-01 16:16:17 +00002185 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2186 sizeof__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002187 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00002188 has_key__doc__},
2189 {"get", (PyCFunction)dict_get, METH_VARARGS,
2190 get__doc__},
2191 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2192 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002193 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00002194 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002195 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002196 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002197 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002198 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002199 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002200 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002201 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002202 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002203 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002204 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002205 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2206 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002207 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002208 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002209 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002210 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002211 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002212 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002213 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002214 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002215 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002216 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00002217 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002218};
2219
Tim Petersd770ebd2006-06-01 15:50:44 +00002220/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002221int
2222PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002223{
2224 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002225 PyDictObject *mp = (PyDictObject *)op;
2226 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002227
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002228 if (!PyString_CheckExact(key) ||
2229 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002230 hash = PyObject_Hash(key);
2231 if (hash == -1)
2232 return -1;
2233 }
Armin Rigo35f6d362006-06-01 13:19:12 +00002234 ep = (mp->ma_lookup)(mp, key, hash);
Tim Petersd770ebd2006-06-01 15:50:44 +00002235 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002236}
2237
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00002238/* Internal version of PyDict_Contains used when the hash value is already known */
2239int
2240_PyDict_Contains(PyObject *op, PyObject *key, long hash)
2241{
Brett Cannon77ae87c2007-10-10 00:07:50 +00002242 PyDictObject *mp = (PyDictObject *)op;
2243 PyDictEntry *ep;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00002244
2245 ep = (mp->ma_lookup)(mp, key, hash);
2246 return ep == NULL ? -1 : (ep->me_value != NULL);
2247}
2248
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002249/* Hack to implement "key in dict" */
2250static PySequenceMethods dict_as_sequence = {
Georg Brandl347b3002006-03-30 11:57:00 +00002251 0, /* sq_length */
2252 0, /* sq_concat */
2253 0, /* sq_repeat */
2254 0, /* sq_item */
2255 0, /* sq_slice */
2256 0, /* sq_ass_item */
2257 0, /* sq_ass_slice */
2258 PyDict_Contains, /* sq_contains */
2259 0, /* sq_inplace_concat */
2260 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002261};
2262
Guido van Rossum09e563a2001-05-01 12:10:21 +00002263static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002264dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2265{
2266 PyObject *self;
2267
2268 assert(type != NULL && type->tp_alloc != NULL);
2269 self = type->tp_alloc(type, 0);
2270 if (self != NULL) {
2271 PyDictObject *d = (PyDictObject *)self;
2272 /* It's guaranteed that tp->alloc zeroed out the struct. */
2273 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2274 INIT_NONZERO_DICT_SLOTS(d);
2275 d->ma_lookup = lookdict_string;
Antoine Pitrouf8387af2009-03-23 18:41:45 +00002276 /* The object has been implicitely tracked by tp_alloc */
2277 if (type == &PyDict_Type)
2278 _PyObject_GC_UNTRACK(d);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002279#ifdef SHOW_CONVERSION_COUNTS
2280 ++created;
2281#endif
Antoine Pitrouf8387af2009-03-23 18:41:45 +00002282#ifdef SHOW_TRACK_COUNT
2283 if (_PyObject_GC_IS_TRACKED(d))
2284 count_tracked++;
2285 else
2286 count_untracked++;
2287#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002288 }
2289 return self;
2290}
2291
Tim Peters25786c02001-09-02 08:22:48 +00002292static int
2293dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2294{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002295 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002296}
2297
Tim Peters6d6c1a32001-08-02 04:15:00 +00002298static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002299dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002300{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002301 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002302}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002303
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002304PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00002305"dict() -> new empty dictionary.\n"
2306"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00002307" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002308"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002309" d = {}\n"
2310" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002311" d[k] = v\n"
2312"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2313" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002314
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002315PyTypeObject PyDict_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002316 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Petersa427a2b2001-10-29 22:25:45 +00002317 "dict",
Brett Cannon77ae87c2007-10-10 00:07:50 +00002318 sizeof(PyDictObject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002319 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00002320 (destructor)dict_dealloc, /* tp_dealloc */
2321 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002322 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00002323 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00002324 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00002325 (reprfunc)dict_repr, /* tp_repr */
2326 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002327 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00002328 &dict_as_mapping, /* tp_as_mapping */
Nick Coghlan53663a62008-07-15 14:27:37 +00002329 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00002330 0, /* tp_call */
2331 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002332 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00002333 0, /* tp_setattro */
2334 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002335 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00002336 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00002337 dictionary_doc, /* tp_doc */
Georg Brandl347b3002006-03-30 11:57:00 +00002338 dict_traverse, /* tp_traverse */
2339 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00002340 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002341 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00002342 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002343 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002344 mapp_methods, /* tp_methods */
2345 0, /* tp_members */
2346 0, /* tp_getset */
2347 0, /* tp_base */
2348 0, /* tp_dict */
2349 0, /* tp_descr_get */
2350 0, /* tp_descr_set */
2351 0, /* tp_dictoffset */
Georg Brandl347b3002006-03-30 11:57:00 +00002352 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002353 PyType_GenericAlloc, /* tp_alloc */
2354 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002355 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002356};
2357
Guido van Rossum3cca2451997-05-16 14:23:33 +00002358/* For backward compatibility with old dictionary interface */
2359
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002360PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002361PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002362{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002363 PyObject *kv, *rv;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002364 kv = PyString_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002365 if (kv == NULL)
2366 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002367 rv = PyDict_GetItem(v, kv);
2368 Py_DECREF(kv);
2369 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002370}
2371
2372int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002373PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002374{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002375 PyObject *kv;
2376 int err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002377 kv = PyString_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002378 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002379 return -1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002380 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002381 err = PyDict_SetItem(v, kv, item);
2382 Py_DECREF(kv);
2383 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002384}
2385
2386int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002387PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002388{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002389 PyObject *kv;
2390 int err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002391 kv = PyString_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002392 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002393 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002394 err = PyDict_DelItem(v, kv);
2395 Py_DECREF(kv);
2396 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002397}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002398
Raymond Hettinger019a1482004-03-18 02:41:19 +00002399/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002400
2401typedef struct {
2402 PyObject_HEAD
Brett Cannon77ae87c2007-10-10 00:07:50 +00002403 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002404 Py_ssize_t di_used;
2405 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002406 PyObject* di_result; /* reusable result tuple for iteritems */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002407 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002408} dictiterobject;
2409
2410static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002411dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002412{
2413 dictiterobject *di;
Antoine Pitrouaa687902009-01-01 14:11:22 +00002414 di = PyObject_GC_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002415 if (di == NULL)
2416 return NULL;
2417 Py_INCREF(dict);
2418 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002419 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002420 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002421 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002422 if (itertype == &PyDictIterItem_Type) {
2423 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2424 if (di->di_result == NULL) {
2425 Py_DECREF(di);
2426 return NULL;
2427 }
2428 }
2429 else
2430 di->di_result = NULL;
Antoine Pitrouaa687902009-01-01 14:11:22 +00002431 _PyObject_GC_TRACK(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002432 return (PyObject *)di;
2433}
2434
2435static void
2436dictiter_dealloc(dictiterobject *di)
2437{
Guido van Rossum2147df72002-07-16 20:30:22 +00002438 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002439 Py_XDECREF(di->di_result);
Antoine Pitrouaa687902009-01-01 14:11:22 +00002440 PyObject_GC_Del(di);
2441}
2442
2443static int
2444dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2445{
2446 Py_VISIT(di->di_dict);
2447 Py_VISIT(di->di_result);
2448 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002449}
2450
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002451static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002452dictiter_len(dictiterobject *di)
2453{
Tim Peters9b10f7e2006-05-30 04:16:25 +00002454 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002455 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002456 len = di->len;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002457 return PyInt_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002458}
2459
Armin Rigof5b3e362006-02-11 21:32:43 +00002460PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002461
2462static PyMethodDef dictiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002463 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002464 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002465};
2466
Raymond Hettinger019a1482004-03-18 02:41:19 +00002467static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002468{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002469 PyObject *key;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002470 register Py_ssize_t i, mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002471 register PyDictEntry *ep;
2472 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002473
Raymond Hettinger019a1482004-03-18 02:41:19 +00002474 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002475 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002476 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002477
Raymond Hettinger019a1482004-03-18 02:41:19 +00002478 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002479 PyErr_SetString(PyExc_RuntimeError,
2480 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002481 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002482 return NULL;
2483 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002484
Raymond Hettinger019a1482004-03-18 02:41:19 +00002485 i = di->di_pos;
2486 if (i < 0)
2487 goto fail;
2488 ep = d->ma_table;
2489 mask = d->ma_mask;
2490 while (i <= mask && ep[i].me_value == NULL)
2491 i++;
2492 di->di_pos = i+1;
2493 if (i > mask)
2494 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002495 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002496 key = ep[i].me_key;
2497 Py_INCREF(key);
2498 return key;
2499
2500fail:
2501 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002502 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002503 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002504}
2505
Raymond Hettinger019a1482004-03-18 02:41:19 +00002506PyTypeObject PyDictIterKey_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002507 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002508 "dictionary-keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002509 sizeof(dictiterobject), /* tp_basicsize */
2510 0, /* tp_itemsize */
2511 /* methods */
2512 (destructor)dictiter_dealloc, /* tp_dealloc */
2513 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002514 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002515 0, /* tp_setattr */
2516 0, /* tp_compare */
2517 0, /* tp_repr */
2518 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002519 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002520 0, /* tp_as_mapping */
2521 0, /* tp_hash */
2522 0, /* tp_call */
2523 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002524 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002525 0, /* tp_setattro */
2526 0, /* tp_as_buffer */
Antoine Pitrouaa687902009-01-01 14:11:22 +00002527 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002528 0, /* tp_doc */
Antoine Pitrouaa687902009-01-01 14:11:22 +00002529 (traverseproc)dictiter_traverse, /* tp_traverse */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002530 0, /* tp_clear */
2531 0, /* tp_richcompare */
2532 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002533 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002534 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002535 dictiter_methods, /* tp_methods */
2536 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002537};
2538
2539static PyObject *dictiter_iternextvalue(dictiterobject *di)
2540{
2541 PyObject *value;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002542 register Py_ssize_t i, mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002543 register PyDictEntry *ep;
2544 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002545
2546 if (d == NULL)
2547 return NULL;
2548 assert (PyDict_Check(d));
2549
2550 if (di->di_used != d->ma_used) {
2551 PyErr_SetString(PyExc_RuntimeError,
2552 "dictionary changed size during iteration");
2553 di->di_used = -1; /* Make this state sticky */
2554 return NULL;
2555 }
2556
2557 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002558 mask = d->ma_mask;
2559 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002560 goto fail;
2561 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002562 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002563 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002564 if (i > mask)
2565 goto fail;
2566 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002567 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002568 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002569 Py_INCREF(value);
2570 return value;
2571
2572fail:
2573 Py_DECREF(d);
2574 di->di_dict = NULL;
2575 return NULL;
2576}
2577
2578PyTypeObject PyDictIterValue_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002579 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002580 "dictionary-valueiterator", /* tp_name */
2581 sizeof(dictiterobject), /* tp_basicsize */
2582 0, /* tp_itemsize */
2583 /* methods */
2584 (destructor)dictiter_dealloc, /* tp_dealloc */
2585 0, /* tp_print */
2586 0, /* tp_getattr */
2587 0, /* tp_setattr */
2588 0, /* tp_compare */
2589 0, /* tp_repr */
2590 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002591 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002592 0, /* tp_as_mapping */
2593 0, /* tp_hash */
2594 0, /* tp_call */
2595 0, /* tp_str */
2596 PyObject_GenericGetAttr, /* tp_getattro */
2597 0, /* tp_setattro */
2598 0, /* tp_as_buffer */
Antoine Pitrouaa687902009-01-01 14:11:22 +00002599 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002600 0, /* tp_doc */
Antoine Pitrouaa687902009-01-01 14:11:22 +00002601 (traverseproc)dictiter_traverse, /* tp_traverse */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002602 0, /* tp_clear */
2603 0, /* tp_richcompare */
2604 0, /* tp_weaklistoffset */
2605 PyObject_SelfIter, /* tp_iter */
2606 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002607 dictiter_methods, /* tp_methods */
2608 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002609};
2610
2611static PyObject *dictiter_iternextitem(dictiterobject *di)
2612{
2613 PyObject *key, *value, *result = di->di_result;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002614 register Py_ssize_t i, mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002615 register PyDictEntry *ep;
2616 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002617
2618 if (d == NULL)
2619 return NULL;
2620 assert (PyDict_Check(d));
2621
2622 if (di->di_used != d->ma_used) {
2623 PyErr_SetString(PyExc_RuntimeError,
2624 "dictionary changed size during iteration");
2625 di->di_used = -1; /* Make this state sticky */
2626 return NULL;
2627 }
2628
2629 i = di->di_pos;
2630 if (i < 0)
2631 goto fail;
2632 ep = d->ma_table;
2633 mask = d->ma_mask;
2634 while (i <= mask && ep[i].me_value == NULL)
2635 i++;
2636 di->di_pos = i+1;
2637 if (i > mask)
2638 goto fail;
2639
2640 if (result->ob_refcnt == 1) {
2641 Py_INCREF(result);
2642 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2643 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2644 } else {
2645 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002646 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002647 return NULL;
2648 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002649 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002650 key = ep[i].me_key;
2651 value = ep[i].me_value;
2652 Py_INCREF(key);
2653 Py_INCREF(value);
2654 PyTuple_SET_ITEM(result, 0, key);
2655 PyTuple_SET_ITEM(result, 1, value);
2656 return result;
2657
2658fail:
2659 Py_DECREF(d);
2660 di->di_dict = NULL;
2661 return NULL;
2662}
2663
2664PyTypeObject PyDictIterItem_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002665 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002666 "dictionary-itemiterator", /* tp_name */
2667 sizeof(dictiterobject), /* tp_basicsize */
2668 0, /* tp_itemsize */
2669 /* methods */
2670 (destructor)dictiter_dealloc, /* tp_dealloc */
2671 0, /* tp_print */
2672 0, /* tp_getattr */
2673 0, /* tp_setattr */
2674 0, /* tp_compare */
2675 0, /* tp_repr */
2676 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002677 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002678 0, /* tp_as_mapping */
2679 0, /* tp_hash */
2680 0, /* tp_call */
2681 0, /* tp_str */
2682 PyObject_GenericGetAttr, /* tp_getattro */
2683 0, /* tp_setattro */
2684 0, /* tp_as_buffer */
Antoine Pitrouaa687902009-01-01 14:11:22 +00002685 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002686 0, /* tp_doc */
Antoine Pitrouaa687902009-01-01 14:11:22 +00002687 (traverseproc)dictiter_traverse, /* tp_traverse */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002688 0, /* tp_clear */
2689 0, /* tp_richcompare */
2690 0, /* tp_weaklistoffset */
2691 PyObject_SelfIter, /* tp_iter */
2692 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002693 dictiter_methods, /* tp_methods */
2694 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002695};