blob: f0e93f8c9a7a6d3a19637e4bd21278e66822bb94 [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,
5 describing explorations into dictionary design and optimization.
6 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
Tim Peterseb28ef22001-06-02 05:27:19 +000015/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000016#undef SHOW_CONVERSION_COUNTS
17
Tim Peterseb28ef22001-06-02 05:27:19 +000018/* See large comment block below. This must be >= 1. */
19#define PERTURB_SHIFT 5
20
Guido van Rossum16e93a81997-01-28 00:00:11 +000021/*
Tim Peterseb28ef22001-06-02 05:27:19 +000022Major subtleties ahead: Most hash schemes depend on having a "good" hash
23function, in the sense of simulating randomness. Python doesn't: its most
24important hash functions (for strings and ints) are very regular in common
25cases:
Tim Peters15d49292001-05-27 07:39:22 +000026
Tim Peterseb28ef22001-06-02 05:27:19 +000027>>> map(hash, (0, 1, 2, 3))
28[0, 1, 2, 3]
29>>> map(hash, ("namea", "nameb", "namec", "named"))
30[-1658398457, -1658398460, -1658398459, -1658398462]
31>>>
Tim Peters15d49292001-05-27 07:39:22 +000032
Tim Peterseb28ef22001-06-02 05:27:19 +000033This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
34the low-order i bits as the initial table index is extremely fast, and there
35are no collisions at all for dicts indexed by a contiguous range of ints.
36The same is approximately true when keys are "consecutive" strings. So this
37gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000038
Tim Peterseb28ef22001-06-02 05:27:19 +000039OTOH, when collisions occur, the tendency to fill contiguous slices of the
40hash table makes a good collision resolution strategy crucial. Taking only
41the last i bits of the hash code is also vulnerable: for example, consider
42[i << 16 for i in range(20000)] as a set of keys. Since ints are their own
43hash codes, and this fits in a dict of size 2**15, the last 15 bits of every
44hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000045
Tim Peterseb28ef22001-06-02 05:27:19 +000046But catering to unusual cases should not slow the usual ones, so we just take
47the last i bits anyway. It's up to collision resolution to do the rest. If
48we *usually* find the key we're looking for on the first try (and, it turns
49out, we usually do -- the table load factor is kept under 2/3, so the odds
50are solidly in our favor), then it makes best sense to keep the initial index
51computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000052
Tim Peterseb28ef22001-06-02 05:27:19 +000053The first half of collision resolution is to visit table indices via this
54recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000055
Tim Peterseb28ef22001-06-02 05:27:19 +000056 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000057
Tim Peterseb28ef22001-06-02 05:27:19 +000058For any initial j in range(2**i), repeating that 2**i times generates each
59int in range(2**i) exactly once (see any text on random-number generation for
60proof). By itself, this doesn't help much: like linear probing (setting
61j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
62order. This would be bad, except that's not the only thing we do, and it's
63actually *good* in the common cases where hash keys are consecutive. In an
64example that's really too small to make this entirely clear, for a table of
65size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000066
Tim Peterseb28ef22001-06-02 05:27:19 +000067 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
68
69If two things come in at index 5, the first place we look after is index 2,
70not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
71Linear probing is deadly in this case because there the fixed probe order
72is the *same* as the order consecutive keys are likely to arrive. But it's
73extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
74and certain that consecutive hash codes do not.
75
76The other half of the strategy is to get the other bits of the hash code
77into play. This is done by initializing a (unsigned) vrbl "perturb" to the
78full hash code, and changing the recurrence to:
79
80 j = (5*j) + 1 + perturb;
81 perturb >>= PERTURB_SHIFT;
82 use j % 2**i as the next table index;
83
84Now the probe sequence depends (eventually) on every bit in the hash code,
85and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
86because it quickly magnifies small differences in the bits that didn't affect
87the initial index. Note that because perturb is unsigned, if the recurrence
88is executed often enough perturb eventually becomes and remains 0. At that
89point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
90that's certain to find an empty slot eventually (since it generates every int
91in range(2**i), and we make sure there's always at least one empty slot).
92
93Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
94small so that the high bits of the hash code continue to affect the probe
95sequence across iterations; but you want it large so that in really bad cases
96the high-order hash bits have an effect on early iterations. 5 was "the
97best" in minimizing total collisions across experiments Tim Peters ran (on
98both normal and pathological cases), but 4 and 6 weren't significantly worse.
99
100Historical: Reimer Behrends contributed the idea of using a polynomial-based
101approach, using repeated multiplication by x in GF(2**n) where an irreducible
102polynomial for each table size was chosen such that x was a primitive root.
103Christian Tismer later extended that to use division by x instead, as an
104efficient way to get the high bits of the hash code into play. This scheme
105also gave excellent collision statistics, but was more expensive: two
106if-tests were required inside the loop; computing "the next" index took about
107the same number of operations but without as much potential parallelism
108(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
109above, and then shifting perturb can be done while the table index is being
110masked); and the dictobject struct required a member to hold the table's
111polynomial. In Tim's experiments the current scheme ran faster, produced
112equally good collision statistics, needed less code & used less memory.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000113*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000114
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000115/* Object used as dummy key to fill deleted entries */
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000116static PyObject *dummy; /* Initialized by first call to newdictobject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000117
Fred Drake1bff34a2000-08-31 19:31:38 +0000118/* forward declarations */
119static dictentry *
120lookdict_string(dictobject *mp, PyObject *key, long hash);
121
122#ifdef SHOW_CONVERSION_COUNTS
123static long created = 0L;
124static long converted = 0L;
125
126static void
127show_counts(void)
128{
129 fprintf(stderr, "created %ld string dicts\n", created);
130 fprintf(stderr, "converted %ld to normal dicts\n", converted);
131 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
132}
133#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000134
Tim Peters6d6c1a32001-08-02 04:15:00 +0000135/* Initialization macros.
136 There are two ways to create a dict: PyDict_New() is the main C API
137 function, and the tp_new slot maps to dict_new(). In the latter case we
138 can save a little time over what PyDict_New does because it's guaranteed
139 that the PyDictObject struct is already zeroed out.
140 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
141 an excellent reason not to).
142*/
143
144#define INIT_NONZERO_DICT_SLOTS(mp) do { \
Tim Petersdea48ec2001-05-22 20:40:22 +0000145 (mp)->ma_table = (mp)->ma_smalltable; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000146 (mp)->ma_mask = PyDict_MINSIZE - 1; \
147 } while(0)
148
149#define EMPTY_TO_MINSIZE(mp) do { \
150 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000151 (mp)->ma_used = (mp)->ma_fill = 0; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000152 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000153 } while(0)
154
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000156PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000157{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000158 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000159 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000161 if (dummy == NULL)
162 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000163#ifdef SHOW_CONVERSION_COUNTS
164 Py_AtExit(show_counts);
165#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000166 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000167 mp = PyObject_GC_New(dictobject, &PyDict_Type);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000168 if (mp == NULL)
169 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170 EMPTY_TO_MINSIZE(mp);
Fred Drake1bff34a2000-08-31 19:31:38 +0000171 mp->ma_lookup = lookdict_string;
172#ifdef SHOW_CONVERSION_COUNTS
173 ++created;
174#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000175 _PyObject_GC_TRACK(mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000176 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000177}
178
179/*
180The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000181This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000182Open addressing is preferred over chaining since the link overhead for
183chaining would be substantial (100% with typical malloc overhead).
184
Tim Peterseb28ef22001-06-02 05:27:19 +0000185The initial probe index is computed as hash mod the table size. Subsequent
186probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000187
188All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000189
Tim Peterseb28ef22001-06-02 05:27:19 +0000190(The details in this version are due to Tim Peters, building on many past
191contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
192Christian Tismer).
Fred Drake1bff34a2000-08-31 19:31:38 +0000193
194This function must never return NULL; failures are indicated by returning
195a dictentry* for which the me_value field is NULL. Exceptions are never
196reported by this function, and outstanding exceptions are maintained.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000197*/
Tim Peterseb28ef22001-06-02 05:27:19 +0000198
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000199static dictentry *
Tim Peters1f5871e2000-07-04 17:44:48 +0000200lookdict(dictobject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000201{
Guido van Rossum16e93a81997-01-28 00:00:11 +0000202 register int i;
Tim Peterseb28ef22001-06-02 05:27:19 +0000203 register unsigned int perturb;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000204 register dictentry *freeslot;
Tim Petersafb6ae82001-06-04 21:00:21 +0000205 register unsigned int mask = mp->ma_mask;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000206 dictentry *ep0 = mp->ma_table;
207 register dictentry *ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000208 register int restore_error;
209 register int checked_error;
Fred Drakec88b99c2000-08-31 19:04:07 +0000210 register int cmp;
211 PyObject *err_type, *err_value, *err_tb;
Tim Peters453163d2001-06-03 04:54:32 +0000212 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000213
Tim Peters2f228e72001-05-13 00:19:31 +0000214 i = hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000215 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000216 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000217 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000218
219 restore_error = checked_error = 0;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000220 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000221 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000222 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000223 if (ep->me_hash == hash) {
224 /* error can't have been checked yet */
225 checked_error = 1;
226 if (PyErr_Occurred()) {
227 restore_error = 1;
228 PyErr_Fetch(&err_type, &err_value, &err_tb);
229 }
Tim Peters453163d2001-06-03 04:54:32 +0000230 startkey = ep->me_key;
231 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000232 if (cmp < 0)
Guido van Rossumb9324202001-01-18 00:39:02 +0000233 PyErr_Clear();
Tim Peters453163d2001-06-03 04:54:32 +0000234 if (ep0 == mp->ma_table && ep->me_key == startkey) {
235 if (cmp > 0)
236 goto Done;
237 }
238 else {
239 /* The compare did major nasty stuff to the
240 * dict: start over.
241 * XXX A clever adversary could prevent this
242 * XXX from terminating.
243 */
244 ep = lookdict(mp, key, hash);
245 goto Done;
246 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000247 }
248 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000249 }
Tim Peters15d49292001-05-27 07:39:22 +0000250
Tim Peters342c65e2001-05-13 06:43:53 +0000251 /* In the loop, me_key == dummy is by far (factor of 100s) the
252 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000253 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
254 i = (i << 2) + i + perturb + 1;
255 ep = &ep0[i & mask];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000256 if (ep->me_key == NULL) {
Tim Peters7b5d0af2001-06-03 04:14:43 +0000257 if (freeslot != NULL)
258 ep = freeslot;
259 break;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000260 }
Tim Peters7b5d0af2001-06-03 04:14:43 +0000261 if (ep->me_key == key)
262 break;
263 if (ep->me_hash == hash && ep->me_key != dummy) {
Fred Drakec88b99c2000-08-31 19:04:07 +0000264 if (!checked_error) {
265 checked_error = 1;
266 if (PyErr_Occurred()) {
267 restore_error = 1;
268 PyErr_Fetch(&err_type, &err_value,
269 &err_tb);
270 }
271 }
Tim Peters453163d2001-06-03 04:54:32 +0000272 startkey = ep->me_key;
273 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000274 if (cmp < 0)
Guido van Rossumb9324202001-01-18 00:39:02 +0000275 PyErr_Clear();
Tim Peters453163d2001-06-03 04:54:32 +0000276 if (ep0 == mp->ma_table && ep->me_key == startkey) {
277 if (cmp > 0)
278 break;
279 }
280 else {
281 /* The compare did major nasty stuff to the
282 * dict: start over.
283 * XXX A clever adversary could prevent this
284 * XXX from terminating.
285 */
286 ep = lookdict(mp, key, hash);
287 break;
288 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000289 }
Tim Peters342c65e2001-05-13 06:43:53 +0000290 else if (ep->me_key == dummy && freeslot == NULL)
291 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000292 }
Tim Peters7b5d0af2001-06-03 04:14:43 +0000293
294Done:
295 if (restore_error)
296 PyErr_Restore(err_type, err_value, err_tb);
297 return ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000298}
299
300/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000301 * Hacked up version of lookdict which can assume keys are always strings;
302 * this assumption allows testing for errors during PyObject_Compare() to
303 * be dropped; string-string comparisons never raise exceptions. This also
304 * means we don't need to go through PyObject_Compare(); we can always use
Martin v. Löwiscd353062001-05-24 16:56:35 +0000305 * _PyString_Eq directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000306 *
Tim Peters0ab085c2001-09-14 00:25:33 +0000307 * This is valuable because the general-case error handling in lookdict() is
308 * expensive, and dicts with pure-string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000309 */
310static dictentry *
311lookdict_string(dictobject *mp, PyObject *key, register long hash)
312{
313 register int i;
Tim Peterseb28ef22001-06-02 05:27:19 +0000314 register unsigned int perturb;
Fred Drake1bff34a2000-08-31 19:31:38 +0000315 register dictentry *freeslot;
Tim Petersafb6ae82001-06-04 21:00:21 +0000316 register unsigned int mask = mp->ma_mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000317 dictentry *ep0 = mp->ma_table;
318 register dictentry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000319
Tim Peters0ab085c2001-09-14 00:25:33 +0000320 /* Make sure this function doesn't have to handle non-string keys,
321 including subclasses of str; e.g., one reason to subclass
322 strings is to override __eq__, and for speed we don't cater to
323 that here. */
324 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000325#ifdef SHOW_CONVERSION_COUNTS
326 ++converted;
327#endif
328 mp->ma_lookup = lookdict;
329 return lookdict(mp, key, hash);
330 }
Tim Peters2f228e72001-05-13 00:19:31 +0000331 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000332 ep = &ep0[i];
333 if (ep->me_key == NULL || ep->me_key == key)
334 return ep;
335 if (ep->me_key == dummy)
336 freeslot = ep;
337 else {
338 if (ep->me_hash == hash
Martin v. Löwiscd353062001-05-24 16:56:35 +0000339 && _PyString_Eq(ep->me_key, key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000340 return ep;
341 }
342 freeslot = NULL;
343 }
Tim Peters15d49292001-05-27 07:39:22 +0000344
Tim Peters342c65e2001-05-13 06:43:53 +0000345 /* In the loop, me_key == dummy is by far (factor of 100s) the
346 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000347 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
348 i = (i << 2) + i + perturb + 1;
349 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000350 if (ep->me_key == NULL)
351 return freeslot == NULL ? ep : freeslot;
352 if (ep->me_key == key
353 || (ep->me_hash == hash
354 && ep->me_key != dummy
Martin v. Löwiscd353062001-05-24 16:56:35 +0000355 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000356 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000357 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000358 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000359 }
360}
361
362/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000363Internal routine to insert a new item into the table.
364Used both by the internal resize routine and by the public insert routine.
365Eats a reference to key and one to value.
366*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000367static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000368insertdict(register dictobject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000369{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000371 register dictentry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000372 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
373
374 assert(mp->ma_lookup != NULL);
375 ep = mp->ma_lookup(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000376 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000377 old_value = ep->me_value;
378 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379 Py_DECREF(old_value); /* which **CAN** re-enter */
380 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000381 }
382 else {
383 if (ep->me_key == NULL)
384 mp->ma_fill++;
385 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 Py_DECREF(ep->me_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000387 ep->me_key = key;
388 ep->me_hash = hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000389 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000390 mp->ma_used++;
391 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000392}
393
394/*
395Restructure the table by allocating a new table and reinserting all
396items again. When entries have been deleted, the new table may
397actually be smaller than the old one.
398*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000399static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000400dictresize(dictobject *mp, int minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000401{
Tim Peterseb28ef22001-06-02 05:27:19 +0000402 int newsize;
Tim Peters0c6010b2001-05-23 23:33:57 +0000403 dictentry *oldtable, *newtable, *ep;
404 int i;
405 int is_oldtable_malloced;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000406 dictentry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000407
408 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000409
Tim Peterseb28ef22001-06-02 05:27:19 +0000410 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000411 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000412 newsize <= minused && newsize > 0;
413 newsize <<= 1)
414 ;
415 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000417 return -1;
418 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000419
420 /* Get space for a new table. */
421 oldtable = mp->ma_table;
422 assert(oldtable != NULL);
423 is_oldtable_malloced = oldtable != mp->ma_smalltable;
424
Tim Peters6d6c1a32001-08-02 04:15:00 +0000425 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000426 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000427 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000428 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000429 if (mp->ma_fill == mp->ma_used) {
430 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000431 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000432 }
433 /* We're not going to resize it, but rebuild the
434 table anyway to purge old dummy entries.
435 Subtle: This is *necessary* if fill==size,
436 as lookdict needs at least one virgin slot to
437 terminate failing searches. If fill < size, it's
438 merely desirable, as dummies slow searches. */
439 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000440 memcpy(small_copy, oldtable, sizeof(small_copy));
441 oldtable = small_copy;
442 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000443 }
444 else {
445 newtable = PyMem_NEW(dictentry, newsize);
446 if (newtable == NULL) {
447 PyErr_NoMemory();
448 return -1;
449 }
450 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000451
452 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000453 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000454 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000455 mp->ma_mask = newsize - 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000456 memset(newtable, 0, sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000457 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000458 i = mp->ma_fill;
459 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000460
Tim Peters19283142001-05-17 22:25:34 +0000461 /* Copy the data over; this is refcount-neutral for active entries;
462 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000463 for (ep = oldtable; i > 0; ep++) {
464 if (ep->me_value != NULL) { /* active entry */
465 --i;
Tim Peters19283142001-05-17 22:25:34 +0000466 insertdict(mp, ep->me_key, ep->me_hash, ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000467 }
Tim Peters19283142001-05-17 22:25:34 +0000468 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000469 --i;
Tim Peters19283142001-05-17 22:25:34 +0000470 assert(ep->me_key == dummy);
471 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000472 }
Tim Peters19283142001-05-17 22:25:34 +0000473 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000474 }
475
Tim Peters0c6010b2001-05-23 23:33:57 +0000476 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000477 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000478 return 0;
479}
480
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000481PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000482PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000483{
484 long hash;
Fred Drake1bff34a2000-08-31 19:31:38 +0000485 dictobject *mp = (dictobject *)op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 if (!PyDict_Check(op)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000487 return NULL;
488 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000489 if (!PyString_CheckExact(key) ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000491 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000493 if (hash == -1) {
494 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000495 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000496 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000497 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000498 return (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000499}
500
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000501/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
502 * dictionary if it is merely replacing the value for an existing key.
503 * This is means that it's safe to loop over a dictionary with
504 * PyDict_Next() and occasionally replace a value -- but you can't
505 * insert new keys or remove them.
506 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000507int
Tim Peters1f5871e2000-07-04 17:44:48 +0000508PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000509{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000510 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000511 register long hash;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000512 register int n_used;
513
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 if (!PyDict_Check(op)) {
515 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000516 return -1;
517 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000518 mp = (dictobject *)op;
Tim Peters0ab085c2001-09-14 00:25:33 +0000519 if (PyString_CheckExact(key)) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000520 hash = ((PyStringObject *)key)->ob_shash;
521 if (hash == -1)
522 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000523 }
Tim Peters1f7df352002-03-29 03:29:08 +0000524 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000526 if (hash == -1)
527 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000528 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000529 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000530 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 Py_INCREF(value);
532 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000533 insertdict(mp, key, hash, value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000534 /* If we added a key, we can safely resize. Otherwise skip this!
535 * If fill >= 2/3 size, adjust size. Normally, this doubles the
536 * size, but it's also possible for the dict to shrink (if ma_fill is
537 * much larger than ma_used, meaning a lot of dict keys have been
538 * deleted).
539 */
Tim Petersafb6ae82001-06-04 21:00:21 +0000540 if (mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2) {
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000541 if (dictresize(mp, mp->ma_used*2) != 0)
542 return -1;
543 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000544 return 0;
545}
546
547int
Tim Peters1f5871e2000-07-04 17:44:48 +0000548PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000549{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000550 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000551 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000552 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000554
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 if (!PyDict_Check(op)) {
556 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000557 return -1;
558 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000559 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000560 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000562 if (hash == -1)
563 return -1;
564 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000565 mp = (dictobject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000566 ep = (mp->ma_lookup)(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000567 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000569 return -1;
570 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000571 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000573 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000574 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000575 ep->me_value = NULL;
576 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000577 Py_DECREF(old_value);
578 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000579 return 0;
580}
581
Guido van Rossum25831651993-05-19 14:50:45 +0000582void
Tim Peters1f5871e2000-07-04 17:44:48 +0000583PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000584{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000585 dictobject *mp;
Tim Petersdea48ec2001-05-22 20:40:22 +0000586 dictentry *ep, *table;
587 int table_is_malloced;
588 int fill;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 dictentry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000590#ifdef Py_DEBUG
591 int i, n;
592#endif
593
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000595 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000596 mp = (dictobject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000597#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000598 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000599 i = 0;
600#endif
601
602 table = mp->ma_table;
603 assert(table != NULL);
604 table_is_malloced = table != mp->ma_smalltable;
605
606 /* This is delicate. During the process of clearing the dict,
607 * decrefs can cause the dict to mutate. To avoid fatal confusion
608 * (voice of experience), we have to make the dict empty before
609 * clearing the slots, and never refer to anything via mp->xxx while
610 * clearing.
611 */
612 fill = mp->ma_fill;
613 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000614 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000615
616 else if (fill > 0) {
617 /* It's a small table with something that needs to be cleared.
618 * Afraid the only safe way is to copy the dict entries into
619 * another small table first.
620 */
621 memcpy(small_copy, table, sizeof(small_copy));
622 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000623 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000624 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000625 /* else it's a small table that's already empty */
626
627 /* Now we can finally clear things. If C had refcounts, we could
628 * assert that the refcount on table is 1 now, i.e. that this function
629 * has unique access to it, so decref side-effects can't alter it.
630 */
631 for (ep = table; fill > 0; ++ep) {
632#ifdef Py_DEBUG
633 assert(i < n);
634 ++i;
635#endif
636 if (ep->me_key) {
637 --fill;
638 Py_DECREF(ep->me_key);
639 Py_XDECREF(ep->me_value);
640 }
641#ifdef Py_DEBUG
642 else
643 assert(ep->me_value == NULL);
644#endif
645 }
646
647 if (table_is_malloced)
648 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000649}
650
Tim Peters080c88b2003-02-15 03:01:11 +0000651/*
652 * Iterate over a dict. Use like so:
653 *
654 * int i;
655 * PyObject *key, *value;
656 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000657 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000658 * Refer to borrowed references in key and value.
659 * }
660 *
661 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000662 * mutates the dict. One exception: it is safe if the loop merely changes
663 * the values associated with the keys (but doesn't insert new keys or
664 * delete keys), via PyDict_SetItem().
665 */
Guido van Rossum25831651993-05-19 14:50:45 +0000666int
Tim Peters1f5871e2000-07-04 17:44:48 +0000667PyDict_Next(PyObject *op, int *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000668{
Guido van Rossum25831651993-05-19 14:50:45 +0000669 int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000670 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000672 return 0;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000673 mp = (dictobject *)op;
Guido van Rossum25831651993-05-19 14:50:45 +0000674 i = *ppos;
675 if (i < 0)
676 return 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000677 while (i <= mp->ma_mask && mp->ma_table[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000678 i++;
679 *ppos = i+1;
Tim Petersafb6ae82001-06-04 21:00:21 +0000680 if (i > mp->ma_mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000681 return 0;
682 if (pkey)
683 *pkey = mp->ma_table[i].me_key;
684 if (pvalue)
685 *pvalue = mp->ma_table[i].me_value;
686 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000687}
688
689/* Methods */
690
691static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000692dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000693{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000694 register dictentry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000695 int fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000696 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000697 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000698 for (ep = mp->ma_table; fill > 0; ep++) {
699 if (ep->me_key) {
700 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000702 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000703 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000704 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000705 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000706 PyMem_DEL(mp->ma_table);
Guido van Rossum9475a232001-10-05 20:51:39 +0000707 mp->ob_type->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000708 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000709}
710
711static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000712dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000713{
714 register int i;
715 register int any;
Guido van Rossum255443b1998-04-10 22:47:14 +0000716
717 i = Py_ReprEnter((PyObject*)mp);
718 if (i != 0) {
719 if (i < 0)
720 return i;
721 fprintf(fp, "{...}");
722 return 0;
723 }
724
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000725 fprintf(fp, "{");
726 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000727 for (i = 0; i <= mp->ma_mask; i++) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000728 dictentry *ep = mp->ma_table + i;
729 PyObject *pvalue = ep->me_value;
730 if (pvalue != NULL) {
731 /* Prevent PyObject_Repr from deleting value during
732 key format */
733 Py_INCREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000734 if (any++ > 0)
735 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000736 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000737 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000738 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000739 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000740 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000741 fprintf(fp, ": ");
Tim Peters19b77cf2001-06-02 08:27:39 +0000742 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000743 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000744 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000745 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000746 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000747 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000748 }
749 }
750 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000751 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000752 return 0;
753}
754
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000756dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000757{
Tim Petersc6057842001-06-16 07:52:53 +0000758 int i;
Tim Petersa7259592001-06-16 05:11:17 +0000759 PyObject *s, *temp, *colon = NULL;
760 PyObject *pieces = NULL, *result = NULL;
761 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +0000762
Tim Petersa7259592001-06-16 05:11:17 +0000763 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +0000764 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000765 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +0000766 }
767
Tim Petersa7259592001-06-16 05:11:17 +0000768 if (mp->ma_used == 0) {
769 result = PyString_FromString("{}");
770 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000771 }
Tim Petersa7259592001-06-16 05:11:17 +0000772
773 pieces = PyList_New(0);
774 if (pieces == NULL)
775 goto Done;
776
777 colon = PyString_FromString(": ");
778 if (colon == NULL)
779 goto Done;
780
781 /* Do repr() on each key+value pair, and insert ": " between them.
782 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +0000783 i = 0;
784 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +0000785 int status;
786 /* Prevent repr from deleting value during key format. */
787 Py_INCREF(value);
788 s = PyObject_Repr(key);
789 PyString_Concat(&s, colon);
790 PyString_ConcatAndDel(&s, PyObject_Repr(value));
791 Py_DECREF(value);
792 if (s == NULL)
793 goto Done;
794 status = PyList_Append(pieces, s);
795 Py_DECREF(s); /* append created a new ref */
796 if (status < 0)
797 goto Done;
798 }
799
800 /* Add "{}" decorations to the first and last items. */
801 assert(PyList_GET_SIZE(pieces) > 0);
802 s = PyString_FromString("{");
803 if (s == NULL)
804 goto Done;
805 temp = PyList_GET_ITEM(pieces, 0);
806 PyString_ConcatAndDel(&s, temp);
807 PyList_SET_ITEM(pieces, 0, s);
808 if (s == NULL)
809 goto Done;
810
811 s = PyString_FromString("}");
812 if (s == NULL)
813 goto Done;
814 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
815 PyString_ConcatAndDel(&temp, s);
816 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
817 if (temp == NULL)
818 goto Done;
819
820 /* Paste them all together with ", " between. */
821 s = PyString_FromString(", ");
822 if (s == NULL)
823 goto Done;
824 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +0000825 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000826
827Done:
828 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000829 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +0000830 Py_ReprLeave((PyObject *)mp);
831 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000832}
833
834static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000835dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000836{
837 return mp->ma_used;
838}
839
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000841dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000842{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000843 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000844 long hash;
Tim Petersdea48ec2001-05-22 20:40:22 +0000845 assert(mp->ma_table != NULL);
Tim Peters0ab085c2001-09-14 00:25:33 +0000846 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000847 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000849 if (hash == -1)
850 return NULL;
851 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000852 v = (mp->ma_lookup)(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000853 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000855 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000857 return v;
858}
859
860static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000861dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000862{
863 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000865 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000866 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000867}
868
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000869static PyMappingMethods dict_as_mapping = {
870 (inquiry)dict_length, /*mp_length*/
871 (binaryfunc)dict_subscript, /*mp_subscript*/
872 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000873};
874
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000875static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000876dict_keys(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000877{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000879 register int i, j, n;
880
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000881 again:
882 n = mp->ma_used;
883 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000884 if (v == NULL)
885 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000886 if (n != mp->ma_used) {
887 /* Durnit. The allocations caused the dict to resize.
888 * Just start over, this shouldn't normally happen.
889 */
890 Py_DECREF(v);
891 goto again;
892 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000893 for (i = 0, j = 0; i <= mp->ma_mask; i++) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000894 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 PyObject *key = mp->ma_table[i].me_key;
896 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000897 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000898 j++;
899 }
900 }
901 return v;
902}
903
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000905dict_values(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000906{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000908 register int i, j, n;
909
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000910 again:
911 n = mp->ma_used;
912 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000913 if (v == NULL)
914 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000915 if (n != mp->ma_used) {
916 /* Durnit. The allocations caused the dict to resize.
917 * Just start over, this shouldn't normally happen.
918 */
919 Py_DECREF(v);
920 goto again;
921 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000922 for (i = 0, j = 0; i <= mp->ma_mask; i++) {
Guido van Rossum25831651993-05-19 14:50:45 +0000923 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000924 PyObject *value = mp->ma_table[i].me_value;
925 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000926 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000927 j++;
928 }
929 }
930 return v;
931}
932
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000934dict_items(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000935{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000937 register int i, j, n;
938 PyObject *item, *key, *value;
939
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000940 /* Preallocate the list of tuples, to avoid allocations during
941 * the loop over the items, which could trigger GC, which
942 * could resize the dict. :-(
943 */
944 again:
945 n = mp->ma_used;
946 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000947 if (v == NULL)
948 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000949 for (i = 0; i < n; i++) {
950 item = PyTuple_New(2);
951 if (item == NULL) {
952 Py_DECREF(v);
953 return NULL;
954 }
955 PyList_SET_ITEM(v, i, item);
956 }
957 if (n != mp->ma_used) {
958 /* Durnit. The allocations caused the dict to resize.
959 * Just start over, this shouldn't normally happen.
960 */
961 Py_DECREF(v);
962 goto again;
963 }
964 /* Nothing we do below makes any function calls. */
Tim Petersafb6ae82001-06-04 21:00:21 +0000965 for (i = 0, j = 0; i <= mp->ma_mask; i++) {
Guido van Rossum25831651993-05-19 14:50:45 +0000966 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000967 key = mp->ma_table[i].me_key;
968 value = mp->ma_table[i].me_value;
969 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000971 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000973 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000974 j++;
975 }
976 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000977 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +0000978 return v;
979}
980
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000981static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +0000982dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +0000983{
984 PyObject *seq;
985 PyObject *value = Py_None;
986 PyObject *it; /* iter(seq) */
987 PyObject *key;
988 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +0000989 int status;
990
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000991 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +0000992 return NULL;
993
994 d = PyObject_CallObject(cls, NULL);
995 if (d == NULL)
996 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +0000997
998 it = PyObject_GetIter(seq);
999 if (it == NULL){
1000 Py_DECREF(d);
1001 return NULL;
1002 }
1003
1004 for (;;) {
1005 key = PyIter_Next(it);
1006 if (key == NULL) {
1007 if (PyErr_Occurred())
1008 goto Fail;
1009 break;
1010 }
Raymond Hettingere03e5b12002-12-07 08:10:51 +00001011 status = PyObject_SetItem(d, key, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001012 Py_DECREF(key);
1013 if (status < 0)
1014 goto Fail;
1015 }
1016
1017 Py_DECREF(it);
1018 return d;
1019
1020Fail:
1021 Py_DECREF(it);
1022 Py_DECREF(d);
1023 return NULL;
1024}
1025
1026static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001027dict_update(PyObject *mp, PyObject *other)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001028{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001029 if (PyDict_Update(mp, other) < 0)
1030 return NULL;
1031 Py_INCREF(Py_None);
1032 return Py_None;
1033}
1034
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001035/* Update unconditionally replaces existing items.
1036 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001037 otherwise it leaves existing items unchanged.
1038
1039 PyDict_{Update,Merge} update/merge from a mapping object.
1040
Tim Petersf582b822001-12-11 18:51:08 +00001041 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001042 producing iterable objects of length 2.
1043*/
1044
Tim Petersf582b822001-12-11 18:51:08 +00001045int
Tim Peters1fc240e2001-10-26 05:06:50 +00001046PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1047{
1048 PyObject *it; /* iter(seq2) */
1049 int i; /* index into seq2 of current element */
1050 PyObject *item; /* seq2[i] */
1051 PyObject *fast; /* item as a 2-tuple or 2-list */
1052
1053 assert(d != NULL);
1054 assert(PyDict_Check(d));
1055 assert(seq2 != NULL);
1056
1057 it = PyObject_GetIter(seq2);
1058 if (it == NULL)
1059 return -1;
1060
1061 for (i = 0; ; ++i) {
1062 PyObject *key, *value;
1063 int n;
1064
1065 fast = NULL;
1066 item = PyIter_Next(it);
1067 if (item == NULL) {
1068 if (PyErr_Occurred())
1069 goto Fail;
1070 break;
1071 }
1072
1073 /* Convert item to sequence, and verify length 2. */
1074 fast = PySequence_Fast(item, "");
1075 if (fast == NULL) {
1076 if (PyErr_ExceptionMatches(PyExc_TypeError))
1077 PyErr_Format(PyExc_TypeError,
1078 "cannot convert dictionary update "
1079 "sequence element #%d to a sequence",
1080 i);
1081 goto Fail;
1082 }
1083 n = PySequence_Fast_GET_SIZE(fast);
1084 if (n != 2) {
1085 PyErr_Format(PyExc_ValueError,
1086 "dictionary update sequence element #%d "
1087 "has length %d; 2 is required",
1088 i, n);
1089 goto Fail;
1090 }
1091
1092 /* Update/merge with this (key, value) pair. */
1093 key = PySequence_Fast_GET_ITEM(fast, 0);
1094 value = PySequence_Fast_GET_ITEM(fast, 1);
1095 if (override || PyDict_GetItem(d, key) == NULL) {
1096 int status = PyDict_SetItem(d, key, value);
1097 if (status < 0)
1098 goto Fail;
1099 }
1100 Py_DECREF(fast);
1101 Py_DECREF(item);
1102 }
1103
1104 i = 0;
1105 goto Return;
1106Fail:
1107 Py_XDECREF(item);
1108 Py_XDECREF(fast);
1109 i = -1;
1110Return:
1111 Py_DECREF(it);
1112 return i;
1113}
1114
Tim Peters6d6c1a32001-08-02 04:15:00 +00001115int
1116PyDict_Update(PyObject *a, PyObject *b)
1117{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001118 return PyDict_Merge(a, b, 1);
1119}
1120
1121int
1122PyDict_Merge(PyObject *a, PyObject *b, int override)
1123{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001124 register PyDictObject *mp, *other;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001125 register int i;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001126 dictentry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001127
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001128 /* We accept for the argument either a concrete dictionary object,
1129 * or an abstract "mapping" object. For the former, we can do
1130 * things quite efficiently. For the latter, we only require that
1131 * PyMapping_Keys() and PyObject_GetItem() be supported.
1132 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001133 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1134 PyErr_BadInternalCall();
1135 return -1;
1136 }
1137 mp = (dictobject*)a;
1138 if (PyDict_Check(b)) {
1139 other = (dictobject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001140 if (other == mp || other->ma_used == 0)
1141 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001142 return 0;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001143 /* Do one big resize at the start, rather than
1144 * incrementally resizing as we insert new items. Expect
1145 * that there will be no (or few) overlapping keys.
1146 */
1147 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
1148 if (dictresize(mp, (mp->ma_used + other->ma_used)*3/2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001149 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001150 }
1151 for (i = 0; i <= other->ma_mask; i++) {
1152 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001153 if (entry->me_value != NULL &&
1154 (override ||
1155 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001156 Py_INCREF(entry->me_key);
1157 Py_INCREF(entry->me_value);
1158 insertdict(mp, entry->me_key, entry->me_hash,
1159 entry->me_value);
1160 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001161 }
1162 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001163 else {
1164 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001165 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001166 PyObject *iter;
1167 PyObject *key, *value;
1168 int status;
1169
1170 if (keys == NULL)
1171 /* Docstring says this is equivalent to E.keys() so
1172 * if E doesn't have a .keys() method we want
1173 * AttributeError to percolate up. Might as well
1174 * do the same for any other error.
1175 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001176 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001177
1178 iter = PyObject_GetIter(keys);
1179 Py_DECREF(keys);
1180 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001181 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001182
1183 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001184 if (!override && PyDict_GetItem(a, key) != NULL) {
1185 Py_DECREF(key);
1186 continue;
1187 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001188 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001189 if (value == NULL) {
1190 Py_DECREF(iter);
1191 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001192 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001193 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001194 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001195 Py_DECREF(key);
1196 Py_DECREF(value);
1197 if (status < 0) {
1198 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001199 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001200 }
1201 }
1202 Py_DECREF(iter);
1203 if (PyErr_Occurred())
1204 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001205 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001206 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001207 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001208}
1209
1210static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001211dict_copy(register dictobject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001212{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001213 return PyDict_Copy((PyObject*)mp);
1214}
1215
1216PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001217PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001218{
1219 register dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001220 register int i;
1221 dictobject *copy;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001222 dictentry *entry;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001223
1224 if (o == NULL || !PyDict_Check(o)) {
1225 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001226 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001227 }
1228 mp = (dictobject *)o;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001229 copy = (dictobject *)PyDict_New();
1230 if (copy == NULL)
1231 return NULL;
1232 if (mp->ma_used > 0) {
1233 if (dictresize(copy, mp->ma_used*3/2) != 0)
1234 return NULL;
Tim Petersafb6ae82001-06-04 21:00:21 +00001235 for (i = 0; i <= mp->ma_mask; i++) {
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001236 entry = &mp->ma_table[i];
1237 if (entry->me_value != NULL) {
1238 Py_INCREF(entry->me_key);
1239 Py_INCREF(entry->me_value);
1240 insertdict(copy, entry->me_key, entry->me_hash,
1241 entry->me_value);
1242 }
1243 }
1244 }
1245 return (PyObject *)copy;
1246}
1247
Guido van Rossum4199fac1993-11-05 10:18:44 +00001248int
Tim Peters1f5871e2000-07-04 17:44:48 +00001249PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001250{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251 if (mp == NULL || !PyDict_Check(mp)) {
1252 PyErr_BadInternalCall();
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001253 return 0;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001254 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001255 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001256}
1257
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001258PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001259PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001260{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001261 if (mp == NULL || !PyDict_Check(mp)) {
1262 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001263 return NULL;
1264 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001265 return dict_keys((dictobject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001266}
1267
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001268PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001269PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001270{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 if (mp == NULL || !PyDict_Check(mp)) {
1272 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001273 return NULL;
1274 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001275 return dict_values((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001276}
1277
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001279PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001280{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001281 if (mp == NULL || !PyDict_Check(mp)) {
1282 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001283 return NULL;
1284 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001285 return dict_items((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001286}
1287
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001288/* Subroutine which returns the smallest key in a for which b's value
1289 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001290 pval argument. Both are NULL if no key in a is found for which b's status
1291 differs. The refcounts on (and only on) non-NULL *pval and function return
1292 values must be decremented by the caller (characterize() increments them
1293 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1294 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001295
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001296static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001297characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001298{
Tim Peters95bf9392001-05-10 08:32:44 +00001299 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1300 PyObject *aval = NULL; /* a[akey] */
Guido van Rossumb9324202001-01-18 00:39:02 +00001301 int i, cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001302
Tim Petersafb6ae82001-06-04 21:00:21 +00001303 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001304 PyObject *thiskey, *thisaval, *thisbval;
1305 if (a->ma_table[i].me_value == NULL)
1306 continue;
1307 thiskey = a->ma_table[i].me_key;
1308 Py_INCREF(thiskey); /* keep alive across compares */
1309 if (akey != NULL) {
1310 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1311 if (cmp < 0) {
1312 Py_DECREF(thiskey);
1313 goto Fail;
1314 }
1315 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001316 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001317 a->ma_table[i].me_value == NULL)
1318 {
1319 /* Not the *smallest* a key; or maybe it is
1320 * but the compare shrunk the dict so we can't
1321 * find its associated value anymore; or
1322 * maybe it is but the compare deleted the
1323 * a[thiskey] entry.
1324 */
1325 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001326 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001327 }
Tim Peters95bf9392001-05-10 08:32:44 +00001328 }
1329
1330 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1331 thisaval = a->ma_table[i].me_value;
1332 assert(thisaval);
1333 Py_INCREF(thisaval); /* keep alive */
1334 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1335 if (thisbval == NULL)
1336 cmp = 0;
1337 else {
1338 /* both dicts have thiskey: same values? */
1339 cmp = PyObject_RichCompareBool(
1340 thisaval, thisbval, Py_EQ);
1341 if (cmp < 0) {
1342 Py_DECREF(thiskey);
1343 Py_DECREF(thisaval);
1344 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001345 }
1346 }
Tim Peters95bf9392001-05-10 08:32:44 +00001347 if (cmp == 0) {
1348 /* New winner. */
1349 Py_XDECREF(akey);
1350 Py_XDECREF(aval);
1351 akey = thiskey;
1352 aval = thisaval;
1353 }
1354 else {
1355 Py_DECREF(thiskey);
1356 Py_DECREF(thisaval);
1357 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001358 }
Tim Peters95bf9392001-05-10 08:32:44 +00001359 *pval = aval;
1360 return akey;
1361
1362Fail:
1363 Py_XDECREF(akey);
1364 Py_XDECREF(aval);
1365 *pval = NULL;
1366 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001367}
1368
1369static int
Tim Peters1f5871e2000-07-04 17:44:48 +00001370dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001371{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001372 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001373 int res;
1374
1375 /* Compare lengths first */
1376 if (a->ma_used < b->ma_used)
1377 return -1; /* a is shorter */
1378 else if (a->ma_used > b->ma_used)
1379 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001380
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001381 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001382 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001383 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001384 if (adiff == NULL) {
1385 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001386 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001387 * must be equal.
1388 */
1389 res = PyErr_Occurred() ? -1 : 0;
1390 goto Finished;
1391 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001392 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001393 if (bdiff == NULL && PyErr_Occurred()) {
1394 assert(!bval);
1395 res = -1;
1396 goto Finished;
1397 }
1398 res = 0;
1399 if (bdiff) {
1400 /* bdiff == NULL "should be" impossible now, but perhaps
1401 * the last comparison done by the characterize() on a had
1402 * the side effect of making the dicts equal!
1403 */
1404 res = PyObject_Compare(adiff, bdiff);
1405 }
1406 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001407 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001408
1409Finished:
1410 Py_XDECREF(adiff);
1411 Py_XDECREF(bdiff);
1412 Py_XDECREF(aval);
1413 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001414 return res;
1415}
1416
Tim Peterse63415e2001-05-08 04:38:29 +00001417/* Return 1 if dicts equal, 0 if not, -1 if error.
1418 * Gets out as soon as any difference is detected.
1419 * Uses only Py_EQ comparison.
1420 */
1421static int
1422dict_equal(dictobject *a, dictobject *b)
1423{
1424 int i;
1425
1426 if (a->ma_used != b->ma_used)
1427 /* can't be equal if # of entries differ */
1428 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001429
Tim Peterse63415e2001-05-08 04:38:29 +00001430 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001431 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001432 PyObject *aval = a->ma_table[i].me_value;
1433 if (aval != NULL) {
1434 int cmp;
1435 PyObject *bval;
1436 PyObject *key = a->ma_table[i].me_key;
1437 /* temporarily bump aval's refcount to ensure it stays
1438 alive until we're done with it */
1439 Py_INCREF(aval);
1440 bval = PyDict_GetItem((PyObject *)b, key);
1441 if (bval == NULL) {
1442 Py_DECREF(aval);
1443 return 0;
1444 }
1445 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1446 Py_DECREF(aval);
1447 if (cmp <= 0) /* error or not equal */
1448 return cmp;
1449 }
1450 }
1451 return 1;
1452 }
1453
1454static PyObject *
1455dict_richcompare(PyObject *v, PyObject *w, int op)
1456{
1457 int cmp;
1458 PyObject *res;
1459
1460 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1461 res = Py_NotImplemented;
1462 }
1463 else if (op == Py_EQ || op == Py_NE) {
1464 cmp = dict_equal((dictobject *)v, (dictobject *)w);
1465 if (cmp < 0)
1466 return NULL;
1467 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1468 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001469 else
1470 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001471 Py_INCREF(res);
1472 return res;
1473 }
1474
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001475static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001476dict_has_key(register dictobject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001477{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001478 long hash;
1479 register long ok;
Tim Peters0ab085c2001-09-14 00:25:33 +00001480 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001481 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001482 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001483 if (hash == -1)
1484 return NULL;
1485 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001486 ok = (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001487 return PyBool_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001488}
1489
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001490static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001491dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001492{
1493 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001494 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001495 PyObject *val = NULL;
1496 long hash;
1497
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001498 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001499 return NULL;
1500
Tim Peters0ab085c2001-09-14 00:25:33 +00001501 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001502 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001503 hash = PyObject_Hash(key);
1504 if (hash == -1)
1505 return NULL;
1506 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001507 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001508
Barry Warsawc38c5da1997-10-06 17:49:20 +00001509 if (val == NULL)
1510 val = failobj;
1511 Py_INCREF(val);
1512 return val;
1513}
1514
1515
1516static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001517dict_setdefault(register dictobject *mp, PyObject *args)
1518{
1519 PyObject *key;
1520 PyObject *failobj = Py_None;
1521 PyObject *val = NULL;
1522 long hash;
1523
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001524 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001525 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001526
Tim Peters0ab085c2001-09-14 00:25:33 +00001527 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001528 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001529 hash = PyObject_Hash(key);
1530 if (hash == -1)
1531 return NULL;
1532 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001533 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001534 if (val == NULL) {
1535 val = failobj;
1536 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1537 val = NULL;
1538 }
1539 Py_XINCREF(val);
1540 return val;
1541}
1542
1543
1544static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001545dict_clear(register dictobject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001546{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001547 PyDict_Clear((PyObject *)mp);
1548 Py_INCREF(Py_None);
1549 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001550}
1551
Guido van Rossumba6ab842000-12-12 22:02:18 +00001552static PyObject *
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001553dict_pop(dictobject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001554{
1555 long hash;
1556 dictentry *ep;
1557 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001558 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001559
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001560 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1561 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001562 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001563 if (deflt) {
1564 Py_INCREF(deflt);
1565 return deflt;
1566 }
Guido van Rossume027d982002-04-12 15:11:59 +00001567 PyErr_SetString(PyExc_KeyError,
1568 "pop(): dictionary is empty");
1569 return NULL;
1570 }
1571 if (!PyString_CheckExact(key) ||
1572 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1573 hash = PyObject_Hash(key);
1574 if (hash == -1)
1575 return NULL;
1576 }
1577 ep = (mp->ma_lookup)(mp, key, hash);
1578 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001579 if (deflt) {
1580 Py_INCREF(deflt);
1581 return deflt;
1582 }
Guido van Rossume027d982002-04-12 15:11:59 +00001583 PyErr_SetObject(PyExc_KeyError, key);
1584 return NULL;
1585 }
1586 old_key = ep->me_key;
1587 Py_INCREF(dummy);
1588 ep->me_key = dummy;
1589 old_value = ep->me_value;
1590 ep->me_value = NULL;
1591 mp->ma_used--;
1592 Py_DECREF(old_key);
1593 return old_value;
1594}
1595
1596static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001597dict_popitem(dictobject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001598{
1599 int i = 0;
1600 dictentry *ep;
1601 PyObject *res;
1602
Tim Petersf4b33f62001-06-02 05:42:29 +00001603 /* Allocate the result tuple before checking the size. Believe it
1604 * or not, this allocation could trigger a garbage collection which
1605 * could empty the dict, so if we checked the size first and that
1606 * happened, the result would be an infinite loop (searching for an
1607 * entry that no longer exists). Note that the usual popitem()
1608 * idiom is "while d: k, v = d.popitem()". so needing to throw the
1609 * tuple away if the dict *is* empty isn't a significant
1610 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001611 */
1612 res = PyTuple_New(2);
1613 if (res == NULL)
1614 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001615 if (mp->ma_used == 0) {
1616 Py_DECREF(res);
1617 PyErr_SetString(PyExc_KeyError,
1618 "popitem(): dictionary is empty");
1619 return NULL;
1620 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001621 /* Set ep to "the first" dict entry with a value. We abuse the hash
1622 * field of slot 0 to hold a search finger:
1623 * If slot 0 has a value, use slot 0.
1624 * Else slot 0 is being used to hold a search finger,
1625 * and we use its hash value as the first index to look.
1626 */
1627 ep = &mp->ma_table[0];
1628 if (ep->me_value == NULL) {
1629 i = (int)ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001630 /* The hash field may be a real hash value, or it may be a
1631 * legit search finger, or it may be a once-legit search
1632 * finger that's out of bounds now because it wrapped around
1633 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001634 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001635 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001636 i = 1; /* skip slot 0 */
1637 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1638 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001639 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001640 i = 1;
1641 }
1642 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001643 PyTuple_SET_ITEM(res, 0, ep->me_key);
1644 PyTuple_SET_ITEM(res, 1, ep->me_value);
1645 Py_INCREF(dummy);
1646 ep->me_key = dummy;
1647 ep->me_value = NULL;
1648 mp->ma_used--;
1649 assert(mp->ma_table[0].me_value == NULL);
1650 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001651 return res;
1652}
1653
Jeremy Hylton8caad492000-06-23 14:18:11 +00001654static int
1655dict_traverse(PyObject *op, visitproc visit, void *arg)
1656{
1657 int i = 0, err;
1658 PyObject *pk;
1659 PyObject *pv;
1660
1661 while (PyDict_Next(op, &i, &pk, &pv)) {
1662 err = visit(pk, arg);
1663 if (err)
1664 return err;
1665 err = visit(pv, arg);
1666 if (err)
1667 return err;
1668 }
1669 return 0;
1670}
1671
1672static int
1673dict_tp_clear(PyObject *op)
1674{
1675 PyDict_Clear(op);
1676 return 0;
1677}
1678
Tim Petersf7f88b12000-12-13 23:18:45 +00001679
Jeremy Hylton938ace62002-07-17 16:30:39 +00001680static PyObject *dictiter_new(dictobject *, binaryfunc);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001681
1682static PyObject *
1683select_key(PyObject *key, PyObject *value)
1684{
1685 Py_INCREF(key);
1686 return key;
1687}
1688
1689static PyObject *
1690select_value(PyObject *key, PyObject *value)
1691{
1692 Py_INCREF(value);
1693 return value;
1694}
1695
1696static PyObject *
1697select_item(PyObject *key, PyObject *value)
1698{
1699 PyObject *res = PyTuple_New(2);
1700
1701 if (res != NULL) {
1702 Py_INCREF(key);
1703 Py_INCREF(value);
1704 PyTuple_SET_ITEM(res, 0, key);
1705 PyTuple_SET_ITEM(res, 1, value);
1706 }
1707 return res;
1708}
1709
1710static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001711dict_iterkeys(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001712{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001713 return dictiter_new(dict, select_key);
1714}
1715
1716static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001717dict_itervalues(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001718{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001719 return dictiter_new(dict, select_value);
1720}
1721
1722static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001723dict_iteritems(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001724{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001725 return dictiter_new(dict, select_item);
1726}
1727
1728
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001729PyDoc_STRVAR(has_key__doc__,
1730"D.has_key(k) -> 1 if D has a key k, else 0");
Tim Petersf7f88b12000-12-13 23:18:45 +00001731
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001732PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001733"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001734
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001735PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001736"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 +00001737
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001738PyDoc_STRVAR(pop__doc__,
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001739"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
1740If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001741
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001742PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001743"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000017442-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00001745
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001746PyDoc_STRVAR(keys__doc__,
1747"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00001748
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001749PyDoc_STRVAR(items__doc__,
1750"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00001751
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001752PyDoc_STRVAR(values__doc__,
1753"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00001754
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001755PyDoc_STRVAR(update__doc__,
1756"D.update(E) -> None. Update D from E: for k in E.keys(): D[k] = E[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00001757
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001758PyDoc_STRVAR(fromkeys__doc__,
1759"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1760v defaults to None.");
1761
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001762PyDoc_STRVAR(clear__doc__,
1763"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001764
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001765PyDoc_STRVAR(copy__doc__,
1766"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001767
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001768PyDoc_STRVAR(iterkeys__doc__,
1769"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001770
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001771PyDoc_STRVAR(itervalues__doc__,
1772"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001773
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001774PyDoc_STRVAR(iteritems__doc__,
1775"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001776
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001777static PyMethodDef mapp_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001778 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001779 has_key__doc__},
1780 {"get", (PyCFunction)dict_get, METH_VARARGS,
1781 get__doc__},
1782 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1783 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001784 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00001785 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001786 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001787 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001788 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001789 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001790 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001791 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001792 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001793 values__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001794 {"update", (PyCFunction)dict_update, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001795 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001796 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
1797 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001798 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001799 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001800 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001801 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001802 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001803 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001804 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001805 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001806 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001807 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00001808 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001809};
1810
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001811static int
1812dict_contains(dictobject *mp, PyObject *key)
1813{
1814 long hash;
1815
Tim Peters0ab085c2001-09-14 00:25:33 +00001816 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001817 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001818 hash = PyObject_Hash(key);
1819 if (hash == -1)
1820 return -1;
1821 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001822 return (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001823}
1824
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001825/* Hack to implement "key in dict" */
1826static PySequenceMethods dict_as_sequence = {
1827 0, /* sq_length */
1828 0, /* sq_concat */
1829 0, /* sq_repeat */
1830 0, /* sq_item */
1831 0, /* sq_slice */
1832 0, /* sq_ass_item */
1833 0, /* sq_ass_slice */
1834 (objobjproc)dict_contains, /* sq_contains */
1835 0, /* sq_inplace_concat */
1836 0, /* sq_inplace_repeat */
1837};
1838
Guido van Rossum09e563a2001-05-01 12:10:21 +00001839static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001840dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1841{
1842 PyObject *self;
1843
1844 assert(type != NULL && type->tp_alloc != NULL);
1845 self = type->tp_alloc(type, 0);
1846 if (self != NULL) {
1847 PyDictObject *d = (PyDictObject *)self;
1848 /* It's guaranteed that tp->alloc zeroed out the struct. */
1849 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
1850 INIT_NONZERO_DICT_SLOTS(d);
1851 d->ma_lookup = lookdict_string;
1852#ifdef SHOW_CONVERSION_COUNTS
1853 ++created;
1854#endif
1855 }
1856 return self;
1857}
1858
Tim Peters25786c02001-09-02 08:22:48 +00001859static int
1860dict_init(PyObject *self, PyObject *args, PyObject *kwds)
1861{
1862 PyObject *arg = NULL;
Tim Peters1fc240e2001-10-26 05:06:50 +00001863 int result = 0;
Tim Peters25786c02001-09-02 08:22:48 +00001864
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001865 if (!PyArg_UnpackTuple(args, "dict", 0, 1, &arg))
Tim Peters1fc240e2001-10-26 05:06:50 +00001866 result = -1;
1867
1868 else if (arg != NULL) {
1869 if (PyObject_HasAttrString(arg, "keys"))
1870 result = PyDict_Merge(self, arg, 1);
1871 else
1872 result = PyDict_MergeFromSeq2(self, arg, 1);
Tim Peters25786c02001-09-02 08:22:48 +00001873 }
Just van Rossuma797d812002-11-23 09:45:04 +00001874 if (result == 0 && kwds != NULL)
1875 result = PyDict_Merge(self, kwds, 1);
Tim Peters1fc240e2001-10-26 05:06:50 +00001876 return result;
Tim Peters25786c02001-09-02 08:22:48 +00001877}
1878
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001879static long
1880dict_nohash(PyObject *self)
1881{
1882 PyErr_SetString(PyExc_TypeError, "dict objects are unhashable");
1883 return -1;
1884}
1885
Tim Peters6d6c1a32001-08-02 04:15:00 +00001886static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00001887dict_iter(dictobject *dict)
1888{
1889 return dictiter_new(dict, select_key);
1890}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001891
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001892PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00001893"dict() -> new empty dictionary.\n"
1894"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00001895" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00001896"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00001897" d = {}\n"
1898" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00001899" d[k] = v\n"
1900"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
1901" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00001902
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001903PyTypeObject PyDict_Type = {
1904 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001905 0,
Tim Petersa427a2b2001-10-29 22:25:45 +00001906 "dict",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001907 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001908 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00001909 (destructor)dict_dealloc, /* tp_dealloc */
1910 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001911 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00001912 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00001913 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00001914 (reprfunc)dict_repr, /* tp_repr */
1915 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001916 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00001917 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001918 dict_nohash, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00001919 0, /* tp_call */
1920 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001921 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00001922 0, /* tp_setattro */
1923 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001924 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00001925 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00001926 dictionary_doc, /* tp_doc */
Guido van Rossumb9324202001-01-18 00:39:02 +00001927 (traverseproc)dict_traverse, /* tp_traverse */
1928 (inquiry)dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00001929 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001930 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00001931 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001932 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001933 mapp_methods, /* tp_methods */
1934 0, /* tp_members */
1935 0, /* tp_getset */
1936 0, /* tp_base */
1937 0, /* tp_dict */
1938 0, /* tp_descr_get */
1939 0, /* tp_descr_set */
1940 0, /* tp_dictoffset */
Tim Peters25786c02001-09-02 08:22:48 +00001941 (initproc)dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001942 PyType_GenericAlloc, /* tp_alloc */
1943 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00001944 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001945};
1946
Guido van Rossum3cca2451997-05-16 14:23:33 +00001947/* For backward compatibility with old dictionary interface */
1948
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001949PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001950PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001951{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001952 PyObject *kv, *rv;
1953 kv = PyString_FromString(key);
1954 if (kv == NULL)
1955 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001956 rv = PyDict_GetItem(v, kv);
1957 Py_DECREF(kv);
1958 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001959}
1960
1961int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001962PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001963{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001964 PyObject *kv;
1965 int err;
1966 kv = PyString_FromString(key);
1967 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001968 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001969 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001970 err = PyDict_SetItem(v, kv, item);
1971 Py_DECREF(kv);
1972 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001973}
1974
1975int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001976PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001977{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001978 PyObject *kv;
1979 int err;
1980 kv = PyString_FromString(key);
1981 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001982 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001983 err = PyDict_DelItem(v, kv);
1984 Py_DECREF(kv);
1985 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001986}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001987
1988/* Dictionary iterator type */
1989
1990extern PyTypeObject PyDictIter_Type; /* Forward */
1991
1992typedef struct {
1993 PyObject_HEAD
Guido van Rossum2147df72002-07-16 20:30:22 +00001994 dictobject *di_dict; /* Set to NULL when iterator is exhausted */
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00001995 int di_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001996 int di_pos;
Guido van Rossum09e563a2001-05-01 12:10:21 +00001997 binaryfunc di_select;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001998} dictiterobject;
1999
2000static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00002001dictiter_new(dictobject *dict, binaryfunc select)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002002{
2003 dictiterobject *di;
Neil Schemenauer6189b892002-04-12 02:43:00 +00002004 di = PyObject_New(dictiterobject, &PyDictIter_Type);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002005 if (di == NULL)
2006 return NULL;
2007 Py_INCREF(dict);
2008 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002009 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002010 di->di_pos = 0;
Guido van Rossum09e563a2001-05-01 12:10:21 +00002011 di->di_select = select;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002012 return (PyObject *)di;
2013}
2014
2015static void
2016dictiter_dealloc(dictiterobject *di)
2017{
Guido van Rossum2147df72002-07-16 20:30:22 +00002018 Py_XDECREF(di->di_dict);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002019 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002020}
2021
Guido van Rossum213c7a62001-04-23 14:08:49 +00002022static PyObject *dictiter_iternext(dictiterobject *di)
2023{
Guido van Rossum09e563a2001-05-01 12:10:21 +00002024 PyObject *key, *value;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002025
Guido van Rossum2147df72002-07-16 20:30:22 +00002026 if (di->di_dict == NULL)
2027 return NULL;
2028
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002029 if (di->di_used != di->di_dict->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002030 PyErr_SetString(PyExc_RuntimeError,
2031 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002032 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002033 return NULL;
2034 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002035 if (PyDict_Next((PyObject *)(di->di_dict), &di->di_pos, &key, &value))
Guido van Rossum09e563a2001-05-01 12:10:21 +00002036 return (*di->di_select)(key, value);
Guido van Rossum2147df72002-07-16 20:30:22 +00002037
2038 Py_DECREF(di->di_dict);
2039 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002040 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002041}
2042
2043PyTypeObject PyDictIter_Type = {
2044 PyObject_HEAD_INIT(&PyType_Type)
2045 0, /* ob_size */
2046 "dictionary-iterator", /* tp_name */
2047 sizeof(dictiterobject), /* tp_basicsize */
2048 0, /* tp_itemsize */
2049 /* methods */
2050 (destructor)dictiter_dealloc, /* tp_dealloc */
2051 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002052 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002053 0, /* tp_setattr */
2054 0, /* tp_compare */
2055 0, /* tp_repr */
2056 0, /* tp_as_number */
2057 0, /* tp_as_sequence */
2058 0, /* tp_as_mapping */
2059 0, /* tp_hash */
2060 0, /* tp_call */
2061 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002062 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002063 0, /* tp_setattro */
2064 0, /* tp_as_buffer */
2065 Py_TPFLAGS_DEFAULT, /* tp_flags */
2066 0, /* tp_doc */
2067 0, /* tp_traverse */
2068 0, /* tp_clear */
2069 0, /* tp_richcompare */
2070 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002071 PyObject_SelfIter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002072 (iternextfunc)dictiter_iternext, /* tp_iternext */
Guido van Rossum2147df72002-07-16 20:30:22 +00002073 0, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002074 0, /* tp_members */
2075 0, /* tp_getset */
2076 0, /* tp_base */
2077 0, /* tp_dict */
2078 0, /* tp_descr_get */
2079 0, /* tp_descr_set */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002080};