blob: 412d5f2e3154aec5d5f94ad99d25b84963abdd5c [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
Tim Peters6d6c1a32001-08-02 04:15:00 +000012typedef PyDictEntry dictentry;
13typedef PyDictObject dictobject;
Guido van Rossum16e93a81997-01-28 00:00:11 +000014
Georg Brandl5e9f94a2006-10-29 18:31:45 +000015/* Set a key error with the specified argument, wrapping it in a
16 * tuple automatically so that tuple keys are not unpacked as the
17 * exception arguments. */
18static void
19set_key_error(PyObject *arg)
20{
21 PyObject *tup;
22 tup = PyTuple_Pack(1, arg);
23 if (!tup)
24 return; /* caller will expect error to be set anyway */
25 PyErr_SetObject(PyExc_KeyError, tup);
Neal Norwitzae6b8412006-10-29 23:42:59 +000026 Py_DECREF(tup);
Georg Brandl5e9f94a2006-10-29 18:31:45 +000027}
28
Tim Peterseb28ef22001-06-02 05:27:19 +000029/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000030#undef SHOW_CONVERSION_COUNTS
31
Tim Peterseb28ef22001-06-02 05:27:19 +000032/* See large comment block below. This must be >= 1. */
33#define PERTURB_SHIFT 5
34
Guido van Rossum16e93a81997-01-28 00:00:11 +000035/*
Tim Peterseb28ef22001-06-02 05:27:19 +000036Major subtleties ahead: Most hash schemes depend on having a "good" hash
37function, in the sense of simulating randomness. Python doesn't: its most
38important hash functions (for strings and ints) are very regular in common
39cases:
Tim Peters15d49292001-05-27 07:39:22 +000040
Tim Peterseb28ef22001-06-02 05:27:19 +000041>>> map(hash, (0, 1, 2, 3))
42[0, 1, 2, 3]
43>>> map(hash, ("namea", "nameb", "namec", "named"))
44[-1658398457, -1658398460, -1658398459, -1658398462]
45>>>
Tim Peters15d49292001-05-27 07:39:22 +000046
Tim Peterseb28ef22001-06-02 05:27:19 +000047This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
48the low-order i bits as the initial table index is extremely fast, and there
49are no collisions at all for dicts indexed by a contiguous range of ints.
50The same is approximately true when keys are "consecutive" strings. So this
51gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000052
Tim Peterseb28ef22001-06-02 05:27:19 +000053OTOH, when collisions occur, the tendency to fill contiguous slices of the
54hash table makes a good collision resolution strategy crucial. Taking only
55the last i bits of the hash code is also vulnerable: for example, consider
56[i << 16 for i in range(20000)] as a set of keys. Since ints are their own
57hash codes, and this fits in a dict of size 2**15, the last 15 bits of every
58hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000059
Tim Peterseb28ef22001-06-02 05:27:19 +000060But catering to unusual cases should not slow the usual ones, so we just take
61the last i bits anyway. It's up to collision resolution to do the rest. If
62we *usually* find the key we're looking for on the first try (and, it turns
63out, we usually do -- the table load factor is kept under 2/3, so the odds
64are solidly in our favor), then it makes best sense to keep the initial index
65computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000066
Tim Peterseb28ef22001-06-02 05:27:19 +000067The first half of collision resolution is to visit table indices via this
68recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000069
Tim Peterseb28ef22001-06-02 05:27:19 +000070 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000071
Tim Peterseb28ef22001-06-02 05:27:19 +000072For any initial j in range(2**i), repeating that 2**i times generates each
73int in range(2**i) exactly once (see any text on random-number generation for
74proof). By itself, this doesn't help much: like linear probing (setting
75j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
76order. This would be bad, except that's not the only thing we do, and it's
77actually *good* in the common cases where hash keys are consecutive. In an
78example that's really too small to make this entirely clear, for a table of
79size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000080
Tim Peterseb28ef22001-06-02 05:27:19 +000081 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
82
83If two things come in at index 5, the first place we look after is index 2,
84not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
85Linear probing is deadly in this case because there the fixed probe order
86is the *same* as the order consecutive keys are likely to arrive. But it's
87extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
88and certain that consecutive hash codes do not.
89
90The other half of the strategy is to get the other bits of the hash code
91into play. This is done by initializing a (unsigned) vrbl "perturb" to the
92full hash code, and changing the recurrence to:
93
94 j = (5*j) + 1 + perturb;
95 perturb >>= PERTURB_SHIFT;
96 use j % 2**i as the next table index;
97
98Now the probe sequence depends (eventually) on every bit in the hash code,
99and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
100because it quickly magnifies small differences in the bits that didn't affect
101the initial index. Note that because perturb is unsigned, if the recurrence
102is executed often enough perturb eventually becomes and remains 0. At that
103point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
104that's certain to find an empty slot eventually (since it generates every int
105in range(2**i), and we make sure there's always at least one empty slot).
106
107Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
108small so that the high bits of the hash code continue to affect the probe
109sequence across iterations; but you want it large so that in really bad cases
110the high-order hash bits have an effect on early iterations. 5 was "the
111best" in minimizing total collisions across experiments Tim Peters ran (on
112both normal and pathological cases), but 4 and 6 weren't significantly worse.
113
114Historical: Reimer Behrends contributed the idea of using a polynomial-based
115approach, using repeated multiplication by x in GF(2**n) where an irreducible
116polynomial for each table size was chosen such that x was a primitive root.
117Christian Tismer later extended that to use division by x instead, as an
118efficient way to get the high bits of the hash code into play. This scheme
119also gave excellent collision statistics, but was more expensive: two
120if-tests were required inside the loop; computing "the next" index took about
121the same number of operations but without as much potential parallelism
122(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
123above, and then shifting perturb can be done while the table index is being
124masked); and the dictobject struct required a member to hold the table's
125polynomial. In Tim's experiments the current scheme ran faster, produced
126equally good collision statistics, needed less code & used less memory.
Tim Peters9b10f7e2006-05-30 04:16:25 +0000127
128Theoretical Python 2.5 headache: hash codes are only C "long", but
129sizeof(Py_ssize_t) > sizeof(long) may be possible. In that case, and if a
130dict is genuinely huge, then only the slots directly reachable via indexing
131by a C long can be the first slot in a probe sequence. The probe sequence
132will still eventually reach every slot in the table, but the collision rate
133on initial probes may be much higher than this scheme was designed for.
134Getting a hash code as fat as Py_ssize_t is the only real cure. But in
135practice, this probably won't make a lick of difference for many years (at
136which point everyone will have terabytes of RAM on 64-bit boxes).
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000137*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000138
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000139/* Object used as dummy key to fill deleted entries */
Raymond Hettingerf81e4502005-08-17 02:19:36 +0000140static PyObject *dummy = NULL; /* Initialized by first call to newdictobject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000141
Armin Rigoe1709372006-04-12 17:06:05 +0000142#ifdef Py_REF_DEBUG
143PyObject *
144_PyDict_Dummy(void)
145{
146 return dummy;
147}
148#endif
149
Fred Drake1bff34a2000-08-31 19:31:38 +0000150/* forward declarations */
151static dictentry *
152lookdict_string(dictobject *mp, PyObject *key, long hash);
153
154#ifdef SHOW_CONVERSION_COUNTS
155static long created = 0L;
156static long converted = 0L;
157
158static void
159show_counts(void)
160{
161 fprintf(stderr, "created %ld string dicts\n", created);
162 fprintf(stderr, "converted %ld to normal dicts\n", converted);
163 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
164}
165#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000166
Tim Peters6d6c1a32001-08-02 04:15:00 +0000167/* Initialization macros.
168 There are two ways to create a dict: PyDict_New() is the main C API
169 function, and the tp_new slot maps to dict_new(). In the latter case we
170 can save a little time over what PyDict_New does because it's guaranteed
171 that the PyDictObject struct is already zeroed out.
172 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
173 an excellent reason not to).
174*/
175
176#define INIT_NONZERO_DICT_SLOTS(mp) do { \
Tim Petersdea48ec2001-05-22 20:40:22 +0000177 (mp)->ma_table = (mp)->ma_smalltable; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000178 (mp)->ma_mask = PyDict_MINSIZE - 1; \
179 } while(0)
180
181#define EMPTY_TO_MINSIZE(mp) do { \
182 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000183 (mp)->ma_used = (mp)->ma_fill = 0; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000184 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000185 } while(0)
186
Raymond Hettinger43442782004-03-17 21:55:03 +0000187/* Dictionary reuse scheme to save calls to malloc, free, and memset */
188#define MAXFREEDICTS 80
189static PyDictObject *free_dicts[MAXFREEDICTS];
190static int num_free_dicts = 0;
191
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000193PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000194{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000195 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000196 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000198 if (dummy == NULL)
199 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000200#ifdef SHOW_CONVERSION_COUNTS
201 Py_AtExit(show_counts);
202#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000203 }
Raymond Hettinger43442782004-03-17 21:55:03 +0000204 if (num_free_dicts) {
205 mp = free_dicts[--num_free_dicts];
206 assert (mp != NULL);
207 assert (mp->ob_type == &PyDict_Type);
208 _Py_NewReference((PyObject *)mp);
209 if (mp->ma_fill) {
210 EMPTY_TO_MINSIZE(mp);
211 }
212 assert (mp->ma_used == 0);
213 assert (mp->ma_table == mp->ma_smalltable);
214 assert (mp->ma_mask == PyDict_MINSIZE - 1);
215 } else {
216 mp = PyObject_GC_New(dictobject, &PyDict_Type);
217 if (mp == NULL)
218 return NULL;
219 EMPTY_TO_MINSIZE(mp);
220 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000221 mp->ma_lookup = lookdict_string;
222#ifdef SHOW_CONVERSION_COUNTS
223 ++created;
224#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000225 _PyObject_GC_TRACK(mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000227}
228
229/*
230The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000231This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000232Open addressing is preferred over chaining since the link overhead for
233chaining would be substantial (100% with typical malloc overhead).
234
Tim Peterseb28ef22001-06-02 05:27:19 +0000235The initial probe index is computed as hash mod the table size. Subsequent
236probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000237
238All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000239
Tim Peterseb28ef22001-06-02 05:27:19 +0000240(The details in this version are due to Tim Peters, building on many past
241contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
242Christian Tismer).
Fred Drake1bff34a2000-08-31 19:31:38 +0000243
Tim Petersd770ebd2006-06-01 15:50:44 +0000244lookdict() is general-purpose, and may return NULL if (and only if) a
245comparison raises an exception (this was new in Python 2.5).
246lookdict_string() below is specialized to string keys, comparison of which can
247never raise an exception; that function can never return NULL. For both, when
248the key isn't found a dictentry* is returned for which the me_value field is
249NULL; this is the slot in the dict at which the key would have been found, and
250the caller can (if it wishes) add the <key, value> pair to the returned
251dictentry*.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000252*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000253static dictentry *
Tim Peters1f5871e2000-07-04 17:44:48 +0000254lookdict(dictobject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000255{
Tim Petersd770ebd2006-06-01 15:50:44 +0000256 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000257 register size_t perturb;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000258 register dictentry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000259 register size_t mask = (size_t)mp->ma_mask;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000260 dictentry *ep0 = mp->ma_table;
261 register dictentry *ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000262 register int cmp;
Tim Peters453163d2001-06-03 04:54:32 +0000263 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000264
Tim Petersd770ebd2006-06-01 15:50:44 +0000265 i = (size_t)hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000266 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000267 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000268 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000269
Guido van Rossum16e93a81997-01-28 00:00:11 +0000270 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000271 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000272 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000273 if (ep->me_hash == hash) {
Tim Peters453163d2001-06-03 04:54:32 +0000274 startkey = ep->me_key;
Georg Brandla5463ab2007-11-29 18:33:04 +0000275 Py_INCREF(startkey);
Tim Peters453163d2001-06-03 04:54:32 +0000276 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Georg Brandla5463ab2007-11-29 18:33:04 +0000277 Py_DECREF(startkey);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000278 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000279 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000280 if (ep0 == mp->ma_table && ep->me_key == startkey) {
281 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000282 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000283 }
284 else {
285 /* The compare did major nasty stuff to the
286 * dict: start over.
287 * XXX A clever adversary could prevent this
288 * XXX from terminating.
289 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000290 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000291 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000292 }
293 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000294 }
Tim Peters15d49292001-05-27 07:39:22 +0000295
Tim Peters342c65e2001-05-13 06:43:53 +0000296 /* In the loop, me_key == dummy is by far (factor of 100s) the
297 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000298 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
299 i = (i << 2) + i + perturb + 1;
300 ep = &ep0[i & mask];
Armin Rigo35f6d362006-06-01 13:19:12 +0000301 if (ep->me_key == NULL)
302 return freeslot == NULL ? ep : freeslot;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000303 if (ep->me_key == key)
Armin Rigo35f6d362006-06-01 13:19:12 +0000304 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000305 if (ep->me_hash == hash && ep->me_key != dummy) {
Tim Peters453163d2001-06-03 04:54:32 +0000306 startkey = ep->me_key;
Georg Brandla5463ab2007-11-29 18:33:04 +0000307 Py_INCREF(startkey);
Tim Peters453163d2001-06-03 04:54:32 +0000308 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Georg Brandla5463ab2007-11-29 18:33:04 +0000309 Py_DECREF(startkey);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000310 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000311 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000312 if (ep0 == mp->ma_table && ep->me_key == startkey) {
313 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000314 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000315 }
316 else {
317 /* The compare did major nasty stuff to the
318 * dict: start over.
319 * XXX A clever adversary could prevent this
320 * XXX from terminating.
321 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000322 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000323 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000324 }
Tim Peters342c65e2001-05-13 06:43:53 +0000325 else if (ep->me_key == dummy && freeslot == NULL)
326 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000327 }
Neal Norwitz7e3ec042006-10-28 21:37:16 +0000328 assert(0); /* NOT REACHED */
329 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000330}
331
332/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000333 * Hacked up version of lookdict which can assume keys are always strings;
Tim Petersd770ebd2006-06-01 15:50:44 +0000334 * this assumption allows testing for errors during PyObject_RichCompareBool()
335 * to be dropped; string-string comparisons never raise exceptions. This also
336 * means we don't need to go through PyObject_RichCompareBool(); we can always
337 * use _PyString_Eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000338 *
Tim Petersd770ebd2006-06-01 15:50:44 +0000339 * This is valuable because dicts with only string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000340 */
341static dictentry *
342lookdict_string(dictobject *mp, PyObject *key, register long hash)
343{
Tim Petersd770ebd2006-06-01 15:50:44 +0000344 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000345 register size_t perturb;
Fred Drake1bff34a2000-08-31 19:31:38 +0000346 register dictentry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000347 register size_t mask = (size_t)mp->ma_mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000348 dictentry *ep0 = mp->ma_table;
349 register dictentry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000350
Tim Peters0ab085c2001-09-14 00:25:33 +0000351 /* Make sure this function doesn't have to handle non-string keys,
352 including subclasses of str; e.g., one reason to subclass
353 strings is to override __eq__, and for speed we don't cater to
354 that here. */
355 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000356#ifdef SHOW_CONVERSION_COUNTS
357 ++converted;
358#endif
359 mp->ma_lookup = lookdict;
360 return lookdict(mp, key, hash);
361 }
Tim Peters2f228e72001-05-13 00:19:31 +0000362 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000363 ep = &ep0[i];
364 if (ep->me_key == NULL || ep->me_key == key)
365 return ep;
366 if (ep->me_key == dummy)
367 freeslot = ep;
368 else {
Tim Petersd770ebd2006-06-01 15:50:44 +0000369 if (ep->me_hash == hash && _PyString_Eq(ep->me_key, key))
Fred Drake1bff34a2000-08-31 19:31:38 +0000370 return ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000371 freeslot = NULL;
372 }
Tim Peters15d49292001-05-27 07:39:22 +0000373
Tim Peters342c65e2001-05-13 06:43:53 +0000374 /* In the loop, me_key == dummy is by far (factor of 100s) the
375 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000376 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
377 i = (i << 2) + i + perturb + 1;
378 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000379 if (ep->me_key == NULL)
380 return freeslot == NULL ? ep : freeslot;
381 if (ep->me_key == key
382 || (ep->me_hash == hash
383 && ep->me_key != dummy
Martin v. Löwiscd353062001-05-24 16:56:35 +0000384 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000385 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000386 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000387 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000388 }
Neal Norwitz7e3ec042006-10-28 21:37:16 +0000389 assert(0); /* NOT REACHED */
390 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000391}
392
393/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000394Internal routine to insert a new item into the table.
395Used both by the internal resize routine and by the public insert routine.
396Eats a reference to key and one to value.
Tim Petersd770ebd2006-06-01 15:50:44 +0000397Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000398*/
Armin Rigo35f6d362006-06-01 13:19:12 +0000399static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000400insertdict(register dictobject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000401{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000403 register dictentry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000404 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
405
406 assert(mp->ma_lookup != NULL);
407 ep = mp->ma_lookup(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000408 if (ep == NULL) {
409 Py_DECREF(key);
410 Py_DECREF(value);
411 return -1;
412 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000413 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000414 old_value = ep->me_value;
415 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 Py_DECREF(old_value); /* which **CAN** re-enter */
417 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000418 }
419 else {
420 if (ep->me_key == NULL)
421 mp->ma_fill++;
Raymond Hettinger07ead172005-02-05 23:42:57 +0000422 else {
423 assert(ep->me_key == dummy);
424 Py_DECREF(dummy);
425 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000426 ep->me_key = key;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000427 ep->me_hash = (Py_ssize_t)hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000428 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000429 mp->ma_used++;
430 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000431 return 0;
432}
433
434/*
435Internal routine used by dictresize() to insert an item which is
436known to be absent from the dict. This routine also assumes that
437the dict contains no deleted entries. Besides the performance benefit,
438using insertdict() in dictresize() is dangerous (SF bug #1456209).
Tim Petersd770ebd2006-06-01 15:50:44 +0000439Note that no refcounts are changed by this routine; if needed, the caller
440is responsible for incref'ing `key` and `value`.
Armin Rigo35f6d362006-06-01 13:19:12 +0000441*/
442static void
443insertdict_clean(register dictobject *mp, PyObject *key, long hash,
444 PyObject *value)
445{
Tim Petersd770ebd2006-06-01 15:50:44 +0000446 register size_t i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000447 register size_t perturb;
Tim Petersd770ebd2006-06-01 15:50:44 +0000448 register size_t mask = (size_t)mp->ma_mask;
Armin Rigo35f6d362006-06-01 13:19:12 +0000449 dictentry *ep0 = mp->ma_table;
450 register dictentry *ep;
451
452 i = hash & mask;
453 ep = &ep0[i];
454 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
455 i = (i << 2) + i + perturb + 1;
456 ep = &ep0[i & mask];
457 }
Tim Petersd770ebd2006-06-01 15:50:44 +0000458 assert(ep->me_value == NULL);
Armin Rigo35f6d362006-06-01 13:19:12 +0000459 mp->ma_fill++;
460 ep->me_key = key;
461 ep->me_hash = (Py_ssize_t)hash;
462 ep->me_value = value;
463 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000464}
465
466/*
467Restructure the table by allocating a new table and reinserting all
468items again. When entries have been deleted, the new table may
469actually be smaller than the old one.
470*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000471static int
Tim Peters9b10f7e2006-05-30 04:16:25 +0000472dictresize(dictobject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000473{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000474 Py_ssize_t newsize;
Tim Peters0c6010b2001-05-23 23:33:57 +0000475 dictentry *oldtable, *newtable, *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000476 Py_ssize_t i;
Tim Peters0c6010b2001-05-23 23:33:57 +0000477 int is_oldtable_malloced;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000478 dictentry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000479
480 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000481
Tim Peterseb28ef22001-06-02 05:27:19 +0000482 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000483 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000484 newsize <= minused && newsize > 0;
485 newsize <<= 1)
486 ;
487 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000489 return -1;
490 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000491
492 /* Get space for a new table. */
493 oldtable = mp->ma_table;
494 assert(oldtable != NULL);
495 is_oldtable_malloced = oldtable != mp->ma_smalltable;
496
Tim Peters6d6c1a32001-08-02 04:15:00 +0000497 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000498 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000499 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000500 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000501 if (mp->ma_fill == mp->ma_used) {
502 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000503 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000504 }
505 /* We're not going to resize it, but rebuild the
506 table anyway to purge old dummy entries.
507 Subtle: This is *necessary* if fill==size,
508 as lookdict needs at least one virgin slot to
509 terminate failing searches. If fill < size, it's
510 merely desirable, as dummies slow searches. */
511 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000512 memcpy(small_copy, oldtable, sizeof(small_copy));
513 oldtable = small_copy;
514 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000515 }
516 else {
517 newtable = PyMem_NEW(dictentry, newsize);
518 if (newtable == NULL) {
519 PyErr_NoMemory();
520 return -1;
521 }
522 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000523
524 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000525 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000526 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000527 mp->ma_mask = newsize - 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000528 memset(newtable, 0, sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000529 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000530 i = mp->ma_fill;
531 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000532
Tim Peters19283142001-05-17 22:25:34 +0000533 /* Copy the data over; this is refcount-neutral for active entries;
534 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000535 for (ep = oldtable; i > 0; ep++) {
536 if (ep->me_value != NULL) { /* active entry */
537 --i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000538 insertdict_clean(mp, ep->me_key, (long)ep->me_hash,
539 ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000540 }
Tim Peters19283142001-05-17 22:25:34 +0000541 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000542 --i;
Tim Peters19283142001-05-17 22:25:34 +0000543 assert(ep->me_key == dummy);
544 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000545 }
Tim Peters19283142001-05-17 22:25:34 +0000546 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000547 }
548
Tim Peters0c6010b2001-05-23 23:33:57 +0000549 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000550 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000551 return 0;
552}
553
Tim Petersd770ebd2006-06-01 15:50:44 +0000554/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
555 * that may occur (originally dicts supported only string keys, and exceptions
556 * weren't possible). So, while the original intent was that a NULL return
Andrew M. Kuchling0067b5f2006-08-04 20:37:43 +0000557 * meant the key wasn't present, in reality it can mean that, or that an error
Tim Petersd770ebd2006-06-01 15:50:44 +0000558 * (suppressed) occurred while computing the key's hash, or that some error
559 * (suppressed) occurred when comparing keys in the dict's internal probe
560 * sequence. A nasty example of the latter is when a Python-coded comparison
561 * function hits a stack-depth error, which can cause this to return NULL
562 * even if the key is present.
563 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000564PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000565PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000566{
567 long hash;
Fred Drake1bff34a2000-08-31 19:31:38 +0000568 dictobject *mp = (dictobject *)op;
Armin Rigo35f6d362006-06-01 13:19:12 +0000569 dictentry *ep;
570 PyThreadState *tstate;
Tim Petersd770ebd2006-06-01 15:50:44 +0000571 if (!PyDict_Check(op))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000572 return NULL;
Tim Peters0ab085c2001-09-14 00:25:33 +0000573 if (!PyString_CheckExact(key) ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000575 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000577 if (hash == -1) {
578 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000579 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000580 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000581 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000582
583 /* We can arrive here with a NULL tstate during initialization:
584 try running "python -Wi" for an example related to string
585 interning. Let's just hope that no exception occurs then... */
Armin Rigoacd0d6d2006-06-10 10:57:40 +0000586 tstate = _PyThreadState_Current;
Armin Rigo35f6d362006-06-01 13:19:12 +0000587 if (tstate != NULL && tstate->curexc_type != NULL) {
588 /* preserve the existing exception */
589 PyObject *err_type, *err_value, *err_tb;
590 PyErr_Fetch(&err_type, &err_value, &err_tb);
591 ep = (mp->ma_lookup)(mp, key, hash);
592 /* ignore errors */
593 PyErr_Restore(err_type, err_value, err_tb);
594 if (ep == NULL)
595 return NULL;
596 }
597 else {
598 ep = (mp->ma_lookup)(mp, key, hash);
599 if (ep == NULL) {
600 PyErr_Clear();
601 return NULL;
602 }
603 }
604 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000605}
606
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000607/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000608 * dictionary if it's merely replacing the value for an existing key.
609 * This means that it's safe to loop over a dictionary with PyDict_Next()
610 * and occasionally replace a value -- but you can't insert new keys or
611 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000612 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000613int
Tim Peters1f5871e2000-07-04 17:44:48 +0000614PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000615{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000616 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000617 register long hash;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000618 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000619
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 if (!PyDict_Check(op)) {
621 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000622 return -1;
623 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000624 assert(key);
625 assert(value);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000626 mp = (dictobject *)op;
Tim Peters0ab085c2001-09-14 00:25:33 +0000627 if (PyString_CheckExact(key)) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000628 hash = ((PyStringObject *)key)->ob_shash;
629 if (hash == -1)
630 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000631 }
Tim Peters1f7df352002-03-29 03:29:08 +0000632 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000634 if (hash == -1)
635 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000636 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000637 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000638 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 Py_INCREF(value);
640 Py_INCREF(key);
Armin Rigo35f6d362006-06-01 13:19:12 +0000641 if (insertdict(mp, key, hash, value) != 0)
642 return -1;
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000643 /* If we added a key, we can safely resize. Otherwise just return!
644 * If fill >= 2/3 size, adjust size. Normally, this doubles or
645 * quaduples the size, but it's also possible for the dict to shrink
Tim Peters60b29962006-01-01 01:19:23 +0000646 * (if ma_fill is much larger than ma_used, meaning a lot of dict
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000647 * keys have been * deleted).
Tim Peters60b29962006-01-01 01:19:23 +0000648 *
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000649 * Quadrupling the size improves average dictionary sparseness
650 * (reducing collisions) at the cost of some memory and iteration
651 * speed (which loops over every possible entry). It also halves
Neal Norwitz80af59c2006-05-30 04:19:21 +0000652 * the number of expensive resize operations in a growing dictionary.
Tim Peters60b29962006-01-01 01:19:23 +0000653 *
654 * Very large dictionaries (over 50K items) use doubling instead.
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000655 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000656 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000657 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
658 return 0;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000659 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000660}
661
662int
Tim Peters1f5871e2000-07-04 17:44:48 +0000663PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000664{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000665 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000666 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000667 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000669
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000670 if (!PyDict_Check(op)) {
671 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000672 return -1;
673 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000674 assert(key);
Tim Peters0ab085c2001-09-14 00:25:33 +0000675 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000676 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000678 if (hash == -1)
679 return -1;
680 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000681 mp = (dictobject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000682 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000683 if (ep == NULL)
684 return -1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000685 if (ep->me_value == NULL) {
Georg Brandl5e9f94a2006-10-29 18:31:45 +0000686 set_key_error(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000687 return -1;
688 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000689 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000691 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000692 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000693 ep->me_value = NULL;
694 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000695 Py_DECREF(old_value);
696 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000697 return 0;
698}
699
Guido van Rossum25831651993-05-19 14:50:45 +0000700void
Tim Peters1f5871e2000-07-04 17:44:48 +0000701PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000702{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000703 dictobject *mp;
Tim Petersdea48ec2001-05-22 20:40:22 +0000704 dictentry *ep, *table;
705 int table_is_malloced;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000706 Py_ssize_t fill;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000707 dictentry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000708#ifdef Py_DEBUG
Tim Peters9b10f7e2006-05-30 04:16:25 +0000709 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000710#endif
711
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000712 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000713 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000714 mp = (dictobject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000715#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000716 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000717 i = 0;
718#endif
719
720 table = mp->ma_table;
721 assert(table != NULL);
722 table_is_malloced = table != mp->ma_smalltable;
723
724 /* This is delicate. During the process of clearing the dict,
725 * decrefs can cause the dict to mutate. To avoid fatal confusion
726 * (voice of experience), we have to make the dict empty before
727 * clearing the slots, and never refer to anything via mp->xxx while
728 * clearing.
729 */
730 fill = mp->ma_fill;
731 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000732 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000733
734 else if (fill > 0) {
735 /* It's a small table with something that needs to be cleared.
736 * Afraid the only safe way is to copy the dict entries into
737 * another small table first.
738 */
739 memcpy(small_copy, table, sizeof(small_copy));
740 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000741 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000742 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000743 /* else it's a small table that's already empty */
744
745 /* Now we can finally clear things. If C had refcounts, we could
746 * assert that the refcount on table is 1 now, i.e. that this function
747 * has unique access to it, so decref side-effects can't alter it.
748 */
749 for (ep = table; fill > 0; ++ep) {
750#ifdef Py_DEBUG
751 assert(i < n);
752 ++i;
753#endif
754 if (ep->me_key) {
755 --fill;
756 Py_DECREF(ep->me_key);
757 Py_XDECREF(ep->me_value);
758 }
759#ifdef Py_DEBUG
760 else
761 assert(ep->me_value == NULL);
762#endif
763 }
764
765 if (table_is_malloced)
766 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000767}
768
Tim Peters080c88b2003-02-15 03:01:11 +0000769/*
770 * Iterate over a dict. Use like so:
771 *
Tim Peters9b10f7e2006-05-30 04:16:25 +0000772 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000773 * PyObject *key, *value;
774 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000775 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000776 * Refer to borrowed references in key and value.
777 * }
778 *
779 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000780 * mutates the dict. One exception: it is safe if the loop merely changes
781 * the values associated with the keys (but doesn't insert new keys or
782 * delete keys), via PyDict_SetItem().
783 */
Guido van Rossum25831651993-05-19 14:50:45 +0000784int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000785PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000786{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000787 register Py_ssize_t i;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000788 register Py_ssize_t mask;
Raymond Hettinger43442782004-03-17 21:55:03 +0000789 register dictentry *ep;
790
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000791 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000792 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000793 i = *ppos;
794 if (i < 0)
795 return 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000796 ep = ((dictobject *)op)->ma_table;
797 mask = ((dictobject *)op)->ma_mask;
798 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000799 i++;
800 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000801 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000802 return 0;
803 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000804 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000805 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000806 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000807 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000808}
809
Raymond Hettinger1bff7962007-02-19 03:04:45 +0000810/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
811int
812_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, long *phash)
813{
814 register Py_ssize_t i;
815 register Py_ssize_t mask;
816 register dictentry *ep;
817
818 if (!PyDict_Check(op))
819 return 0;
820 i = *ppos;
821 if (i < 0)
822 return 0;
823 ep = ((dictobject *)op)->ma_table;
824 mask = ((dictobject *)op)->ma_mask;
825 while (i <= mask && ep[i].me_value == NULL)
826 i++;
827 *ppos = i+1;
828 if (i > mask)
829 return 0;
830 *phash = (long)(ep[i].me_hash);
831 if (pkey)
832 *pkey = ep[i].me_key;
833 if (pvalue)
834 *pvalue = ep[i].me_value;
835 return 1;
836}
837
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000838/* Methods */
839
840static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000841dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000842{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000843 register dictentry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000844 Py_ssize_t fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000845 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000846 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000847 for (ep = mp->ma_table; fill > 0; ep++) {
848 if (ep->me_key) {
849 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000850 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000851 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000852 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000853 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000854 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000855 PyMem_DEL(mp->ma_table);
Raymond Hettinger43442782004-03-17 21:55:03 +0000856 if (num_free_dicts < MAXFREEDICTS && mp->ob_type == &PyDict_Type)
857 free_dicts[num_free_dicts++] = mp;
Tim Peters60b29962006-01-01 01:19:23 +0000858 else
Raymond Hettinger43442782004-03-17 21:55:03 +0000859 mp->ob_type->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000860 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000861}
862
863static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000864dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000865{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000866 register Py_ssize_t i;
867 register Py_ssize_t any;
Tim Peters33f4a6a2006-05-30 05:23:59 +0000868 int status;
Guido van Rossum255443b1998-04-10 22:47:14 +0000869
Tim Peters33f4a6a2006-05-30 05:23:59 +0000870 status = Py_ReprEnter((PyObject*)mp);
871 if (status != 0) {
872 if (status < 0)
873 return status;
Guido van Rossum255443b1998-04-10 22:47:14 +0000874 fprintf(fp, "{...}");
875 return 0;
876 }
877
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000878 fprintf(fp, "{");
879 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000880 for (i = 0; i <= mp->ma_mask; i++) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000881 dictentry *ep = mp->ma_table + i;
882 PyObject *pvalue = ep->me_value;
883 if (pvalue != NULL) {
884 /* Prevent PyObject_Repr from deleting value during
885 key format */
886 Py_INCREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000887 if (any++ > 0)
888 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000889 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000890 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000891 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000892 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000893 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000894 fprintf(fp, ": ");
Tim Peters19b77cf2001-06-02 08:27:39 +0000895 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000896 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000897 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000898 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000899 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000900 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000901 }
902 }
903 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000904 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000905 return 0;
906}
907
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000908static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000909dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000910{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000911 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +0000912 PyObject *s, *temp, *colon = NULL;
913 PyObject *pieces = NULL, *result = NULL;
914 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +0000915
Tim Petersa7259592001-06-16 05:11:17 +0000916 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +0000917 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000918 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +0000919 }
920
Tim Petersa7259592001-06-16 05:11:17 +0000921 if (mp->ma_used == 0) {
922 result = PyString_FromString("{}");
923 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000924 }
Tim Petersa7259592001-06-16 05:11:17 +0000925
926 pieces = PyList_New(0);
927 if (pieces == NULL)
928 goto Done;
929
930 colon = PyString_FromString(": ");
931 if (colon == NULL)
932 goto Done;
933
934 /* Do repr() on each key+value pair, and insert ": " between them.
935 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +0000936 i = 0;
937 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +0000938 int status;
939 /* Prevent repr from deleting value during key format. */
940 Py_INCREF(value);
941 s = PyObject_Repr(key);
942 PyString_Concat(&s, colon);
943 PyString_ConcatAndDel(&s, PyObject_Repr(value));
944 Py_DECREF(value);
945 if (s == NULL)
946 goto Done;
947 status = PyList_Append(pieces, s);
948 Py_DECREF(s); /* append created a new ref */
949 if (status < 0)
950 goto Done;
951 }
952
953 /* Add "{}" decorations to the first and last items. */
954 assert(PyList_GET_SIZE(pieces) > 0);
955 s = PyString_FromString("{");
956 if (s == NULL)
957 goto Done;
958 temp = PyList_GET_ITEM(pieces, 0);
959 PyString_ConcatAndDel(&s, temp);
960 PyList_SET_ITEM(pieces, 0, s);
961 if (s == NULL)
962 goto Done;
963
964 s = PyString_FromString("}");
965 if (s == NULL)
966 goto Done;
967 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
968 PyString_ConcatAndDel(&temp, s);
969 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
970 if (temp == NULL)
971 goto Done;
972
973 /* Paste them all together with ", " between. */
974 s = PyString_FromString(", ");
975 if (s == NULL)
976 goto Done;
977 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +0000978 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000979
980Done:
981 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +0000983 Py_ReprLeave((PyObject *)mp);
984 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000985}
986
Martin v. Löwis18e16552006-02-15 17:27:45 +0000987static Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +0000988dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000989{
990 return mp->ma_used;
991}
992
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000993static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000994dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000995{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000997 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +0000998 dictentry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000999 assert(mp->ma_table != NULL);
Tim Peters0ab085c2001-09-14 00:25:33 +00001000 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001001 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001003 if (hash == -1)
1004 return NULL;
1005 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001006 ep = (mp->ma_lookup)(mp, key, hash);
1007 if (ep == NULL)
1008 return NULL;
1009 v = ep->me_value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001010 if (v == NULL) {
1011 if (!PyDict_CheckExact(mp)) {
1012 /* Look up __missing__ method if we're a subclass. */
Guido van Rossum4b92a822006-02-25 23:32:30 +00001013 PyObject *missing;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001014 static PyObject *missing_str = NULL;
1015 if (missing_str == NULL)
Tim Peters9b10f7e2006-05-30 04:16:25 +00001016 missing_str =
Guido van Rossum1968ad32006-02-25 22:38:04 +00001017 PyString_InternFromString("__missing__");
Guido van Rossum4b92a822006-02-25 23:32:30 +00001018 missing = _PyType_Lookup(mp->ob_type, missing_str);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001019 if (missing != NULL)
1020 return PyObject_CallFunctionObjArgs(missing,
1021 (PyObject *)mp, key, NULL);
1022 }
Georg Brandl5e9f94a2006-10-29 18:31:45 +00001023 set_key_error(key);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001024 return NULL;
1025 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001026 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001028 return v;
1029}
1030
1031static int
Tim Peters1f5871e2000-07-04 17:44:48 +00001032dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001033{
1034 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001035 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001036 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001037 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001038}
1039
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001040static PyMappingMethods dict_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001041 (lenfunc)dict_length, /*mp_length*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001042 (binaryfunc)dict_subscript, /*mp_subscript*/
1043 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001044};
1045
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001047dict_keys(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001048{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001049 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001050 register Py_ssize_t i, j;
Raymond Hettinger43442782004-03-17 21:55:03 +00001051 dictentry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001052 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001053
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001054 again:
1055 n = mp->ma_used;
1056 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001057 if (v == NULL)
1058 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001059 if (n != mp->ma_used) {
1060 /* Durnit. The allocations caused the dict to resize.
1061 * Just start over, this shouldn't normally happen.
1062 */
1063 Py_DECREF(v);
1064 goto again;
1065 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001066 ep = mp->ma_table;
1067 mask = mp->ma_mask;
1068 for (i = 0, j = 0; i <= mask; i++) {
1069 if (ep[i].me_value != NULL) {
1070 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001071 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001072 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001073 j++;
1074 }
1075 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001076 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001077 return v;
1078}
1079
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001081dict_values(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001082{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001083 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001084 register Py_ssize_t i, j;
Raymond Hettinger43442782004-03-17 21:55:03 +00001085 dictentry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001086 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001087
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001088 again:
1089 n = mp->ma_used;
1090 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001091 if (v == NULL)
1092 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001093 if (n != mp->ma_used) {
1094 /* Durnit. The allocations caused the dict to resize.
1095 * Just start over, this shouldn't normally happen.
1096 */
1097 Py_DECREF(v);
1098 goto again;
1099 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001100 ep = mp->ma_table;
1101 mask = mp->ma_mask;
1102 for (i = 0, j = 0; i <= mask; i++) {
1103 if (ep[i].me_value != NULL) {
1104 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001105 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001106 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001107 j++;
1108 }
1109 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001110 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001111 return v;
1112}
1113
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001114static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001115dict_items(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001116{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001118 register Py_ssize_t i, j, n;
1119 Py_ssize_t mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001120 PyObject *item, *key, *value;
Raymond Hettinger43442782004-03-17 21:55:03 +00001121 dictentry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001122
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001123 /* Preallocate the list of tuples, to avoid allocations during
1124 * the loop over the items, which could trigger GC, which
1125 * could resize the dict. :-(
1126 */
1127 again:
1128 n = mp->ma_used;
1129 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001130 if (v == NULL)
1131 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001132 for (i = 0; i < n; i++) {
1133 item = PyTuple_New(2);
1134 if (item == NULL) {
1135 Py_DECREF(v);
1136 return NULL;
1137 }
1138 PyList_SET_ITEM(v, i, item);
1139 }
1140 if (n != mp->ma_used) {
1141 /* Durnit. The allocations caused the dict to resize.
1142 * Just start over, this shouldn't normally happen.
1143 */
1144 Py_DECREF(v);
1145 goto again;
1146 }
1147 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001148 ep = mp->ma_table;
1149 mask = mp->ma_mask;
1150 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001151 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001152 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001153 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001154 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001155 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001156 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001157 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001158 j++;
1159 }
1160 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001161 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001162 return v;
1163}
1164
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001165static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001166dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001167{
1168 PyObject *seq;
1169 PyObject *value = Py_None;
1170 PyObject *it; /* iter(seq) */
1171 PyObject *key;
1172 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001173 int status;
1174
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001175 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001176 return NULL;
1177
1178 d = PyObject_CallObject(cls, NULL);
1179 if (d == NULL)
1180 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001181
Raymond Hettingerf94e89c2007-03-20 21:45:04 +00001182 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
1183 dictobject *mp = (dictobject *)d;
1184 Py_ssize_t pos = 0;
1185 PyObject *key;
1186 long hash;
1187
1188 if (dictresize(mp, PySet_GET_SIZE(seq)))
1189 return NULL;
1190
1191 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1192 Py_INCREF(key);
Raymond Hettinger7ed0a652007-03-21 20:36:45 +00001193 Py_INCREF(value);
1194 if (insertdict(mp, key, hash, value))
Raymond Hettingerf94e89c2007-03-20 21:45:04 +00001195 return NULL;
1196 }
1197 return d;
1198 }
1199
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001200 it = PyObject_GetIter(seq);
1201 if (it == NULL){
1202 Py_DECREF(d);
1203 return NULL;
1204 }
1205
1206 for (;;) {
1207 key = PyIter_Next(it);
1208 if (key == NULL) {
1209 if (PyErr_Occurred())
1210 goto Fail;
1211 break;
1212 }
Raymond Hettingere03e5b12002-12-07 08:10:51 +00001213 status = PyObject_SetItem(d, key, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001214 Py_DECREF(key);
1215 if (status < 0)
1216 goto Fail;
1217 }
1218
1219 Py_DECREF(it);
1220 return d;
1221
1222Fail:
1223 Py_DECREF(it);
1224 Py_DECREF(d);
1225 return NULL;
1226}
1227
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001228static int
1229dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001230{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001231 PyObject *arg = NULL;
1232 int result = 0;
1233
1234 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1235 result = -1;
1236
1237 else if (arg != NULL) {
1238 if (PyObject_HasAttrString(arg, "keys"))
1239 result = PyDict_Merge(self, arg, 1);
1240 else
1241 result = PyDict_MergeFromSeq2(self, arg, 1);
1242 }
1243 if (result == 0 && kwds != NULL)
1244 result = PyDict_Merge(self, kwds, 1);
1245 return result;
1246}
1247
1248static PyObject *
1249dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1250{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001251 if (dict_update_common(self, args, kwds, "update") != -1)
1252 Py_RETURN_NONE;
1253 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001254}
1255
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001256/* Update unconditionally replaces existing items.
1257 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001258 otherwise it leaves existing items unchanged.
1259
1260 PyDict_{Update,Merge} update/merge from a mapping object.
1261
Tim Petersf582b822001-12-11 18:51:08 +00001262 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001263 producing iterable objects of length 2.
1264*/
1265
Tim Petersf582b822001-12-11 18:51:08 +00001266int
Tim Peters1fc240e2001-10-26 05:06:50 +00001267PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1268{
1269 PyObject *it; /* iter(seq2) */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001270 Py_ssize_t i; /* index into seq2 of current element */
Tim Peters1fc240e2001-10-26 05:06:50 +00001271 PyObject *item; /* seq2[i] */
1272 PyObject *fast; /* item as a 2-tuple or 2-list */
1273
1274 assert(d != NULL);
1275 assert(PyDict_Check(d));
1276 assert(seq2 != NULL);
1277
1278 it = PyObject_GetIter(seq2);
1279 if (it == NULL)
1280 return -1;
1281
1282 for (i = 0; ; ++i) {
1283 PyObject *key, *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001284 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001285
1286 fast = NULL;
1287 item = PyIter_Next(it);
1288 if (item == NULL) {
1289 if (PyErr_Occurred())
1290 goto Fail;
1291 break;
1292 }
1293
1294 /* Convert item to sequence, and verify length 2. */
1295 fast = PySequence_Fast(item, "");
1296 if (fast == NULL) {
1297 if (PyErr_ExceptionMatches(PyExc_TypeError))
1298 PyErr_Format(PyExc_TypeError,
1299 "cannot convert dictionary update "
Neal Norwitzd3881b02006-05-30 04:25:05 +00001300 "sequence element #%zd to a sequence",
Tim Peters1fc240e2001-10-26 05:06:50 +00001301 i);
1302 goto Fail;
1303 }
1304 n = PySequence_Fast_GET_SIZE(fast);
1305 if (n != 2) {
1306 PyErr_Format(PyExc_ValueError,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001307 "dictionary update sequence element #%zd "
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00001308 "has length %zd; 2 is required",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00001309 i, n);
Tim Peters1fc240e2001-10-26 05:06:50 +00001310 goto Fail;
1311 }
1312
1313 /* Update/merge with this (key, value) pair. */
1314 key = PySequence_Fast_GET_ITEM(fast, 0);
1315 value = PySequence_Fast_GET_ITEM(fast, 1);
1316 if (override || PyDict_GetItem(d, key) == NULL) {
1317 int status = PyDict_SetItem(d, key, value);
1318 if (status < 0)
1319 goto Fail;
1320 }
1321 Py_DECREF(fast);
1322 Py_DECREF(item);
1323 }
1324
1325 i = 0;
1326 goto Return;
1327Fail:
1328 Py_XDECREF(item);
1329 Py_XDECREF(fast);
1330 i = -1;
1331Return:
1332 Py_DECREF(it);
Neal Norwitzd3881b02006-05-30 04:25:05 +00001333 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001334}
1335
Tim Peters6d6c1a32001-08-02 04:15:00 +00001336int
1337PyDict_Update(PyObject *a, PyObject *b)
1338{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001339 return PyDict_Merge(a, b, 1);
1340}
1341
1342int
1343PyDict_Merge(PyObject *a, PyObject *b, int override)
1344{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001345 register PyDictObject *mp, *other;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001346 register Py_ssize_t i;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001347 dictentry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001348
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001349 /* We accept for the argument either a concrete dictionary object,
1350 * or an abstract "mapping" object. For the former, we can do
1351 * things quite efficiently. For the latter, we only require that
1352 * PyMapping_Keys() and PyObject_GetItem() be supported.
1353 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001354 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1355 PyErr_BadInternalCall();
1356 return -1;
1357 }
1358 mp = (dictobject*)a;
Neal Norwitze6e383f2007-04-16 06:59:13 +00001359 if (PyDict_Check(b)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001360 other = (dictobject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001361 if (other == mp || other->ma_used == 0)
1362 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001363 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001364 if (mp->ma_used == 0)
1365 /* Since the target dict is empty, PyDict_GetItem()
1366 * always returns NULL. Setting override to 1
1367 * skips the unnecessary test.
1368 */
1369 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001370 /* Do one big resize at the start, rather than
1371 * incrementally resizing as we insert new items. Expect
1372 * that there will be no (or few) overlapping keys.
1373 */
1374 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001375 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001376 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001377 }
1378 for (i = 0; i <= other->ma_mask; i++) {
1379 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001380 if (entry->me_value != NULL &&
1381 (override ||
1382 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001383 Py_INCREF(entry->me_key);
1384 Py_INCREF(entry->me_value);
Armin Rigo35f6d362006-06-01 13:19:12 +00001385 if (insertdict(mp, entry->me_key,
1386 (long)entry->me_hash,
1387 entry->me_value) != 0)
1388 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001389 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001390 }
1391 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001392 else {
1393 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001394 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001395 PyObject *iter;
1396 PyObject *key, *value;
1397 int status;
1398
1399 if (keys == NULL)
1400 /* Docstring says this is equivalent to E.keys() so
1401 * if E doesn't have a .keys() method we want
1402 * AttributeError to percolate up. Might as well
1403 * do the same for any other error.
1404 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001405 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001406
1407 iter = PyObject_GetIter(keys);
1408 Py_DECREF(keys);
1409 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001410 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001411
1412 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001413 if (!override && PyDict_GetItem(a, key) != NULL) {
1414 Py_DECREF(key);
1415 continue;
1416 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001417 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001418 if (value == NULL) {
1419 Py_DECREF(iter);
1420 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001421 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001422 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001423 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001424 Py_DECREF(key);
1425 Py_DECREF(value);
1426 if (status < 0) {
1427 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001428 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001429 }
1430 }
1431 Py_DECREF(iter);
1432 if (PyErr_Occurred())
1433 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001434 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001435 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001436 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001437}
1438
1439static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001440dict_copy(register dictobject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001441{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001442 return PyDict_Copy((PyObject*)mp);
1443}
1444
1445PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001446PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001447{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001448 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001449
1450 if (o == NULL || !PyDict_Check(o)) {
1451 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001452 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001453 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001454 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001455 if (copy == NULL)
1456 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001457 if (PyDict_Merge(copy, o, 1) == 0)
1458 return copy;
1459 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001460 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001461}
1462
Martin v. Löwis18e16552006-02-15 17:27:45 +00001463Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001464PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001465{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466 if (mp == NULL || !PyDict_Check(mp)) {
1467 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001468 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001469 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001470 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001471}
1472
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001473PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001474PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001475{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476 if (mp == NULL || !PyDict_Check(mp)) {
1477 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001478 return NULL;
1479 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001480 return dict_keys((dictobject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001481}
1482
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001483PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001484PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001485{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001486 if (mp == NULL || !PyDict_Check(mp)) {
1487 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001488 return NULL;
1489 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001490 return dict_values((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001491}
1492
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001493PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001494PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001495{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001496 if (mp == NULL || !PyDict_Check(mp)) {
1497 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001498 return NULL;
1499 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001500 return dict_items((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001501}
1502
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001503/* Subroutine which returns the smallest key in a for which b's value
1504 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001505 pval argument. Both are NULL if no key in a is found for which b's status
1506 differs. The refcounts on (and only on) non-NULL *pval and function return
1507 values must be decremented by the caller (characterize() increments them
1508 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1509 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001510
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001511static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001512characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001513{
Tim Peters95bf9392001-05-10 08:32:44 +00001514 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1515 PyObject *aval = NULL; /* a[akey] */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001516 Py_ssize_t i;
1517 int cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001518
Tim Petersafb6ae82001-06-04 21:00:21 +00001519 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001520 PyObject *thiskey, *thisaval, *thisbval;
1521 if (a->ma_table[i].me_value == NULL)
1522 continue;
1523 thiskey = a->ma_table[i].me_key;
1524 Py_INCREF(thiskey); /* keep alive across compares */
1525 if (akey != NULL) {
1526 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1527 if (cmp < 0) {
1528 Py_DECREF(thiskey);
1529 goto Fail;
1530 }
1531 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001532 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001533 a->ma_table[i].me_value == NULL)
1534 {
1535 /* Not the *smallest* a key; or maybe it is
1536 * but the compare shrunk the dict so we can't
1537 * find its associated value anymore; or
1538 * maybe it is but the compare deleted the
1539 * a[thiskey] entry.
Neal Norwitzd3881b02006-05-30 04:25:05 +00001540 */
Tim Peters95bf9392001-05-10 08:32:44 +00001541 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001542 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001543 }
Tim Peters95bf9392001-05-10 08:32:44 +00001544 }
1545
1546 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1547 thisaval = a->ma_table[i].me_value;
1548 assert(thisaval);
1549 Py_INCREF(thisaval); /* keep alive */
1550 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1551 if (thisbval == NULL)
1552 cmp = 0;
1553 else {
1554 /* both dicts have thiskey: same values? */
1555 cmp = PyObject_RichCompareBool(
1556 thisaval, thisbval, Py_EQ);
1557 if (cmp < 0) {
1558 Py_DECREF(thiskey);
1559 Py_DECREF(thisaval);
1560 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001561 }
1562 }
Tim Peters95bf9392001-05-10 08:32:44 +00001563 if (cmp == 0) {
1564 /* New winner. */
1565 Py_XDECREF(akey);
1566 Py_XDECREF(aval);
1567 akey = thiskey;
1568 aval = thisaval;
1569 }
1570 else {
1571 Py_DECREF(thiskey);
1572 Py_DECREF(thisaval);
1573 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001574 }
Tim Peters95bf9392001-05-10 08:32:44 +00001575 *pval = aval;
1576 return akey;
1577
1578Fail:
1579 Py_XDECREF(akey);
1580 Py_XDECREF(aval);
1581 *pval = NULL;
1582 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001583}
1584
1585static int
Tim Peters1f5871e2000-07-04 17:44:48 +00001586dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001587{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001589 int res;
1590
1591 /* Compare lengths first */
1592 if (a->ma_used < b->ma_used)
1593 return -1; /* a is shorter */
1594 else if (a->ma_used > b->ma_used)
1595 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001596
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001597 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001598 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001599 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001600 if (adiff == NULL) {
1601 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001602 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001603 * must be equal.
1604 */
1605 res = PyErr_Occurred() ? -1 : 0;
1606 goto Finished;
1607 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001608 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001609 if (bdiff == NULL && PyErr_Occurred()) {
1610 assert(!bval);
1611 res = -1;
1612 goto Finished;
1613 }
1614 res = 0;
1615 if (bdiff) {
1616 /* bdiff == NULL "should be" impossible now, but perhaps
1617 * the last comparison done by the characterize() on a had
1618 * the side effect of making the dicts equal!
1619 */
1620 res = PyObject_Compare(adiff, bdiff);
1621 }
1622 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001623 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001624
1625Finished:
1626 Py_XDECREF(adiff);
1627 Py_XDECREF(bdiff);
1628 Py_XDECREF(aval);
1629 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001630 return res;
1631}
1632
Tim Peterse63415e2001-05-08 04:38:29 +00001633/* Return 1 if dicts equal, 0 if not, -1 if error.
1634 * Gets out as soon as any difference is detected.
1635 * Uses only Py_EQ comparison.
1636 */
1637static int
1638dict_equal(dictobject *a, dictobject *b)
1639{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001640 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001641
1642 if (a->ma_used != b->ma_used)
1643 /* can't be equal if # of entries differ */
1644 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001645
Tim Peterse63415e2001-05-08 04:38:29 +00001646 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001647 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001648 PyObject *aval = a->ma_table[i].me_value;
1649 if (aval != NULL) {
1650 int cmp;
1651 PyObject *bval;
1652 PyObject *key = a->ma_table[i].me_key;
1653 /* temporarily bump aval's refcount to ensure it stays
1654 alive until we're done with it */
1655 Py_INCREF(aval);
Neal Norwitzd3da7d32006-09-05 01:54:06 +00001656 /* ditto for key */
1657 Py_INCREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001658 bval = PyDict_GetItem((PyObject *)b, key);
Neal Norwitzd3da7d32006-09-05 01:54:06 +00001659 Py_DECREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001660 if (bval == NULL) {
1661 Py_DECREF(aval);
1662 return 0;
1663 }
1664 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1665 Py_DECREF(aval);
1666 if (cmp <= 0) /* error or not equal */
1667 return cmp;
1668 }
1669 }
1670 return 1;
1671 }
1672
1673static PyObject *
1674dict_richcompare(PyObject *v, PyObject *w, int op)
1675{
1676 int cmp;
1677 PyObject *res;
1678
1679 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1680 res = Py_NotImplemented;
1681 }
1682 else if (op == Py_EQ || op == Py_NE) {
1683 cmp = dict_equal((dictobject *)v, (dictobject *)w);
1684 if (cmp < 0)
1685 return NULL;
1686 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1687 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001688 else
1689 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001690 Py_INCREF(res);
1691 return res;
1692 }
1693
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001694static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001695dict_has_key(register dictobject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001696{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001697 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +00001698 dictentry *ep;
Tim Petersd770ebd2006-06-01 15:50:44 +00001699
Tim Peters0ab085c2001-09-14 00:25:33 +00001700 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001701 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001702 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001703 if (hash == -1)
1704 return NULL;
1705 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001706 ep = (mp->ma_lookup)(mp, key, hash);
1707 if (ep == NULL)
1708 return NULL;
Tim Petersd770ebd2006-06-01 15:50:44 +00001709 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001710}
1711
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001712static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001713dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001714{
1715 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001716 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001717 PyObject *val = NULL;
1718 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +00001719 dictentry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001720
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001721 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001722 return NULL;
1723
Tim Peters0ab085c2001-09-14 00:25:33 +00001724 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001725 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001726 hash = PyObject_Hash(key);
1727 if (hash == -1)
1728 return NULL;
1729 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001730 ep = (mp->ma_lookup)(mp, key, hash);
1731 if (ep == NULL)
1732 return NULL;
1733 val = ep->me_value;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001734 if (val == NULL)
1735 val = failobj;
1736 Py_INCREF(val);
1737 return val;
1738}
1739
1740
1741static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001742dict_setdefault(register dictobject *mp, PyObject *args)
1743{
1744 PyObject *key;
1745 PyObject *failobj = Py_None;
1746 PyObject *val = NULL;
1747 long hash;
Armin Rigo35f6d362006-06-01 13:19:12 +00001748 dictentry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001749
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001750 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001751 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001752
Tim Peters0ab085c2001-09-14 00:25:33 +00001753 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001754 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001755 hash = PyObject_Hash(key);
1756 if (hash == -1)
1757 return NULL;
1758 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001759 ep = (mp->ma_lookup)(mp, key, hash);
1760 if (ep == NULL)
1761 return NULL;
1762 val = ep->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001763 if (val == NULL) {
1764 val = failobj;
1765 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1766 val = NULL;
1767 }
1768 Py_XINCREF(val);
1769 return val;
1770}
1771
1772
1773static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001774dict_clear(register dictobject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001775{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001776 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001777 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001778}
1779
Guido van Rossumba6ab842000-12-12 22:02:18 +00001780static PyObject *
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001781dict_pop(dictobject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001782{
1783 long hash;
1784 dictentry *ep;
1785 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001786 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001787
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001788 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1789 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001790 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001791 if (deflt) {
1792 Py_INCREF(deflt);
1793 return deflt;
1794 }
Guido van Rossume027d982002-04-12 15:11:59 +00001795 PyErr_SetString(PyExc_KeyError,
1796 "pop(): dictionary is empty");
1797 return NULL;
1798 }
1799 if (!PyString_CheckExact(key) ||
1800 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1801 hash = PyObject_Hash(key);
1802 if (hash == -1)
1803 return NULL;
1804 }
1805 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +00001806 if (ep == NULL)
1807 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001808 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001809 if (deflt) {
1810 Py_INCREF(deflt);
1811 return deflt;
1812 }
Georg Brandl5e9f94a2006-10-29 18:31:45 +00001813 set_key_error(key);
Guido van Rossume027d982002-04-12 15:11:59 +00001814 return NULL;
1815 }
1816 old_key = ep->me_key;
1817 Py_INCREF(dummy);
1818 ep->me_key = dummy;
1819 old_value = ep->me_value;
1820 ep->me_value = NULL;
1821 mp->ma_used--;
1822 Py_DECREF(old_key);
1823 return old_value;
1824}
1825
1826static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001827dict_popitem(dictobject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001828{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001829 Py_ssize_t i = 0;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001830 dictentry *ep;
1831 PyObject *res;
1832
Tim Petersf4b33f62001-06-02 05:42:29 +00001833 /* Allocate the result tuple before checking the size. Believe it
1834 * or not, this allocation could trigger a garbage collection which
1835 * could empty the dict, so if we checked the size first and that
1836 * happened, the result would be an infinite loop (searching for an
1837 * entry that no longer exists). Note that the usual popitem()
1838 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Tim Peters9b10f7e2006-05-30 04:16:25 +00001839 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00001840 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001841 */
1842 res = PyTuple_New(2);
1843 if (res == NULL)
1844 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001845 if (mp->ma_used == 0) {
1846 Py_DECREF(res);
1847 PyErr_SetString(PyExc_KeyError,
1848 "popitem(): dictionary is empty");
1849 return NULL;
1850 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001851 /* Set ep to "the first" dict entry with a value. We abuse the hash
1852 * field of slot 0 to hold a search finger:
1853 * If slot 0 has a value, use slot 0.
1854 * Else slot 0 is being used to hold a search finger,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001855 * and we use its hash value as the first index to look.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001856 */
1857 ep = &mp->ma_table[0];
1858 if (ep->me_value == NULL) {
Tim Peters9b10f7e2006-05-30 04:16:25 +00001859 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001860 /* The hash field may be a real hash value, or it may be a
1861 * legit search finger, or it may be a once-legit search
1862 * finger that's out of bounds now because it wrapped around
1863 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001864 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001865 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001866 i = 1; /* skip slot 0 */
1867 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1868 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001869 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001870 i = 1;
1871 }
1872 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001873 PyTuple_SET_ITEM(res, 0, ep->me_key);
1874 PyTuple_SET_ITEM(res, 1, ep->me_value);
1875 Py_INCREF(dummy);
1876 ep->me_key = dummy;
1877 ep->me_value = NULL;
1878 mp->ma_used--;
1879 assert(mp->ma_table[0].me_value == NULL);
1880 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001881 return res;
1882}
1883
Jeremy Hylton8caad492000-06-23 14:18:11 +00001884static int
1885dict_traverse(PyObject *op, visitproc visit, void *arg)
1886{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001887 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001888 PyObject *pk;
1889 PyObject *pv;
1890
1891 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Woutersc6e55062006-04-15 21:47:09 +00001892 Py_VISIT(pk);
1893 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00001894 }
1895 return 0;
1896}
1897
1898static int
1899dict_tp_clear(PyObject *op)
1900{
1901 PyDict_Clear(op);
1902 return 0;
1903}
1904
Tim Petersf7f88b12000-12-13 23:18:45 +00001905
Raymond Hettinger019a1482004-03-18 02:41:19 +00001906extern PyTypeObject PyDictIterKey_Type; /* Forward */
1907extern PyTypeObject PyDictIterValue_Type; /* Forward */
1908extern PyTypeObject PyDictIterItem_Type; /* Forward */
1909static PyObject *dictiter_new(dictobject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001910
1911static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001912dict_iterkeys(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001913{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001914 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001915}
1916
1917static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001918dict_itervalues(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001919{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001920 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001921}
1922
1923static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001924dict_iteritems(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001925{
Raymond Hettinger019a1482004-03-18 02:41:19 +00001926 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001927}
1928
1929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001930PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00001931"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00001932
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001933PyDoc_STRVAR(contains__doc__,
1934"D.__contains__(k) -> True if D has a key k, else False");
1935
1936PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1937
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001938PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001939"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001940
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001941PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001942"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 +00001943
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001944PyDoc_STRVAR(pop__doc__,
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001945"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
1946If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001947
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001948PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001949"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000019502-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00001951
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001952PyDoc_STRVAR(keys__doc__,
1953"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00001954
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001955PyDoc_STRVAR(items__doc__,
1956"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00001957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001958PyDoc_STRVAR(values__doc__,
1959"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00001960
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001961PyDoc_STRVAR(update__doc__,
Walter Dörwaldd70ad8a2004-05-28 20:59:21 +00001962"D.update(E, **F) -> None. Update D from E and F: for k in E: D[k] = E[k]\n\
1963(if E has keys else: for (k, v) in E: D[k] = v) then: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00001964
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001965PyDoc_STRVAR(fromkeys__doc__,
1966"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1967v defaults to None.");
1968
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001969PyDoc_STRVAR(clear__doc__,
1970"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001971
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001972PyDoc_STRVAR(copy__doc__,
1973"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001974
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001975PyDoc_STRVAR(iterkeys__doc__,
1976"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001977
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001978PyDoc_STRVAR(itervalues__doc__,
1979"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001980
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001981PyDoc_STRVAR(iteritems__doc__,
1982"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001983
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001984static PyMethodDef mapp_methods[] = {
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001985 {"__contains__",(PyCFunction)dict_has_key, METH_O | METH_COEXIST,
1986 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00001987 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001988 getitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001989 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001990 has_key__doc__},
1991 {"get", (PyCFunction)dict_get, METH_VARARGS,
1992 get__doc__},
1993 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1994 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001995 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00001996 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001997 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001998 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001999 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002000 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002001 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002002 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002003 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002004 values__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002005 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002006 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002007 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2008 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002009 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002010 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002011 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002012 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002013 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002014 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002015 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002016 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002017 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002018 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00002019 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002020};
2021
Tim Petersd770ebd2006-06-01 15:50:44 +00002022/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002023int
2024PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002025{
2026 long hash;
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002027 dictobject *mp = (dictobject *)op;
Armin Rigo35f6d362006-06-01 13:19:12 +00002028 dictentry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002029
Tim Peters0ab085c2001-09-14 00:25:33 +00002030 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00002031 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002032 hash = PyObject_Hash(key);
2033 if (hash == -1)
2034 return -1;
2035 }
Armin Rigo35f6d362006-06-01 13:19:12 +00002036 ep = (mp->ma_lookup)(mp, key, hash);
Tim Petersd770ebd2006-06-01 15:50:44 +00002037 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002038}
2039
Raymond Hettinger1bff7962007-02-19 03:04:45 +00002040/* Internal version of PyDict_Contains used when the hash value is already known */
2041int
2042_PyDict_Contains(PyObject *op, PyObject *key, long hash)
2043{
2044 dictobject *mp = (dictobject *)op;
2045 dictentry *ep;
2046
2047 ep = (mp->ma_lookup)(mp, key, hash);
2048 return ep == NULL ? -1 : (ep->me_value != NULL);
2049}
2050
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002051/* Hack to implement "key in dict" */
2052static PySequenceMethods dict_as_sequence = {
Georg Brandl347b3002006-03-30 11:57:00 +00002053 0, /* sq_length */
2054 0, /* sq_concat */
2055 0, /* sq_repeat */
2056 0, /* sq_item */
2057 0, /* sq_slice */
2058 0, /* sq_ass_item */
2059 0, /* sq_ass_slice */
2060 PyDict_Contains, /* sq_contains */
2061 0, /* sq_inplace_concat */
2062 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002063};
2064
Guido van Rossum09e563a2001-05-01 12:10:21 +00002065static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002066dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2067{
2068 PyObject *self;
2069
2070 assert(type != NULL && type->tp_alloc != NULL);
2071 self = type->tp_alloc(type, 0);
2072 if (self != NULL) {
2073 PyDictObject *d = (PyDictObject *)self;
2074 /* It's guaranteed that tp->alloc zeroed out the struct. */
2075 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2076 INIT_NONZERO_DICT_SLOTS(d);
2077 d->ma_lookup = lookdict_string;
2078#ifdef SHOW_CONVERSION_COUNTS
2079 ++created;
2080#endif
2081 }
2082 return self;
2083}
2084
Tim Peters25786c02001-09-02 08:22:48 +00002085static int
2086dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2087{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002088 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002089}
2090
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002091static long
2092dict_nohash(PyObject *self)
2093{
2094 PyErr_SetString(PyExc_TypeError, "dict objects are unhashable");
2095 return -1;
2096}
2097
Tim Peters6d6c1a32001-08-02 04:15:00 +00002098static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00002099dict_iter(dictobject *dict)
2100{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002101 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002102}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002103
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002104PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00002105"dict() -> new empty dictionary.\n"
2106"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00002107" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002108"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002109" d = {}\n"
2110" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002111" d[k] = v\n"
2112"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2113" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002114
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002115PyTypeObject PyDict_Type = {
2116 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002117 0,
Tim Petersa427a2b2001-10-29 22:25:45 +00002118 "dict",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002119 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002120 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00002121 (destructor)dict_dealloc, /* tp_dealloc */
2122 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002123 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00002124 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00002125 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00002126 (reprfunc)dict_repr, /* tp_repr */
2127 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002128 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00002129 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002130 dict_nohash, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00002131 0, /* tp_call */
2132 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002133 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00002134 0, /* tp_setattro */
2135 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002136 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00002137 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00002138 dictionary_doc, /* tp_doc */
Georg Brandl347b3002006-03-30 11:57:00 +00002139 dict_traverse, /* tp_traverse */
2140 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00002141 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002142 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00002143 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002144 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002145 mapp_methods, /* tp_methods */
2146 0, /* tp_members */
2147 0, /* tp_getset */
2148 0, /* tp_base */
2149 0, /* tp_dict */
2150 0, /* tp_descr_get */
2151 0, /* tp_descr_set */
2152 0, /* tp_dictoffset */
Georg Brandl347b3002006-03-30 11:57:00 +00002153 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002154 PyType_GenericAlloc, /* tp_alloc */
2155 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002156 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002157};
2158
Guido van Rossum3cca2451997-05-16 14:23:33 +00002159/* For backward compatibility with old dictionary interface */
2160
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002161PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002162PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002163{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002164 PyObject *kv, *rv;
2165 kv = PyString_FromString(key);
2166 if (kv == NULL)
2167 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002168 rv = PyDict_GetItem(v, kv);
2169 Py_DECREF(kv);
2170 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002171}
2172
2173int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002174PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002175{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002176 PyObject *kv;
2177 int err;
2178 kv = PyString_FromString(key);
2179 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002180 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00002181 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002182 err = PyDict_SetItem(v, kv, item);
2183 Py_DECREF(kv);
2184 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002185}
2186
2187int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002188PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002189{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002190 PyObject *kv;
2191 int err;
2192 kv = PyString_FromString(key);
2193 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002194 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002195 err = PyDict_DelItem(v, kv);
2196 Py_DECREF(kv);
2197 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002198}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002199
Raymond Hettinger019a1482004-03-18 02:41:19 +00002200/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002201
2202typedef struct {
2203 PyObject_HEAD
Guido van Rossum2147df72002-07-16 20:30:22 +00002204 dictobject *di_dict; /* Set to NULL when iterator is exhausted */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002205 Py_ssize_t di_used;
2206 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002207 PyObject* di_result; /* reusable result tuple for iteritems */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002208 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002209} dictiterobject;
2210
2211static PyObject *
Raymond Hettinger019a1482004-03-18 02:41:19 +00002212dictiter_new(dictobject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002213{
2214 dictiterobject *di;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002215 di = PyObject_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002216 if (di == NULL)
2217 return NULL;
2218 Py_INCREF(dict);
2219 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002220 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002221 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002222 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002223 if (itertype == &PyDictIterItem_Type) {
2224 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2225 if (di->di_result == NULL) {
2226 Py_DECREF(di);
2227 return NULL;
2228 }
2229 }
2230 else
2231 di->di_result = NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002232 return (PyObject *)di;
2233}
2234
2235static void
2236dictiter_dealloc(dictiterobject *di)
2237{
Guido van Rossum2147df72002-07-16 20:30:22 +00002238 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002239 Py_XDECREF(di->di_result);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002240 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002241}
2242
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002243static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002244dictiter_len(dictiterobject *di)
2245{
Tim Peters9b10f7e2006-05-30 04:16:25 +00002246 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002247 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002248 len = di->len;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002249 return PyInt_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002250}
2251
Armin Rigof5b3e362006-02-11 21:32:43 +00002252PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002253
2254static PyMethodDef dictiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002255 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002256 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002257};
2258
Raymond Hettinger019a1482004-03-18 02:41:19 +00002259static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002260{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002261 PyObject *key;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002262 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002263 register dictentry *ep;
2264 dictobject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002265
Raymond Hettinger019a1482004-03-18 02:41:19 +00002266 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002267 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002268 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002269
Raymond Hettinger019a1482004-03-18 02:41:19 +00002270 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002271 PyErr_SetString(PyExc_RuntimeError,
2272 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002273 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002274 return NULL;
2275 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002276
Raymond Hettinger019a1482004-03-18 02:41:19 +00002277 i = di->di_pos;
2278 if (i < 0)
2279 goto fail;
2280 ep = d->ma_table;
2281 mask = d->ma_mask;
2282 while (i <= mask && ep[i].me_value == NULL)
2283 i++;
2284 di->di_pos = i+1;
2285 if (i > mask)
2286 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002287 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002288 key = ep[i].me_key;
2289 Py_INCREF(key);
2290 return key;
2291
2292fail:
2293 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002294 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002295 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002296}
2297
Raymond Hettinger019a1482004-03-18 02:41:19 +00002298PyTypeObject PyDictIterKey_Type = {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002299 PyObject_HEAD_INIT(&PyType_Type)
2300 0, /* ob_size */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002301 "dictionary-keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002302 sizeof(dictiterobject), /* tp_basicsize */
2303 0, /* tp_itemsize */
2304 /* methods */
2305 (destructor)dictiter_dealloc, /* tp_dealloc */
2306 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002307 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002308 0, /* tp_setattr */
2309 0, /* tp_compare */
2310 0, /* tp_repr */
2311 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002312 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002313 0, /* tp_as_mapping */
2314 0, /* tp_hash */
2315 0, /* tp_call */
2316 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002317 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002318 0, /* tp_setattro */
2319 0, /* tp_as_buffer */
2320 Py_TPFLAGS_DEFAULT, /* tp_flags */
2321 0, /* tp_doc */
2322 0, /* tp_traverse */
2323 0, /* tp_clear */
2324 0, /* tp_richcompare */
2325 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002326 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002327 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002328 dictiter_methods, /* tp_methods */
2329 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002330};
2331
2332static PyObject *dictiter_iternextvalue(dictiterobject *di)
2333{
2334 PyObject *value;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002335 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002336 register dictentry *ep;
2337 dictobject *d = di->di_dict;
2338
2339 if (d == NULL)
2340 return NULL;
2341 assert (PyDict_Check(d));
2342
2343 if (di->di_used != d->ma_used) {
2344 PyErr_SetString(PyExc_RuntimeError,
2345 "dictionary changed size during iteration");
2346 di->di_used = -1; /* Make this state sticky */
2347 return NULL;
2348 }
2349
2350 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002351 mask = d->ma_mask;
2352 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002353 goto fail;
2354 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002355 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002356 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002357 if (i > mask)
2358 goto fail;
2359 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002360 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002361 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002362 Py_INCREF(value);
2363 return value;
2364
2365fail:
2366 Py_DECREF(d);
2367 di->di_dict = NULL;
2368 return NULL;
2369}
2370
2371PyTypeObject PyDictIterValue_Type = {
2372 PyObject_HEAD_INIT(&PyType_Type)
2373 0, /* ob_size */
2374 "dictionary-valueiterator", /* tp_name */
2375 sizeof(dictiterobject), /* tp_basicsize */
2376 0, /* tp_itemsize */
2377 /* methods */
2378 (destructor)dictiter_dealloc, /* tp_dealloc */
2379 0, /* tp_print */
2380 0, /* tp_getattr */
2381 0, /* tp_setattr */
2382 0, /* tp_compare */
2383 0, /* tp_repr */
2384 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002385 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002386 0, /* tp_as_mapping */
2387 0, /* tp_hash */
2388 0, /* tp_call */
2389 0, /* tp_str */
2390 PyObject_GenericGetAttr, /* tp_getattro */
2391 0, /* tp_setattro */
2392 0, /* tp_as_buffer */
2393 Py_TPFLAGS_DEFAULT, /* tp_flags */
2394 0, /* tp_doc */
2395 0, /* tp_traverse */
2396 0, /* tp_clear */
2397 0, /* tp_richcompare */
2398 0, /* tp_weaklistoffset */
2399 PyObject_SelfIter, /* tp_iter */
2400 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002401 dictiter_methods, /* tp_methods */
2402 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002403};
2404
2405static PyObject *dictiter_iternextitem(dictiterobject *di)
2406{
2407 PyObject *key, *value, *result = di->di_result;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002408 register Py_ssize_t i, mask;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002409 register dictentry *ep;
2410 dictobject *d = di->di_dict;
2411
2412 if (d == NULL)
2413 return NULL;
2414 assert (PyDict_Check(d));
2415
2416 if (di->di_used != d->ma_used) {
2417 PyErr_SetString(PyExc_RuntimeError,
2418 "dictionary changed size during iteration");
2419 di->di_used = -1; /* Make this state sticky */
2420 return NULL;
2421 }
2422
2423 i = di->di_pos;
2424 if (i < 0)
2425 goto fail;
2426 ep = d->ma_table;
2427 mask = d->ma_mask;
2428 while (i <= mask && ep[i].me_value == NULL)
2429 i++;
2430 di->di_pos = i+1;
2431 if (i > mask)
2432 goto fail;
2433
2434 if (result->ob_refcnt == 1) {
2435 Py_INCREF(result);
2436 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2437 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2438 } else {
2439 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002440 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002441 return NULL;
2442 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002443 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002444 key = ep[i].me_key;
2445 value = ep[i].me_value;
2446 Py_INCREF(key);
2447 Py_INCREF(value);
2448 PyTuple_SET_ITEM(result, 0, key);
2449 PyTuple_SET_ITEM(result, 1, value);
2450 return result;
2451
2452fail:
2453 Py_DECREF(d);
2454 di->di_dict = NULL;
2455 return NULL;
2456}
2457
2458PyTypeObject PyDictIterItem_Type = {
2459 PyObject_HEAD_INIT(&PyType_Type)
2460 0, /* ob_size */
2461 "dictionary-itemiterator", /* tp_name */
2462 sizeof(dictiterobject), /* tp_basicsize */
2463 0, /* tp_itemsize */
2464 /* methods */
2465 (destructor)dictiter_dealloc, /* tp_dealloc */
2466 0, /* tp_print */
2467 0, /* tp_getattr */
2468 0, /* tp_setattr */
2469 0, /* tp_compare */
2470 0, /* tp_repr */
2471 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002472 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002473 0, /* tp_as_mapping */
2474 0, /* tp_hash */
2475 0, /* tp_call */
2476 0, /* tp_str */
2477 PyObject_GenericGetAttr, /* tp_getattro */
2478 0, /* tp_setattro */
2479 0, /* tp_as_buffer */
2480 Py_TPFLAGS_DEFAULT, /* tp_flags */
2481 0, /* tp_doc */
2482 0, /* tp_traverse */
2483 0, /* tp_clear */
2484 0, /* tp_richcompare */
2485 0, /* tp_weaklistoffset */
2486 PyObject_SelfIter, /* tp_iter */
2487 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002488 dictiter_methods, /* tp_methods */
2489 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002490};