blob: b720ae5b736f78853fb08fdff40a9753e77d8e47 [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 Rossumc0b618a1997-05-02 03:12:38 +0000514 if (((PyStringObject *)key)->ob_sinterned != NULL) {
515 key = ((PyStringObject *)key)->ob_sinterned;
516 hash = ((PyStringObject *)key)->ob_shash;
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 = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000520 if (hash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000522 }
523 }
Tim Peters1f7df352002-03-29 03:29:08 +0000524 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000526 if (hash == -1)
527 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000528 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000529 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000530 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 Py_INCREF(value);
532 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000533 insertdict(mp, key, hash, value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000534 /* If we added a key, we can safely resize. Otherwise skip this!
535 * If fill >= 2/3 size, adjust size. Normally, this doubles the
536 * size, but it's also possible for the dict to shrink (if ma_fill is
537 * much larger than ma_used, meaning a lot of dict keys have been
538 * deleted).
539 */
Tim Petersafb6ae82001-06-04 21:00:21 +0000540 if (mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2) {
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000541 if (dictresize(mp, mp->ma_used*2) != 0)
542 return -1;
543 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000544 return 0;
545}
546
547int
Tim Peters1f5871e2000-07-04 17:44:48 +0000548PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000549{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000550 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000551 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000552 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000554
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 if (!PyDict_Check(op)) {
556 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000557 return -1;
558 }
Tim Peters0ab085c2001-09-14 00:25:33 +0000559 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000560 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000562 if (hash == -1)
563 return -1;
564 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000565 mp = (dictobject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000566 ep = (mp->ma_lookup)(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000567 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000569 return -1;
570 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000571 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000573 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000574 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000575 ep->me_value = NULL;
576 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000577 Py_DECREF(old_value);
578 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000579 return 0;
580}
581
Guido van Rossum25831651993-05-19 14:50:45 +0000582void
Tim Peters1f5871e2000-07-04 17:44:48 +0000583PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000584{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000585 dictobject *mp;
Tim Petersdea48ec2001-05-22 20:40:22 +0000586 dictentry *ep, *table;
587 int table_is_malloced;
588 int fill;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 dictentry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000590#ifdef Py_DEBUG
591 int i, n;
592#endif
593
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000595 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000596 mp = (dictobject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000597#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000598 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000599 i = 0;
600#endif
601
602 table = mp->ma_table;
603 assert(table != NULL);
604 table_is_malloced = table != mp->ma_smalltable;
605
606 /* This is delicate. During the process of clearing the dict,
607 * decrefs can cause the dict to mutate. To avoid fatal confusion
608 * (voice of experience), we have to make the dict empty before
609 * clearing the slots, and never refer to anything via mp->xxx while
610 * clearing.
611 */
612 fill = mp->ma_fill;
613 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000614 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000615
616 else if (fill > 0) {
617 /* It's a small table with something that needs to be cleared.
618 * Afraid the only safe way is to copy the dict entries into
619 * another small table first.
620 */
621 memcpy(small_copy, table, sizeof(small_copy));
622 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000623 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000624 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000625 /* else it's a small table that's already empty */
626
627 /* Now we can finally clear things. If C had refcounts, we could
628 * assert that the refcount on table is 1 now, i.e. that this function
629 * has unique access to it, so decref side-effects can't alter it.
630 */
631 for (ep = table; fill > 0; ++ep) {
632#ifdef Py_DEBUG
633 assert(i < n);
634 ++i;
635#endif
636 if (ep->me_key) {
637 --fill;
638 Py_DECREF(ep->me_key);
639 Py_XDECREF(ep->me_value);
640 }
641#ifdef Py_DEBUG
642 else
643 assert(ep->me_value == NULL);
644#endif
645 }
646
647 if (table_is_malloced)
648 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000649}
650
Tim Peters67830702001-03-21 19:23:56 +0000651/* CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
652 * mutates the dict. One exception: it is safe if the loop merely changes
653 * the values associated with the keys (but doesn't insert new keys or
654 * delete keys), via PyDict_SetItem().
655 */
Guido van Rossum25831651993-05-19 14:50:45 +0000656int
Tim Peters1f5871e2000-07-04 17:44:48 +0000657PyDict_Next(PyObject *op, int *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000658{
Guido van Rossum25831651993-05-19 14:50:45 +0000659 int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000660 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000662 return 0;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000663 mp = (dictobject *)op;
Guido van Rossum25831651993-05-19 14:50:45 +0000664 i = *ppos;
665 if (i < 0)
666 return 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000667 while (i <= mp->ma_mask && mp->ma_table[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000668 i++;
669 *ppos = i+1;
Tim Petersafb6ae82001-06-04 21:00:21 +0000670 if (i > mp->ma_mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000671 return 0;
672 if (pkey)
673 *pkey = mp->ma_table[i].me_key;
674 if (pvalue)
675 *pvalue = mp->ma_table[i].me_value;
676 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000677}
678
679/* Methods */
680
681static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000682dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000683{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000684 register dictentry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000685 int fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000686 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000687 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000688 for (ep = mp->ma_table; fill > 0; ep++) {
689 if (ep->me_key) {
690 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000692 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000693 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000694 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000695 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000696 PyMem_DEL(mp->ma_table);
Guido van Rossum9475a232001-10-05 20:51:39 +0000697 mp->ob_type->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000698 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000699}
700
701static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000702dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000703{
704 register int i;
705 register int any;
Guido van Rossum255443b1998-04-10 22:47:14 +0000706
707 i = Py_ReprEnter((PyObject*)mp);
708 if (i != 0) {
709 if (i < 0)
710 return i;
711 fprintf(fp, "{...}");
712 return 0;
713 }
714
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000715 fprintf(fp, "{");
716 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +0000717 for (i = 0; i <= mp->ma_mask; i++) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000718 dictentry *ep = mp->ma_table + i;
719 PyObject *pvalue = ep->me_value;
720 if (pvalue != NULL) {
721 /* Prevent PyObject_Repr from deleting value during
722 key format */
723 Py_INCREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000724 if (any++ > 0)
725 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000726 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000727 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000728 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000729 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000730 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000731 fprintf(fp, ": ");
Tim Peters19b77cf2001-06-02 08:27:39 +0000732 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +0000733 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +0000734 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000735 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000736 }
Tim Peters23cf6be2001-06-02 08:02:56 +0000737 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000738 }
739 }
740 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000741 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000742 return 0;
743}
744
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000746dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000747{
Tim Petersc6057842001-06-16 07:52:53 +0000748 int i;
Tim Petersa7259592001-06-16 05:11:17 +0000749 PyObject *s, *temp, *colon = NULL;
750 PyObject *pieces = NULL, *result = NULL;
751 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +0000752
Tim Petersa7259592001-06-16 05:11:17 +0000753 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +0000754 if (i != 0) {
Tim Petersa7259592001-06-16 05:11:17 +0000755 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +0000756 }
757
Tim Petersa7259592001-06-16 05:11:17 +0000758 if (mp->ma_used == 0) {
759 result = PyString_FromString("{}");
760 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000761 }
Tim Petersa7259592001-06-16 05:11:17 +0000762
763 pieces = PyList_New(0);
764 if (pieces == NULL)
765 goto Done;
766
767 colon = PyString_FromString(": ");
768 if (colon == NULL)
769 goto Done;
770
771 /* Do repr() on each key+value pair, and insert ": " between them.
772 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +0000773 i = 0;
774 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +0000775 int status;
776 /* Prevent repr from deleting value during key format. */
777 Py_INCREF(value);
778 s = PyObject_Repr(key);
779 PyString_Concat(&s, colon);
780 PyString_ConcatAndDel(&s, PyObject_Repr(value));
781 Py_DECREF(value);
782 if (s == NULL)
783 goto Done;
784 status = PyList_Append(pieces, s);
785 Py_DECREF(s); /* append created a new ref */
786 if (status < 0)
787 goto Done;
788 }
789
790 /* Add "{}" decorations to the first and last items. */
791 assert(PyList_GET_SIZE(pieces) > 0);
792 s = PyString_FromString("{");
793 if (s == NULL)
794 goto Done;
795 temp = PyList_GET_ITEM(pieces, 0);
796 PyString_ConcatAndDel(&s, temp);
797 PyList_SET_ITEM(pieces, 0, s);
798 if (s == NULL)
799 goto Done;
800
801 s = PyString_FromString("}");
802 if (s == NULL)
803 goto Done;
804 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
805 PyString_ConcatAndDel(&temp, s);
806 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
807 if (temp == NULL)
808 goto Done;
809
810 /* Paste them all together with ", " between. */
811 s = PyString_FromString(", ");
812 if (s == NULL)
813 goto Done;
814 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +0000815 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000816
817Done:
818 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +0000820 Py_ReprLeave((PyObject *)mp);
821 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000822}
823
824static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000825dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000826{
827 return mp->ma_used;
828}
829
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000831dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000832{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000834 long hash;
Tim Petersdea48ec2001-05-22 20:40:22 +0000835 assert(mp->ma_table != NULL);
Tim Peters0ab085c2001-09-14 00:25:33 +0000836 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +0000837 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000838 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000839 if (hash == -1)
840 return NULL;
841 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000842 v = (mp->ma_lookup)(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000843 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000845 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000847 return v;
848}
849
850static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000851dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000852{
853 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000855 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000857}
858
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000859static PyMappingMethods dict_as_mapping = {
860 (inquiry)dict_length, /*mp_length*/
861 (binaryfunc)dict_subscript, /*mp_subscript*/
862 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000863};
864
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000866dict_keys(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000867{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000869 register int i, j, n;
870
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000871 again:
872 n = mp->ma_used;
873 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000874 if (v == NULL)
875 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000876 if (n != mp->ma_used) {
877 /* Durnit. The allocations caused the dict to resize.
878 * Just start over, this shouldn't normally happen.
879 */
880 Py_DECREF(v);
881 goto again;
882 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000883 for (i = 0, j = 0; i <= mp->ma_mask; i++) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000884 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 PyObject *key = mp->ma_table[i].me_key;
886 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000887 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000888 j++;
889 }
890 }
891 return v;
892}
893
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000894static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000895dict_values(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000896{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000898 register int i, j, n;
899
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000900 again:
901 n = mp->ma_used;
902 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000903 if (v == NULL)
904 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000905 if (n != mp->ma_used) {
906 /* Durnit. The allocations caused the dict to resize.
907 * Just start over, this shouldn't normally happen.
908 */
909 Py_DECREF(v);
910 goto again;
911 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000912 for (i = 0, j = 0; i <= mp->ma_mask; i++) {
Guido van Rossum25831651993-05-19 14:50:45 +0000913 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000914 PyObject *value = mp->ma_table[i].me_value;
915 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000916 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000917 j++;
918 }
919 }
920 return v;
921}
922
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000924dict_items(register dictobject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000925{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 register PyObject *v;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000927 register int i, j, n;
928 PyObject *item, *key, *value;
929
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000930 /* Preallocate the list of tuples, to avoid allocations during
931 * the loop over the items, which could trigger GC, which
932 * could resize the dict. :-(
933 */
934 again:
935 n = mp->ma_used;
936 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +0000937 if (v == NULL)
938 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000939 for (i = 0; i < n; i++) {
940 item = PyTuple_New(2);
941 if (item == NULL) {
942 Py_DECREF(v);
943 return NULL;
944 }
945 PyList_SET_ITEM(v, i, item);
946 }
947 if (n != mp->ma_used) {
948 /* Durnit. The allocations caused the dict to resize.
949 * Just start over, this shouldn't normally happen.
950 */
951 Py_DECREF(v);
952 goto again;
953 }
954 /* Nothing we do below makes any function calls. */
Tim Petersafb6ae82001-06-04 21:00:21 +0000955 for (i = 0, j = 0; i <= mp->ma_mask; i++) {
Guido van Rossum25831651993-05-19 14:50:45 +0000956 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000957 key = mp->ma_table[i].me_key;
958 value = mp->ma_table[i].me_value;
959 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000960 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000961 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000963 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000964 j++;
965 }
966 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000967 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +0000968 return v;
969}
970
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000971static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000972dict_update(PyObject *mp, PyObject *other)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000973{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000974 if (PyDict_Update(mp, other) < 0)
975 return NULL;
976 Py_INCREF(Py_None);
977 return Py_None;
978}
979
Guido van Rossum05ac6de2001-08-10 20:28:28 +0000980/* Update unconditionally replaces existing items.
981 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +0000982 otherwise it leaves existing items unchanged.
983
984 PyDict_{Update,Merge} update/merge from a mapping object.
985
Tim Petersf582b822001-12-11 18:51:08 +0000986 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +0000987 producing iterable objects of length 2.
988*/
989
Tim Petersf582b822001-12-11 18:51:08 +0000990int
Tim Peters1fc240e2001-10-26 05:06:50 +0000991PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
992{
993 PyObject *it; /* iter(seq2) */
994 int i; /* index into seq2 of current element */
995 PyObject *item; /* seq2[i] */
996 PyObject *fast; /* item as a 2-tuple or 2-list */
997
998 assert(d != NULL);
999 assert(PyDict_Check(d));
1000 assert(seq2 != NULL);
1001
1002 it = PyObject_GetIter(seq2);
1003 if (it == NULL)
1004 return -1;
1005
1006 for (i = 0; ; ++i) {
1007 PyObject *key, *value;
1008 int n;
1009
1010 fast = NULL;
1011 item = PyIter_Next(it);
1012 if (item == NULL) {
1013 if (PyErr_Occurred())
1014 goto Fail;
1015 break;
1016 }
1017
1018 /* Convert item to sequence, and verify length 2. */
1019 fast = PySequence_Fast(item, "");
1020 if (fast == NULL) {
1021 if (PyErr_ExceptionMatches(PyExc_TypeError))
1022 PyErr_Format(PyExc_TypeError,
1023 "cannot convert dictionary update "
1024 "sequence element #%d to a sequence",
1025 i);
1026 goto Fail;
1027 }
1028 n = PySequence_Fast_GET_SIZE(fast);
1029 if (n != 2) {
1030 PyErr_Format(PyExc_ValueError,
1031 "dictionary update sequence element #%d "
1032 "has length %d; 2 is required",
1033 i, n);
1034 goto Fail;
1035 }
1036
1037 /* Update/merge with this (key, value) pair. */
1038 key = PySequence_Fast_GET_ITEM(fast, 0);
1039 value = PySequence_Fast_GET_ITEM(fast, 1);
1040 if (override || PyDict_GetItem(d, key) == NULL) {
1041 int status = PyDict_SetItem(d, key, value);
1042 if (status < 0)
1043 goto Fail;
1044 }
1045 Py_DECREF(fast);
1046 Py_DECREF(item);
1047 }
1048
1049 i = 0;
1050 goto Return;
1051Fail:
1052 Py_XDECREF(item);
1053 Py_XDECREF(fast);
1054 i = -1;
1055Return:
1056 Py_DECREF(it);
1057 return i;
1058}
1059
Tim Peters6d6c1a32001-08-02 04:15:00 +00001060int
1061PyDict_Update(PyObject *a, PyObject *b)
1062{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001063 return PyDict_Merge(a, b, 1);
1064}
1065
1066int
1067PyDict_Merge(PyObject *a, PyObject *b, int override)
1068{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001069 register PyDictObject *mp, *other;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001070 register int i;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001071 dictentry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001072
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001073 /* We accept for the argument either a concrete dictionary object,
1074 * or an abstract "mapping" object. For the former, we can do
1075 * things quite efficiently. For the latter, we only require that
1076 * PyMapping_Keys() and PyObject_GetItem() be supported.
1077 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001078 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1079 PyErr_BadInternalCall();
1080 return -1;
1081 }
1082 mp = (dictobject*)a;
1083 if (PyDict_Check(b)) {
1084 other = (dictobject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001085 if (other == mp || other->ma_used == 0)
1086 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001087 return 0;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001088 /* Do one big resize at the start, rather than
1089 * incrementally resizing as we insert new items. Expect
1090 * that there will be no (or few) overlapping keys.
1091 */
1092 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
1093 if (dictresize(mp, (mp->ma_used + other->ma_used)*3/2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001094 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001095 }
1096 for (i = 0; i <= other->ma_mask; i++) {
1097 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001098 if (entry->me_value != NULL &&
1099 (override ||
1100 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001101 Py_INCREF(entry->me_key);
1102 Py_INCREF(entry->me_value);
1103 insertdict(mp, entry->me_key, entry->me_hash,
1104 entry->me_value);
1105 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001106 }
1107 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001108 else {
1109 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001110 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001111 PyObject *iter;
1112 PyObject *key, *value;
1113 int status;
1114
1115 if (keys == NULL)
1116 /* Docstring says this is equivalent to E.keys() so
1117 * if E doesn't have a .keys() method we want
1118 * AttributeError to percolate up. Might as well
1119 * do the same for any other error.
1120 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001121 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001122
1123 iter = PyObject_GetIter(keys);
1124 Py_DECREF(keys);
1125 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001126 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001127
1128 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001129 if (!override && PyDict_GetItem(a, key) != NULL) {
1130 Py_DECREF(key);
1131 continue;
1132 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001133 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001134 if (value == NULL) {
1135 Py_DECREF(iter);
1136 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001137 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001138 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001139 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001140 Py_DECREF(key);
1141 Py_DECREF(value);
1142 if (status < 0) {
1143 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001144 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001145 }
1146 }
1147 Py_DECREF(iter);
1148 if (PyErr_Occurred())
1149 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001150 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001151 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001152 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001153}
1154
1155static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001156dict_copy(register dictobject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001157{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001158 return PyDict_Copy((PyObject*)mp);
1159}
1160
1161PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001162PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001163{
1164 register dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001165 register int i;
1166 dictobject *copy;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001167 dictentry *entry;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001168
1169 if (o == NULL || !PyDict_Check(o)) {
1170 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001171 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001172 }
1173 mp = (dictobject *)o;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001174 copy = (dictobject *)PyDict_New();
1175 if (copy == NULL)
1176 return NULL;
1177 if (mp->ma_used > 0) {
1178 if (dictresize(copy, mp->ma_used*3/2) != 0)
1179 return NULL;
Tim Petersafb6ae82001-06-04 21:00:21 +00001180 for (i = 0; i <= mp->ma_mask; i++) {
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001181 entry = &mp->ma_table[i];
1182 if (entry->me_value != NULL) {
1183 Py_INCREF(entry->me_key);
1184 Py_INCREF(entry->me_value);
1185 insertdict(copy, entry->me_key, entry->me_hash,
1186 entry->me_value);
1187 }
1188 }
1189 }
1190 return (PyObject *)copy;
1191}
1192
Guido van Rossum4199fac1993-11-05 10:18:44 +00001193int
Tim Peters1f5871e2000-07-04 17:44:48 +00001194PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001195{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001196 if (mp == NULL || !PyDict_Check(mp)) {
1197 PyErr_BadInternalCall();
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001198 return 0;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001199 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001200 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001201}
1202
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001204PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001205{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206 if (mp == NULL || !PyDict_Check(mp)) {
1207 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001208 return NULL;
1209 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001210 return dict_keys((dictobject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001211}
1212
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001214PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001215{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 if (mp == NULL || !PyDict_Check(mp)) {
1217 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001218 return NULL;
1219 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001220 return dict_values((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001221}
1222
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001223PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001224PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001225{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001226 if (mp == NULL || !PyDict_Check(mp)) {
1227 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001228 return NULL;
1229 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001230 return dict_items((dictobject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001231}
1232
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001233/* Subroutine which returns the smallest key in a for which b's value
1234 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001235 pval argument. Both are NULL if no key in a is found for which b's status
1236 differs. The refcounts on (and only on) non-NULL *pval and function return
1237 values must be decremented by the caller (characterize() increments them
1238 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1239 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001240
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001241static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001242characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001243{
Tim Peters95bf9392001-05-10 08:32:44 +00001244 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1245 PyObject *aval = NULL; /* a[akey] */
Guido van Rossumb9324202001-01-18 00:39:02 +00001246 int i, cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001247
Tim Petersafb6ae82001-06-04 21:00:21 +00001248 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001249 PyObject *thiskey, *thisaval, *thisbval;
1250 if (a->ma_table[i].me_value == NULL)
1251 continue;
1252 thiskey = a->ma_table[i].me_key;
1253 Py_INCREF(thiskey); /* keep alive across compares */
1254 if (akey != NULL) {
1255 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1256 if (cmp < 0) {
1257 Py_DECREF(thiskey);
1258 goto Fail;
1259 }
1260 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001261 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001262 a->ma_table[i].me_value == NULL)
1263 {
1264 /* Not the *smallest* a key; or maybe it is
1265 * but the compare shrunk the dict so we can't
1266 * find its associated value anymore; or
1267 * maybe it is but the compare deleted the
1268 * a[thiskey] entry.
1269 */
1270 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001271 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001272 }
Tim Peters95bf9392001-05-10 08:32:44 +00001273 }
1274
1275 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1276 thisaval = a->ma_table[i].me_value;
1277 assert(thisaval);
1278 Py_INCREF(thisaval); /* keep alive */
1279 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1280 if (thisbval == NULL)
1281 cmp = 0;
1282 else {
1283 /* both dicts have thiskey: same values? */
1284 cmp = PyObject_RichCompareBool(
1285 thisaval, thisbval, Py_EQ);
1286 if (cmp < 0) {
1287 Py_DECREF(thiskey);
1288 Py_DECREF(thisaval);
1289 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001290 }
1291 }
Tim Peters95bf9392001-05-10 08:32:44 +00001292 if (cmp == 0) {
1293 /* New winner. */
1294 Py_XDECREF(akey);
1295 Py_XDECREF(aval);
1296 akey = thiskey;
1297 aval = thisaval;
1298 }
1299 else {
1300 Py_DECREF(thiskey);
1301 Py_DECREF(thisaval);
1302 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001303 }
Tim Peters95bf9392001-05-10 08:32:44 +00001304 *pval = aval;
1305 return akey;
1306
1307Fail:
1308 Py_XDECREF(akey);
1309 Py_XDECREF(aval);
1310 *pval = NULL;
1311 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001312}
1313
1314static int
Tim Peters1f5871e2000-07-04 17:44:48 +00001315dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001316{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001318 int res;
1319
1320 /* Compare lengths first */
1321 if (a->ma_used < b->ma_used)
1322 return -1; /* a is shorter */
1323 else if (a->ma_used > b->ma_used)
1324 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001325
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001326 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001327 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001328 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001329 if (adiff == NULL) {
1330 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001331 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001332 * must be equal.
1333 */
1334 res = PyErr_Occurred() ? -1 : 0;
1335 goto Finished;
1336 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001337 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001338 if (bdiff == NULL && PyErr_Occurred()) {
1339 assert(!bval);
1340 res = -1;
1341 goto Finished;
1342 }
1343 res = 0;
1344 if (bdiff) {
1345 /* bdiff == NULL "should be" impossible now, but perhaps
1346 * the last comparison done by the characterize() on a had
1347 * the side effect of making the dicts equal!
1348 */
1349 res = PyObject_Compare(adiff, bdiff);
1350 }
1351 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001352 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001353
1354Finished:
1355 Py_XDECREF(adiff);
1356 Py_XDECREF(bdiff);
1357 Py_XDECREF(aval);
1358 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001359 return res;
1360}
1361
Tim Peterse63415e2001-05-08 04:38:29 +00001362/* Return 1 if dicts equal, 0 if not, -1 if error.
1363 * Gets out as soon as any difference is detected.
1364 * Uses only Py_EQ comparison.
1365 */
1366static int
1367dict_equal(dictobject *a, dictobject *b)
1368{
1369 int i;
1370
1371 if (a->ma_used != b->ma_used)
1372 /* can't be equal if # of entries differ */
1373 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001374
Tim Peterse63415e2001-05-08 04:38:29 +00001375 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001376 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001377 PyObject *aval = a->ma_table[i].me_value;
1378 if (aval != NULL) {
1379 int cmp;
1380 PyObject *bval;
1381 PyObject *key = a->ma_table[i].me_key;
1382 /* temporarily bump aval's refcount to ensure it stays
1383 alive until we're done with it */
1384 Py_INCREF(aval);
1385 bval = PyDict_GetItem((PyObject *)b, key);
1386 if (bval == NULL) {
1387 Py_DECREF(aval);
1388 return 0;
1389 }
1390 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1391 Py_DECREF(aval);
1392 if (cmp <= 0) /* error or not equal */
1393 return cmp;
1394 }
1395 }
1396 return 1;
1397 }
1398
1399static PyObject *
1400dict_richcompare(PyObject *v, PyObject *w, int op)
1401{
1402 int cmp;
1403 PyObject *res;
1404
1405 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1406 res = Py_NotImplemented;
1407 }
1408 else if (op == Py_EQ || op == Py_NE) {
1409 cmp = dict_equal((dictobject *)v, (dictobject *)w);
1410 if (cmp < 0)
1411 return NULL;
1412 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1413 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001414 else
1415 res = Py_NotImplemented;
Tim Peterse63415e2001-05-08 04:38:29 +00001416 Py_INCREF(res);
1417 return res;
1418 }
1419
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001420static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001421dict_has_key(register dictobject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001422{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001423 long hash;
1424 register long ok;
Tim Peters0ab085c2001-09-14 00:25:33 +00001425 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001426 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001428 if (hash == -1)
1429 return NULL;
1430 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001431 ok = (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001432 return PyBool_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001433}
1434
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001436dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001437{
1438 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001439 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001440 PyObject *val = NULL;
1441 long hash;
1442
Fred Drake52fccfd2000-02-23 15:47:16 +00001443 if (!PyArg_ParseTuple(args, "O|O:get", &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001444 return NULL;
1445
Tim Peters0ab085c2001-09-14 00:25:33 +00001446 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001447 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001448 hash = PyObject_Hash(key);
1449 if (hash == -1)
1450 return NULL;
1451 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001452 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001453
Barry Warsawc38c5da1997-10-06 17:49:20 +00001454 if (val == NULL)
1455 val = failobj;
1456 Py_INCREF(val);
1457 return val;
1458}
1459
1460
1461static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001462dict_setdefault(register dictobject *mp, PyObject *args)
1463{
1464 PyObject *key;
1465 PyObject *failobj = Py_None;
1466 PyObject *val = NULL;
1467 long hash;
1468
1469 if (!PyArg_ParseTuple(args, "O|O:setdefault", &key, &failobj))
1470 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001471
Tim Peters0ab085c2001-09-14 00:25:33 +00001472 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001473 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001474 hash = PyObject_Hash(key);
1475 if (hash == -1)
1476 return NULL;
1477 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001478 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001479 if (val == NULL) {
1480 val = failobj;
1481 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1482 val = NULL;
1483 }
1484 Py_XINCREF(val);
1485 return val;
1486}
1487
1488
1489static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001490dict_clear(register dictobject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001491{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492 PyDict_Clear((PyObject *)mp);
1493 Py_INCREF(Py_None);
1494 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001495}
1496
Guido van Rossumba6ab842000-12-12 22:02:18 +00001497static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001498dict_popitem(dictobject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001499{
1500 int i = 0;
1501 dictentry *ep;
1502 PyObject *res;
1503
Tim Petersf4b33f62001-06-02 05:42:29 +00001504 /* Allocate the result tuple before checking the size. Believe it
1505 * or not, this allocation could trigger a garbage collection which
1506 * could empty the dict, so if we checked the size first and that
1507 * happened, the result would be an infinite loop (searching for an
1508 * entry that no longer exists). Note that the usual popitem()
1509 * idiom is "while d: k, v = d.popitem()". so needing to throw the
1510 * tuple away if the dict *is* empty isn't a significant
1511 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001512 */
1513 res = PyTuple_New(2);
1514 if (res == NULL)
1515 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00001516 if (mp->ma_used == 0) {
1517 Py_DECREF(res);
1518 PyErr_SetString(PyExc_KeyError,
1519 "popitem(): dictionary is empty");
1520 return NULL;
1521 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00001522 /* Set ep to "the first" dict entry with a value. We abuse the hash
1523 * field of slot 0 to hold a search finger:
1524 * If slot 0 has a value, use slot 0.
1525 * Else slot 0 is being used to hold a search finger,
1526 * and we use its hash value as the first index to look.
1527 */
1528 ep = &mp->ma_table[0];
1529 if (ep->me_value == NULL) {
1530 i = (int)ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00001531 /* The hash field may be a real hash value, or it may be a
1532 * legit search finger, or it may be a once-legit search
1533 * finger that's out of bounds now because it wrapped around
1534 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00001535 */
Tim Petersafb6ae82001-06-04 21:00:21 +00001536 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001537 i = 1; /* skip slot 0 */
1538 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1539 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00001540 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001541 i = 1;
1542 }
1543 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001544 PyTuple_SET_ITEM(res, 0, ep->me_key);
1545 PyTuple_SET_ITEM(res, 1, ep->me_value);
1546 Py_INCREF(dummy);
1547 ep->me_key = dummy;
1548 ep->me_value = NULL;
1549 mp->ma_used--;
1550 assert(mp->ma_table[0].me_value == NULL);
1551 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00001552 return res;
1553}
1554
Jeremy Hylton8caad492000-06-23 14:18:11 +00001555static int
1556dict_traverse(PyObject *op, visitproc visit, void *arg)
1557{
1558 int i = 0, err;
1559 PyObject *pk;
1560 PyObject *pv;
1561
1562 while (PyDict_Next(op, &i, &pk, &pv)) {
1563 err = visit(pk, arg);
1564 if (err)
1565 return err;
1566 err = visit(pv, arg);
1567 if (err)
1568 return err;
1569 }
1570 return 0;
1571}
1572
1573static int
1574dict_tp_clear(PyObject *op)
1575{
1576 PyDict_Clear(op);
1577 return 0;
1578}
1579
Tim Petersf7f88b12000-12-13 23:18:45 +00001580
Guido van Rossum09e563a2001-05-01 12:10:21 +00001581staticforward PyObject *dictiter_new(dictobject *, binaryfunc);
1582
1583static PyObject *
1584select_key(PyObject *key, PyObject *value)
1585{
1586 Py_INCREF(key);
1587 return key;
1588}
1589
1590static PyObject *
1591select_value(PyObject *key, PyObject *value)
1592{
1593 Py_INCREF(value);
1594 return value;
1595}
1596
1597static PyObject *
1598select_item(PyObject *key, PyObject *value)
1599{
1600 PyObject *res = PyTuple_New(2);
1601
1602 if (res != NULL) {
1603 Py_INCREF(key);
1604 Py_INCREF(value);
1605 PyTuple_SET_ITEM(res, 0, key);
1606 PyTuple_SET_ITEM(res, 1, value);
1607 }
1608 return res;
1609}
1610
1611static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001612dict_iterkeys(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001613{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001614 return dictiter_new(dict, select_key);
1615}
1616
1617static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001618dict_itervalues(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001619{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001620 return dictiter_new(dict, select_value);
1621}
1622
1623static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001624dict_iteritems(dictobject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00001625{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001626 return dictiter_new(dict, select_item);
1627}
1628
1629
Tim Petersf7f88b12000-12-13 23:18:45 +00001630static char has_key__doc__[] =
1631"D.has_key(k) -> 1 if D has a key k, else 0";
1632
1633static char get__doc__[] =
1634"D.get(k[,d]) -> D[k] if D.has_key(k), else d. d defaults to None.";
1635
1636static char setdefault_doc__[] =
1637"D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if not D.has_key(k)";
1638
1639static char popitem__doc__[] =
1640"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
16412-tuple; but raise KeyError if D is empty";
1642
1643static char keys__doc__[] =
1644"D.keys() -> list of D's keys";
1645
1646static char items__doc__[] =
1647"D.items() -> list of D's (key, value) pairs, as 2-tuples";
1648
1649static char values__doc__[] =
1650"D.values() -> list of D's values";
1651
1652static char update__doc__[] =
1653"D.update(E) -> None. Update D from E: for k in E.keys(): D[k] = E[k]";
1654
1655static char clear__doc__[] =
1656"D.clear() -> None. Remove all items from D.";
1657
1658static char copy__doc__[] =
1659"D.copy() -> a shallow copy of D";
1660
Guido van Rossum09e563a2001-05-01 12:10:21 +00001661static char iterkeys__doc__[] =
1662"D.iterkeys() -> an iterator over the keys of D";
1663
1664static char itervalues__doc__[] =
1665"D.itervalues() -> an iterator over the values of D";
1666
1667static char iteritems__doc__[] =
1668"D.iteritems() -> an iterator over the (key, value) items of D";
1669
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001670static PyMethodDef mapp_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001671 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001672 has_key__doc__},
1673 {"get", (PyCFunction)dict_get, METH_VARARGS,
1674 get__doc__},
1675 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1676 setdefault_doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001677 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001678 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001679 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001680 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001681 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001682 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001683 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001684 values__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001685 {"update", (PyCFunction)dict_update, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00001686 update__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001687 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001688 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001689 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00001690 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001691 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001692 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001693 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001694 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001695 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00001696 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00001697 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001698};
1699
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001700static int
1701dict_contains(dictobject *mp, PyObject *key)
1702{
1703 long hash;
1704
Tim Peters0ab085c2001-09-14 00:25:33 +00001705 if (!PyString_CheckExact(key) ||
Tim Peters1f7df352002-03-29 03:29:08 +00001706 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001707 hash = PyObject_Hash(key);
1708 if (hash == -1)
1709 return -1;
1710 }
Tim Petersdea48ec2001-05-22 20:40:22 +00001711 return (mp->ma_lookup)(mp, key, hash)->me_value != NULL;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001712}
1713
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001714/* Hack to implement "key in dict" */
1715static PySequenceMethods dict_as_sequence = {
1716 0, /* sq_length */
1717 0, /* sq_concat */
1718 0, /* sq_repeat */
1719 0, /* sq_item */
1720 0, /* sq_slice */
1721 0, /* sq_ass_item */
1722 0, /* sq_ass_slice */
1723 (objobjproc)dict_contains, /* sq_contains */
1724 0, /* sq_inplace_concat */
1725 0, /* sq_inplace_repeat */
1726};
1727
Guido van Rossum09e563a2001-05-01 12:10:21 +00001728static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001729dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1730{
1731 PyObject *self;
1732
1733 assert(type != NULL && type->tp_alloc != NULL);
1734 self = type->tp_alloc(type, 0);
1735 if (self != NULL) {
1736 PyDictObject *d = (PyDictObject *)self;
1737 /* It's guaranteed that tp->alloc zeroed out the struct. */
1738 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
1739 INIT_NONZERO_DICT_SLOTS(d);
1740 d->ma_lookup = lookdict_string;
1741#ifdef SHOW_CONVERSION_COUNTS
1742 ++created;
1743#endif
1744 }
1745 return self;
1746}
1747
Tim Peters25786c02001-09-02 08:22:48 +00001748static int
1749dict_init(PyObject *self, PyObject *args, PyObject *kwds)
1750{
1751 PyObject *arg = NULL;
Tim Peters4d859532001-10-27 18:27:48 +00001752 static char *kwlist[] = {"items", 0};
Tim Peters1fc240e2001-10-26 05:06:50 +00001753 int result = 0;
Tim Peters25786c02001-09-02 08:22:48 +00001754
Tim Petersa427a2b2001-10-29 22:25:45 +00001755 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:dict",
Tim Peters25786c02001-09-02 08:22:48 +00001756 kwlist, &arg))
Tim Peters1fc240e2001-10-26 05:06:50 +00001757 result = -1;
1758
1759 else if (arg != NULL) {
1760 if (PyObject_HasAttrString(arg, "keys"))
1761 result = PyDict_Merge(self, arg, 1);
1762 else
1763 result = PyDict_MergeFromSeq2(self, arg, 1);
Tim Peters25786c02001-09-02 08:22:48 +00001764 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001765 return result;
Tim Peters25786c02001-09-02 08:22:48 +00001766}
1767
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001768static long
1769dict_nohash(PyObject *self)
1770{
1771 PyErr_SetString(PyExc_TypeError, "dict objects are unhashable");
1772 return -1;
1773}
1774
Tim Peters6d6c1a32001-08-02 04:15:00 +00001775static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00001776dict_iter(dictobject *dict)
1777{
1778 return dictiter_new(dict, select_key);
1779}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001780
Tim Peters25786c02001-09-02 08:22:48 +00001781static char dictionary_doc[] =
Tim Petersa427a2b2001-10-29 22:25:45 +00001782"dict() -> new empty dictionary.\n"
1783"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00001784" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00001785"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00001786" d = {}\n"
1787" for k, v in seq:\n"
1788" d[k] = v";
Tim Peters25786c02001-09-02 08:22:48 +00001789
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001790PyTypeObject PyDict_Type = {
1791 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001792 0,
Tim Petersa427a2b2001-10-29 22:25:45 +00001793 "dict",
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001794 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001795 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00001796 (destructor)dict_dealloc, /* tp_dealloc */
1797 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001798 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00001799 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00001800 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00001801 (reprfunc)dict_repr, /* tp_repr */
1802 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00001803 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00001804 &dict_as_mapping, /* tp_as_mapping */
Guido van Rossumdbb53d92001-12-03 16:32:18 +00001805 dict_nohash, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00001806 0, /* tp_call */
1807 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001808 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00001809 0, /* tp_setattro */
1810 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00001811 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +00001812 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00001813 dictionary_doc, /* tp_doc */
Guido van Rossumb9324202001-01-18 00:39:02 +00001814 (traverseproc)dict_traverse, /* tp_traverse */
1815 (inquiry)dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00001816 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001817 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00001818 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001819 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001820 mapp_methods, /* tp_methods */
1821 0, /* tp_members */
1822 0, /* tp_getset */
1823 0, /* tp_base */
1824 0, /* tp_dict */
1825 0, /* tp_descr_get */
1826 0, /* tp_descr_set */
1827 0, /* tp_dictoffset */
Tim Peters25786c02001-09-02 08:22:48 +00001828 (initproc)dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001829 PyType_GenericAlloc, /* tp_alloc */
1830 dict_new, /* tp_new */
Guido van Rossum9475a232001-10-05 20:51:39 +00001831 _PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001832};
1833
Guido van Rossum3cca2451997-05-16 14:23:33 +00001834/* For backward compatibility with old dictionary interface */
1835
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001836PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001837PyDict_GetItemString(PyObject *v, char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001838{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001839 PyObject *kv, *rv;
1840 kv = PyString_FromString(key);
1841 if (kv == NULL)
1842 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001843 rv = PyDict_GetItem(v, kv);
1844 Py_DECREF(kv);
1845 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001846}
1847
1848int
Tim Peters1f5871e2000-07-04 17:44:48 +00001849PyDict_SetItemString(PyObject *v, char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001850{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001851 PyObject *kv;
1852 int err;
1853 kv = PyString_FromString(key);
1854 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001855 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001856 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001857 err = PyDict_SetItem(v, kv, item);
1858 Py_DECREF(kv);
1859 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001860}
1861
1862int
Tim Peters1f5871e2000-07-04 17:44:48 +00001863PyDict_DelItemString(PyObject *v, char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001864{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001865 PyObject *kv;
1866 int err;
1867 kv = PyString_FromString(key);
1868 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001869 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001870 err = PyDict_DelItem(v, kv);
1871 Py_DECREF(kv);
1872 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001873}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001874
1875/* Dictionary iterator type */
1876
1877extern PyTypeObject PyDictIter_Type; /* Forward */
1878
1879typedef struct {
1880 PyObject_HEAD
1881 dictobject *di_dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00001882 int di_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001883 int di_pos;
Guido van Rossum09e563a2001-05-01 12:10:21 +00001884 binaryfunc di_select;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001885} dictiterobject;
1886
1887static PyObject *
Guido van Rossum09e563a2001-05-01 12:10:21 +00001888dictiter_new(dictobject *dict, binaryfunc select)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001889{
1890 dictiterobject *di;
Neil Schemenauerdcc819a2002-03-22 15:33:15 +00001891 di = PyMalloc_New(dictiterobject, &PyDictIter_Type);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001892 if (di == NULL)
1893 return NULL;
1894 Py_INCREF(dict);
1895 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00001896 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001897 di->di_pos = 0;
Guido van Rossum09e563a2001-05-01 12:10:21 +00001898 di->di_select = select;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001899 return (PyObject *)di;
1900}
1901
1902static void
1903dictiter_dealloc(dictiterobject *di)
1904{
1905 Py_DECREF(di->di_dict);
Neil Schemenauerdcc819a2002-03-22 15:33:15 +00001906 PyMalloc_Del(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001907}
1908
1909static PyObject *
1910dictiter_next(dictiterobject *di, PyObject *args)
1911{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001912 PyObject *key, *value;
Guido van Rossum213c7a62001-04-23 14:08:49 +00001913
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00001914 if (di->di_used != di->di_dict->ma_used) {
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001915 PyErr_SetString(PyExc_RuntimeError,
1916 "dictionary changed size during iteration");
1917 return NULL;
1918 }
Guido van Rossum09e563a2001-05-01 12:10:21 +00001919 if (PyDict_Next((PyObject *)(di->di_dict), &di->di_pos, &key, &value)) {
1920 return (*di->di_select)(key, value);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001921 }
1922 PyErr_SetObject(PyExc_StopIteration, Py_None);
1923 return NULL;
1924}
1925
1926static PyObject *
1927dictiter_getiter(PyObject *it)
1928{
1929 Py_INCREF(it);
1930 return it;
1931}
1932
1933static PyMethodDef dictiter_methods[] = {
1934 {"next", (PyCFunction)dictiter_next, METH_VARARGS,
1935 "it.next() -- get the next value, or raise StopIteration"},
1936 {NULL, NULL} /* sentinel */
1937};
1938
Guido van Rossum213c7a62001-04-23 14:08:49 +00001939static PyObject *dictiter_iternext(dictiterobject *di)
1940{
Guido van Rossum09e563a2001-05-01 12:10:21 +00001941 PyObject *key, *value;
Guido van Rossum213c7a62001-04-23 14:08:49 +00001942
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00001943 if (di->di_used != di->di_dict->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001944 PyErr_SetString(PyExc_RuntimeError,
1945 "dictionary changed size during iteration");
1946 return NULL;
1947 }
Guido van Rossum09e563a2001-05-01 12:10:21 +00001948 if (PyDict_Next((PyObject *)(di->di_dict), &di->di_pos, &key, &value)) {
1949 return (*di->di_select)(key, value);
Guido van Rossum213c7a62001-04-23 14:08:49 +00001950 }
1951 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001952}
1953
1954PyTypeObject PyDictIter_Type = {
1955 PyObject_HEAD_INIT(&PyType_Type)
1956 0, /* ob_size */
1957 "dictionary-iterator", /* tp_name */
1958 sizeof(dictiterobject), /* tp_basicsize */
1959 0, /* tp_itemsize */
1960 /* methods */
1961 (destructor)dictiter_dealloc, /* tp_dealloc */
1962 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001963 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001964 0, /* tp_setattr */
1965 0, /* tp_compare */
1966 0, /* tp_repr */
1967 0, /* tp_as_number */
1968 0, /* tp_as_sequence */
1969 0, /* tp_as_mapping */
1970 0, /* tp_hash */
1971 0, /* tp_call */
1972 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001973 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001974 0, /* tp_setattro */
1975 0, /* tp_as_buffer */
1976 Py_TPFLAGS_DEFAULT, /* tp_flags */
1977 0, /* tp_doc */
1978 0, /* tp_traverse */
1979 0, /* tp_clear */
1980 0, /* tp_richcompare */
1981 0, /* tp_weaklistoffset */
1982 (getiterfunc)dictiter_getiter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001983 (iternextfunc)dictiter_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001984 dictiter_methods, /* tp_methods */
1985 0, /* tp_members */
1986 0, /* tp_getset */
1987 0, /* tp_base */
1988 0, /* tp_dict */
1989 0, /* tp_descr_get */
1990 0, /* tp_descr_set */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001991};