blob: b20d6f36e9a14420de1e4fc094ac9b1c3c6efdc7 [file] [log] [blame]
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001
Guido van Rossum2bc13791999-03-24 19:06:42 +00002/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003
Raymond Hettinger930427b2003-05-03 06:51:59 +00004/* The distribution includes a separate file, Objects/dictnotes.txt,
Tim Peters60b29962006-01-01 01:19:23 +00005 describing explorations into dictionary design and optimization.
Raymond Hettinger930427b2003-05-03 06:51:59 +00006 It covers typical dictionary use patterns, the parameters for
7 tuning dictionaries, and several ideas for possible optimizations.
8*/
9
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010#include "Python.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000011
Guido van Rossum16e93a81997-01-28 00:00:11 +000012
Georg Brandlb9f4ad32006-10-29 18:31:42 +000013/* Set a key error with the specified argument, wrapping it in a
14 * tuple automatically so that tuple keys are not unpacked as the
15 * exception arguments. */
16static void
17set_key_error(PyObject *arg)
18{
19 PyObject *tup;
20 tup = PyTuple_Pack(1, arg);
21 if (!tup)
22 return; /* caller will expect error to be set anyway */
23 PyErr_SetObject(PyExc_KeyError, tup);
Neal Norwitz7b932da2006-10-29 23:39:03 +000024 Py_DECREF(tup);
Georg Brandlb9f4ad32006-10-29 18:31:42 +000025}
26
Tim Peterseb28ef22001-06-02 05:27:19 +000027/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000028#undef SHOW_CONVERSION_COUNTS
29
Tim Peterseb28ef22001-06-02 05:27:19 +000030/* See large comment block below. This must be >= 1. */
31#define PERTURB_SHIFT 5
32
Guido van Rossum16e93a81997-01-28 00:00:11 +000033/*
Tim Peterseb28ef22001-06-02 05:27:19 +000034Major subtleties ahead: Most hash schemes depend on having a "good" hash
35function, in the sense of simulating randomness. Python doesn't: its most
36important hash functions (for strings and ints) are very regular in common
37cases:
Tim Peters15d49292001-05-27 07:39:22 +000038
Tim Peterseb28ef22001-06-02 05:27:19 +000039>>> map(hash, (0, 1, 2, 3))
40[0, 1, 2, 3]
41>>> map(hash, ("namea", "nameb", "namec", "named"))
42[-1658398457, -1658398460, -1658398459, -1658398462]
43>>>
Tim Peters15d49292001-05-27 07:39:22 +000044
Tim Peterseb28ef22001-06-02 05:27:19 +000045This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
46the low-order i bits as the initial table index is extremely fast, and there
47are no collisions at all for dicts indexed by a contiguous range of ints.
48The same is approximately true when keys are "consecutive" strings. So this
49gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000050
Tim Peterseb28ef22001-06-02 05:27:19 +000051OTOH, when collisions occur, the tendency to fill contiguous slices of the
52hash table makes a good collision resolution strategy crucial. Taking only
53the last i bits of the hash code is also vulnerable: for example, consider
54[i << 16 for i in range(20000)] as a set of keys. Since ints are their own
55hash codes, and this fits in a dict of size 2**15, the last 15 bits of every
56hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000057
Tim Peterseb28ef22001-06-02 05:27:19 +000058But catering to unusual cases should not slow the usual ones, so we just take
59the last i bits anyway. It's up to collision resolution to do the rest. If
60we *usually* find the key we're looking for on the first try (and, it turns
61out, we usually do -- the table load factor is kept under 2/3, so the odds
62are solidly in our favor), then it makes best sense to keep the initial index
63computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000064
Tim Peterseb28ef22001-06-02 05:27:19 +000065The first half of collision resolution is to visit table indices via this
66recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000067
Tim Peterseb28ef22001-06-02 05:27:19 +000068 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000069
Tim Peterseb28ef22001-06-02 05:27:19 +000070For any initial j in range(2**i), repeating that 2**i times generates each
71int in range(2**i) exactly once (see any text on random-number generation for
72proof). By itself, this doesn't help much: like linear probing (setting
73j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
74order. This would be bad, except that's not the only thing we do, and it's
75actually *good* in the common cases where hash keys are consecutive. In an
76example that's really too small to make this entirely clear, for a table of
77size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000078
Tim Peterseb28ef22001-06-02 05:27:19 +000079 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
80
81If two things come in at index 5, the first place we look after is index 2,
82not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
83Linear probing is deadly in this case because there the fixed probe order
84is the *same* as the order consecutive keys are likely to arrive. But it's
85extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
86and certain that consecutive hash codes do not.
87
88The other half of the strategy is to get the other bits of the hash code
89into play. This is done by initializing a (unsigned) vrbl "perturb" to the
90full hash code, and changing the recurrence to:
91
92 j = (5*j) + 1 + perturb;
93 perturb >>= PERTURB_SHIFT;
94 use j % 2**i as the next table index;
95
96Now the probe sequence depends (eventually) on every bit in the hash code,
97and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
98because it quickly magnifies small differences in the bits that didn't affect
99the initial index. Note that because perturb is unsigned, if the recurrence
100is executed often enough perturb eventually becomes and remains 0. At that
101point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
102that's certain to find an empty slot eventually (since it generates every int
103in range(2**i), and we make sure there's always at least one empty slot).
104
105Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
106small so that the high bits of the hash code continue to affect the probe
107sequence across iterations; but you want it large so that in really bad cases
108the high-order hash bits have an effect on early iterations. 5 was "the
109best" in minimizing total collisions across experiments Tim Peters ran (on
110both normal and pathological cases), but 4 and 6 weren't significantly worse.
111
112Historical: Reimer Behrends contributed the idea of using a polynomial-based
113approach, using repeated multiplication by x in GF(2**n) where an irreducible
114polynomial for each table size was chosen such that x was a primitive root.
115Christian Tismer later extended that to use division by x instead, as an
116efficient way to get the high bits of the hash code into play. This scheme
117also gave excellent collision statistics, but was more expensive: two
118if-tests were required inside the loop; computing "the next" index took about
119the same number of operations but without as much potential parallelism
120(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
121above, and then shifting perturb can be done while the table index is being
Brett Cannon77ae87c2007-10-10 00:07:50 +0000122masked); and the PyDictObject struct required a member to hold the table's
Tim Peterseb28ef22001-06-02 05:27:19 +0000123polynomial. In Tim's experiments the current scheme ran faster, produced
124equally good collision statistics, needed less code & used less memory.
Tim Peters9b10f7e2006-05-30 04:16:25 +0000125
126Theoretical Python 2.5 headache: hash codes are only C "long", but
127sizeof(Py_ssize_t) > sizeof(long) may be possible. In that case, and if a
128dict is genuinely huge, then only the slots directly reachable via indexing
129by a C long can be the first slot in a probe sequence. The probe sequence
130will still eventually reach every slot in the table, but the collision rate
131on initial probes may be much higher than this scheme was designed for.
132Getting a hash code as fat as Py_ssize_t is the only real cure. But in
133practice, this probably won't make a lick of difference for many years (at
134which point everyone will have terabytes of RAM on 64-bit boxes).
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000135*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000136
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000137/* Object used as dummy key to fill deleted entries */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000138static PyObject *dummy = NULL; /* Initialized by first call to newPyDictObject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000139
Armin Rigoe1709372006-04-12 17:06:05 +0000140#ifdef Py_REF_DEBUG
141PyObject *
142_PyDict_Dummy(void)
143{
144 return dummy;
145}
146#endif
147
Fred Drake1bff34a2000-08-31 19:31:38 +0000148/* forward declarations */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000149static PyDictEntry *
150lookdict_string(PyDictObject *mp, PyObject *key, long hash);
Fred Drake1bff34a2000-08-31 19:31:38 +0000151
152#ifdef SHOW_CONVERSION_COUNTS
153static long created = 0L;
154static long converted = 0L;
155
156static void
157show_counts(void)
158{
159 fprintf(stderr, "created %ld string dicts\n", created);
160 fprintf(stderr, "converted %ld to normal dicts\n", converted);
161 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
162}
163#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000164
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000165/* Debug statistic to compare allocations with reuse through the free list */
166#undef SHOW_ALLOC_COUNT
167#ifdef SHOW_ALLOC_COUNT
168static size_t count_alloc = 0;
169static size_t count_reuse = 0;
170
171static void
172show_alloc(void)
173{
Christian Heimes09bde042008-02-24 12:26:16 +0000174 fprintf(stderr, "Dict allocations: %" PY_FORMAT_SIZE_T "d\n",
175 count_alloc);
176 fprintf(stderr, "Dict reuse through freelist: %" PY_FORMAT_SIZE_T
177 "d\n", count_reuse);
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000178 fprintf(stderr, "%.2f%% reuse rate\n\n",
179 (100.0*count_reuse/(count_alloc+count_reuse)));
180}
181#endif
182
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000183/* Debug statistic to count GC tracking of dicts */
184#ifdef SHOW_TRACK_COUNT
185static Py_ssize_t count_untracked = 0;
186static Py_ssize_t count_tracked = 0;
187
188static void
189show_track(void)
190{
191 fprintf(stderr, "Dicts created: %" PY_FORMAT_SIZE_T "d\n",
192 count_tracked + count_untracked);
193 fprintf(stderr, "Dicts tracked by the GC: %" PY_FORMAT_SIZE_T
194 "d\n", count_tracked);
195 fprintf(stderr, "%.2f%% dict tracking rate\n\n",
196 (100.0*count_tracked/(count_untracked+count_tracked)));
197}
198#endif
199
200
Tim Peters6d6c1a32001-08-02 04:15:00 +0000201/* Initialization macros.
202 There are two ways to create a dict: PyDict_New() is the main C API
203 function, and the tp_new slot maps to dict_new(). In the latter case we
204 can save a little time over what PyDict_New does because it's guaranteed
205 that the PyDictObject struct is already zeroed out.
206 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
207 an excellent reason not to).
208*/
209
210#define INIT_NONZERO_DICT_SLOTS(mp) do { \
Tim Petersdea48ec2001-05-22 20:40:22 +0000211 (mp)->ma_table = (mp)->ma_smalltable; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 (mp)->ma_mask = PyDict_MINSIZE - 1; \
213 } while(0)
214
215#define EMPTY_TO_MINSIZE(mp) do { \
216 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000217 (mp)->ma_used = (mp)->ma_fill = 0; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000218 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000219 } while(0)
220
Raymond Hettinger43442782004-03-17 21:55:03 +0000221/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes5b970ad2008-02-06 13:33:44 +0000222#ifndef PyDict_MAXFREELIST
223#define PyDict_MAXFREELIST 80
224#endif
225static PyDictObject *free_list[PyDict_MAXFREELIST];
226static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000227
Christian Heimesf75dbef2008-02-08 00:11:31 +0000228void
229PyDict_Fini(void)
230{
Christian Heimes48397d62008-02-08 00:14:34 +0000231 PyDictObject *op;
Christian Heimesf75dbef2008-02-08 00:11:31 +0000232
233 while (numfree) {
Christian Heimes48397d62008-02-08 00:14:34 +0000234 op = free_list[--numfree];
Christian Heimesf75dbef2008-02-08 00:11:31 +0000235 assert(PyDict_CheckExact(op));
236 PyObject_GC_Del(op);
237 }
238}
239
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000241PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000242{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000243 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000244 if (dummy == NULL) { /* Auto-initialize dummy */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000245 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000246 if (dummy == NULL)
247 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000248#ifdef SHOW_CONVERSION_COUNTS
249 Py_AtExit(show_counts);
250#endif
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000251#ifdef SHOW_ALLOC_COUNT
252 Py_AtExit(show_alloc);
253#endif
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000254#ifdef SHOW_TRACK_COUNT
255 Py_AtExit(show_track);
256#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000257 }
Christian Heimes5b970ad2008-02-06 13:33:44 +0000258 if (numfree) {
259 mp = free_list[--numfree];
Raymond Hettinger43442782004-03-17 21:55:03 +0000260 assert (mp != NULL);
Christian Heimese93237d2007-12-19 02:37:44 +0000261 assert (Py_TYPE(mp) == &PyDict_Type);
Raymond Hettinger43442782004-03-17 21:55:03 +0000262 _Py_NewReference((PyObject *)mp);
263 if (mp->ma_fill) {
264 EMPTY_TO_MINSIZE(mp);
Georg Brandl1e13ea92008-08-11 09:07:59 +0000265 } else {
266 /* At least set ma_table and ma_mask; these are wrong
267 if an empty but presized dict is added to freelist */
268 INIT_NONZERO_DICT_SLOTS(mp);
Raymond Hettinger43442782004-03-17 21:55:03 +0000269 }
270 assert (mp->ma_used == 0);
271 assert (mp->ma_table == mp->ma_smalltable);
272 assert (mp->ma_mask == PyDict_MINSIZE - 1);
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000273#ifdef SHOW_ALLOC_COUNT
274 count_reuse++;
275#endif
Raymond Hettinger43442782004-03-17 21:55:03 +0000276 } else {
Brett Cannon77ae87c2007-10-10 00:07:50 +0000277 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
Raymond Hettinger43442782004-03-17 21:55:03 +0000278 if (mp == NULL)
279 return NULL;
280 EMPTY_TO_MINSIZE(mp);
Christian Heimesb4ee4a12008-02-07 17:15:30 +0000281#ifdef SHOW_ALLOC_COUNT
282 count_alloc++;
283#endif
Raymond Hettinger43442782004-03-17 21:55:03 +0000284 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000285 mp->ma_lookup = lookdict_string;
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000286#ifdef SHOW_TRACK_COUNT
287 count_untracked++;
288#endif
Fred Drake1bff34a2000-08-31 19:31:38 +0000289#ifdef SHOW_CONVERSION_COUNTS
290 ++created;
291#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000293}
294
295/*
296The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000297This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000298Open addressing is preferred over chaining since the link overhead for
299chaining would be substantial (100% with typical malloc overhead).
300
Tim Peterseb28ef22001-06-02 05:27:19 +0000301The initial probe index is computed as hash mod the table size. Subsequent
302probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000303
304All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000305
Tim Peterseb28ef22001-06-02 05:27:19 +0000306(The details in this version are due to Tim Peters, building on many past
307contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
308Christian Tismer).
Fred Drake1bff34a2000-08-31 19:31:38 +0000309
Tim Petersd770ebd2006-06-01 15:50:44 +0000310lookdict() is general-purpose, and may return NULL if (and only if) a
311comparison raises an exception (this was new in Python 2.5).
312lookdict_string() below is specialized to string keys, comparison of which can
313never raise an exception; that function can never return NULL. For both, when
Brett Cannon77ae87c2007-10-10 00:07:50 +0000314the key isn't found a PyDictEntry* is returned for which the me_value field is
Tim Petersd770ebd2006-06-01 15:50:44 +0000315NULL; this is the slot in the dict at which the key would have been found, and
316the caller can (if it wishes) add the <key, value> pair to the returned
Brett Cannon77ae87c2007-10-10 00:07:50 +0000317PyDictEntry*.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000318*/
Brett Cannon77ae87c2007-10-10 00:07:50 +0000319static PyDictEntry *
320lookdict(PyDictObject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000321{
Tim Petersd770ebd2006-06-01 15:50:44 +0000322 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000323 register size_t perturb;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000324 register PyDictEntry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000325 register size_t mask = (size_t)mp->ma_mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000326 PyDictEntry *ep0 = mp->ma_table;
327 register PyDictEntry *ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000328 register int cmp;
Tim Peters453163d2001-06-03 04:54:32 +0000329 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000330
Tim Petersd770ebd2006-06-01 15:50:44 +0000331 i = (size_t)hash & mask;
Guido van Rossumefb46091997-01-29 15:53:56 +0000332 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000333 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000334 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000335
Guido van Rossum16e93a81997-01-28 00:00:11 +0000336 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000337 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000338 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000339 if (ep->me_hash == hash) {
Tim Peters453163d2001-06-03 04:54:32 +0000340 startkey = ep->me_key;
Georg Brandlede3a322007-11-29 18:33:01 +0000341 Py_INCREF(startkey);
Tim Peters453163d2001-06-03 04:54:32 +0000342 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Georg Brandlede3a322007-11-29 18:33:01 +0000343 Py_DECREF(startkey);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000344 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000345 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000346 if (ep0 == mp->ma_table && ep->me_key == startkey) {
347 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000348 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000349 }
350 else {
351 /* The compare did major nasty stuff to the
352 * dict: start over.
353 * XXX A clever adversary could prevent this
354 * XXX from terminating.
355 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000356 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000357 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000358 }
359 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000360 }
Tim Peters15d49292001-05-27 07:39:22 +0000361
Tim Peters342c65e2001-05-13 06:43:53 +0000362 /* In the loop, me_key == dummy is by far (factor of 100s) the
363 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000364 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
365 i = (i << 2) + i + perturb + 1;
366 ep = &ep0[i & mask];
Armin Rigo35f6d362006-06-01 13:19:12 +0000367 if (ep->me_key == NULL)
368 return freeslot == NULL ? ep : freeslot;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000369 if (ep->me_key == key)
Armin Rigo35f6d362006-06-01 13:19:12 +0000370 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000371 if (ep->me_hash == hash && ep->me_key != dummy) {
Tim Peters453163d2001-06-03 04:54:32 +0000372 startkey = ep->me_key;
Georg Brandlede3a322007-11-29 18:33:01 +0000373 Py_INCREF(startkey);
Tim Peters453163d2001-06-03 04:54:32 +0000374 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Georg Brandlede3a322007-11-29 18:33:01 +0000375 Py_DECREF(startkey);
Tim Peters7b5d0af2001-06-03 04:14:43 +0000376 if (cmp < 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000377 return NULL;
Tim Peters453163d2001-06-03 04:54:32 +0000378 if (ep0 == mp->ma_table && ep->me_key == startkey) {
379 if (cmp > 0)
Armin Rigo35f6d362006-06-01 13:19:12 +0000380 return ep;
Tim Peters453163d2001-06-03 04:54:32 +0000381 }
382 else {
383 /* The compare did major nasty stuff to the
384 * dict: start over.
385 * XXX A clever adversary could prevent this
386 * XXX from terminating.
387 */
Armin Rigo35f6d362006-06-01 13:19:12 +0000388 return lookdict(mp, key, hash);
Tim Peters453163d2001-06-03 04:54:32 +0000389 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000390 }
Tim Peters342c65e2001-05-13 06:43:53 +0000391 else if (ep->me_key == dummy && freeslot == NULL)
392 freeslot = ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000393 }
Neal Norwitza5ccda92006-10-28 21:16:54 +0000394 assert(0); /* NOT REACHED */
395 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000396}
397
398/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000399 * Hacked up version of lookdict which can assume keys are always strings;
Tim Petersd770ebd2006-06-01 15:50:44 +0000400 * this assumption allows testing for errors during PyObject_RichCompareBool()
401 * to be dropped; string-string comparisons never raise exceptions. This also
402 * means we don't need to go through PyObject_RichCompareBool(); we can always
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000403 * use _PyString_Eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000404 *
Tim Petersd770ebd2006-06-01 15:50:44 +0000405 * This is valuable because dicts with only string keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000406 */
Brett Cannon77ae87c2007-10-10 00:07:50 +0000407static PyDictEntry *
408lookdict_string(PyDictObject *mp, PyObject *key, register long hash)
Fred Drake1bff34a2000-08-31 19:31:38 +0000409{
Tim Petersd770ebd2006-06-01 15:50:44 +0000410 register size_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000411 register size_t perturb;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000412 register PyDictEntry *freeslot;
Tim Petersd770ebd2006-06-01 15:50:44 +0000413 register size_t mask = (size_t)mp->ma_mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000414 PyDictEntry *ep0 = mp->ma_table;
415 register PyDictEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000416
Tim Peters0ab085c2001-09-14 00:25:33 +0000417 /* Make sure this function doesn't have to handle non-string keys,
418 including subclasses of str; e.g., one reason to subclass
419 strings is to override __eq__, and for speed we don't cater to
420 that here. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000421 if (!PyString_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000422#ifdef SHOW_CONVERSION_COUNTS
423 ++converted;
424#endif
425 mp->ma_lookup = lookdict;
426 return lookdict(mp, key, hash);
427 }
Tim Peters2f228e72001-05-13 00:19:31 +0000428 i = hash & mask;
Fred Drake1bff34a2000-08-31 19:31:38 +0000429 ep = &ep0[i];
430 if (ep->me_key == NULL || ep->me_key == key)
431 return ep;
432 if (ep->me_key == dummy)
433 freeslot = ep;
434 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000435 if (ep->me_hash == hash && _PyString_Eq(ep->me_key, key))
Fred Drake1bff34a2000-08-31 19:31:38 +0000436 return ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000437 freeslot = NULL;
438 }
Tim Peters15d49292001-05-27 07:39:22 +0000439
Tim Peters342c65e2001-05-13 06:43:53 +0000440 /* In the loop, me_key == dummy is by far (factor of 100s) the
441 least likely outcome, so test for that last. */
Tim Peterseb28ef22001-06-02 05:27:19 +0000442 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
443 i = (i << 2) + i + perturb + 1;
444 ep = &ep0[i & mask];
Tim Peters342c65e2001-05-13 06:43:53 +0000445 if (ep->me_key == NULL)
446 return freeslot == NULL ? ep : freeslot;
447 if (ep->me_key == key
448 || (ep->me_hash == hash
449 && ep->me_key != dummy
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000450 && _PyString_Eq(ep->me_key, key)))
Fred Drake1bff34a2000-08-31 19:31:38 +0000451 return ep;
Tim Petersdea48ec2001-05-22 20:40:22 +0000452 if (ep->me_key == dummy && freeslot == NULL)
Tim Peters342c65e2001-05-13 06:43:53 +0000453 freeslot = ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000454 }
Neal Norwitza5ccda92006-10-28 21:16:54 +0000455 assert(0); /* NOT REACHED */
456 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000457}
458
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000459#ifdef SHOW_TRACK_COUNT
460#define INCREASE_TRACK_COUNT \
461 (count_tracked++, count_untracked--);
462#define DECREASE_TRACK_COUNT \
463 (count_tracked--, count_untracked++);
464#else
465#define INCREASE_TRACK_COUNT
466#define DECREASE_TRACK_COUNT
467#endif
468
469#define MAINTAIN_TRACKING(mp, key, value) \
470 do { \
471 if (!_PyObject_GC_IS_TRACKED(mp)) { \
472 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
473 _PyObject_GC_MAY_BE_TRACKED(value)) { \
474 _PyObject_GC_TRACK(mp); \
475 INCREASE_TRACK_COUNT \
476 } \
477 } \
478 } while(0)
479
480void
481_PyDict_MaybeUntrack(PyObject *op)
482{
483 PyDictObject *mp;
484 PyObject *value;
485 Py_ssize_t mask, i;
486 PyDictEntry *ep;
487
488 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
489 return;
490
491 mp = (PyDictObject *) op;
492 ep = mp->ma_table;
493 mask = mp->ma_mask;
494 for (i = 0; i <= mask; i++) {
495 if ((value = ep[i].me_value) == NULL)
496 continue;
497 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
498 _PyObject_GC_MAY_BE_TRACKED(ep[i].me_key))
499 return;
500 }
Antoine Pitrou1fba6242009-03-23 19:17:00 +0000501 DECREASE_TRACK_COUNT
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000502 _PyObject_GC_UNTRACK(op);
503}
504
505
Fred Drake1bff34a2000-08-31 19:31:38 +0000506/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000507Internal routine to insert a new item into the table.
508Used both by the internal resize routine and by the public insert routine.
509Eats a reference to key and one to value.
Tim Petersd770ebd2006-06-01 15:50:44 +0000510Returns -1 if an error occurred, or 0 on success.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000511*/
Armin Rigo35f6d362006-06-01 13:19:12 +0000512static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000513insertdict(register PyDictObject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000514{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 PyObject *old_value;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000516 register PyDictEntry *ep;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000517 typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long);
518
519 assert(mp->ma_lookup != NULL);
520 ep = mp->ma_lookup(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000521 if (ep == NULL) {
522 Py_DECREF(key);
523 Py_DECREF(value);
524 return -1;
525 }
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000526 MAINTAIN_TRACKING(mp, key, value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000527 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000528 old_value = ep->me_value;
529 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 Py_DECREF(old_value); /* which **CAN** re-enter */
531 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000532 }
533 else {
534 if (ep->me_key == NULL)
535 mp->ma_fill++;
Raymond Hettinger07ead172005-02-05 23:42:57 +0000536 else {
537 assert(ep->me_key == dummy);
538 Py_DECREF(dummy);
539 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000540 ep->me_key = key;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000541 ep->me_hash = (Py_ssize_t)hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000542 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000543 mp->ma_used++;
544 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000545 return 0;
546}
547
548/*
549Internal routine used by dictresize() to insert an item which is
550known to be absent from the dict. This routine also assumes that
551the dict contains no deleted entries. Besides the performance benefit,
552using insertdict() in dictresize() is dangerous (SF bug #1456209).
Tim Petersd770ebd2006-06-01 15:50:44 +0000553Note that no refcounts are changed by this routine; if needed, the caller
554is responsible for incref'ing `key` and `value`.
Armin Rigo35f6d362006-06-01 13:19:12 +0000555*/
556static void
Brett Cannon77ae87c2007-10-10 00:07:50 +0000557insertdict_clean(register PyDictObject *mp, PyObject *key, long hash,
Armin Rigo35f6d362006-06-01 13:19:12 +0000558 PyObject *value)
559{
Tim Petersd770ebd2006-06-01 15:50:44 +0000560 register size_t i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000561 register size_t perturb;
Tim Petersd770ebd2006-06-01 15:50:44 +0000562 register size_t mask = (size_t)mp->ma_mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000563 PyDictEntry *ep0 = mp->ma_table;
564 register PyDictEntry *ep;
Armin Rigo35f6d362006-06-01 13:19:12 +0000565
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000566 MAINTAIN_TRACKING(mp, key, value);
Armin Rigo35f6d362006-06-01 13:19:12 +0000567 i = hash & mask;
568 ep = &ep0[i];
569 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
570 i = (i << 2) + i + perturb + 1;
571 ep = &ep0[i & mask];
572 }
Tim Petersd770ebd2006-06-01 15:50:44 +0000573 assert(ep->me_value == NULL);
Armin Rigo35f6d362006-06-01 13:19:12 +0000574 mp->ma_fill++;
575 ep->me_key = key;
576 ep->me_hash = (Py_ssize_t)hash;
577 ep->me_value = value;
578 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000579}
580
581/*
582Restructure the table by allocating a new table and reinserting all
583items again. When entries have been deleted, the new table may
584actually be smaller than the old one.
585*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000586static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000587dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000588{
Tim Peters9b10f7e2006-05-30 04:16:25 +0000589 Py_ssize_t newsize;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000590 PyDictEntry *oldtable, *newtable, *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000591 Py_ssize_t i;
Tim Peters0c6010b2001-05-23 23:33:57 +0000592 int is_oldtable_malloced;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000593 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000594
595 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000596
Tim Peterseb28ef22001-06-02 05:27:19 +0000597 /* Find the smallest table size > minused. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000598 for (newsize = PyDict_MINSIZE;
Tim Peterseb28ef22001-06-02 05:27:19 +0000599 newsize <= minused && newsize > 0;
600 newsize <<= 1)
601 ;
602 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000604 return -1;
605 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000606
607 /* Get space for a new table. */
608 oldtable = mp->ma_table;
609 assert(oldtable != NULL);
610 is_oldtable_malloced = oldtable != mp->ma_smalltable;
611
Tim Peters6d6c1a32001-08-02 04:15:00 +0000612 if (newsize == PyDict_MINSIZE) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000613 /* A large table is shrinking, or we can't get any smaller. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000614 newtable = mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000615 if (newtable == oldtable) {
Tim Petersf8a548c2001-05-24 16:26:40 +0000616 if (mp->ma_fill == mp->ma_used) {
617 /* No dummies, so no point doing anything. */
Tim Peters0c6010b2001-05-23 23:33:57 +0000618 return 0;
Tim Petersf8a548c2001-05-24 16:26:40 +0000619 }
620 /* We're not going to resize it, but rebuild the
621 table anyway to purge old dummy entries.
622 Subtle: This is *necessary* if fill==size,
623 as lookdict needs at least one virgin slot to
624 terminate failing searches. If fill < size, it's
625 merely desirable, as dummies slow searches. */
626 assert(mp->ma_fill > mp->ma_used);
Tim Peters0c6010b2001-05-23 23:33:57 +0000627 memcpy(small_copy, oldtable, sizeof(small_copy));
628 oldtable = small_copy;
629 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000630 }
631 else {
Brett Cannon77ae87c2007-10-10 00:07:50 +0000632 newtable = PyMem_NEW(PyDictEntry, newsize);
Tim Petersdea48ec2001-05-22 20:40:22 +0000633 if (newtable == NULL) {
634 PyErr_NoMemory();
635 return -1;
636 }
637 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000638
639 /* Make the dict empty, using the new table. */
Tim Petersdea48ec2001-05-22 20:40:22 +0000640 assert(newtable != oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000641 mp->ma_table = newtable;
Tim Petersafb6ae82001-06-04 21:00:21 +0000642 mp->ma_mask = newsize - 1;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000643 memset(newtable, 0, sizeof(PyDictEntry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000644 mp->ma_used = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000645 i = mp->ma_fill;
646 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000647
Tim Peters19283142001-05-17 22:25:34 +0000648 /* Copy the data over; this is refcount-neutral for active entries;
649 dummy entries aren't copied over, of course */
Tim Petersdea48ec2001-05-22 20:40:22 +0000650 for (ep = oldtable; i > 0; ep++) {
651 if (ep->me_value != NULL) { /* active entry */
652 --i;
Armin Rigo35f6d362006-06-01 13:19:12 +0000653 insertdict_clean(mp, ep->me_key, (long)ep->me_hash,
654 ep->me_value);
Tim Petersdea48ec2001-05-22 20:40:22 +0000655 }
Tim Peters19283142001-05-17 22:25:34 +0000656 else if (ep->me_key != NULL) { /* dummy entry */
Tim Petersdea48ec2001-05-22 20:40:22 +0000657 --i;
Tim Peters19283142001-05-17 22:25:34 +0000658 assert(ep->me_key == dummy);
659 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000660 }
Tim Peters19283142001-05-17 22:25:34 +0000661 /* else key == value == NULL: nothing to do */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000662 }
663
Tim Peters0c6010b2001-05-23 23:33:57 +0000664 if (is_oldtable_malloced)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000665 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000666 return 0;
667}
668
Raymond Hettingerfd7ed402007-12-18 21:24:09 +0000669/* Create a new dictionary pre-sized to hold an estimated number of elements.
670 Underestimates are okay because the dictionary will resize as necessary.
671 Overestimates just mean the dictionary will be more sparse than usual.
672*/
673
674PyObject *
675_PyDict_NewPresized(Py_ssize_t minused)
676{
677 PyObject *op = PyDict_New();
678
679 if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
680 Py_DECREF(op);
681 return NULL;
682 }
683 return op;
684}
685
Tim Petersd770ebd2006-06-01 15:50:44 +0000686/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
687 * that may occur (originally dicts supported only string keys, and exceptions
688 * weren't possible). So, while the original intent was that a NULL return
Andrew M. Kuchling0067b5f2006-08-04 20:37:43 +0000689 * meant the key wasn't present, in reality it can mean that, or that an error
Tim Petersd770ebd2006-06-01 15:50:44 +0000690 * (suppressed) occurred while computing the key's hash, or that some error
691 * (suppressed) occurred when comparing keys in the dict's internal probe
692 * sequence. A nasty example of the latter is when a Python-coded comparison
693 * function hits a stack-depth error, which can cause this to return NULL
694 * even if the key is present.
695 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000697PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000698{
699 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000700 PyDictObject *mp = (PyDictObject *)op;
701 PyDictEntry *ep;
Armin Rigo35f6d362006-06-01 13:19:12 +0000702 PyThreadState *tstate;
Tim Petersd770ebd2006-06-01 15:50:44 +0000703 if (!PyDict_Check(op))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000704 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000705 if (!PyString_CheckExact(key) ||
706 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Guido van Rossumca756f21997-01-23 19:39:29 +0000707 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000709 if (hash == -1) {
710 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000711 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000712 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000713 }
Armin Rigo35f6d362006-06-01 13:19:12 +0000714
Benjamin Peterson24d91752009-07-21 14:08:40 +0000715 /* We can arrive here with a NULL tstate during initialization: try
716 running "python -Wi" for an example related to string interning.
717 Let's just hope that no exception occurs then... This must be
718 _PyThreadState_Current and not PyThreadState_GET() because in debug
Benjamin Peterson9119fbc2009-07-25 02:03:48 +0000719 mode, the latter complains if tstate is NULL. */
Benjamin Peterson24d91752009-07-21 14:08:40 +0000720 tstate = _PyThreadState_Current;
Armin Rigo35f6d362006-06-01 13:19:12 +0000721 if (tstate != NULL && tstate->curexc_type != NULL) {
722 /* preserve the existing exception */
723 PyObject *err_type, *err_value, *err_tb;
724 PyErr_Fetch(&err_type, &err_value, &err_tb);
725 ep = (mp->ma_lookup)(mp, key, hash);
726 /* ignore errors */
727 PyErr_Restore(err_type, err_value, err_tb);
728 if (ep == NULL)
729 return NULL;
730 }
731 else {
732 ep = (mp->ma_lookup)(mp, key, hash);
733 if (ep == NULL) {
734 PyErr_Clear();
735 return NULL;
736 }
737 }
738 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000739}
740
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000741/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
Tim Peters60b29962006-01-01 01:19:23 +0000742 * dictionary if it's merely replacing the value for an existing key.
743 * This means that it's safe to loop over a dictionary with PyDict_Next()
744 * and occasionally replace a value -- but you can't insert new keys or
745 * remove them.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000746 */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000747int
Tim Peters1f5871e2000-07-04 17:44:48 +0000748PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000749{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000750 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000751 register long hash;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000752 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000753
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754 if (!PyDict_Check(op)) {
755 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000756 return -1;
757 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000758 assert(key);
759 assert(value);
Brett Cannon77ae87c2007-10-10 00:07:50 +0000760 mp = (PyDictObject *)op;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000761 if (PyString_CheckExact(key)) {
762 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum45ec02a2002-08-19 21:43:18 +0000763 if (hash == -1)
764 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000765 }
Tim Peters1f7df352002-03-29 03:29:08 +0000766 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000768 if (hash == -1)
769 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000770 }
Tim Petersafb6ae82001-06-04 21:00:21 +0000771 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000772 n_used = mp->ma_used;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773 Py_INCREF(value);
774 Py_INCREF(key);
Armin Rigo35f6d362006-06-01 13:19:12 +0000775 if (insertdict(mp, key, hash, value) != 0)
776 return -1;
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000777 /* If we added a key, we can safely resize. Otherwise just return!
778 * If fill >= 2/3 size, adjust size. Normally, this doubles or
779 * quaduples the size, but it's also possible for the dict to shrink
Tim Peters60b29962006-01-01 01:19:23 +0000780 * (if ma_fill is much larger than ma_used, meaning a lot of dict
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000781 * keys have been * deleted).
Tim Peters60b29962006-01-01 01:19:23 +0000782 *
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000783 * Quadrupling the size improves average dictionary sparseness
784 * (reducing collisions) at the cost of some memory and iteration
785 * speed (which loops over every possible entry). It also halves
Neal Norwitz80af59c2006-05-30 04:19:21 +0000786 * the number of expensive resize operations in a growing dictionary.
Tim Peters60b29962006-01-01 01:19:23 +0000787 *
788 * Very large dictionaries (over 50K items) use doubling instead.
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000789 * This may help applications with severe memory constraints.
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000790 */
Raymond Hettinger3539f6b2003-05-05 22:22:10 +0000791 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
792 return 0;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000793 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000794}
795
796int
Tim Peters1f5871e2000-07-04 17:44:48 +0000797PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000798{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000799 register PyDictObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000800 register long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000801 register PyDictEntry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000803
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 if (!PyDict_Check(op)) {
805 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000806 return -1;
807 }
Neal Norwitz48808a12006-07-21 05:29:58 +0000808 assert(key);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000809 if (!PyString_CheckExact(key) ||
810 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000811 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000812 if (hash == -1)
813 return -1;
814 }
Brett Cannon77ae87c2007-10-10 00:07:50 +0000815 mp = (PyDictObject *)op;
Fred Drake1bff34a2000-08-31 19:31:38 +0000816 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +0000817 if (ep == NULL)
818 return -1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000819 if (ep->me_value == NULL) {
Georg Brandlb9f4ad32006-10-29 18:31:42 +0000820 set_key_error(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000821 return -1;
822 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000823 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000825 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000826 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000827 ep->me_value = NULL;
828 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000829 Py_DECREF(old_value);
830 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000831 return 0;
832}
833
Guido van Rossum25831651993-05-19 14:50:45 +0000834void
Tim Peters1f5871e2000-07-04 17:44:48 +0000835PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000836{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000837 PyDictObject *mp;
838 PyDictEntry *ep, *table;
Tim Petersdea48ec2001-05-22 20:40:22 +0000839 int table_is_malloced;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000840 Py_ssize_t fill;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000841 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000842#ifdef Py_DEBUG
Tim Peters9b10f7e2006-05-30 04:16:25 +0000843 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000844#endif
845
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000847 return;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000848 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000849#ifdef Py_DEBUG
Tim Petersafb6ae82001-06-04 21:00:21 +0000850 n = mp->ma_mask + 1;
Tim Petersdea48ec2001-05-22 20:40:22 +0000851 i = 0;
852#endif
853
854 table = mp->ma_table;
855 assert(table != NULL);
856 table_is_malloced = table != mp->ma_smalltable;
857
858 /* This is delicate. During the process of clearing the dict,
859 * decrefs can cause the dict to mutate. To avoid fatal confusion
860 * (voice of experience), we have to make the dict empty before
861 * clearing the slots, and never refer to anything via mp->xxx while
862 * clearing.
863 */
864 fill = mp->ma_fill;
865 if (table_is_malloced)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000866 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000867
868 else if (fill > 0) {
869 /* It's a small table with something that needs to be cleared.
870 * Afraid the only safe way is to copy the dict entries into
871 * another small table first.
872 */
873 memcpy(small_copy, table, sizeof(small_copy));
874 table = small_copy;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000875 EMPTY_TO_MINSIZE(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000876 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000877 /* else it's a small table that's already empty */
878
879 /* Now we can finally clear things. If C had refcounts, we could
880 * assert that the refcount on table is 1 now, i.e. that this function
881 * has unique access to it, so decref side-effects can't alter it.
882 */
883 for (ep = table; fill > 0; ++ep) {
884#ifdef Py_DEBUG
885 assert(i < n);
886 ++i;
887#endif
888 if (ep->me_key) {
889 --fill;
890 Py_DECREF(ep->me_key);
891 Py_XDECREF(ep->me_value);
892 }
893#ifdef Py_DEBUG
894 else
895 assert(ep->me_value == NULL);
896#endif
897 }
898
899 if (table_is_malloced)
900 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000901}
902
Tim Peters080c88b2003-02-15 03:01:11 +0000903/*
904 * Iterate over a dict. Use like so:
905 *
Tim Peters9b10f7e2006-05-30 04:16:25 +0000906 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000907 * PyObject *key, *value;
908 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000909 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000910 * Refer to borrowed references in key and value.
911 * }
912 *
913 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000914 * mutates the dict. One exception: it is safe if the loop merely changes
915 * the values associated with the keys (but doesn't insert new keys or
916 * delete keys), via PyDict_SetItem().
917 */
Guido van Rossum25831651993-05-19 14:50:45 +0000918int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000919PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000920{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000921 register Py_ssize_t i;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000922 register Py_ssize_t mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000923 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000924
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000926 return 0;
Guido van Rossum25831651993-05-19 14:50:45 +0000927 i = *ppos;
928 if (i < 0)
929 return 0;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000930 ep = ((PyDictObject *)op)->ma_table;
931 mask = ((PyDictObject *)op)->ma_mask;
Raymond Hettinger43442782004-03-17 21:55:03 +0000932 while (i <= mask && ep[i].me_value == NULL)
Guido van Rossum25831651993-05-19 14:50:45 +0000933 i++;
934 *ppos = i+1;
Raymond Hettinger43442782004-03-17 21:55:03 +0000935 if (i > mask)
Guido van Rossum25831651993-05-19 14:50:45 +0000936 return 0;
937 if (pkey)
Raymond Hettinger43442782004-03-17 21:55:03 +0000938 *pkey = ep[i].me_key;
Guido van Rossum25831651993-05-19 14:50:45 +0000939 if (pvalue)
Raymond Hettinger43442782004-03-17 21:55:03 +0000940 *pvalue = ep[i].me_value;
Guido van Rossum25831651993-05-19 14:50:45 +0000941 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000942}
943
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000944/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
945int
946_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, long *phash)
947{
948 register Py_ssize_t i;
949 register Py_ssize_t mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000950 register PyDictEntry *ep;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000951
952 if (!PyDict_Check(op))
953 return 0;
954 i = *ppos;
955 if (i < 0)
956 return 0;
Brett Cannon77ae87c2007-10-10 00:07:50 +0000957 ep = ((PyDictObject *)op)->ma_table;
958 mask = ((PyDictObject *)op)->ma_mask;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000959 while (i <= mask && ep[i].me_value == NULL)
960 i++;
961 *ppos = i+1;
962 if (i > mask)
963 return 0;
964 *phash = (long)(ep[i].me_hash);
965 if (pkey)
966 *pkey = ep[i].me_key;
967 if (pvalue)
968 *pvalue = ep[i].me_value;
969 return 1;
970}
971
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000972/* Methods */
973
974static void
Brett Cannon77ae87c2007-10-10 00:07:50 +0000975dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000976{
Brett Cannon77ae87c2007-10-10 00:07:50 +0000977 register PyDictEntry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +0000978 Py_ssize_t fill = mp->ma_fill;
Guido van Rossumff413af2002-03-28 20:34:59 +0000979 PyObject_GC_UnTrack(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000980 Py_TRASHCAN_SAFE_BEGIN(mp)
Tim Petersdea48ec2001-05-22 20:40:22 +0000981 for (ep = mp->ma_table; fill > 0; ep++) {
982 if (ep->me_key) {
983 --fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000984 Py_DECREF(ep->me_key);
Tim Petersdea48ec2001-05-22 20:40:22 +0000985 Py_XDECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000986 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000987 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000988 if (mp->ma_table != mp->ma_smalltable)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000989 PyMem_DEL(mp->ma_table);
Christian Heimes5b970ad2008-02-06 13:33:44 +0000990 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
991 free_list[numfree++] = mp;
Tim Peters60b29962006-01-01 01:19:23 +0000992 else
Christian Heimese93237d2007-12-19 02:37:44 +0000993 Py_TYPE(mp)->tp_free((PyObject *)mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000994 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000995}
996
997static int
Brett Cannon77ae87c2007-10-10 00:07:50 +0000998dict_print(register PyDictObject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000999{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001000 register Py_ssize_t i;
1001 register Py_ssize_t any;
Tim Peters33f4a6a2006-05-30 05:23:59 +00001002 int status;
Guido van Rossum255443b1998-04-10 22:47:14 +00001003
Tim Peters33f4a6a2006-05-30 05:23:59 +00001004 status = Py_ReprEnter((PyObject*)mp);
1005 if (status != 0) {
1006 if (status < 0)
1007 return status;
Brett Cannon01531592007-09-17 03:28:34 +00001008 Py_BEGIN_ALLOW_THREADS
Guido van Rossum255443b1998-04-10 22:47:14 +00001009 fprintf(fp, "{...}");
Brett Cannon01531592007-09-17 03:28:34 +00001010 Py_END_ALLOW_THREADS
Guido van Rossum255443b1998-04-10 22:47:14 +00001011 return 0;
1012 }
1013
Brett Cannon01531592007-09-17 03:28:34 +00001014 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001015 fprintf(fp, "{");
Brett Cannon01531592007-09-17 03:28:34 +00001016 Py_END_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001017 any = 0;
Tim Petersafb6ae82001-06-04 21:00:21 +00001018 for (i = 0; i <= mp->ma_mask; i++) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001019 PyDictEntry *ep = mp->ma_table + i;
Tim Peters23cf6be2001-06-02 08:02:56 +00001020 PyObject *pvalue = ep->me_value;
1021 if (pvalue != NULL) {
1022 /* Prevent PyObject_Repr from deleting value during
1023 key format */
1024 Py_INCREF(pvalue);
Brett Cannon01531592007-09-17 03:28:34 +00001025 if (any++ > 0) {
1026 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001027 fprintf(fp, ", ");
Brett Cannon01531592007-09-17 03:28:34 +00001028 Py_END_ALLOW_THREADS
1029 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001030 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Tim Peters23cf6be2001-06-02 08:02:56 +00001031 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +00001032 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001033 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +00001034 }
Brett Cannon01531592007-09-17 03:28:34 +00001035 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001036 fprintf(fp, ": ");
Brett Cannon01531592007-09-17 03:28:34 +00001037 Py_END_ALLOW_THREADS
Tim Peters19b77cf2001-06-02 08:27:39 +00001038 if (PyObject_Print(pvalue, fp, 0) != 0) {
Tim Peters23cf6be2001-06-02 08:02:56 +00001039 Py_DECREF(pvalue);
Guido van Rossum255443b1998-04-10 22:47:14 +00001040 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001041 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +00001042 }
Tim Peters23cf6be2001-06-02 08:02:56 +00001043 Py_DECREF(pvalue);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001044 }
1045 }
Brett Cannon01531592007-09-17 03:28:34 +00001046 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001047 fprintf(fp, "}");
Brett Cannon01531592007-09-17 03:28:34 +00001048 Py_END_ALLOW_THREADS
Guido van Rossum255443b1998-04-10 22:47:14 +00001049 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001050 return 0;
1051}
1052
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001054dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001055{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001056 Py_ssize_t i;
Tim Petersa7259592001-06-16 05:11:17 +00001057 PyObject *s, *temp, *colon = NULL;
1058 PyObject *pieces = NULL, *result = NULL;
1059 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001060
Tim Petersa7259592001-06-16 05:11:17 +00001061 i = Py_ReprEnter((PyObject *)mp);
Guido van Rossum255443b1998-04-10 22:47:14 +00001062 if (i != 0) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001063 return i > 0 ? PyString_FromString("{...}") : NULL;
Guido van Rossum255443b1998-04-10 22:47:14 +00001064 }
1065
Tim Petersa7259592001-06-16 05:11:17 +00001066 if (mp->ma_used == 0) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001067 result = PyString_FromString("{}");
Tim Petersa7259592001-06-16 05:11:17 +00001068 goto Done;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001069 }
Tim Petersa7259592001-06-16 05:11:17 +00001070
1071 pieces = PyList_New(0);
1072 if (pieces == NULL)
1073 goto Done;
1074
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001075 colon = PyString_FromString(": ");
Tim Petersa7259592001-06-16 05:11:17 +00001076 if (colon == NULL)
1077 goto Done;
1078
1079 /* Do repr() on each key+value pair, and insert ": " between them.
1080 Note that repr may mutate the dict. */
Tim Petersc6057842001-06-16 07:52:53 +00001081 i = 0;
1082 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
Tim Petersa7259592001-06-16 05:11:17 +00001083 int status;
1084 /* Prevent repr from deleting value during key format. */
1085 Py_INCREF(value);
1086 s = PyObject_Repr(key);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001087 PyString_Concat(&s, colon);
1088 PyString_ConcatAndDel(&s, PyObject_Repr(value));
Tim Petersa7259592001-06-16 05:11:17 +00001089 Py_DECREF(value);
1090 if (s == NULL)
1091 goto Done;
1092 status = PyList_Append(pieces, s);
1093 Py_DECREF(s); /* append created a new ref */
1094 if (status < 0)
1095 goto Done;
1096 }
1097
1098 /* Add "{}" decorations to the first and last items. */
1099 assert(PyList_GET_SIZE(pieces) > 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001100 s = PyString_FromString("{");
Tim Petersa7259592001-06-16 05:11:17 +00001101 if (s == NULL)
1102 goto Done;
1103 temp = PyList_GET_ITEM(pieces, 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001104 PyString_ConcatAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +00001105 PyList_SET_ITEM(pieces, 0, s);
1106 if (s == NULL)
1107 goto Done;
1108
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001109 s = PyString_FromString("}");
Tim Petersa7259592001-06-16 05:11:17 +00001110 if (s == NULL)
1111 goto Done;
1112 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001113 PyString_ConcatAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +00001114 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1115 if (temp == NULL)
1116 goto Done;
1117
1118 /* Paste them all together with ", " between. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001119 s = PyString_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +00001120 if (s == NULL)
1121 goto Done;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001122 result = _PyString_Join(s, pieces);
Tim Peters0ab085c2001-09-14 00:25:33 +00001123 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001124
1125Done:
1126 Py_XDECREF(pieces);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001127 Py_XDECREF(colon);
Tim Petersa7259592001-06-16 05:11:17 +00001128 Py_ReprLeave((PyObject *)mp);
1129 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001130}
1131
Martin v. Löwis18e16552006-02-15 17:27:45 +00001132static Py_ssize_t
Brett Cannon77ae87c2007-10-10 00:07:50 +00001133dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001134{
1135 return mp->ma_used;
1136}
1137
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001139dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001140{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001142 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001143 PyDictEntry *ep;
Tim Petersdea48ec2001-05-22 20:40:22 +00001144 assert(mp->ma_table != NULL);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001145 if (!PyString_CheckExact(key) ||
1146 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001147 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001148 if (hash == -1)
1149 return NULL;
1150 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001151 ep = (mp->ma_lookup)(mp, key, hash);
1152 if (ep == NULL)
1153 return NULL;
1154 v = ep->me_value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001155 if (v == NULL) {
1156 if (!PyDict_CheckExact(mp)) {
1157 /* Look up __missing__ method if we're a subclass. */
Benjamin Peterson1afec5d2009-05-27 03:08:44 +00001158 PyObject *missing, *res;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001159 static PyObject *missing_str = NULL;
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001160 missing = _PyObject_LookupSpecial((PyObject *)mp,
1161 "__missing__",
1162 &missing_str);
Benjamin Peterson1afec5d2009-05-27 03:08:44 +00001163 if (missing != NULL) {
1164 res = PyObject_CallFunctionObjArgs(missing,
1165 key, NULL);
1166 Py_DECREF(missing);
1167 return res;
1168 }
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001169 else if (PyErr_Occurred())
1170 return NULL;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001171 }
Georg Brandlb9f4ad32006-10-29 18:31:42 +00001172 set_key_error(key);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001173 return NULL;
1174 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001175 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001176 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001177 return v;
1178}
1179
1180static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001181dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001182{
1183 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001185 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001187}
1188
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001189static PyMappingMethods dict_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001190 (lenfunc)dict_length, /*mp_length*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001191 (binaryfunc)dict_subscript, /*mp_subscript*/
1192 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001193};
1194
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001195static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001196dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001197{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001198 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001199 register Py_ssize_t i, j;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001200 PyDictEntry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001201 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001202
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001203 again:
1204 n = mp->ma_used;
1205 v = PyList_New(n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001206 if (v == NULL)
1207 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001208 if (n != mp->ma_used) {
1209 /* Durnit. The allocations caused the dict to resize.
1210 * Just start over, this shouldn't normally happen.
1211 */
1212 Py_DECREF(v);
1213 goto again;
1214 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001215 ep = mp->ma_table;
1216 mask = mp->ma_mask;
1217 for (i = 0, j = 0; i <= mask; i++) {
1218 if (ep[i].me_value != NULL) {
1219 PyObject *key = ep[i].me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001221 PyList_SET_ITEM(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001222 j++;
1223 }
1224 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001225 assert(j == n);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001226 return v;
1227}
1228
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001230dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001231{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001233 register Py_ssize_t i, j;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001234 PyDictEntry *ep;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001235 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001236
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001237 again:
1238 n = mp->ma_used;
1239 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001240 if (v == NULL)
1241 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001242 if (n != mp->ma_used) {
1243 /* Durnit. The allocations caused the dict to resize.
1244 * Just start over, this shouldn't normally happen.
1245 */
1246 Py_DECREF(v);
1247 goto again;
1248 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001249 ep = mp->ma_table;
1250 mask = mp->ma_mask;
1251 for (i = 0, j = 0; i <= mask; i++) {
1252 if (ep[i].me_value != NULL) {
1253 PyObject *value = ep[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001255 PyList_SET_ITEM(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001256 j++;
1257 }
1258 }
Raymond Hettinger43442782004-03-17 21:55:03 +00001259 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001260 return v;
1261}
1262
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001264dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001265{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266 register PyObject *v;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001267 register Py_ssize_t i, j, n;
1268 Py_ssize_t mask;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001269 PyObject *item, *key, *value;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001270 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001271
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001272 /* Preallocate the list of tuples, to avoid allocations during
1273 * the loop over the items, which could trigger GC, which
1274 * could resize the dict. :-(
1275 */
1276 again:
1277 n = mp->ma_used;
1278 v = PyList_New(n);
Guido van Rossum25831651993-05-19 14:50:45 +00001279 if (v == NULL)
1280 return NULL;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001281 for (i = 0; i < n; i++) {
1282 item = PyTuple_New(2);
1283 if (item == NULL) {
1284 Py_DECREF(v);
1285 return NULL;
1286 }
1287 PyList_SET_ITEM(v, i, item);
1288 }
1289 if (n != mp->ma_used) {
1290 /* Durnit. The allocations caused the dict to resize.
1291 * Just start over, this shouldn't normally happen.
1292 */
1293 Py_DECREF(v);
1294 goto again;
1295 }
1296 /* Nothing we do below makes any function calls. */
Raymond Hettinger43442782004-03-17 21:55:03 +00001297 ep = mp->ma_table;
1298 mask = mp->ma_mask;
1299 for (i = 0, j = 0; i <= mask; i++) {
Raymond Hettinger06905122004-03-19 10:30:00 +00001300 if ((value=ep[i].me_value) != NULL) {
Raymond Hettinger43442782004-03-17 21:55:03 +00001301 key = ep[i].me_key;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001302 item = PyList_GET_ITEM(v, j);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303 Py_INCREF(key);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001304 PyTuple_SET_ITEM(item, 0, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 Py_INCREF(value);
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001306 PyTuple_SET_ITEM(item, 1, value);
Guido van Rossum25831651993-05-19 14:50:45 +00001307 j++;
1308 }
1309 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001310 assert(j == n);
Guido van Rossum25831651993-05-19 14:50:45 +00001311 return v;
1312}
1313
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001314static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001315dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001316{
1317 PyObject *seq;
1318 PyObject *value = Py_None;
1319 PyObject *it; /* iter(seq) */
1320 PyObject *key;
1321 PyObject *d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001322 int status;
1323
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001324 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001325 return NULL;
1326
1327 d = PyObject_CallObject(cls, NULL);
1328 if (d == NULL)
1329 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001330
Raymond Hettingercdcf8872007-11-07 02:26:17 +00001331 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1332 PyDictObject *mp = (PyDictObject *)d;
1333 PyObject *oldvalue;
1334 Py_ssize_t pos = 0;
1335 PyObject *key;
1336 long hash;
1337
Raymond Hettingera27474c2008-06-28 22:16:53 +00001338 if (dictresize(mp, Py_SIZE(seq)))
Raymond Hettingercdcf8872007-11-07 02:26:17 +00001339 return NULL;
1340
1341 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1342 Py_INCREF(key);
1343 Py_INCREF(value);
1344 if (insertdict(mp, key, hash, value))
1345 return NULL;
1346 }
1347 return d;
1348 }
1349
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001350 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001351 PyDictObject *mp = (PyDictObject *)d;
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001352 Py_ssize_t pos = 0;
1353 PyObject *key;
1354 long hash;
1355
1356 if (dictresize(mp, PySet_GET_SIZE(seq)))
1357 return NULL;
1358
1359 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1360 Py_INCREF(key);
Raymond Hettingere3146f52007-03-21 20:33:57 +00001361 Py_INCREF(value);
1362 if (insertdict(mp, key, hash, value))
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00001363 return NULL;
1364 }
1365 return d;
1366 }
1367
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001368 it = PyObject_GetIter(seq);
1369 if (it == NULL){
1370 Py_DECREF(d);
1371 return NULL;
1372 }
1373
Raymond Hettinger34448792007-11-09 23:14:44 +00001374 if (PyDict_CheckExact(d)) {
1375 while ((key = PyIter_Next(it)) != NULL) {
1376 status = PyDict_SetItem(d, key, value);
1377 Py_DECREF(key);
1378 if (status < 0)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001379 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001380 }
Raymond Hettinger34448792007-11-09 23:14:44 +00001381 } else {
1382 while ((key = PyIter_Next(it)) != NULL) {
1383 status = PyObject_SetItem(d, key, value);
1384 Py_DECREF(key);
1385 if (status < 0)
1386 goto Fail;
1387 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001388 }
1389
Raymond Hettinger34448792007-11-09 23:14:44 +00001390 if (PyErr_Occurred())
1391 goto Fail;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001392 Py_DECREF(it);
1393 return d;
1394
1395Fail:
1396 Py_DECREF(it);
1397 Py_DECREF(d);
1398 return NULL;
1399}
1400
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001401static int
1402dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001403{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001404 PyObject *arg = NULL;
1405 int result = 0;
1406
1407 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1408 result = -1;
1409
1410 else if (arg != NULL) {
1411 if (PyObject_HasAttrString(arg, "keys"))
1412 result = PyDict_Merge(self, arg, 1);
1413 else
1414 result = PyDict_MergeFromSeq2(self, arg, 1);
1415 }
1416 if (result == 0 && kwds != NULL)
1417 result = PyDict_Merge(self, kwds, 1);
1418 return result;
1419}
1420
1421static PyObject *
1422dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1423{
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001424 if (dict_update_common(self, args, kwds, "update") != -1)
1425 Py_RETURN_NONE;
1426 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001427}
1428
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001429/* Update unconditionally replaces existing items.
1430 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001431 otherwise it leaves existing items unchanged.
1432
1433 PyDict_{Update,Merge} update/merge from a mapping object.
1434
Tim Petersf582b822001-12-11 18:51:08 +00001435 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001436 producing iterable objects of length 2.
1437*/
1438
Tim Petersf582b822001-12-11 18:51:08 +00001439int
Tim Peters1fc240e2001-10-26 05:06:50 +00001440PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1441{
1442 PyObject *it; /* iter(seq2) */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001443 Py_ssize_t i; /* index into seq2 of current element */
Tim Peters1fc240e2001-10-26 05:06:50 +00001444 PyObject *item; /* seq2[i] */
1445 PyObject *fast; /* item as a 2-tuple or 2-list */
1446
1447 assert(d != NULL);
1448 assert(PyDict_Check(d));
1449 assert(seq2 != NULL);
1450
1451 it = PyObject_GetIter(seq2);
1452 if (it == NULL)
1453 return -1;
1454
1455 for (i = 0; ; ++i) {
1456 PyObject *key, *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001457 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001458
1459 fast = NULL;
1460 item = PyIter_Next(it);
1461 if (item == NULL) {
1462 if (PyErr_Occurred())
1463 goto Fail;
1464 break;
1465 }
1466
1467 /* Convert item to sequence, and verify length 2. */
1468 fast = PySequence_Fast(item, "");
1469 if (fast == NULL) {
1470 if (PyErr_ExceptionMatches(PyExc_TypeError))
1471 PyErr_Format(PyExc_TypeError,
1472 "cannot convert dictionary update "
Neal Norwitzd3881b02006-05-30 04:25:05 +00001473 "sequence element #%zd to a sequence",
Tim Peters1fc240e2001-10-26 05:06:50 +00001474 i);
1475 goto Fail;
1476 }
1477 n = PySequence_Fast_GET_SIZE(fast);
1478 if (n != 2) {
1479 PyErr_Format(PyExc_ValueError,
Neal Norwitzd3881b02006-05-30 04:25:05 +00001480 "dictionary update sequence element #%zd "
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00001481 "has length %zd; 2 is required",
Martin v. Löwise0e89f72006-02-16 06:59:22 +00001482 i, n);
Tim Peters1fc240e2001-10-26 05:06:50 +00001483 goto Fail;
1484 }
1485
1486 /* Update/merge with this (key, value) pair. */
1487 key = PySequence_Fast_GET_ITEM(fast, 0);
1488 value = PySequence_Fast_GET_ITEM(fast, 1);
1489 if (override || PyDict_GetItem(d, key) == NULL) {
1490 int status = PyDict_SetItem(d, key, value);
1491 if (status < 0)
1492 goto Fail;
1493 }
1494 Py_DECREF(fast);
1495 Py_DECREF(item);
1496 }
1497
1498 i = 0;
1499 goto Return;
1500Fail:
1501 Py_XDECREF(item);
1502 Py_XDECREF(fast);
1503 i = -1;
1504Return:
1505 Py_DECREF(it);
Neal Norwitzd3881b02006-05-30 04:25:05 +00001506 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001507}
1508
Tim Peters6d6c1a32001-08-02 04:15:00 +00001509int
1510PyDict_Update(PyObject *a, PyObject *b)
1511{
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001512 return PyDict_Merge(a, b, 1);
1513}
1514
1515int
1516PyDict_Merge(PyObject *a, PyObject *b, int override)
1517{
Tim Peters6d6c1a32001-08-02 04:15:00 +00001518 register PyDictObject *mp, *other;
Tim Peters9b10f7e2006-05-30 04:16:25 +00001519 register Py_ssize_t i;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001520 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001521
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001522 /* We accept for the argument either a concrete dictionary object,
1523 * or an abstract "mapping" object. For the former, we can do
1524 * things quite efficiently. For the latter, we only require that
1525 * PyMapping_Keys() and PyObject_GetItem() be supported.
1526 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001527 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1528 PyErr_BadInternalCall();
1529 return -1;
1530 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001531 mp = (PyDictObject*)a;
Raymond Hettinger3dbd4c52008-01-25 19:24:46 +00001532 if (PyDict_Check(b)) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001533 other = (PyDictObject*)b;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001534 if (other == mp || other->ma_used == 0)
1535 /* a.update(a) or a.update({}); nothing to do */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001536 return 0;
Raymond Hettinger186e7392005-05-14 18:08:25 +00001537 if (mp->ma_used == 0)
1538 /* Since the target dict is empty, PyDict_GetItem()
1539 * always returns NULL. Setting override to 1
1540 * skips the unnecessary test.
1541 */
1542 override = 1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001543 /* Do one big resize at the start, rather than
1544 * incrementally resizing as we insert new items. Expect
1545 * that there will be no (or few) overlapping keys.
1546 */
1547 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
Raymond Hettingerc8d22902003-05-07 00:49:40 +00001548 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001549 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001550 }
1551 for (i = 0; i <= other->ma_mask; i++) {
1552 entry = &other->ma_table[i];
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001553 if (entry->me_value != NULL &&
1554 (override ||
1555 PyDict_GetItem(a, entry->me_key) == NULL)) {
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001556 Py_INCREF(entry->me_key);
1557 Py_INCREF(entry->me_value);
Armin Rigo35f6d362006-06-01 13:19:12 +00001558 if (insertdict(mp, entry->me_key,
1559 (long)entry->me_hash,
1560 entry->me_value) != 0)
1561 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001562 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001563 }
1564 }
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001565 else {
1566 /* Do it the generic, slower way */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001567 PyObject *keys = PyMapping_Keys(b);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001568 PyObject *iter;
1569 PyObject *key, *value;
1570 int status;
1571
1572 if (keys == NULL)
1573 /* Docstring says this is equivalent to E.keys() so
1574 * if E doesn't have a .keys() method we want
1575 * AttributeError to percolate up. Might as well
1576 * do the same for any other error.
1577 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001578 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001579
1580 iter = PyObject_GetIter(keys);
1581 Py_DECREF(keys);
1582 if (iter == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001583 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001584
1585 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001586 if (!override && PyDict_GetItem(a, key) != NULL) {
1587 Py_DECREF(key);
1588 continue;
1589 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001590 value = PyObject_GetItem(b, key);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001591 if (value == NULL) {
1592 Py_DECREF(iter);
1593 Py_DECREF(key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001594 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001595 }
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001596 status = PyDict_SetItem(a, key, value);
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001597 Py_DECREF(key);
1598 Py_DECREF(value);
1599 if (status < 0) {
1600 Py_DECREF(iter);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001601 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001602 }
1603 }
1604 Py_DECREF(iter);
1605 if (PyErr_Occurred())
1606 /* Iterator completed, via error */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001607 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001608 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001609 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001610}
1611
1612static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001613dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001614{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001615 return PyDict_Copy((PyObject*)mp);
1616}
1617
1618PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001619PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001620{
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001621 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001622
1623 if (o == NULL || !PyDict_Check(o)) {
1624 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001625 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001626 }
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001627 copy = PyDict_New();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001628 if (copy == NULL)
1629 return NULL;
Raymond Hettingerebedb2f2004-03-08 04:19:01 +00001630 if (PyDict_Merge(copy, o, 1) == 0)
1631 return copy;
1632 Py_DECREF(copy);
Raymond Hettinger1356f782005-04-15 15:58:42 +00001633 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001634}
1635
Martin v. Löwis18e16552006-02-15 17:27:45 +00001636Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001637PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001638{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639 if (mp == NULL || !PyDict_Check(mp)) {
1640 PyErr_BadInternalCall();
Jeremy Hylton7083bb72004-02-17 20:10:11 +00001641 return -1;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001642 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001643 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001644}
1645
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001646PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001647PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001648{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649 if (mp == NULL || !PyDict_Check(mp)) {
1650 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001651 return NULL;
1652 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001653 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001654}
1655
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001656PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001657PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001658{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659 if (mp == NULL || !PyDict_Check(mp)) {
1660 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001661 return NULL;
1662 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001663 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001664}
1665
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001666PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001667PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001668{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001669 if (mp == NULL || !PyDict_Check(mp)) {
1670 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +00001671 return NULL;
1672 }
Brett Cannon77ae87c2007-10-10 00:07:50 +00001673 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001674}
1675
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001676/* Subroutine which returns the smallest key in a for which b's value
1677 is different or absent. The value is returned too, through the
Tim Peters95bf9392001-05-10 08:32:44 +00001678 pval argument. Both are NULL if no key in a is found for which b's status
1679 differs. The refcounts on (and only on) non-NULL *pval and function return
1680 values must be decremented by the caller (characterize() increments them
1681 to ensure that mutating comparison and PyDict_GetItem calls can't delete
1682 them before the caller is done looking at them). */
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001683
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001684static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001685characterize(PyDictObject *a, PyDictObject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001686{
Tim Peters95bf9392001-05-10 08:32:44 +00001687 PyObject *akey = NULL; /* smallest key in a s.t. a[akey] != b[akey] */
1688 PyObject *aval = NULL; /* a[akey] */
Tim Peters9b10f7e2006-05-30 04:16:25 +00001689 Py_ssize_t i;
1690 int cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001691
Tim Petersafb6ae82001-06-04 21:00:21 +00001692 for (i = 0; i <= a->ma_mask; i++) {
Tim Peters95bf9392001-05-10 08:32:44 +00001693 PyObject *thiskey, *thisaval, *thisbval;
1694 if (a->ma_table[i].me_value == NULL)
1695 continue;
1696 thiskey = a->ma_table[i].me_key;
1697 Py_INCREF(thiskey); /* keep alive across compares */
1698 if (akey != NULL) {
1699 cmp = PyObject_RichCompareBool(akey, thiskey, Py_LT);
1700 if (cmp < 0) {
1701 Py_DECREF(thiskey);
1702 goto Fail;
1703 }
1704 if (cmp > 0 ||
Tim Petersafb6ae82001-06-04 21:00:21 +00001705 i > a->ma_mask ||
Tim Peters95bf9392001-05-10 08:32:44 +00001706 a->ma_table[i].me_value == NULL)
1707 {
1708 /* Not the *smallest* a key; or maybe it is
1709 * but the compare shrunk the dict so we can't
1710 * find its associated value anymore; or
1711 * maybe it is but the compare deleted the
1712 * a[thiskey] entry.
Neal Norwitzd3881b02006-05-30 04:25:05 +00001713 */
Tim Peters95bf9392001-05-10 08:32:44 +00001714 Py_DECREF(thiskey);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001715 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +00001716 }
Tim Peters95bf9392001-05-10 08:32:44 +00001717 }
1718
1719 /* Compare a[thiskey] to b[thiskey]; cmp <- true iff equal. */
1720 thisaval = a->ma_table[i].me_value;
1721 assert(thisaval);
1722 Py_INCREF(thisaval); /* keep alive */
1723 thisbval = PyDict_GetItem((PyObject *)b, thiskey);
1724 if (thisbval == NULL)
1725 cmp = 0;
1726 else {
1727 /* both dicts have thiskey: same values? */
1728 cmp = PyObject_RichCompareBool(
1729 thisaval, thisbval, Py_EQ);
1730 if (cmp < 0) {
1731 Py_DECREF(thiskey);
1732 Py_DECREF(thisaval);
1733 goto Fail;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001734 }
1735 }
Tim Peters95bf9392001-05-10 08:32:44 +00001736 if (cmp == 0) {
1737 /* New winner. */
1738 Py_XDECREF(akey);
1739 Py_XDECREF(aval);
1740 akey = thiskey;
1741 aval = thisaval;
1742 }
1743 else {
1744 Py_DECREF(thiskey);
1745 Py_DECREF(thisaval);
1746 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001747 }
Tim Peters95bf9392001-05-10 08:32:44 +00001748 *pval = aval;
1749 return akey;
1750
1751Fail:
1752 Py_XDECREF(akey);
1753 Py_XDECREF(aval);
1754 *pval = NULL;
1755 return NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001756}
1757
1758static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001759dict_compare(PyDictObject *a, PyDictObject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001760{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001761 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001762 int res;
1763
1764 /* Compare lengths first */
1765 if (a->ma_used < b->ma_used)
1766 return -1; /* a is shorter */
1767 else if (a->ma_used > b->ma_used)
1768 return 1; /* b is shorter */
Tim Peters95bf9392001-05-10 08:32:44 +00001769
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001770 /* Same length -- check all keys */
Tim Peters95bf9392001-05-10 08:32:44 +00001771 bdiff = bval = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001772 adiff = characterize(a, b, &aval);
Tim Peters95bf9392001-05-10 08:32:44 +00001773 if (adiff == NULL) {
1774 assert(!aval);
Tim Peters3918fb22001-05-10 18:58:31 +00001775 /* Either an error, or a is a subset with the same length so
Tim Peters95bf9392001-05-10 08:32:44 +00001776 * must be equal.
1777 */
1778 res = PyErr_Occurred() ? -1 : 0;
1779 goto Finished;
1780 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001781 bdiff = characterize(b, a, &bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001782 if (bdiff == NULL && PyErr_Occurred()) {
1783 assert(!bval);
1784 res = -1;
1785 goto Finished;
1786 }
1787 res = 0;
1788 if (bdiff) {
1789 /* bdiff == NULL "should be" impossible now, but perhaps
1790 * the last comparison done by the characterize() on a had
1791 * the side effect of making the dicts equal!
1792 */
1793 res = PyObject_Compare(adiff, bdiff);
1794 }
1795 if (res == 0 && bval != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001796 res = PyObject_Compare(aval, bval);
Tim Peters95bf9392001-05-10 08:32:44 +00001797
1798Finished:
1799 Py_XDECREF(adiff);
1800 Py_XDECREF(bdiff);
1801 Py_XDECREF(aval);
1802 Py_XDECREF(bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001803 return res;
1804}
1805
Tim Peterse63415e2001-05-08 04:38:29 +00001806/* Return 1 if dicts equal, 0 if not, -1 if error.
1807 * Gets out as soon as any difference is detected.
1808 * Uses only Py_EQ comparison.
1809 */
1810static int
Brett Cannon77ae87c2007-10-10 00:07:50 +00001811dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001812{
Tim Peters9b10f7e2006-05-30 04:16:25 +00001813 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001814
1815 if (a->ma_used != b->ma_used)
1816 /* can't be equal if # of entries differ */
1817 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001818
Tim Peterse63415e2001-05-08 04:38:29 +00001819 /* Same # of entries -- check all of 'em. Exit early on any diff. */
Tim Petersafb6ae82001-06-04 21:00:21 +00001820 for (i = 0; i <= a->ma_mask; i++) {
Tim Peterse63415e2001-05-08 04:38:29 +00001821 PyObject *aval = a->ma_table[i].me_value;
1822 if (aval != NULL) {
1823 int cmp;
1824 PyObject *bval;
1825 PyObject *key = a->ma_table[i].me_key;
1826 /* temporarily bump aval's refcount to ensure it stays
1827 alive until we're done with it */
1828 Py_INCREF(aval);
Neal Norwitza22975f2006-09-05 02:24:03 +00001829 /* ditto for key */
1830 Py_INCREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001831 bval = PyDict_GetItem((PyObject *)b, key);
Neal Norwitza22975f2006-09-05 02:24:03 +00001832 Py_DECREF(key);
Tim Peterse63415e2001-05-08 04:38:29 +00001833 if (bval == NULL) {
1834 Py_DECREF(aval);
1835 return 0;
1836 }
1837 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1838 Py_DECREF(aval);
1839 if (cmp <= 0) /* error or not equal */
1840 return cmp;
1841 }
1842 }
1843 return 1;
1844 }
1845
1846static PyObject *
1847dict_richcompare(PyObject *v, PyObject *w, int op)
1848{
1849 int cmp;
1850 PyObject *res;
1851
1852 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1853 res = Py_NotImplemented;
1854 }
1855 else if (op == Py_EQ || op == Py_NE) {
Brett Cannon77ae87c2007-10-10 00:07:50 +00001856 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
Tim Peterse63415e2001-05-08 04:38:29 +00001857 if (cmp < 0)
1858 return NULL;
1859 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1860 }
Steven Bethardae42f332008-03-18 17:26:10 +00001861 else {
1862 /* Py3K warning if comparison isn't == or != */
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001863 if (PyErr_WarnPy3k("dict inequality comparisons not supported "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001864 "in 3.x", 1) < 0) {
Steven Bethardae42f332008-03-18 17:26:10 +00001865 return NULL;
1866 }
Tim Peters4fa58bf2001-05-10 21:45:19 +00001867 res = Py_NotImplemented;
Steven Bethardae42f332008-03-18 17:26:10 +00001868 }
Tim Peterse63415e2001-05-08 04:38:29 +00001869 Py_INCREF(res);
1870 return res;
1871 }
1872
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001873static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001874dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001875{
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001876 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001877 PyDictEntry *ep;
Tim Petersd770ebd2006-06-01 15:50:44 +00001878
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001879 if (!PyString_CheckExact(key) ||
1880 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001881 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001882 if (hash == -1)
1883 return NULL;
1884 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001885 ep = (mp->ma_lookup)(mp, key, hash);
1886 if (ep == NULL)
1887 return NULL;
Tim Petersd770ebd2006-06-01 15:50:44 +00001888 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001889}
1890
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001891static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001892dict_has_key(register PyDictObject *mp, PyObject *key)
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +00001893{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001894 if (PyErr_WarnPy3k("dict.has_key() not supported in 3.x; "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001895 "use the in operator", 1) < 0)
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +00001896 return NULL;
1897 return dict_contains(mp, key);
1898}
1899
1900static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001901dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001902{
1903 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001904 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001905 PyObject *val = NULL;
1906 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001907 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001908
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001909 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001910 return NULL;
1911
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001912 if (!PyString_CheckExact(key) ||
1913 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Barry Warsawc38c5da1997-10-06 17:49:20 +00001914 hash = PyObject_Hash(key);
1915 if (hash == -1)
1916 return NULL;
1917 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001918 ep = (mp->ma_lookup)(mp, key, hash);
1919 if (ep == NULL)
1920 return NULL;
1921 val = ep->me_value;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001922 if (val == NULL)
1923 val = failobj;
1924 Py_INCREF(val);
1925 return val;
1926}
1927
1928
1929static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001930dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001931{
1932 PyObject *key;
1933 PyObject *failobj = Py_None;
1934 PyObject *val = NULL;
1935 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001936 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001937
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001938 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
Guido van Rossum164452c2000-08-08 16:12:54 +00001939 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001940
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001941 if (!PyString_CheckExact(key) ||
1942 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum164452c2000-08-08 16:12:54 +00001943 hash = PyObject_Hash(key);
1944 if (hash == -1)
1945 return NULL;
1946 }
Armin Rigo35f6d362006-06-01 13:19:12 +00001947 ep = (mp->ma_lookup)(mp, key, hash);
1948 if (ep == NULL)
1949 return NULL;
1950 val = ep->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001951 if (val == NULL) {
1952 val = failobj;
1953 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1954 val = NULL;
1955 }
1956 Py_XINCREF(val);
1957 return val;
1958}
1959
1960
1961static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001962dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001963{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001964 PyDict_Clear((PyObject *)mp);
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00001965 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001966}
1967
Guido van Rossumba6ab842000-12-12 22:02:18 +00001968static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00001969dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001970{
1971 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00001972 PyDictEntry *ep;
Guido van Rossume027d982002-04-12 15:11:59 +00001973 PyObject *old_value, *old_key;
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001974 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001975
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001976 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1977 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001978 if (mp->ma_used == 0) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001979 if (deflt) {
1980 Py_INCREF(deflt);
1981 return deflt;
1982 }
Guido van Rossume027d982002-04-12 15:11:59 +00001983 PyErr_SetString(PyExc_KeyError,
1984 "pop(): dictionary is empty");
1985 return NULL;
1986 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001987 if (!PyString_CheckExact(key) ||
1988 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossume027d982002-04-12 15:11:59 +00001989 hash = PyObject_Hash(key);
1990 if (hash == -1)
1991 return NULL;
1992 }
1993 ep = (mp->ma_lookup)(mp, key, hash);
Armin Rigo35f6d362006-06-01 13:19:12 +00001994 if (ep == NULL)
1995 return NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001996 if (ep->me_value == NULL) {
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001997 if (deflt) {
1998 Py_INCREF(deflt);
1999 return deflt;
2000 }
Georg Brandlb9f4ad32006-10-29 18:31:42 +00002001 set_key_error(key);
Guido van Rossume027d982002-04-12 15:11:59 +00002002 return NULL;
2003 }
2004 old_key = ep->me_key;
2005 Py_INCREF(dummy);
2006 ep->me_key = dummy;
2007 old_value = ep->me_value;
2008 ep->me_value = NULL;
2009 mp->ma_used--;
2010 Py_DECREF(old_key);
2011 return old_value;
2012}
2013
2014static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002015dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002016{
Tim Peters9b10f7e2006-05-30 04:16:25 +00002017 Py_ssize_t i = 0;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002018 PyDictEntry *ep;
Guido van Rossumba6ab842000-12-12 22:02:18 +00002019 PyObject *res;
2020
Tim Petersf4b33f62001-06-02 05:42:29 +00002021 /* Allocate the result tuple before checking the size. Believe it
2022 * or not, this allocation could trigger a garbage collection which
2023 * could empty the dict, so if we checked the size first and that
2024 * happened, the result would be an infinite loop (searching for an
2025 * entry that no longer exists). Note that the usual popitem()
2026 * idiom is "while d: k, v = d.popitem()". so needing to throw the
Tim Peters9b10f7e2006-05-30 04:16:25 +00002027 * tuple away if the dict *is* empty isn't a significant
Tim Petersf4b33f62001-06-02 05:42:29 +00002028 * inefficiency -- possible, but unlikely in practice.
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002029 */
2030 res = PyTuple_New(2);
2031 if (res == NULL)
2032 return NULL;
Guido van Rossume04eaec2001-04-16 00:02:32 +00002033 if (mp->ma_used == 0) {
2034 Py_DECREF(res);
2035 PyErr_SetString(PyExc_KeyError,
2036 "popitem(): dictionary is empty");
2037 return NULL;
2038 }
Guido van Rossumba6ab842000-12-12 22:02:18 +00002039 /* Set ep to "the first" dict entry with a value. We abuse the hash
2040 * field of slot 0 to hold a search finger:
2041 * If slot 0 has a value, use slot 0.
2042 * Else slot 0 is being used to hold a search finger,
Neal Norwitzd3881b02006-05-30 04:25:05 +00002043 * and we use its hash value as the first index to look.
Guido van Rossumba6ab842000-12-12 22:02:18 +00002044 */
2045 ep = &mp->ma_table[0];
2046 if (ep->me_value == NULL) {
Tim Peters9b10f7e2006-05-30 04:16:25 +00002047 i = ep->me_hash;
Tim Petersdea48ec2001-05-22 20:40:22 +00002048 /* The hash field may be a real hash value, or it may be a
2049 * legit search finger, or it may be a once-legit search
2050 * finger that's out of bounds now because it wrapped around
2051 * or the table shrunk -- simply make sure it's in bounds now.
Guido van Rossumba6ab842000-12-12 22:02:18 +00002052 */
Tim Petersafb6ae82001-06-04 21:00:21 +00002053 if (i > mp->ma_mask || i < 1)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002054 i = 1; /* skip slot 0 */
2055 while ((ep = &mp->ma_table[i])->me_value == NULL) {
2056 i++;
Tim Petersafb6ae82001-06-04 21:00:21 +00002057 if (i > mp->ma_mask)
Guido van Rossumba6ab842000-12-12 22:02:18 +00002058 i = 1;
2059 }
2060 }
Guido van Rossuma4dd0112001-04-15 22:16:26 +00002061 PyTuple_SET_ITEM(res, 0, ep->me_key);
2062 PyTuple_SET_ITEM(res, 1, ep->me_value);
2063 Py_INCREF(dummy);
2064 ep->me_key = dummy;
2065 ep->me_value = NULL;
2066 mp->ma_used--;
2067 assert(mp->ma_table[0].me_value == NULL);
2068 mp->ma_table[0].me_hash = i + 1; /* next place to start */
Guido van Rossumba6ab842000-12-12 22:02:18 +00002069 return res;
2070}
2071
Jeremy Hylton8caad492000-06-23 14:18:11 +00002072static int
2073dict_traverse(PyObject *op, visitproc visit, void *arg)
2074{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002075 Py_ssize_t i = 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00002076 PyObject *pk;
2077 PyObject *pv;
2078
2079 while (PyDict_Next(op, &i, &pk, &pv)) {
Thomas Woutersc6e55062006-04-15 21:47:09 +00002080 Py_VISIT(pk);
2081 Py_VISIT(pv);
Jeremy Hylton8caad492000-06-23 14:18:11 +00002082 }
2083 return 0;
2084}
2085
2086static int
2087dict_tp_clear(PyObject *op)
2088{
2089 PyDict_Clear(op);
2090 return 0;
2091}
2092
Tim Petersf7f88b12000-12-13 23:18:45 +00002093
Raymond Hettinger019a1482004-03-18 02:41:19 +00002094extern PyTypeObject PyDictIterKey_Type; /* Forward */
2095extern PyTypeObject PyDictIterValue_Type; /* Forward */
2096extern PyTypeObject PyDictIterItem_Type; /* Forward */
Brett Cannon77ae87c2007-10-10 00:07:50 +00002097static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002098
2099static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002100dict_iterkeys(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002101{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002102 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002103}
2104
2105static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002106dict_itervalues(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002107{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002108 return dictiter_new(dict, &PyDictIterValue_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002109}
2110
2111static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002112dict_iteritems(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002113{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002114 return dictiter_new(dict, &PyDictIterItem_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002115}
2116
Robert Schuppenies51df0642008-06-01 16:16:17 +00002117static PyObject *
2118dict_sizeof(PyDictObject *mp)
2119{
2120 Py_ssize_t res;
2121
Robert Schuppenies161b9212008-06-26 15:20:35 +00002122 res = sizeof(PyDictObject);
Robert Schuppenies51df0642008-06-01 16:16:17 +00002123 if (mp->ma_table != mp->ma_smalltable)
2124 res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry);
2125 return PyInt_FromSsize_t(res);
2126}
Guido van Rossum09e563a2001-05-01 12:10:21 +00002127
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002128PyDoc_STRVAR(has_key__doc__,
Raymond Hettinger574aa322003-09-01 22:12:08 +00002129"D.has_key(k) -> True if D has a key k, else False");
Tim Petersf7f88b12000-12-13 23:18:45 +00002130
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002131PyDoc_STRVAR(contains__doc__,
2132"D.__contains__(k) -> True if D has a key k, else False");
2133
2134PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
2135
Robert Schuppenies51df0642008-06-01 16:16:17 +00002136PyDoc_STRVAR(sizeof__doc__,
Georg Brandl7a6de8b2008-06-01 16:42:16 +00002137"D.__sizeof__() -> size of D in memory, in bytes");
Robert Schuppenies51df0642008-06-01 16:16:17 +00002138
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002139PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002140"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002141
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002142PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00002143"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 +00002144
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002145PyDoc_STRVAR(pop__doc__,
Andrew M. Kuchlinga4127172008-10-04 21:51:59 +00002146"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002147If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00002148
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002149PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002150"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Andrew M. Kuchlinga4127172008-10-04 21:51:59 +000021512-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002152
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002153PyDoc_STRVAR(keys__doc__,
2154"D.keys() -> list of D's keys");
Tim Petersf7f88b12000-12-13 23:18:45 +00002155
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002156PyDoc_STRVAR(items__doc__,
2157"D.items() -> list of D's (key, value) pairs, as 2-tuples");
Tim Petersf7f88b12000-12-13 23:18:45 +00002158
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002159PyDoc_STRVAR(values__doc__,
2160"D.values() -> list of D's values");
Tim Petersf7f88b12000-12-13 23:18:45 +00002161
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002162PyDoc_STRVAR(update__doc__,
Andrew M. Kuchlinga4127172008-10-04 21:51:59 +00002163"D.update(E, **F) -> None. Update D from dict/iterable E and F.\n"
2164"If E has a .keys() method, does: for k in E: D[k] = E[k]\n\
2165If E lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
2166In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002167
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002168PyDoc_STRVAR(fromkeys__doc__,
2169"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
2170v defaults to None.");
2171
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002172PyDoc_STRVAR(clear__doc__,
2173"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002174
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002175PyDoc_STRVAR(copy__doc__,
2176"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002177
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002178PyDoc_STRVAR(iterkeys__doc__,
2179"D.iterkeys() -> an iterator over the keys of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002180
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002181PyDoc_STRVAR(itervalues__doc__,
2182"D.itervalues() -> an iterator over the values of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002183
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002184PyDoc_STRVAR(iteritems__doc__,
2185"D.iteritems() -> an iterator over the (key, value) items of D");
Guido van Rossum09e563a2001-05-01 12:10:21 +00002186
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002187/* Forward */
2188static PyObject *dictkeys_new(PyObject *);
2189static PyObject *dictitems_new(PyObject *);
2190static PyObject *dictvalues_new(PyObject *);
2191
2192PyDoc_STRVAR(viewkeys__doc__,
2193 "D.viewkeys() -> a set-like object providing a view on D's keys");
2194PyDoc_STRVAR(viewitems__doc__,
2195 "D.viewitems() -> a set-like object providing a view on D's items");
2196PyDoc_STRVAR(viewvalues__doc__,
2197 "D.viewvalues() -> an object providing a view on D's values");
2198
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002199static PyMethodDef mapp_methods[] = {
Neal Norwitzc7926292007-05-23 06:57:35 +00002200 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002201 contains__doc__},
Raymond Hettinger0c669672003-12-13 13:31:55 +00002202 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002203 getitem__doc__},
Robert Schuppenies51df0642008-06-01 16:16:17 +00002204 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2205 sizeof__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002206 {"has_key", (PyCFunction)dict_has_key, METH_O,
Tim Petersf7f88b12000-12-13 23:18:45 +00002207 has_key__doc__},
2208 {"get", (PyCFunction)dict_get, METH_VARARGS,
2209 get__doc__},
2210 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2211 setdefault_doc__},
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00002212 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
Just van Rossuma797d812002-11-23 09:45:04 +00002213 pop__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002214 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002215 popitem__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002216 {"keys", (PyCFunction)dict_keys, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002217 keys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002218 {"items", (PyCFunction)dict_items, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002219 items__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002220 {"values", (PyCFunction)dict_values, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002221 values__doc__},
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002222 {"viewkeys", (PyCFunction)dictkeys_new, METH_NOARGS,
2223 viewkeys__doc__},
2224 {"viewitems", (PyCFunction)dictitems_new, METH_NOARGS,
2225 viewitems__doc__},
2226 {"viewvalues", (PyCFunction)dictvalues_new, METH_NOARGS,
2227 viewvalues__doc__},
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002228 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002229 update__doc__},
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002230 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2231 fromkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002232 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002233 clear__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002234 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
Tim Petersf7f88b12000-12-13 23:18:45 +00002235 copy__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002236 {"iterkeys", (PyCFunction)dict_iterkeys, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002237 iterkeys__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002238 {"itervalues", (PyCFunction)dict_itervalues, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002239 itervalues__doc__},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002240 {"iteritems", (PyCFunction)dict_iteritems, METH_NOARGS,
Guido van Rossum09e563a2001-05-01 12:10:21 +00002241 iteritems__doc__},
Tim Petersf7f88b12000-12-13 23:18:45 +00002242 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002243};
2244
Tim Petersd770ebd2006-06-01 15:50:44 +00002245/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002246int
2247PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002248{
2249 long hash;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002250 PyDictObject *mp = (PyDictObject *)op;
2251 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002252
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002253 if (!PyString_CheckExact(key) ||
2254 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002255 hash = PyObject_Hash(key);
2256 if (hash == -1)
2257 return -1;
2258 }
Armin Rigo35f6d362006-06-01 13:19:12 +00002259 ep = (mp->ma_lookup)(mp, key, hash);
Tim Petersd770ebd2006-06-01 15:50:44 +00002260 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002261}
2262
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00002263/* Internal version of PyDict_Contains used when the hash value is already known */
2264int
2265_PyDict_Contains(PyObject *op, PyObject *key, long hash)
2266{
Brett Cannon77ae87c2007-10-10 00:07:50 +00002267 PyDictObject *mp = (PyDictObject *)op;
2268 PyDictEntry *ep;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00002269
2270 ep = (mp->ma_lookup)(mp, key, hash);
2271 return ep == NULL ? -1 : (ep->me_value != NULL);
2272}
2273
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002274/* Hack to implement "key in dict" */
2275static PySequenceMethods dict_as_sequence = {
Georg Brandl347b3002006-03-30 11:57:00 +00002276 0, /* sq_length */
2277 0, /* sq_concat */
2278 0, /* sq_repeat */
2279 0, /* sq_item */
2280 0, /* sq_slice */
2281 0, /* sq_ass_item */
2282 0, /* sq_ass_slice */
2283 PyDict_Contains, /* sq_contains */
2284 0, /* sq_inplace_concat */
2285 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002286};
2287
Guido van Rossum09e563a2001-05-01 12:10:21 +00002288static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002289dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2290{
2291 PyObject *self;
2292
2293 assert(type != NULL && type->tp_alloc != NULL);
2294 self = type->tp_alloc(type, 0);
2295 if (self != NULL) {
2296 PyDictObject *d = (PyDictObject *)self;
2297 /* It's guaranteed that tp->alloc zeroed out the struct. */
2298 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2299 INIT_NONZERO_DICT_SLOTS(d);
2300 d->ma_lookup = lookdict_string;
Antoine Pitrouf8387af2009-03-23 18:41:45 +00002301 /* The object has been implicitely tracked by tp_alloc */
2302 if (type == &PyDict_Type)
2303 _PyObject_GC_UNTRACK(d);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002304#ifdef SHOW_CONVERSION_COUNTS
2305 ++created;
2306#endif
Antoine Pitrouf8387af2009-03-23 18:41:45 +00002307#ifdef SHOW_TRACK_COUNT
2308 if (_PyObject_GC_IS_TRACKED(d))
2309 count_tracked++;
2310 else
2311 count_untracked++;
2312#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002313 }
2314 return self;
2315}
2316
Tim Peters25786c02001-09-02 08:22:48 +00002317static int
2318dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2319{
Raymond Hettinger31017ae2004-03-04 08:25:44 +00002320 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002321}
2322
Tim Peters6d6c1a32001-08-02 04:15:00 +00002323static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002324dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002325{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002326 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002327}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002328
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002329PyDoc_STRVAR(dictionary_doc,
Tim Petersa427a2b2001-10-29 22:25:45 +00002330"dict() -> new empty dictionary.\n"
2331"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Tim Peters1fc240e2001-10-26 05:06:50 +00002332" (key, value) pairs.\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002333"dict(seq) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002334" d = {}\n"
2335" for k, v in seq:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002336" d[k] = v\n"
2337"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2338" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002339
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002340PyTypeObject PyDict_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002341 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Petersa427a2b2001-10-29 22:25:45 +00002342 "dict",
Brett Cannon77ae87c2007-10-10 00:07:50 +00002343 sizeof(PyDictObject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002344 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00002345 (destructor)dict_dealloc, /* tp_dealloc */
2346 (printfunc)dict_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002347 0, /* tp_getattr */
Guido van Rossumb9324202001-01-18 00:39:02 +00002348 0, /* tp_setattr */
Tim Peters4fa58bf2001-05-10 21:45:19 +00002349 (cmpfunc)dict_compare, /* tp_compare */
Guido van Rossumb9324202001-01-18 00:39:02 +00002350 (reprfunc)dict_repr, /* tp_repr */
2351 0, /* tp_as_number */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002352 &dict_as_sequence, /* tp_as_sequence */
Guido van Rossumb9324202001-01-18 00:39:02 +00002353 &dict_as_mapping, /* tp_as_mapping */
Nick Coghlan53663a62008-07-15 14:27:37 +00002354 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
Guido van Rossumb9324202001-01-18 00:39:02 +00002355 0, /* tp_call */
2356 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002357 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumb9324202001-01-18 00:39:02 +00002358 0, /* tp_setattro */
2359 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +00002360 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00002361 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
Tim Peters25786c02001-09-02 08:22:48 +00002362 dictionary_doc, /* tp_doc */
Georg Brandl347b3002006-03-30 11:57:00 +00002363 dict_traverse, /* tp_traverse */
2364 dict_tp_clear, /* tp_clear */
Tim Peterse63415e2001-05-08 04:38:29 +00002365 dict_richcompare, /* tp_richcompare */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002366 0, /* tp_weaklistoffset */
Guido van Rossum09e563a2001-05-01 12:10:21 +00002367 (getiterfunc)dict_iter, /* tp_iter */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002368 0, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002369 mapp_methods, /* tp_methods */
2370 0, /* tp_members */
2371 0, /* tp_getset */
2372 0, /* tp_base */
2373 0, /* tp_dict */
2374 0, /* tp_descr_get */
2375 0, /* tp_descr_set */
2376 0, /* tp_dictoffset */
Georg Brandl347b3002006-03-30 11:57:00 +00002377 dict_init, /* tp_init */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002378 PyType_GenericAlloc, /* tp_alloc */
2379 dict_new, /* tp_new */
Neil Schemenauer6189b892002-04-12 02:43:00 +00002380 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002381};
2382
Guido van Rossum3cca2451997-05-16 14:23:33 +00002383/* For backward compatibility with old dictionary interface */
2384
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002385PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002386PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002387{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002388 PyObject *kv, *rv;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002389 kv = PyString_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002390 if (kv == NULL)
2391 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002392 rv = PyDict_GetItem(v, kv);
2393 Py_DECREF(kv);
2394 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002395}
2396
2397int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002398PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002399{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002400 PyObject *kv;
2401 int err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002402 kv = PyString_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002403 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002404 return -1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002405 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00002406 err = PyDict_SetItem(v, kv, item);
2407 Py_DECREF(kv);
2408 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002409}
2410
2411int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002412PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002413{
Guido van Rossum3cca2451997-05-16 14:23:33 +00002414 PyObject *kv;
2415 int err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002416 kv = PyString_FromString(key);
Guido van Rossum3cca2451997-05-16 14:23:33 +00002417 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00002418 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00002419 err = PyDict_DelItem(v, kv);
2420 Py_DECREF(kv);
2421 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002422}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002423
Raymond Hettinger019a1482004-03-18 02:41:19 +00002424/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002425
2426typedef struct {
2427 PyObject_HEAD
Brett Cannon77ae87c2007-10-10 00:07:50 +00002428 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002429 Py_ssize_t di_used;
2430 Py_ssize_t di_pos;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002431 PyObject* di_result; /* reusable result tuple for iteritems */
Tim Peters9b10f7e2006-05-30 04:16:25 +00002432 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002433} dictiterobject;
2434
2435static PyObject *
Brett Cannon77ae87c2007-10-10 00:07:50 +00002436dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002437{
2438 dictiterobject *di;
Antoine Pitrouaa687902009-01-01 14:11:22 +00002439 di = PyObject_GC_New(dictiterobject, itertype);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002440 if (di == NULL)
2441 return NULL;
2442 Py_INCREF(dict);
2443 di->di_dict = dict;
Guido van Rossumb1f35bf2001-05-02 15:13:44 +00002444 di->di_used = dict->ma_used;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002445 di->di_pos = 0;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002446 di->len = dict->ma_used;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002447 if (itertype == &PyDictIterItem_Type) {
2448 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2449 if (di->di_result == NULL) {
2450 Py_DECREF(di);
2451 return NULL;
2452 }
2453 }
2454 else
2455 di->di_result = NULL;
Antoine Pitrouaa687902009-01-01 14:11:22 +00002456 _PyObject_GC_TRACK(di);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002457 return (PyObject *)di;
2458}
2459
2460static void
2461dictiter_dealloc(dictiterobject *di)
2462{
Guido van Rossum2147df72002-07-16 20:30:22 +00002463 Py_XDECREF(di->di_dict);
Raymond Hettinger019a1482004-03-18 02:41:19 +00002464 Py_XDECREF(di->di_result);
Antoine Pitrouaa687902009-01-01 14:11:22 +00002465 PyObject_GC_Del(di);
2466}
2467
2468static int
2469dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2470{
2471 Py_VISIT(di->di_dict);
2472 Py_VISIT(di->di_result);
2473 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002474}
2475
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002476static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002477dictiter_len(dictiterobject *di)
2478{
Tim Peters9b10f7e2006-05-30 04:16:25 +00002479 Py_ssize_t len = 0;
Raymond Hettinger7892b1c2004-04-12 18:10:01 +00002480 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002481 len = di->len;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002482 return PyInt_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002483}
2484
Armin Rigof5b3e362006-02-11 21:32:43 +00002485PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002486
2487static PyMethodDef dictiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +00002488 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002489 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002490};
2491
Raymond Hettinger019a1482004-03-18 02:41:19 +00002492static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002493{
Raymond Hettinger019a1482004-03-18 02:41:19 +00002494 PyObject *key;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002495 register Py_ssize_t i, mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002496 register PyDictEntry *ep;
2497 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002498
Raymond Hettinger019a1482004-03-18 02:41:19 +00002499 if (d == NULL)
Guido van Rossum2147df72002-07-16 20:30:22 +00002500 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002501 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002502
Raymond Hettinger019a1482004-03-18 02:41:19 +00002503 if (di->di_used != d->ma_used) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00002504 PyErr_SetString(PyExc_RuntimeError,
2505 "dictionary changed size during iteration");
Guido van Rossum2147df72002-07-16 20:30:22 +00002506 di->di_used = -1; /* Make this state sticky */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002507 return NULL;
2508 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002509
Raymond Hettinger019a1482004-03-18 02:41:19 +00002510 i = di->di_pos;
2511 if (i < 0)
2512 goto fail;
2513 ep = d->ma_table;
2514 mask = d->ma_mask;
2515 while (i <= mask && ep[i].me_value == NULL)
2516 i++;
2517 di->di_pos = i+1;
2518 if (i > mask)
2519 goto fail;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002520 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002521 key = ep[i].me_key;
2522 Py_INCREF(key);
2523 return key;
2524
2525fail:
2526 Py_DECREF(d);
Guido van Rossum2147df72002-07-16 20:30:22 +00002527 di->di_dict = NULL;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002528 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002529}
2530
Raymond Hettinger019a1482004-03-18 02:41:19 +00002531PyTypeObject PyDictIterKey_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002532 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002533 "dictionary-keyiterator", /* tp_name */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002534 sizeof(dictiterobject), /* tp_basicsize */
2535 0, /* tp_itemsize */
2536 /* methods */
2537 (destructor)dictiter_dealloc, /* tp_dealloc */
2538 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002539 0, /* tp_getattr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002540 0, /* tp_setattr */
2541 0, /* tp_compare */
2542 0, /* tp_repr */
2543 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002544 0, /* tp_as_sequence */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002545 0, /* tp_as_mapping */
2546 0, /* tp_hash */
2547 0, /* tp_call */
2548 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002549 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002550 0, /* tp_setattro */
2551 0, /* tp_as_buffer */
Antoine Pitrouaa687902009-01-01 14:11:22 +00002552 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002553 0, /* tp_doc */
Antoine Pitrouaa687902009-01-01 14:11:22 +00002554 (traverseproc)dictiter_traverse, /* tp_traverse */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002555 0, /* tp_clear */
2556 0, /* tp_richcompare */
2557 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002558 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002559 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002560 dictiter_methods, /* tp_methods */
2561 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002562};
2563
2564static PyObject *dictiter_iternextvalue(dictiterobject *di)
2565{
2566 PyObject *value;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002567 register Py_ssize_t i, mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002568 register PyDictEntry *ep;
2569 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002570
2571 if (d == NULL)
2572 return NULL;
2573 assert (PyDict_Check(d));
2574
2575 if (di->di_used != d->ma_used) {
2576 PyErr_SetString(PyExc_RuntimeError,
2577 "dictionary changed size during iteration");
2578 di->di_used = -1; /* Make this state sticky */
2579 return NULL;
2580 }
2581
2582 i = di->di_pos;
Guido van Rossum09240f62004-03-20 19:11:58 +00002583 mask = d->ma_mask;
2584 if (i < 0 || i > mask)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002585 goto fail;
2586 ep = d->ma_table;
Guido van Rossum09240f62004-03-20 19:11:58 +00002587 while ((value=ep[i].me_value) == NULL) {
Raymond Hettinger019a1482004-03-18 02:41:19 +00002588 i++;
Guido van Rossum09240f62004-03-20 19:11:58 +00002589 if (i > mask)
2590 goto fail;
2591 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002592 di->di_pos = i+1;
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002593 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002594 Py_INCREF(value);
2595 return value;
2596
2597fail:
2598 Py_DECREF(d);
2599 di->di_dict = NULL;
2600 return NULL;
2601}
2602
2603PyTypeObject PyDictIterValue_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002604 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002605 "dictionary-valueiterator", /* tp_name */
2606 sizeof(dictiterobject), /* tp_basicsize */
2607 0, /* tp_itemsize */
2608 /* methods */
2609 (destructor)dictiter_dealloc, /* tp_dealloc */
2610 0, /* tp_print */
2611 0, /* tp_getattr */
2612 0, /* tp_setattr */
2613 0, /* tp_compare */
2614 0, /* tp_repr */
2615 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002616 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002617 0, /* tp_as_mapping */
2618 0, /* tp_hash */
2619 0, /* tp_call */
2620 0, /* tp_str */
2621 PyObject_GenericGetAttr, /* tp_getattro */
2622 0, /* tp_setattro */
2623 0, /* tp_as_buffer */
Antoine Pitrouaa687902009-01-01 14:11:22 +00002624 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002625 0, /* tp_doc */
Antoine Pitrouaa687902009-01-01 14:11:22 +00002626 (traverseproc)dictiter_traverse, /* tp_traverse */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002627 0, /* tp_clear */
2628 0, /* tp_richcompare */
2629 0, /* tp_weaklistoffset */
2630 PyObject_SelfIter, /* tp_iter */
2631 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002632 dictiter_methods, /* tp_methods */
2633 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002634};
2635
2636static PyObject *dictiter_iternextitem(dictiterobject *di)
2637{
2638 PyObject *key, *value, *result = di->di_result;
Tim Peters9b10f7e2006-05-30 04:16:25 +00002639 register Py_ssize_t i, mask;
Brett Cannon77ae87c2007-10-10 00:07:50 +00002640 register PyDictEntry *ep;
2641 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002642
2643 if (d == NULL)
2644 return NULL;
2645 assert (PyDict_Check(d));
2646
2647 if (di->di_used != d->ma_used) {
2648 PyErr_SetString(PyExc_RuntimeError,
2649 "dictionary changed size during iteration");
2650 di->di_used = -1; /* Make this state sticky */
2651 return NULL;
2652 }
2653
2654 i = di->di_pos;
2655 if (i < 0)
2656 goto fail;
2657 ep = d->ma_table;
2658 mask = d->ma_mask;
2659 while (i <= mask && ep[i].me_value == NULL)
2660 i++;
2661 di->di_pos = i+1;
2662 if (i > mask)
2663 goto fail;
2664
2665 if (result->ob_refcnt == 1) {
2666 Py_INCREF(result);
2667 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2668 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2669 } else {
2670 result = PyTuple_New(2);
Tim Peters60b29962006-01-01 01:19:23 +00002671 if (result == NULL)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002672 return NULL;
2673 }
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002674 di->len--;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002675 key = ep[i].me_key;
2676 value = ep[i].me_value;
2677 Py_INCREF(key);
2678 Py_INCREF(value);
2679 PyTuple_SET_ITEM(result, 0, key);
2680 PyTuple_SET_ITEM(result, 1, value);
2681 return result;
2682
2683fail:
2684 Py_DECREF(d);
2685 di->di_dict = NULL;
2686 return NULL;
2687}
2688
2689PyTypeObject PyDictIterItem_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002690 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger019a1482004-03-18 02:41:19 +00002691 "dictionary-itemiterator", /* tp_name */
2692 sizeof(dictiterobject), /* tp_basicsize */
2693 0, /* tp_itemsize */
2694 /* methods */
2695 (destructor)dictiter_dealloc, /* tp_dealloc */
2696 0, /* tp_print */
2697 0, /* tp_getattr */
2698 0, /* tp_setattr */
2699 0, /* tp_compare */
2700 0, /* tp_repr */
2701 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002702 0, /* tp_as_sequence */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002703 0, /* tp_as_mapping */
2704 0, /* tp_hash */
2705 0, /* tp_call */
2706 0, /* tp_str */
2707 PyObject_GenericGetAttr, /* tp_getattro */
2708 0, /* tp_setattro */
2709 0, /* tp_as_buffer */
Antoine Pitrouaa687902009-01-01 14:11:22 +00002710 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002711 0, /* tp_doc */
Antoine Pitrouaa687902009-01-01 14:11:22 +00002712 (traverseproc)dictiter_traverse, /* tp_traverse */
Raymond Hettinger019a1482004-03-18 02:41:19 +00002713 0, /* tp_clear */
2714 0, /* tp_richcompare */
2715 0, /* tp_weaklistoffset */
2716 PyObject_SelfIter, /* tp_iter */
2717 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002718 dictiter_methods, /* tp_methods */
2719 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002720};
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002721
2722/***********************************************/
2723/* View objects for keys(), items(), values(). */
2724/***********************************************/
2725
2726/* The instance lay-out is the same for all three; but the type differs. */
2727
2728typedef struct {
2729 PyObject_HEAD
2730 PyDictObject *dv_dict;
2731} dictviewobject;
2732
2733
2734static void
2735dictview_dealloc(dictviewobject *dv)
2736{
2737 Py_XDECREF(dv->dv_dict);
2738 PyObject_GC_Del(dv);
2739}
2740
2741static int
2742dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
2743{
2744 Py_VISIT(dv->dv_dict);
2745 return 0;
2746}
2747
2748static Py_ssize_t
2749dictview_len(dictviewobject *dv)
2750{
2751 Py_ssize_t len = 0;
2752 if (dv->dv_dict != NULL)
2753 len = dv->dv_dict->ma_used;
2754 return len;
2755}
2756
2757static PyObject *
2758dictview_new(PyObject *dict, PyTypeObject *type)
2759{
2760 dictviewobject *dv;
2761 if (dict == NULL) {
2762 PyErr_BadInternalCall();
2763 return NULL;
2764 }
2765 if (!PyDict_Check(dict)) {
2766 /* XXX Get rid of this restriction later */
2767 PyErr_Format(PyExc_TypeError,
2768 "%s() requires a dict argument, not '%s'",
2769 type->tp_name, dict->ob_type->tp_name);
2770 return NULL;
2771 }
2772 dv = PyObject_GC_New(dictviewobject, type);
2773 if (dv == NULL)
2774 return NULL;
2775 Py_INCREF(dict);
2776 dv->dv_dict = (PyDictObject *)dict;
2777 _PyObject_GC_TRACK(dv);
2778 return (PyObject *)dv;
2779}
2780
2781/* TODO(guido): The views objects are not complete:
2782
2783 * support more set operations
2784 * support arbitrary mappings?
2785 - either these should be static or exported in dictobject.h
2786 - if public then they should probably be in builtins
2787*/
2788
2789/* Return 1 if self is a subset of other, iterating over self;
2790 0 if not; -1 if an error occurred. */
2791static int
2792all_contained_in(PyObject *self, PyObject *other)
2793{
2794 PyObject *iter = PyObject_GetIter(self);
2795 int ok = 1;
2796
2797 if (iter == NULL)
2798 return -1;
2799 for (;;) {
2800 PyObject *next = PyIter_Next(iter);
2801 if (next == NULL) {
2802 if (PyErr_Occurred())
2803 ok = -1;
2804 break;
2805 }
2806 ok = PySequence_Contains(other, next);
2807 Py_DECREF(next);
2808 if (ok <= 0)
2809 break;
2810 }
2811 Py_DECREF(iter);
2812 return ok;
2813}
2814
2815static PyObject *
2816dictview_richcompare(PyObject *self, PyObject *other, int op)
2817{
2818 Py_ssize_t len_self, len_other;
2819 int ok;
2820 PyObject *result;
2821
2822 assert(self != NULL);
2823 assert(PyDictViewSet_Check(self));
2824 assert(other != NULL);
2825
2826 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other)) {
2827 Py_INCREF(Py_NotImplemented);
2828 return Py_NotImplemented;
2829 }
2830
2831 len_self = PyObject_Size(self);
2832 if (len_self < 0)
2833 return NULL;
2834 len_other = PyObject_Size(other);
2835 if (len_other < 0)
2836 return NULL;
2837
2838 ok = 0;
2839 switch(op) {
2840
2841 case Py_NE:
2842 case Py_EQ:
2843 if (len_self == len_other)
2844 ok = all_contained_in(self, other);
2845 if (op == Py_NE && ok >= 0)
2846 ok = !ok;
2847 break;
2848
2849 case Py_LT:
2850 if (len_self < len_other)
2851 ok = all_contained_in(self, other);
2852 break;
2853
2854 case Py_LE:
2855 if (len_self <= len_other)
2856 ok = all_contained_in(self, other);
2857 break;
2858
2859 case Py_GT:
2860 if (len_self > len_other)
2861 ok = all_contained_in(other, self);
2862 break;
2863
2864 case Py_GE:
2865 if (len_self >= len_other)
2866 ok = all_contained_in(other, self);
2867 break;
2868
2869 }
2870 if (ok < 0)
2871 return NULL;
2872 result = ok ? Py_True : Py_False;
2873 Py_INCREF(result);
2874 return result;
2875}
2876
2877static PyObject *
2878dictview_repr(dictviewobject *dv)
2879{
2880 PyObject *seq;
2881 PyObject *seq_str;
2882 PyObject *result;
2883
2884 seq = PySequence_List((PyObject *)dv);
2885 if (seq == NULL)
2886 return NULL;
2887
2888 seq_str = PyObject_Repr(seq);
Alexandre Vassalotti58a96ef2010-01-12 01:34:43 +00002889 result = PyString_FromFormat("%s(%s)", Py_TYPE(dv)->tp_name,
2890 PyString_AS_STRING(seq_str));
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00002891 Py_DECREF(seq_str);
2892 Py_DECREF(seq);
2893 return result;
2894}
2895
2896/*** dict_keys ***/
2897
2898static PyObject *
2899dictkeys_iter(dictviewobject *dv)
2900{
2901 if (dv->dv_dict == NULL) {
2902 Py_RETURN_NONE;
2903 }
2904 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
2905}
2906
2907static int
2908dictkeys_contains(dictviewobject *dv, PyObject *obj)
2909{
2910 if (dv->dv_dict == NULL)
2911 return 0;
2912 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
2913}
2914
2915static PySequenceMethods dictkeys_as_sequence = {
2916 (lenfunc)dictview_len, /* sq_length */
2917 0, /* sq_concat */
2918 0, /* sq_repeat */
2919 0, /* sq_item */
2920 0, /* sq_slice */
2921 0, /* sq_ass_item */
2922 0, /* sq_ass_slice */
2923 (objobjproc)dictkeys_contains, /* sq_contains */
2924};
2925
2926static PyObject*
2927dictviews_sub(PyObject* self, PyObject *other)
2928{
2929 PyObject *result = PySet_New(self);
2930 PyObject *tmp;
2931 if (result == NULL)
2932 return NULL;
2933
2934 tmp = PyObject_CallMethod(result, "difference_update", "O", other);
2935 if (tmp == NULL) {
2936 Py_DECREF(result);
2937 return NULL;
2938 }
2939
2940 Py_DECREF(tmp);
2941 return result;
2942}
2943
2944static PyObject*
2945dictviews_and(PyObject* self, PyObject *other)
2946{
2947 PyObject *result = PySet_New(self);
2948 PyObject *tmp;
2949 if (result == NULL)
2950 return NULL;
2951
2952 tmp = PyObject_CallMethod(result, "intersection_update", "O", other);
2953 if (tmp == NULL) {
2954 Py_DECREF(result);
2955 return NULL;
2956 }
2957
2958 Py_DECREF(tmp);
2959 return result;
2960}
2961
2962static PyObject*
2963dictviews_or(PyObject* self, PyObject *other)
2964{
2965 PyObject *result = PySet_New(self);
2966 PyObject *tmp;
2967 if (result == NULL)
2968 return NULL;
2969
2970 tmp = PyObject_CallMethod(result, "update", "O", other);
2971 if (tmp == NULL) {
2972 Py_DECREF(result);
2973 return NULL;
2974 }
2975
2976 Py_DECREF(tmp);
2977 return result;
2978}
2979
2980static PyObject*
2981dictviews_xor(PyObject* self, PyObject *other)
2982{
2983 PyObject *result = PySet_New(self);
2984 PyObject *tmp;
2985 if (result == NULL)
2986 return NULL;
2987
2988 tmp = PyObject_CallMethod(result, "symmetric_difference_update", "O",
2989 other);
2990 if (tmp == NULL) {
2991 Py_DECREF(result);
2992 return NULL;
2993 }
2994
2995 Py_DECREF(tmp);
2996 return result;
2997}
2998
2999static PyNumberMethods dictviews_as_number = {
3000 0, /*nb_add*/
3001 (binaryfunc)dictviews_sub, /*nb_subtract*/
3002 0, /*nb_multiply*/
3003 0, /*nb_remainder*/
3004 0, /*nb_divmod*/
3005 0, /*nb_power*/
3006 0, /*nb_negative*/
3007 0, /*nb_positive*/
3008 0, /*nb_absolute*/
3009 0, /*nb_bool*/
3010 0, /*nb_invert*/
3011 0, /*nb_lshift*/
3012 0, /*nb_rshift*/
3013 (binaryfunc)dictviews_and, /*nb_and*/
3014 (binaryfunc)dictviews_xor, /*nb_xor*/
3015 (binaryfunc)dictviews_or, /*nb_or*/
3016};
3017
3018static PyMethodDef dictkeys_methods[] = {
3019 {NULL, NULL} /* sentinel */
3020};
3021
3022PyTypeObject PyDictKeys_Type = {
3023 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3024 "dict_keys", /* tp_name */
3025 sizeof(dictviewobject), /* tp_basicsize */
3026 0, /* tp_itemsize */
3027 /* methods */
3028 (destructor)dictview_dealloc, /* tp_dealloc */
3029 0, /* tp_print */
3030 0, /* tp_getattr */
3031 0, /* tp_setattr */
3032 0, /* tp_reserved */
3033 (reprfunc)dictview_repr, /* tp_repr */
3034 &dictviews_as_number, /* tp_as_number */
3035 &dictkeys_as_sequence, /* tp_as_sequence */
3036 0, /* tp_as_mapping */
3037 0, /* tp_hash */
3038 0, /* tp_call */
3039 0, /* tp_str */
3040 PyObject_GenericGetAttr, /* tp_getattro */
3041 0, /* tp_setattro */
3042 0, /* tp_as_buffer */
3043 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3044 0, /* tp_doc */
3045 (traverseproc)dictview_traverse, /* tp_traverse */
3046 0, /* tp_clear */
3047 dictview_richcompare, /* tp_richcompare */
3048 0, /* tp_weaklistoffset */
3049 (getiterfunc)dictkeys_iter, /* tp_iter */
3050 0, /* tp_iternext */
3051 dictkeys_methods, /* tp_methods */
3052 0,
3053};
3054
3055static PyObject *
3056dictkeys_new(PyObject *dict)
3057{
3058 return dictview_new(dict, &PyDictKeys_Type);
3059}
3060
3061/*** dict_items ***/
3062
3063static PyObject *
3064dictitems_iter(dictviewobject *dv)
3065{
3066 if (dv->dv_dict == NULL) {
3067 Py_RETURN_NONE;
3068 }
3069 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
3070}
3071
3072static int
3073dictitems_contains(dictviewobject *dv, PyObject *obj)
3074{
3075 PyObject *key, *value, *found;
3076 if (dv->dv_dict == NULL)
3077 return 0;
3078 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3079 return 0;
3080 key = PyTuple_GET_ITEM(obj, 0);
3081 value = PyTuple_GET_ITEM(obj, 1);
3082 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3083 if (found == NULL) {
3084 if (PyErr_Occurred())
3085 return -1;
3086 return 0;
3087 }
3088 return PyObject_RichCompareBool(value, found, Py_EQ);
3089}
3090
3091static PySequenceMethods dictitems_as_sequence = {
3092 (lenfunc)dictview_len, /* sq_length */
3093 0, /* sq_concat */
3094 0, /* sq_repeat */
3095 0, /* sq_item */
3096 0, /* sq_slice */
3097 0, /* sq_ass_item */
3098 0, /* sq_ass_slice */
3099 (objobjproc)dictitems_contains, /* sq_contains */
3100};
3101
3102static PyMethodDef dictitems_methods[] = {
3103 {NULL, NULL} /* sentinel */
3104};
3105
3106PyTypeObject PyDictItems_Type = {
3107 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3108 "dict_items", /* tp_name */
3109 sizeof(dictviewobject), /* tp_basicsize */
3110 0, /* tp_itemsize */
3111 /* methods */
3112 (destructor)dictview_dealloc, /* tp_dealloc */
3113 0, /* tp_print */
3114 0, /* tp_getattr */
3115 0, /* tp_setattr */
3116 0, /* tp_reserved */
3117 (reprfunc)dictview_repr, /* tp_repr */
3118 &dictviews_as_number, /* tp_as_number */
3119 &dictitems_as_sequence, /* tp_as_sequence */
3120 0, /* tp_as_mapping */
3121 0, /* tp_hash */
3122 0, /* tp_call */
3123 0, /* tp_str */
3124 PyObject_GenericGetAttr, /* tp_getattro */
3125 0, /* tp_setattro */
3126 0, /* tp_as_buffer */
3127 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3128 0, /* tp_doc */
3129 (traverseproc)dictview_traverse, /* tp_traverse */
3130 0, /* tp_clear */
3131 dictview_richcompare, /* tp_richcompare */
3132 0, /* tp_weaklistoffset */
3133 (getiterfunc)dictitems_iter, /* tp_iter */
3134 0, /* tp_iternext */
3135 dictitems_methods, /* tp_methods */
3136 0,
3137};
3138
3139static PyObject *
3140dictitems_new(PyObject *dict)
3141{
3142 return dictview_new(dict, &PyDictItems_Type);
3143}
3144
3145/*** dict_values ***/
3146
3147static PyObject *
3148dictvalues_iter(dictviewobject *dv)
3149{
3150 if (dv->dv_dict == NULL) {
3151 Py_RETURN_NONE;
3152 }
3153 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
3154}
3155
3156static PySequenceMethods dictvalues_as_sequence = {
3157 (lenfunc)dictview_len, /* sq_length */
3158 0, /* sq_concat */
3159 0, /* sq_repeat */
3160 0, /* sq_item */
3161 0, /* sq_slice */
3162 0, /* sq_ass_item */
3163 0, /* sq_ass_slice */
3164 (objobjproc)0, /* sq_contains */
3165};
3166
3167static PyMethodDef dictvalues_methods[] = {
3168 {NULL, NULL} /* sentinel */
3169};
3170
3171PyTypeObject PyDictValues_Type = {
3172 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3173 "dict_values", /* tp_name */
3174 sizeof(dictviewobject), /* tp_basicsize */
3175 0, /* tp_itemsize */
3176 /* methods */
3177 (destructor)dictview_dealloc, /* tp_dealloc */
3178 0, /* tp_print */
3179 0, /* tp_getattr */
3180 0, /* tp_setattr */
3181 0, /* tp_reserved */
3182 (reprfunc)dictview_repr, /* tp_repr */
3183 0, /* tp_as_number */
3184 &dictvalues_as_sequence, /* tp_as_sequence */
3185 0, /* tp_as_mapping */
3186 0, /* tp_hash */
3187 0, /* tp_call */
3188 0, /* tp_str */
3189 PyObject_GenericGetAttr, /* tp_getattro */
3190 0, /* tp_setattro */
3191 0, /* tp_as_buffer */
3192 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3193 0, /* tp_doc */
3194 (traverseproc)dictview_traverse, /* tp_traverse */
3195 0, /* tp_clear */
3196 0, /* tp_richcompare */
3197 0, /* tp_weaklistoffset */
3198 (getiterfunc)dictvalues_iter, /* tp_iter */
3199 0, /* tp_iternext */
3200 dictvalues_methods, /* tp_methods */
3201 0,
3202};
3203
3204static PyObject *
3205dictvalues_new(PyObject *dict)
3206{
3207 return dictview_new(dict, &PyDictValues_Type);
3208}