blob: 9ae71855d27ad413ad4e56772e5a7c505a3c998e [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
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +00005
Tim Peters6d6c1a32001-08-02 04:15:00 +00006typedef PyDictEntry dictentry;
7typedef PyDictObject dictobject;
Guido van Rossum16e93a81997-01-28 00:00:11 +00008
Tim Peterseb28ef22001-06-02 05:27:19 +00009/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000010#undef SHOW_CONVERSION_COUNTS
11
Tim Peterseb28ef22001-06-02 05:27:19 +000012/* See large comment block below. This must be >= 1. */
13#define PERTURB_SHIFT 5
14
Guido van Rossum16e93a81997-01-28 00:00:11 +000015/*
Tim Peterseb28ef22001-06-02 05:27:19 +000016Major subtleties ahead: Most hash schemes depend on having a "good" hash
17function, in the sense of simulating randomness. Python doesn't: its most
18important hash functions (for strings and ints) are very regular in common
19cases:
Tim Peters15d49292001-05-27 07:39:22 +000020
Tim Peterseb28ef22001-06-02 05:27:19 +000021>>> map(hash, (0, 1, 2, 3))
22[0, 1, 2, 3]
23>>> map(hash, ("namea", "nameb", "namec", "named"))
24[-1658398457, -1658398460, -1658398459, -1658398462]
25>>>
Tim Peters15d49292001-05-27 07:39:22 +000026
Tim Peterseb28ef22001-06-02 05:27:19 +000027This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
28the low-order i bits as the initial table index is extremely fast, and there
29are no collisions at all for dicts indexed by a contiguous range of ints.
30The same is approximately true when keys are "consecutive" strings. So this
31gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000032
Tim Peterseb28ef22001-06-02 05:27:19 +000033OTOH, when collisions occur, the tendency to fill contiguous slices of the
34hash table makes a good collision resolution strategy crucial. Taking only
35the last i bits of the hash code is also vulnerable: for example, consider
36[i << 16 for i in range(20000)] as a set of keys. Since ints are their own
37hash codes, and this fits in a dict of size 2**15, the last 15 bits of every
38hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000039
Tim Peterseb28ef22001-06-02 05:27:19 +000040But catering to unusual cases should not slow the usual ones, so we just take
41the last i bits anyway. It's up to collision resolution to do the rest. If
42we *usually* find the key we're looking for on the first try (and, it turns
43out, we usually do -- the table load factor is kept under 2/3, so the odds
44are solidly in our favor), then it makes best sense to keep the initial index
45computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000046
Tim Peterseb28ef22001-06-02 05:27:19 +000047The first half of collision resolution is to visit table indices via this
48recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000049
Tim Peterseb28ef22001-06-02 05:27:19 +000050 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000051
Tim Peterseb28ef22001-06-02 05:27:19 +000052For any initial j in range(2**i), repeating that 2**i times generates each
53int in range(2**i) exactly once (see any text on random-number generation for
54proof). By itself, this doesn't help much: like linear probing (setting
55j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
56order. This would be bad, except that's not the only thing we do, and it's
57actually *good* in the common cases where hash keys are consecutive. In an
58example that's really too small to make this entirely clear, for a table of
59size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000060
Tim Peterseb28ef22001-06-02 05:27:19 +000061 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
62
63If two things come in at index 5, the first place we look after is index 2,
64not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
65Linear probing is deadly in this case because there the fixed probe order
66is the *same* as the order consecutive keys are likely to arrive. But it's
67extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
68and certain that consecutive hash codes do not.
69
70The other half of the strategy is to get the other bits of the hash code
71into play. This is done by initializing a (unsigned) vrbl "perturb" to the
72full hash code, and changing the recurrence to:
73
74 j = (5*j) + 1 + perturb;
75 perturb >>= PERTURB_SHIFT;
76 use j % 2**i as the next table index;
77
78Now the probe sequence depends (eventually) on every bit in the hash code,
79and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
80because it quickly magnifies small differences in the bits that didn't affect
81the initial index. Note that because perturb is unsigned, if the recurrence
82is executed often enough perturb eventually becomes and remains 0. At that
83point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
84that's certain to find an empty slot eventually (since it generates every int
85in range(2**i), and we make sure there's always at least one empty slot).
86
87Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
88small so that the high bits of the hash code continue to affect the probe
89sequence across iterations; but you want it large so that in really bad cases
90the high-order hash bits have an effect on early iterations. 5 was "the
91best" in minimizing total collisions across experiments Tim Peters ran (on
92both normal and pathological cases), but 4 and 6 weren't significantly worse.
93
94Historical: Reimer Behrends contributed the idea of using a polynomial-based
95approach, using repeated multiplication by x in GF(2**n) where an irreducible
96polynomial for each table size was chosen such that x was a primitive root.
97Christian Tismer later extended that to use division by x instead, as an
98efficient way to get the high bits of the hash code into play. This scheme
99also gave excellent collision statistics, but was more expensive: two
100if-tests were required inside the loop; computing "the next" index took about
101the same number of operations but without as much potential parallelism
102(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
103above, and then shifting perturb can be done while the table index is being
104masked); and the dictobject struct required a member to hold the table's
105polynomial. In Tim's experiments the current scheme ran faster, produced
106equally good collision statistics, needed less code & used less memory.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000107*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000108
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000109/* Object used as dummy key to fill deleted entries */
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000110static PyObject *dummy; /* Initialized by first call to newdictobject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000111
Fred Drake1bff34a2000-08-31 19:31:38 +0000112/* forward declarations */
113static dictentry *
114lookdict_string(dictobject *mp, PyObject *key, long hash);
115
116#ifdef SHOW_CONVERSION_COUNTS
117static long created = 0L;
118static long converted = 0L;
119
120static void
121show_counts(void)
122{
123 fprintf(stderr, "created %ld string dicts\n", created);
124 fprintf(stderr, "converted %ld to normal dicts\n", converted);
125 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
126}
127#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000128
Tim Peters6d6c1a32001-08-02 04:15:00 +0000129/* Initialization macros.
130 There are two ways to create a dict: PyDict_New() is the main C API
131 function, and the tp_new slot maps to dict_new(). In the latter case we
132 can save a little time over what PyDict_New does because it's guaranteed
133 that the PyDictObject struct is already zeroed out.
134 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
135 an excellent reason not to).
136*/
137
138#define INIT_NONZERO_DICT_SLOTS(mp) do { \
Tim Petersdea48ec2001-05-22 20:40:22 +0000139 (mp)->ma_table = (mp)->ma_smalltable; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000140 (mp)->ma_mask = PyDict_MINSIZE - 1; \
141 } while(0)
142
143#define EMPTY_TO_MINSIZE(mp) do { \
144 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000145 (mp)->ma_used = (mp)->ma_fill = 0; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000146 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000147 } while(0)
148
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000150PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000151{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000152 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000153 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000155 if (dummy == NULL)
156 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000157#ifdef SHOW_CONVERSION_COUNTS
158 Py_AtExit(show_counts);
159#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000160 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000161 mp = PyObject_GC_New(dictobject, &PyDict_Type);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000162 if (mp == NULL)
163 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000164 EMPTY_TO_MINSIZE(mp);
Fred Drake1bff34a2000-08-31 19:31:38 +0000165 mp->ma_lookup = lookdict_string;
166#ifdef SHOW_CONVERSION_COUNTS
167 ++created;
168#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000169 _PyObject_GC_TRACK(mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000171}
172
173/*
174The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000175This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000176Open addressing is preferred over chaining since the link overhead for
177chaining would be substantial (100% with typical malloc overhead).
178
Tim Peterseb28ef22001-06-02 05:27:19 +0000179The initial probe index is computed as hash mod the table size. Subsequent
180probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000181
182All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000183
Tim Peterseb28ef22001-06-02 05:27:19 +0000184(The details in this version are due to Tim Peters, building on many past
185contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
186Christian Tismer).
Fred Drake1bff34a2000-08-31 19:31:38 +0000187
188This function must never return NULL; failures are indicated by returning
189a dictentry* for which the me_value field is NULL. Exceptions are never
190reported by this function, and outstanding exceptions are maintained.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000191*/
Tim Peterseb28ef22001-06-02 05:27:19 +0000192
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000193static dictentry *
Tim Peters1f5871e2000-07-04 17:44:48 +0000194lookdict(dictobject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000195{
Guido van Rossum16e93a81997-01-28 00:00:11 +0000196 register int i;
Tim Peterseb28ef22001-06-02 05:27:19 +0000197 register unsigned int perturb;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000198 register dictentry *freeslot;
Tim Petersafb6ae82001-06-04 21:00:21 +0000199 register unsigned int mask = mp->ma_mask;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000200 dictentry *ep0 = mp->ma_table;
201 register dictentry *ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000202 register int restore_error;
203 register int checked_error;
Fred Drakec88b99c2000-08-31 19:04:07 +0000204 register int cmp;
205 PyObject *err_type, *err_value, *err_tb;
Tim Peters453163d2001-06-03 04:54:32 +0000206 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000207
Tim Peters2f228e72001-05-13 00:19:31 +0000208 i = hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000209 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000210 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000211 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000212
213 restore_error = checked_error = 0;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000214 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000215 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000216 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000217 if (ep->me_hash == hash) {
218 /* error can't have been checked yet */
219 checked_error = 1;
220 if (PyErr_Occurred()) {
221 restore_error = 1;
222 PyErr_Fetch(&err_type, &err_value, &err_tb);
223 }
Tim Peters453163d2001-06-03 04:54:32 +0000224 startkey = ep->me_key;
225 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000226 if (cmp < 0)
Guido van Rossumb9324202001-01-18 00:39:02 +0000227 PyErr_Clear();
Tim Peters453163d2001-06-03 04:54:32 +0000228 if (ep0 == mp->ma_table && ep->me_key == startkey) {
229 if (cmp > 0)
230 goto Done;
231 }
232 else {
233 /* The compare did major nasty stuff to the
234 * dict: start over.
235 * XXX A clever adversary could prevent this
236 * XXX from terminating.
237 */
238 ep = lookdict(mp, key, hash);
239 goto Done;
240 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000241 }
242 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000243 }
Tim Peters15d49292001-05-27 07:39:22 +0000244
Tim Peters342c65e2001-05-13 06:43:53 +0000245 /* In the loop, me_key == dummy is by far (factor of 100s) the
246 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000247 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
248 i = (i << 2) + i + perturb + 1;
249 ep = &ep0[i & mask];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000250 if (ep->me_key == NULL) {
Tim Peters7b5d0af2001-06-03 04:14:43 +0000251 if (freeslot != NULL)
252 ep = freeslot;
253 break;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000254 }
Tim Peters7b5d0af2001-06-03 04:14:43 +0000255 if (ep->me_key == key)
256 break;
257 if (ep->me_hash == hash && ep->me_key != dummy) {
Fred Drakec88b99c2000-08-31 19:04:07 +0000258 if (!checked_error) {
259 checked_error = 1;
260 if (PyErr_Occurred()) {
261 restore_error = 1;
262 PyErr_Fetch(&err_type, &err_value,
263 &err_tb);
264 }
265 }
Tim Peters453163d2001-06-03 04:54:32 +0000266 startkey = ep->me_key;
267 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000268 if (cmp < 0)
Guido van Rossumb9324202001-01-18 00:39:02 +0000269 PyErr_Clear();
Tim Peters453163d2001-06-03 04:54:32 +0000270 if (ep0 == mp->ma_table && ep->me_key == startkey) {
271 if (cmp > 0)
272 break;
273 }
274 else {
275 /* The compare did major nasty stuff to the
276 * dict: start over.
277 * XXX A clever adversary could prevent this
278 * XXX from terminating.
279 */
280 ep = lookdict(mp, key, hash);
281 break;
282 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000283 }
Tim Peters342c65e2001-05-13 06:43:53 +0000284 else if (ep->me_key == dummy && freeslot == NULL)
285 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000286 }
Tim Peters7b5d0af2001-06-03 04:14:43 +0000287
288Done:
289 if (restore_error)
290 PyErr_Restore(err_type, err_value, err_tb);
291 return ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000292}
293
294/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000295 * Hacked up version of lookdict which can assume keys are always strings;
296 * this assumption allows testing for errors during PyObject_Compare() to
297 * be dropped; string-string comparisons never raise exceptions. This also
298 * means we don't need to go through PyObject_Compare(); we can always use
Martin v. Löwiscd353062001-05-24 16:56:35 +0000299 * _PyString_Eq directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000300 *
Tim Peters0ab085c2001-09-14 00:25:33 +0000301 * This is valuable because the general-case error handling in lookdict() is
302 * expensive, and dicts with pure-string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000303 */
304static dictentry *
305lookdict_string(dictobject *mp, PyObject *key, register long hash)
306{
307 register int i;
Tim Peterseb28ef22001-06-02 05:27:19 +0000308 register unsigned int perturb;
Fred Drake1bff34a2000-08-31 19:31:38 +0000309 register dictentry *freeslot;
Tim Petersafb6ae82001-06-04 21:00:21 +0000310 register unsigned int mask = mp->ma_mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000311 dictentry *ep0 = mp->ma_table;
312 register dictentry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000313
Tim Peters0ab085c2001-09-14 00:25:33 +0000314 /* Make sure this function doesn't have to handle non-string keys,
315 including subclasses of str; e.g., one reason to subclass
316 strings is to override __eq__, and for speed we don't cater to
317 that here. */
318 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000319#ifdef SHOW_CONVERSION_COUNTS
320 ++converted;
321#endif
322 mp->ma_lookup = lookdict;
323 return lookdict(mp, key, hash);
324 }
Tim Peters2f228e72001-05-13 00:19:31 +0000325 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000326 ep = &ep0[i];
327 if (ep->me_key == NULL || ep->me_key == key)
328 return ep;
329 if (ep->me_key == dummy)
330 freeslot = ep;
331 else {
332 if (ep->me_hash == hash
Martin v. Löwiscd353062001-05-24 16:56:35 +0000333 && _PyString_Eq(ep->me_key, key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000334 return ep;
335 }
336 freeslot = NULL;
337 }
Tim Peters15d49292001-05-27 07:39:22 +0000338
Tim Peters342c65e2001-05-13 06:43:53 +0000339 /* In the loop, me_key == dummy is by far (factor of 100s) the
340 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000341 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
342 i = (i << 2) + i + perturb + 1;
343 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000344 if (ep->me_key == NULL)
345 return freeslot == NULL ? ep : freeslot;
346 if (ep->me_key == key
347 || (ep->me_hash == hash
348 && ep->me_key != dummy
Martin v. Löwiscd353062001-05-24 16:56:35 +0000349 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000350 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000351 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000352 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000353 }
354}
355
356/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000357Internal routine to insert a new item into the table.
358Used both by the internal resize routine and by the public insert routine.
359Eats a reference to key and one to value.
360*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000361static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000362insertdict(register dictobject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000363{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000365 register dictentry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000366 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
367
368 assert(mp->ma_lookup != NULL);
369 ep = mp->ma_lookup(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000370 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000371 old_value = ep->me_value;
372 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 Py_DECREF(old_value); /* which **CAN** re-enter */
374 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000375 }
376 else {
377 if (ep->me_key == NULL)
378 mp->ma_fill++;
379 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 Py_DECREF(ep->me_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000381 ep->me_key = key;
382 ep->me_hash = hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000383 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000384 mp->ma_used++;
385 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000386}
387
388/*
389Restructure the table by allocating a new table and reinserting all
390items again. When entries have been deleted, the new table may
391actually be smaller than the old one.
392*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000393static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000394dictresize(dictobject *mp, int minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000395{
Tim Peterseb28ef22001-06-02 05:27:19 +0000396 int newsize;
Tim Peters0c6010b2001-05-23 23:33:57 +0000397 dictentry *oldtable, *newtable, *ep;
398 int i;
399 int is_oldtable_malloced;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000400 dictentry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000401
402 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000403
Tim Peterseb28ef22001-06-02 05:27:19 +0000404 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000405 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000406 newsize <= minused && newsize > 0;
407 newsize <<= 1)
408 ;
409 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000411 return -1;
412 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000413
414 /* Get space for a new table. */
415 oldtable = mp->ma_table;
416 assert(oldtable != NULL);
417 is_oldtable_malloced = oldtable != mp->ma_smalltable;
418
Tim Peters6d6c1a32001-08-02 04:15:00 +0000419 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000420 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000421 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000422 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000423 if (mp->ma_fill == mp->ma_used) {
424 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000425 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000426 }
427 /* We're not going to resize it, but rebuild the
428 table anyway to purge old dummy entries.
429 Subtle: This is *necessary* if fill==size,
430 as lookdict needs at least one virgin slot to
431 terminate failing searches. If fill < size, it's
432 merely desirable, as dummies slow searches. */
433 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000434 memcpy(small_copy, oldtable, sizeof(small_copy));
435 oldtable = small_copy;
436 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000437 }
438 else {
439 newtable = PyMem_NEW(dictentry, newsize);
440 if (newtable == NULL) {
441 PyErr_NoMemory();
442 return -1;
443 }
444 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000445
446 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000447 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000448 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000449 mp->ma_mask = newsize - 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000450 memset(newtable, 0, sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000451 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000452 i = mp->ma_fill;
453 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000454
Tim Peters19283142001-05-17 22:25:34 +0000455 /* Copy the data over; this is refcount-neutral for active entries;
456 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000457 for (ep = oldtable; i > 0; ep++) {
458 if (ep->me_value != NULL) { /* active entry */
459 --i;
Tim Peters19283142001-05-17 22:25:34 +0000460 insertdict(mp, ep->me_key, ep->me_hash, ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000461 }
Tim Peters19283142001-05-17 22:25:34 +0000462 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000463 --i;
Tim Peters19283142001-05-17 22:25:34 +0000464 assert(ep->me_key == dummy);
465 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000466 }
Tim Peters19283142001-05-17 22:25:34 +0000467 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000468 }
469
Tim Peters0c6010b2001-05-23 23:33:57 +0000470 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000471 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000472 return 0;
473}
474
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000476PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000477{
478 long hash;
Fred Drake1bff34a2000-08-31 19:31:38 +0000479 dictobject *mp = (dictobject *)op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 if (!PyDict_Check(op)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000481 return NULL;
482 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000483 if (!PyString_CheckExact(key) ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000485 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000487 if (hash == -1) {
488 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000489 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000490 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000491 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000492 return (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000493}
494
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000495/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
496 * dictionary if it is merely replacing the value for an existing key.
497 * This is means that it's safe to loop over a dictionary with
498 * PyDict_Next() and occasionally replace a value -- but you can't
499 * insert new keys or remove them.
500 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000501int
Tim Peters1f5871e2000-07-04 17:44:48 +0000502PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000503{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000504 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000505 register long hash;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000506 register int n_used;
507
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 if (!PyDict_Check(op)) {
509 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000510 return -1;
511 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000512 mp = (dictobject *)op;
Tim Peters0ab085c2001-09-14 00:25:33 +0000513 if (PyString_CheckExact(key)) {
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000514 hash = ((PyStringObject *)key)->ob_shash;
515 if (hash == -1)
516 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000517 }
Tim Peters1f7df352002-03-29 03:29:08 +0000518 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000520 if (hash == -1)
521 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000522 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000523 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000524 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 Py_INCREF(value);
526 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000527 insertdict(mp, key, hash, value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000528 /* If we added a key, we can safely resize. Otherwise skip this!
529 * If fill >= 2/3 size, adjust size. Normally, this doubles the
530 * size, but it's also possible for the dict to shrink (if ma_fill is
531 * much larger than ma_used, meaning a lot of dict keys have been
532 * deleted).
533 */
Tim Petersafb6ae82001-06-04 21:00:21 +0000534 if (mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2) {
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000535 if (dictresize(mp, mp->ma_used*2) != 0)
536 return -1;
537 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000538 return 0;
539}
540
541int
Tim Peters1f5871e2000-07-04 17:44:48 +0000542PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000543{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000544 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000545 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000546 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000548
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 if (!PyDict_Check(op)) {
550 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000551 return -1;
552 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000553 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000554 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000556 if (hash == -1)
557 return -1;
558 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000559 mp = (dictobject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000560 ep = (mp->ma_lookup)(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000561 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000563 return -1;
564 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000565 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000567 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000568 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000569 ep->me_value = NULL;
570 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000571 Py_DECREF(old_value);
572 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000573 return 0;
574}
575
Guido van Rossum25831651993-05-19 14:50:45 +0000576void
Tim Peters1f5871e2000-07-04 17:44:48 +0000577PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000578{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000579 dictobject *mp;
Tim Petersdea48ec2001-05-22 20:40:22 +0000580 dictentry *ep, *table;
581 int table_is_malloced;
582 int fill;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000583 dictentry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000584#ifdef Py_DEBUG
585 int i, n;
586#endif
587
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000589 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000590 mp = (dictobject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000591#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000592 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000593 i = 0;
594#endif
595
596 table = mp->ma_table;
597 assert(table != NULL);
598 table_is_malloced = table != mp->ma_smalltable;
599
600 /* This is delicate. During the process of clearing the dict,
601 * decrefs can cause the dict to mutate. To avoid fatal confusion
602 * (voice of experience), we have to make the dict empty before
603 * clearing the slots, and never refer to anything via mp->xxx while
604 * clearing.
605 */
606 fill = mp->ma_fill;
607 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000608 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000609
610 else if (fill > 0) {
611 /* It's a small table with something that needs to be cleared.
612 * Afraid the only safe way is to copy the dict entries into
613 * another small table first.
614 */
615 memcpy(small_copy, table, sizeof(small_copy));
616 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000618 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000619 /* else it's a small table that's already empty */
620
621 /* Now we can finally clear things. If C had refcounts, we could
622 * assert that the refcount on table is 1 now, i.e. that this function
623 * has unique access to it, so decref side-effects can't alter it.
624 */
625 for (ep = table; fill > 0; ++ep) {
626#ifdef Py_DEBUG
627 assert(i < n);
628 ++i;
629#endif
630 if (ep->me_key) {
631 --fill;
632 Py_DECREF(ep->me_key);
633 Py_XDECREF(ep->me_value);
634 }
635#ifdef Py_DEBUG
636 else
637 assert(ep->me_value == NULL);
638#endif
639 }
640
641 if (table_is_malloced)
642 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000643}
644
Tim Peters080c88b2003-02-15 03:01:11 +0000645/*
646 * Iterate over a dict. Use like so:
647 *
648 * int i;
649 * PyObject *key, *value;
650 * i = 0; # important! i should not otherwise be changed by you
651 * while (PyDict_Next(yourdict, &i, &key, &value) {
652 * Refer to borrowed references in key and value.
653 * }
654 *
655 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000656 * mutates the dict. One exception: it is safe if the loop merely changes
657 * the values associated with the keys (but doesn't insert new keys or
658 * delete keys), via PyDict_SetItem().
659 */
Guido van Rossum25831651993-05-19 14:50:45 +0000660int
Tim Peters1f5871e2000-07-04 17:44:48 +0000661PyDict_Next(PyObject *op, int *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000662{
Guido van Rossum25831651993-05-19 14:50:45 +0000663 int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000664 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000666 return 0;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000667 mp = (dictobject *)op;
Guido van Rossum25831651993-05-19 14:50:45 +0000668 i = *ppos;
669 if (i < 0)
670 return 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000671 while (i <= mp->ma_mask && mp->ma_table[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000672 i++;
673 *ppos = i+1;
Tim Petersafb6ae82001-06-04 21:00:21 +0000674 if (i > mp->ma_mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000675 return 0;
676 if (pkey)
677 *pkey = mp->ma_table[i].me_key;
678 if (pvalue)
679 *pvalue = mp->ma_table[i].me_value;
680 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000681}
682
683/* Methods */
684
685static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000686dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000687{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000688 register dictentry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000689 int fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000690 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000691 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000692 for (ep = mp->ma_table; fill > 0; ep++) {
693 if (ep->me_key) {
694 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000696 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000697 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000698 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000699 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000700 PyMem_DEL(mp->ma_table);
Guido van Rossum9475a232001-10-05 20:51:39 +0000701 mp->ob_type->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000702 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000703}
704
705static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000706dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000707{
708 register int i;
709 register int any;
Guido van Rossum255443b1998-04-10 22:47:14 +0000710
711 i = Py_ReprEnter((PyObject*)mp);
712 if (i != 0) {
713 if (i < 0)
714 return i;
715 fprintf(fp, "{...}");
716 return 0;
717 }
718
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000719 fprintf(fp, "{");
720 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000721 for (i = 0; i <= mp->ma_mask; i++) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000722 dictentry *ep = mp->ma_table + i;
723 PyObject *pvalue = ep->me_value;
724 if (pvalue != NULL) {
725 /* Prevent PyObject_Repr from deleting value during
726 key format */
727 Py_INCREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000728 if (any++ > 0)
729 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000730 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000731 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000732 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000733 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000734 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000735 fprintf(fp, ": ");
Tim Peters19b77cf2001-06-02 08:27:39 +0000736 if (PyObject_Print(pvalue, 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 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000741 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000742 }
743 }
744 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000745 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000746 return 0;
747}
748
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000750dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000751{
Tim Petersc6057842001-06-16 07:52:53 +0000752 int i;
Tim Petersa7259592001-06-16 05:11:17 +0000753 PyObject *s, *temp, *colon = NULL;
754 PyObject *pieces = NULL, *result = NULL;
755 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +0000756
Tim Petersa7259592001-06-16 05:11:17 +0000757 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +0000758 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000759 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +0000760 }
761
Tim Petersa7259592001-06-16 05:11:17 +0000762 if (mp->ma_used == 0) {
763 result = PyString_FromString("{}");
764 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000765 }
Tim Petersa7259592001-06-16 05:11:17 +0000766
767 pieces = PyList_New(0);
768 if (pieces == NULL)
769 goto Done;
770
771 colon = PyString_FromString(": ");
772 if (colon == NULL)
773 goto Done;
774
775 /* Do repr() on each key+value pair, and insert ": " between them.
776 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +0000777 i = 0;
778 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +0000779 int status;
780 /* Prevent repr from deleting value during key format. */
781 Py_INCREF(value);
782 s = PyObject_Repr(key);
783 PyString_Concat(&s, colon);
784 PyString_ConcatAndDel(&s, PyObject_Repr(value));
785 Py_DECREF(value);
786 if (s == NULL)
787 goto Done;
788 status = PyList_Append(pieces, s);
789 Py_DECREF(s); /* append created a new ref */
790 if (status < 0)
791 goto Done;
792 }
793
794 /* Add "{}" decorations to the first and last items. */
795 assert(PyList_GET_SIZE(pieces) > 0);
796 s = PyString_FromString("{");
797 if (s == NULL)
798 goto Done;
799 temp = PyList_GET_ITEM(pieces, 0);
800 PyString_ConcatAndDel(&s, temp);
801 PyList_SET_ITEM(pieces, 0, s);
802 if (s == NULL)
803 goto Done;
804
805 s = PyString_FromString("}");
806 if (s == NULL)
807 goto Done;
808 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
809 PyString_ConcatAndDel(&temp, s);
810 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
811 if (temp == NULL)
812 goto Done;
813
814 /* Paste them all together with ", " between. */
815 s = PyString_FromString(", ");
816 if (s == NULL)
817 goto Done;
818 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +0000819 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000820
821Done:
822 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +0000824 Py_ReprLeave((PyObject *)mp);
825 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000826}
827
828static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000829dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000830{
831 return mp->ma_used;
832}
833
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000835dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000836{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000838 long hash;
Tim Petersdea48ec2001-05-22 20:40:22 +0000839 assert(mp->ma_table != NULL);
Tim Peters0ab085c2001-09-14 00:25:33 +0000840 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000841 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000842 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000843 if (hash == -1)
844 return NULL;
845 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000846 v = (mp->ma_lookup)(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000847 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000849 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000850 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000851 return v;
852}
853
854static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000855dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000856{
857 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000859 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000861}
862
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000863static PyMappingMethods dict_as_mapping = {
864 (inquiry)dict_length, /*mp_length*/
865 (binaryfunc)dict_subscript, /*mp_subscript*/
866 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000867};
868
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000870dict_keys(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000871{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000873 register int i, j, n;
874
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000875 again:
876 n = mp->ma_used;
877 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000878 if (v == NULL)
879 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000880 if (n != mp->ma_used) {
881 /* Durnit. The allocations caused the dict to resize.
882 * Just start over, this shouldn't normally happen.
883 */
884 Py_DECREF(v);
885 goto again;
886 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000887 for (i = 0, j = 0; i <= mp->ma_mask; i++) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000888 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 PyObject *key = mp->ma_table[i].me_key;
890 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000891 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000892 j++;
893 }
894 }
895 return v;
896}
897
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000898static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000899dict_values(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000900{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000901 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000902 register int i, j, n;
903
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000904 again:
905 n = mp->ma_used;
906 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000907 if (v == NULL)
908 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000909 if (n != mp->ma_used) {
910 /* Durnit. The allocations caused the dict to resize.
911 * Just start over, this shouldn't normally happen.
912 */
913 Py_DECREF(v);
914 goto again;
915 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000916 for (i = 0, j = 0; i <= mp->ma_mask; i++) {
Guido van Rossum25831651993-05-19 14:50:45 +0000917 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 PyObject *value = mp->ma_table[i].me_value;
919 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000920 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000921 j++;
922 }
923 }
924 return v;
925}
926
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000928dict_items(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000929{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000931 register int i, j, n;
932 PyObject *item, *key, *value;
933
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000934 /* Preallocate the list of tuples, to avoid allocations during
935 * the loop over the items, which could trigger GC, which
936 * could resize the dict. :-(
937 */
938 again:
939 n = mp->ma_used;
940 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000941 if (v == NULL)
942 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000943 for (i = 0; i < n; i++) {
944 item = PyTuple_New(2);
945 if (item == NULL) {
946 Py_DECREF(v);
947 return NULL;
948 }
949 PyList_SET_ITEM(v, i, item);
950 }
951 if (n != mp->ma_used) {
952 /* Durnit. The allocations caused the dict to resize.
953 * Just start over, this shouldn't normally happen.
954 */
955 Py_DECREF(v);
956 goto again;
957 }
958 /* Nothing we do below makes any function calls. */
Tim Petersafb6ae82001-06-04 21:00:21 +0000959 for (i = 0, j = 0; i <= mp->ma_mask; i++) {
Guido van Rossum25831651993-05-19 14:50:45 +0000960 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000961 key = mp->ma_table[i].me_key;
962 value = mp->ma_table[i].me_value;
963 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000965 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000966 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000967 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000968 j++;
969 }
970 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000971 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +0000972 return v;
973}
974
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000975static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +0000976dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +0000977{
978 PyObject *seq;
979 PyObject *value = Py_None;
980 PyObject *it; /* iter(seq) */
981 PyObject *key;
982 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +0000983 int status;
984
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000985 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +0000986 return NULL;
987
988 d = PyObject_CallObject(cls, NULL);
989 if (d == NULL)
990 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +0000991
992 it = PyObject_GetIter(seq);
993 if (it == NULL){
994 Py_DECREF(d);
995 return NULL;
996 }
997
998 for (;;) {
999 key = PyIter_Next(it);
1000 if (key == NULL) {
1001 if (PyErr_Occurred())
1002 goto Fail;
1003 break;
1004 }
Raymond Hettingere03e5b12002-12-07 08:10:51 +00001005 status = PyObject_SetItem(d, key, value);
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001006 Py_DECREF(key);
1007 if (status < 0)
1008 goto Fail;
1009 }
1010
1011 Py_DECREF(it);
1012 return d;
1013
1014Fail:
1015 Py_DECREF(it);
1016 Py_DECREF(d);
1017 return NULL;
1018}
1019
1020static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001021dict_update(PyObject *mp, PyObject *other)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001022{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001023 if (PyDict_Update(mp, other) < 0)
1024 return NULL;
1025 Py_INCREF(Py_None);
1026 return Py_None;
1027}
1028
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001029/* Update unconditionally replaces existing items.
1030 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001031 otherwise it leaves existing items unchanged.
1032
1033 PyDict_{Update,Merge} update/merge from a mapping object.
1034
Tim Petersf582b822001-12-11 18:51:08 +00001035 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001036 producing iterable objects of length 2.
1037*/
1038
Tim Petersf582b822001-12-11 18:51:08 +00001039int
Tim Peters1fc240e2001-10-26 05:06:50 +00001040PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1041{
1042 PyObject *it; /* iter(seq2) */
1043 int i; /* index into seq2 of current element */
1044 PyObject *item; /* seq2[i] */
1045 PyObject *fast; /* item as a 2-tuple or 2-list */
1046
1047 assert(d != NULL);
1048 assert(PyDict_Check(d));
1049 assert(seq2 != NULL);
1050
1051 it = PyObject_GetIter(seq2);
1052 if (it == NULL)
1053 return -1;
1054
1055 for (i = 0; ; ++i) {
1056 PyObject *key, *value;
1057 int n;
1058
1059 fast = NULL;
1060 item = PyIter_Next(it);
1061 if (item == NULL) {
1062 if (PyErr_Occurred())
1063 goto Fail;
1064 break;
1065 }
1066
1067 /* Convert item to sequence, and verify length 2. */
1068 fast = PySequence_Fast(item, "");
1069 if (fast == NULL) {
1070 if (PyErr_ExceptionMatches(PyExc_TypeError))
1071 PyErr_Format(PyExc_TypeError,
1072 "cannot convert dictionary update "
1073 "sequence element #%d to a sequence",
1074 i);
1075 goto Fail;
1076 }
1077 n = PySequence_Fast_GET_SIZE(fast);
1078 if (n != 2) {
1079 PyErr_Format(PyExc_ValueError,
1080 "dictionary update sequence element #%d "
1081 "has length %d; 2 is required",
1082 i, n);
1083 goto Fail;
1084 }
1085
1086 /* Update/merge with this (key, value) pair. */
1087 key = PySequence_Fast_GET_ITEM(fast, 0);
1088 value = PySequence_Fast_GET_ITEM(fast, 1);
1089 if (override || PyDict_GetItem(d, key) == NULL) {
1090 int status = PyDict_SetItem(d, key, value);
1091 if (status < 0)
1092 goto Fail;
1093 }
1094 Py_DECREF(fast);
1095 Py_DECREF(item);
1096 }
1097
1098 i = 0;
1099 goto Return;
1100Fail:
1101 Py_XDECREF(item);
1102 Py_XDECREF(fast);
1103 i = -1;
1104Return:
1105 Py_DECREF(it);
1106 return i;
1107}
1108
Tim Peters6d6c1a32001-08-02 04:15:00 +00001109int
1110PyDict_Update(PyObject *a, PyObject *b)
1111{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001112 return PyDict_Merge(a, b, 1);
1113}
1114
1115int
1116PyDict_Merge(PyObject *a, PyObject *b, int override)
1117{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001118 register PyDictObject *mp, *other;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001119 register int i;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001120 dictentry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001121
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001122 /* We accept for the argument either a concrete dictionary object,
1123 * or an abstract "mapping" object. For the former, we can do
1124 * things quite efficiently. For the latter, we only require that
1125 * PyMapping_Keys() and PyObject_GetItem() be supported.
1126 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001127 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1128 PyErr_BadInternalCall();
1129 return -1;
1130 }
1131 mp = (dictobject*)a;
1132 if (PyDict_Check(b)) {
1133 other = (dictobject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001134 if (other == mp || other->ma_used == 0)
1135 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001136 return 0;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001137 /* Do one big resize at the start, rather than
1138 * incrementally resizing as we insert new items. Expect
1139 * that there will be no (or few) overlapping keys.
1140 */
1141 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
1142 if (dictresize(mp, (mp->ma_used + other->ma_used)*3/2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001143 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001144 }
1145 for (i = 0; i <= other->ma_mask; i++) {
1146 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001147 if (entry->me_value != NULL &&
1148 (override ||
1149 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001150 Py_INCREF(entry->me_key);
1151 Py_INCREF(entry->me_value);
1152 insertdict(mp, entry->me_key, entry->me_hash,
1153 entry->me_value);
1154 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001155 }
1156 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001157 else {
1158 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001159 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001160 PyObject *iter;
1161 PyObject *key, *value;
1162 int status;
1163
1164 if (keys == NULL)
1165 /* Docstring says this is equivalent to E.keys() so
1166 * if E doesn't have a .keys() method we want
1167 * AttributeError to percolate up. Might as well
1168 * do the same for any other error.
1169 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001170 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001171
1172 iter = PyObject_GetIter(keys);
1173 Py_DECREF(keys);
1174 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001175 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001176
1177 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001178 if (!override && PyDict_GetItem(a, key) != NULL) {
1179 Py_DECREF(key);
1180 continue;
1181 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001182 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001183 if (value == NULL) {
1184 Py_DECREF(iter);
1185 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001186 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001187 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001188 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001189 Py_DECREF(key);
1190 Py_DECREF(value);
1191 if (status < 0) {
1192 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001193 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001194 }
1195 }
1196 Py_DECREF(iter);
1197 if (PyErr_Occurred())
1198 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001199 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001200 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001201 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001202}
1203
1204static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001205dict_copy(register dictobject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001206{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001207 return PyDict_Copy((PyObject*)mp);
1208}
1209
1210PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001211PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001212{
1213 register dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001214 register int i;
1215 dictobject *copy;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001216 dictentry *entry;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001217
1218 if (o == NULL || !PyDict_Check(o)) {
1219 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001220 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001221 }
1222 mp = (dictobject *)o;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001223 copy = (dictobject *)PyDict_New();
1224 if (copy == NULL)
1225 return NULL;
1226 if (mp->ma_used > 0) {
1227 if (dictresize(copy, mp->ma_used*3/2) != 0)
1228 return NULL;
Tim Petersafb6ae82001-06-04 21:00:21 +00001229 for (i = 0; i <= mp->ma_mask; i++) {
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001230 entry = &mp->ma_table[i];
1231 if (entry->me_value != NULL) {
1232 Py_INCREF(entry->me_key);
1233 Py_INCREF(entry->me_value);
1234 insertdict(copy, entry->me_key, entry->me_hash,
1235 entry->me_value);
1236 }
1237 }
1238 }
1239 return (PyObject *)copy;
1240}
1241
Guido van Rossum4199fac1993-11-05 10:18:44 +00001242int
Tim Peters1f5871e2000-07-04 17:44:48 +00001243PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001244{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001245 if (mp == NULL || !PyDict_Check(mp)) {
1246 PyErr_BadInternalCall();
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001247 return 0;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001248 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001249 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001250}
1251
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001252PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001253PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001254{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001255 if (mp == NULL || !PyDict_Check(mp)) {
1256 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001257 return NULL;
1258 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001259 return dict_keys((dictobject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001260}
1261
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001262PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001263PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001264{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001265 if (mp == NULL || !PyDict_Check(mp)) {
1266 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001267 return NULL;
1268 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001269 return dict_values((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001270}
1271
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001272PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001273PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001274{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275 if (mp == NULL || !PyDict_Check(mp)) {
1276 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001277 return NULL;
1278 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001279 return dict_items((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001280}
1281
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001282/* Subroutine which returns the smallest key in a for which b's value
1283 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001284 pval argument. Both are NULL if no key in a is found for which b's status
1285 differs. The refcounts on (and only on) non-NULL *pval and function return
1286 values must be decremented by the caller (characterize() increments them
1287 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1288 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001289
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001291characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001292{
Tim Peters95bf9392001-05-10 08:32:44 +00001293 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1294 PyObject *aval = NULL; /* a[akey] */
Guido van Rossumb9324202001-01-18 00:39:02 +00001295 int i, cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001296
Tim Petersafb6ae82001-06-04 21:00:21 +00001297 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001298 PyObject *thiskey, *thisaval, *thisbval;
1299 if (a->ma_table[i].me_value == NULL)
1300 continue;
1301 thiskey = a->ma_table[i].me_key;
1302 Py_INCREF(thiskey); /* keep alive across compares */
1303 if (akey != NULL) {
1304 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1305 if (cmp < 0) {
1306 Py_DECREF(thiskey);
1307 goto Fail;
1308 }
1309 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001310 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001311 a->ma_table[i].me_value == NULL)
1312 {
1313 /* Not the *smallest* a key; or maybe it is
1314 * but the compare shrunk the dict so we can't
1315 * find its associated value anymore; or
1316 * maybe it is but the compare deleted the
1317 * a[thiskey] entry.
1318 */
1319 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001320 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001321 }
Tim Peters95bf9392001-05-10 08:32:44 +00001322 }
1323
1324 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1325 thisaval = a->ma_table[i].me_value;
1326 assert(thisaval);
1327 Py_INCREF(thisaval); /* keep alive */
1328 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1329 if (thisbval == NULL)
1330 cmp = 0;
1331 else {
1332 /* both dicts have thiskey: same values? */
1333 cmp = PyObject_RichCompareBool(
1334 thisaval, thisbval, Py_EQ);
1335 if (cmp < 0) {
1336 Py_DECREF(thiskey);
1337 Py_DECREF(thisaval);
1338 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001339 }
1340 }
Tim Peters95bf9392001-05-10 08:32:44 +00001341 if (cmp == 0) {
1342 /* New winner. */
1343 Py_XDECREF(akey);
1344 Py_XDECREF(aval);
1345 akey = thiskey;
1346 aval = thisaval;
1347 }
1348 else {
1349 Py_DECREF(thiskey);
1350 Py_DECREF(thisaval);
1351 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001352 }
Tim Peters95bf9392001-05-10 08:32:44 +00001353 *pval = aval;
1354 return akey;
1355
1356Fail:
1357 Py_XDECREF(akey);
1358 Py_XDECREF(aval);
1359 *pval = NULL;
1360 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001361}
1362
1363static int
Tim Peters1f5871e2000-07-04 17:44:48 +00001364dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001365{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001366 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001367 int res;
1368
1369 /* Compare lengths first */
1370 if (a->ma_used < b->ma_used)
1371 return -1; /* a is shorter */
1372 else if (a->ma_used > b->ma_used)
1373 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001374
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001375 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001376 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001377 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001378 if (adiff == NULL) {
1379 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001380 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001381 * must be equal.
1382 */
1383 res = PyErr_Occurred() ? -1 : 0;
1384 goto Finished;
1385 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001386 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001387 if (bdiff == NULL && PyErr_Occurred()) {
1388 assert(!bval);
1389 res = -1;
1390 goto Finished;
1391 }
1392 res = 0;
1393 if (bdiff) {
1394 /* bdiff == NULL "should be" impossible now, but perhaps
1395 * the last comparison done by the characterize() on a had
1396 * the side effect of making the dicts equal!
1397 */
1398 res = PyObject_Compare(adiff, bdiff);
1399 }
1400 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001401 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001402
1403Finished:
1404 Py_XDECREF(adiff);
1405 Py_XDECREF(bdiff);
1406 Py_XDECREF(aval);
1407 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001408 return res;
1409}
1410
Tim Peterse63415e2001-05-08 04:38:29 +00001411/* Return 1 if dicts equal, 0 if not, -1 if error.
1412 * Gets out as soon as any difference is detected.
1413 * Uses only Py_EQ comparison.
1414 */
1415static int
1416dict_equal(dictobject *a, dictobject *b)
1417{
1418 int i;
1419
1420 if (a->ma_used != b->ma_used)
1421 /* can't be equal if # of entries differ */
1422 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001423
Tim Peterse63415e2001-05-08 04:38:29 +00001424 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001425 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001426 PyObject *aval = a->ma_table[i].me_value;
1427 if (aval != NULL) {
1428 int cmp;
1429 PyObject *bval;
1430 PyObject *key = a->ma_table[i].me_key;
1431 /* temporarily bump aval's refcount to ensure it stays
1432 alive until we're done with it */
1433 Py_INCREF(aval);
1434 bval = PyDict_GetItem((PyObject *)b, key);
1435 if (bval == NULL) {
1436 Py_DECREF(aval);
1437 return 0;
1438 }
1439 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1440 Py_DECREF(aval);
1441 if (cmp <= 0) /* error or not equal */
1442 return cmp;
1443 }
1444 }
1445 return 1;
1446 }
1447
1448static PyObject *
1449dict_richcompare(PyObject *v, PyObject *w, int op)
1450{
1451 int cmp;
1452 PyObject *res;
1453
1454 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1455 res = Py_NotImplemented;
1456 }
1457 else if (op == Py_EQ || op == Py_NE) {
1458 cmp = dict_equal((dictobject *)v, (dictobject *)w);
1459 if (cmp < 0)
1460 return NULL;
1461 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1462 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001463 else
1464 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001465 Py_INCREF(res);
1466 return res;
1467 }
1468
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001469static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001470dict_has_key(register dictobject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001471{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001472 long hash;
1473 register long ok;
Tim Peters0ab085c2001-09-14 00:25:33 +00001474 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001475 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001477 if (hash == -1)
1478 return NULL;
1479 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001480 ok = (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001481 return PyBool_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001482}
1483
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001485dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001486{
1487 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001488 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001489 PyObject *val = NULL;
1490 long hash;
1491
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001492 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001493 return NULL;
1494
Tim Peters0ab085c2001-09-14 00:25:33 +00001495 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001496 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001497 hash = PyObject_Hash(key);
1498 if (hash == -1)
1499 return NULL;
1500 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001501 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001502
Barry Warsawc38c5da1997-10-06 17:49:20 +00001503 if (val == NULL)
1504 val = failobj;
1505 Py_INCREF(val);
1506 return val;
1507}
1508
1509
1510static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001511dict_setdefault(register dictobject *mp, PyObject *args)
1512{
1513 PyObject *key;
1514 PyObject *failobj = Py_None;
1515 PyObject *val = NULL;
1516 long hash;
1517
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001518 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001519 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001520
Tim Peters0ab085c2001-09-14 00:25:33 +00001521 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001522 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001523 hash = PyObject_Hash(key);
1524 if (hash == -1)
1525 return NULL;
1526 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001527 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001528 if (val == NULL) {
1529 val = failobj;
1530 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1531 val = NULL;
1532 }
1533 Py_XINCREF(val);
1534 return val;
1535}
1536
1537
1538static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001539dict_clear(register dictobject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001540{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001541 PyDict_Clear((PyObject *)mp);
1542 Py_INCREF(Py_None);
1543 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001544}
1545
Guido van Rossumba6ab842000-12-12 22:02:18 +00001546static PyObject *
Guido van Rossume027d982002-04-12 15:11:59 +00001547dict_pop(dictobject *mp, PyObject *key)
1548{
1549 long hash;
1550 dictentry *ep;
1551 PyObject *old_value, *old_key;
1552
1553 if (mp->ma_used == 0) {
1554 PyErr_SetString(PyExc_KeyError,
1555 "pop(): dictionary is empty");
1556 return NULL;
1557 }
1558 if (!PyString_CheckExact(key) ||
1559 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
1560 hash = PyObject_Hash(key);
1561 if (hash == -1)
1562 return NULL;
1563 }
1564 ep = (mp->ma_lookup)(mp, key, hash);
1565 if (ep->me_value == NULL) {
1566 PyErr_SetObject(PyExc_KeyError, key);
1567 return NULL;
1568 }
1569 old_key = ep->me_key;
1570 Py_INCREF(dummy);
1571 ep->me_key = dummy;
1572 old_value = ep->me_value;
1573 ep->me_value = NULL;
1574 mp->ma_used--;
1575 Py_DECREF(old_key);
1576 return old_value;
1577}
1578
1579static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001580dict_popitem(dictobject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001581{
1582 int i = 0;
1583 dictentry *ep;
1584 PyObject *res;
1585
Tim Petersf4b33f62001-06-02 05:42:29 +00001586 /* Allocate the result tuple before checking the size. Believe it
1587 * or not, this allocation could trigger a garbage collection which
1588 * could empty the dict, so if we checked the size first and that
1589 * happened, the result would be an infinite loop (searching for an
1590 * entry that no longer exists). Note that the usual popitem()
1591 * idiom is "while d: k, v = d.popitem()". so needing to throw the
1592 * tuple away if the dict *is* empty isn't a significant
1593 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001594 */
1595 res = PyTuple_New(2);
1596 if (res == NULL)
1597 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001598 if (mp->ma_used == 0) {
1599 Py_DECREF(res);
1600 PyErr_SetString(PyExc_KeyError,
1601 "popitem(): dictionary is empty");
1602 return NULL;
1603 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001604 /* Set ep to "the first" dict entry with a value. We abuse the hash
1605 * field of slot 0 to hold a search finger:
1606 * If slot 0 has a value, use slot 0.
1607 * Else slot 0 is being used to hold a search finger,
1608 * and we use its hash value as the first index to look.
1609 */
1610 ep = &mp->ma_table[0];
1611 if (ep->me_value == NULL) {
1612 i = (int)ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001613 /* The hash field may be a real hash value, or it may be a
1614 * legit search finger, or it may be a once-legit search
1615 * finger that's out of bounds now because it wrapped around
1616 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001617 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001618 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001619 i = 1; /* skip slot 0 */
1620 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1621 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001622 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001623 i = 1;
1624 }
1625 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001626 PyTuple_SET_ITEM(res, 0, ep->me_key);
1627 PyTuple_SET_ITEM(res, 1, ep->me_value);
1628 Py_INCREF(dummy);
1629 ep->me_key = dummy;
1630 ep->me_value = NULL;
1631 mp->ma_used--;
1632 assert(mp->ma_table[0].me_value == NULL);
1633 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001634 return res;
1635}
1636
Jeremy Hylton8caad492000-06-23 14:18:11 +00001637static int
1638dict_traverse(PyObject *op, visitproc visit, void *arg)
1639{
1640 int i = 0, err;
1641 PyObject *pk;
1642 PyObject *pv;
1643
1644 while (PyDict_Next(op, &i, &pk, &pv)) {
1645 err = visit(pk, arg);
1646 if (err)
1647 return err;
1648 err = visit(pv, arg);
1649 if (err)
1650 return err;
1651 }
1652 return 0;
1653}
1654
1655static int
1656dict_tp_clear(PyObject *op)
1657{
1658 PyDict_Clear(op);
1659 return 0;
1660}
1661
Tim Petersf7f88b12000-12-13 23:18:45 +00001662
Jeremy Hylton938ace62002-07-17 16:30:39 +00001663static PyObject *dictiter_new(dictobject *, binaryfunc);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001664
1665static PyObject *
1666select_key(PyObject *key, PyObject *value)
1667{
1668 Py_INCREF(key);
1669 return key;
1670}
1671
1672static PyObject *
1673select_value(PyObject *key, PyObject *value)
1674{
1675 Py_INCREF(value);
1676 return value;
1677}
1678
1679static PyObject *
1680select_item(PyObject *key, PyObject *value)
1681{
1682 PyObject *res = PyTuple_New(2);
1683
1684 if (res != NULL) {
1685 Py_INCREF(key);
1686 Py_INCREF(value);
1687 PyTuple_SET_ITEM(res, 0, key);
1688 PyTuple_SET_ITEM(res, 1, value);
1689 }
1690 return res;
1691}
1692
1693static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001694dict_iterkeys(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001695{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001696 return dictiter_new(dict, select_key);
1697}
1698
1699static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001700dict_itervalues(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001701{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001702 return dictiter_new(dict, select_value);
1703}
1704
1705static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001706dict_iteritems(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001707{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001708 return dictiter_new(dict, select_item);
1709}
1710
1711
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001712PyDoc_STRVAR(has_key__doc__,
1713"D.has_key(k) -> 1 if D has a key k, else 0");
Tim Petersf7f88b12000-12-13 23:18:45 +00001714
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001715PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001716"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001717
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001718PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001719"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 +00001720
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001721PyDoc_STRVAR(pop__doc__,
1722"D.pop(k) -> v, remove specified key and return the corresponding value");
Guido van Rossume027d982002-04-12 15:11:59 +00001723
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001724PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00001725"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000017262-tuple; but raise KeyError if D is empty");
Tim Petersf7f88b12000-12-13 23:18:45 +00001727
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001728PyDoc_STRVAR(keys__doc__,
1729"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00001730
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001731PyDoc_STRVAR(items__doc__,
1732"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00001733
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001734PyDoc_STRVAR(values__doc__,
1735"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00001736
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001737PyDoc_STRVAR(update__doc__,
1738"D.update(E) -> None. Update D from E: for k in E.keys(): D[k] = E[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00001739
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001740PyDoc_STRVAR(fromkeys__doc__,
1741"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
1742v defaults to None.");
1743
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001744PyDoc_STRVAR(clear__doc__,
1745"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001746
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001747PyDoc_STRVAR(copy__doc__,
1748"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00001749
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001750PyDoc_STRVAR(iterkeys__doc__,
1751"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001752
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001753PyDoc_STRVAR(itervalues__doc__,
1754"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001755
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001756PyDoc_STRVAR(iteritems__doc__,
1757"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00001758
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001759static PyMethodDef mapp_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001760 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001761 has_key__doc__},
1762 {"get", (PyCFunction)dict_get, METH_VARARGS,
1763 get__doc__},
1764 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1765 setdefault_doc__},
Guido van Rossume027d982002-04-12 15:11:59 +00001766 {"pop", (PyCFunction)dict_pop, METH_O,
Just van Rossuma797d812002-11-23 09:45:04 +00001767 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001768 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001769 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001770 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001771 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001772 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001773 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001774 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001775 values__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001776 {"update", (PyCFunction)dict_update, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001777 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001778 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
1779 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001780 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001781 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001782 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001783 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001784 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001785 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001786 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001787 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001788 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001789 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00001790 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001791};
1792
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001793static int
1794dict_contains(dictobject *mp, PyObject *key)
1795{
1796 long hash;
1797
Tim Peters0ab085c2001-09-14 00:25:33 +00001798 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001799 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001800 hash = PyObject_Hash(key);
1801 if (hash == -1)
1802 return -1;
1803 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001804 return (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001805}
1806
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001807/* Hack to implement "key in dict" */
1808static PySequenceMethods dict_as_sequence = {
1809 0, /* sq_length */
1810 0, /* sq_concat */
1811 0, /* sq_repeat */
1812 0, /* sq_item */
1813 0, /* sq_slice */
1814 0, /* sq_ass_item */
1815 0, /* sq_ass_slice */
1816 (objobjproc)dict_contains, /* sq_contains */
1817 0, /* sq_inplace_concat */
1818 0, /* sq_inplace_repeat */
1819};
1820
Guido van Rossum09e563a2001-05-01 12:10:21 +00001821static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001822dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1823{
1824 PyObject *self;
1825
1826 assert(type != NULL && type->tp_alloc != NULL);
1827 self = type->tp_alloc(type, 0);
1828 if (self != NULL) {
1829 PyDictObject *d = (PyDictObject *)self;
1830 /* It's guaranteed that tp->alloc zeroed out the struct. */
1831 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
1832 INIT_NONZERO_DICT_SLOTS(d);
1833 d->ma_lookup = lookdict_string;
1834#ifdef SHOW_CONVERSION_COUNTS
1835 ++created;
1836#endif
1837 }
1838 return self;
1839}
1840
Tim Peters25786c02001-09-02 08:22:48 +00001841static int
1842dict_init(PyObject *self, PyObject *args, PyObject *kwds)
1843{
1844 PyObject *arg = NULL;
Tim Peters1fc240e2001-10-26 05:06:50 +00001845 int result = 0;
Tim Peters25786c02001-09-02 08:22:48 +00001846
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001847 if (!PyArg_UnpackTuple(args, "dict", 0, 1, &arg))
Tim Peters1fc240e2001-10-26 05:06:50 +00001848 result = -1;
1849
1850 else if (arg != NULL) {
1851 if (PyObject_HasAttrString(arg, "keys"))
1852 result = PyDict_Merge(self, arg, 1);
1853 else
1854 result = PyDict_MergeFromSeq2(self, arg, 1);
Tim Peters25786c02001-09-02 08:22:48 +00001855 }
Just van Rossuma797d812002-11-23 09:45:04 +00001856 if (result == 0 && kwds != NULL)
1857 result = PyDict_Merge(self, kwds, 1);
Tim Peters1fc240e2001-10-26 05:06:50 +00001858 return result;
Tim Peters25786c02001-09-02 08:22:48 +00001859}
1860
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001861static long
1862dict_nohash(PyObject *self)
1863{
1864 PyErr_SetString(PyExc_TypeError, "dict objects are unhashable");
1865 return -1;
1866}
1867
Tim Peters6d6c1a32001-08-02 04:15:00 +00001868static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00001869dict_iter(dictobject *dict)
1870{
1871 return dictiter_new(dict, select_key);
1872}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001873
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001874PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00001875"dict() -> new empty dictionary.\n"
1876"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00001877" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00001878"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00001879" d = {}\n"
1880" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00001881" d[k] = v\n"
1882"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
1883" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00001884
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001885PyTypeObject PyDict_Type = {
1886 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001887 0,
Tim Petersa427a2b2001-10-29 22:25:45 +00001888 "dict",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001889 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001890 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00001891 (destructor)dict_dealloc, /* tp_dealloc */
1892 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001893 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00001894 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00001895 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00001896 (reprfunc)dict_repr, /* tp_repr */
1897 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001898 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00001899 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001900 dict_nohash, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00001901 0, /* tp_call */
1902 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001903 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00001904 0, /* tp_setattro */
1905 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001906 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00001907 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00001908 dictionary_doc, /* tp_doc */
Guido van Rossumb9324202001-01-18 00:39:02 +00001909 (traverseproc)dict_traverse, /* tp_traverse */
1910 (inquiry)dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00001911 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001912 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00001913 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001914 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001915 mapp_methods, /* tp_methods */
1916 0, /* tp_members */
1917 0, /* tp_getset */
1918 0, /* tp_base */
1919 0, /* tp_dict */
1920 0, /* tp_descr_get */
1921 0, /* tp_descr_set */
1922 0, /* tp_dictoffset */
Tim Peters25786c02001-09-02 08:22:48 +00001923 (initproc)dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001924 PyType_GenericAlloc, /* tp_alloc */
1925 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00001926 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001927};
1928
Guido van Rossum3cca2451997-05-16 14:23:33 +00001929/* For backward compatibility with old dictionary interface */
1930
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001931PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001932PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001933{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001934 PyObject *kv, *rv;
1935 kv = PyString_FromString(key);
1936 if (kv == NULL)
1937 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001938 rv = PyDict_GetItem(v, kv);
1939 Py_DECREF(kv);
1940 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001941}
1942
1943int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001944PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001945{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001946 PyObject *kv;
1947 int err;
1948 kv = PyString_FromString(key);
1949 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001950 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001951 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001952 err = PyDict_SetItem(v, kv, item);
1953 Py_DECREF(kv);
1954 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001955}
1956
1957int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00001958PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001959{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001960 PyObject *kv;
1961 int err;
1962 kv = PyString_FromString(key);
1963 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001964 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001965 err = PyDict_DelItem(v, kv);
1966 Py_DECREF(kv);
1967 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001968}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001969
1970/* Dictionary iterator type */
1971
1972extern PyTypeObject PyDictIter_Type; /* Forward */
1973
1974typedef struct {
1975 PyObject_HEAD
Guido van Rossum2147df72002-07-16 20:30:22 +00001976 dictobject *di_dict; /* Set to NULL when iterator is exhausted */
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00001977 int di_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001978 int di_pos;
Guido van Rossum09e563a2001-05-01 12:10:21 +00001979 binaryfunc di_select;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001980} dictiterobject;
1981
1982static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00001983dictiter_new(dictobject *dict, binaryfunc select)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001984{
1985 dictiterobject *di;
Neil Schemenauer6189b892002-04-12 02:43:00 +00001986 di = PyObject_New(dictiterobject, &PyDictIter_Type);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001987 if (di == NULL)
1988 return NULL;
1989 Py_INCREF(dict);
1990 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00001991 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001992 di->di_pos = 0;
Guido van Rossum09e563a2001-05-01 12:10:21 +00001993 di->di_select = select;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001994 return (PyObject *)di;
1995}
1996
1997static void
1998dictiter_dealloc(dictiterobject *di)
1999{
Guido van Rossum2147df72002-07-16 20:30:22 +00002000 Py_XDECREF(di->di_dict);
Neil Schemenauer6189b892002-04-12 02:43:00 +00002001 PyObject_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002002}
2003
2004static PyObject *
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002005dictiter_getiter(PyObject *it)
2006{
2007 Py_INCREF(it);
2008 return it;
2009}
2010
Guido van Rossum213c7a62001-04-23 14:08:49 +00002011static PyObject *dictiter_iternext(dictiterobject *di)
2012{
Guido van Rossum09e563a2001-05-01 12:10:21 +00002013 PyObject *key, *value;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002014
Guido van Rossum2147df72002-07-16 20:30:22 +00002015 if (di->di_dict == NULL)
2016 return NULL;
2017
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002018 if (di->di_used != di->di_dict->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002019 PyErr_SetString(PyExc_RuntimeError,
2020 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002021 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002022 return NULL;
2023 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002024 if (PyDict_Next((PyObject *)(di->di_dict), &di->di_pos, &key, &value))
Guido van Rossum09e563a2001-05-01 12:10:21 +00002025 return (*di->di_select)(key, value);
Guido van Rossum2147df72002-07-16 20:30:22 +00002026
2027 Py_DECREF(di->di_dict);
2028 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002029 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002030}
2031
2032PyTypeObject PyDictIter_Type = {
2033 PyObject_HEAD_INIT(&PyType_Type)
2034 0, /* ob_size */
2035 "dictionary-iterator", /* tp_name */
2036 sizeof(dictiterobject), /* tp_basicsize */
2037 0, /* tp_itemsize */
2038 /* methods */
2039 (destructor)dictiter_dealloc, /* tp_dealloc */
2040 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002041 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002042 0, /* tp_setattr */
2043 0, /* tp_compare */
2044 0, /* tp_repr */
2045 0, /* tp_as_number */
2046 0, /* tp_as_sequence */
2047 0, /* tp_as_mapping */
2048 0, /* tp_hash */
2049 0, /* tp_call */
2050 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002051 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002052 0, /* tp_setattro */
2053 0, /* tp_as_buffer */
2054 Py_TPFLAGS_DEFAULT, /* tp_flags */
2055 0, /* tp_doc */
2056 0, /* tp_traverse */
2057 0, /* tp_clear */
2058 0, /* tp_richcompare */
2059 0, /* tp_weaklistoffset */
2060 (getiterfunc)dictiter_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002061 (iternextfunc)dictiter_iternext, /* tp_iternext */
Guido van Rossum2147df72002-07-16 20:30:22 +00002062 0, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002063 0, /* tp_members */
2064 0, /* tp_getset */
2065 0, /* tp_base */
2066 0, /* tp_dict */
2067 0, /* tp_descr_get */
2068 0, /* tp_descr_set */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002069};