blob: 3db7a5e6d9e41771e6d9237a5f00753cc8084008 [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"
Christian Heimes0ded5b52007-12-10 15:50:56 +000011#include "stringlib/eq.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000012
Guido van Rossum16e93a81997-01-28 00:00:11 +000013
Thomas Wouters89f507f2006-12-13 04:49:30 +000014/* Set a key error with the specified argument, wrapping it in a
15 * tuple automatically so that tuple keys are not unpacked as the
16 * exception arguments. */
17static void
18set_key_error(PyObject *arg)
19{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 PyObject *tup;
21 tup = PyTuple_Pack(1, arg);
22 if (!tup)
23 return; /* caller will expect error to be set anyway */
24 PyErr_SetObject(PyExc_KeyError, tup);
25 Py_DECREF(tup);
Thomas Wouters89f507f2006-12-13 04:49:30 +000026}
27
Tim Peterseb28ef22001-06-02 05:27:19 +000028/* Define this out if you don't want conversion statistics on exit. */
Fred Drake1bff34a2000-08-31 19:31:38 +000029#undef SHOW_CONVERSION_COUNTS
30
Tim Peterseb28ef22001-06-02 05:27:19 +000031/* See large comment block below. This must be >= 1. */
32#define PERTURB_SHIFT 5
33
Guido van Rossum16e93a81997-01-28 00:00:11 +000034/*
Tim Peterseb28ef22001-06-02 05:27:19 +000035Major subtleties ahead: Most hash schemes depend on having a "good" hash
36function, in the sense of simulating randomness. Python doesn't: its most
37important hash functions (for strings and ints) are very regular in common
38cases:
Tim Peters15d49292001-05-27 07:39:22 +000039
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000040 >>> map(hash, (0, 1, 2, 3))
41 [0, 1, 2, 3]
42 >>> map(hash, ("namea", "nameb", "namec", "named"))
43 [-1658398457, -1658398460, -1658398459, -1658398462]
44 >>>
Tim Peters15d49292001-05-27 07:39:22 +000045
Tim Peterseb28ef22001-06-02 05:27:19 +000046This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
47the low-order i bits as the initial table index is extremely fast, and there
48are no collisions at all for dicts indexed by a contiguous range of ints.
49The same is approximately true when keys are "consecutive" strings. So this
50gives better-than-random behavior in common cases, and that's very desirable.
Tim Peters15d49292001-05-27 07:39:22 +000051
Tim Peterseb28ef22001-06-02 05:27:19 +000052OTOH, when collisions occur, the tendency to fill contiguous slices of the
53hash table makes a good collision resolution strategy crucial. Taking only
54the last i bits of the hash code is also vulnerable: for example, consider
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055the list [i << 16 for i in range(20000)] as a set of keys. Since ints are
Guido van Rossumdc5f6b22006-08-24 21:29:26 +000056their own hash codes, and this fits in a dict of size 2**15, the last 15 bits
57 of every hash code are all 0: they *all* map to the same table index.
Tim Peters15d49292001-05-27 07:39:22 +000058
Tim Peterseb28ef22001-06-02 05:27:19 +000059But catering to unusual cases should not slow the usual ones, so we just take
60the last i bits anyway. It's up to collision resolution to do the rest. If
61we *usually* find the key we're looking for on the first try (and, it turns
62out, we usually do -- the table load factor is kept under 2/3, so the odds
63are solidly in our favor), then it makes best sense to keep the initial index
64computation dirt cheap.
Tim Peters15d49292001-05-27 07:39:22 +000065
Tim Peterseb28ef22001-06-02 05:27:19 +000066The first half of collision resolution is to visit table indices via this
67recurrence:
Tim Peters15d49292001-05-27 07:39:22 +000068
Tim Peterseb28ef22001-06-02 05:27:19 +000069 j = ((5*j) + 1) mod 2**i
Tim Peters15d49292001-05-27 07:39:22 +000070
Tim Peterseb28ef22001-06-02 05:27:19 +000071For any initial j in range(2**i), repeating that 2**i times generates each
72int in range(2**i) exactly once (see any text on random-number generation for
73proof). By itself, this doesn't help much: like linear probing (setting
74j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
75order. This would be bad, except that's not the only thing we do, and it's
76actually *good* in the common cases where hash keys are consecutive. In an
77example that's really too small to make this entirely clear, for a table of
78size 2**3 the order of indices is:
Tim Peters15d49292001-05-27 07:39:22 +000079
Tim Peterseb28ef22001-06-02 05:27:19 +000080 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
81
82If two things come in at index 5, the first place we look after is index 2,
83not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
84Linear probing is deadly in this case because there the fixed probe order
85is the *same* as the order consecutive keys are likely to arrive. But it's
86extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
87and certain that consecutive hash codes do not.
88
89The other half of the strategy is to get the other bits of the hash code
90into play. This is done by initializing a (unsigned) vrbl "perturb" to the
91full hash code, and changing the recurrence to:
92
93 j = (5*j) + 1 + perturb;
94 perturb >>= PERTURB_SHIFT;
95 use j % 2**i as the next table index;
96
97Now the probe sequence depends (eventually) on every bit in the hash code,
98and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
99because it quickly magnifies small differences in the bits that didn't affect
100the initial index. Note that because perturb is unsigned, if the recurrence
101is executed often enough perturb eventually becomes and remains 0. At that
102point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
103that's certain to find an empty slot eventually (since it generates every int
104in range(2**i), and we make sure there's always at least one empty slot).
105
106Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
107small so that the high bits of the hash code continue to affect the probe
108sequence across iterations; but you want it large so that in really bad cases
109the high-order hash bits have an effect on early iterations. 5 was "the
110best" in minimizing total collisions across experiments Tim Peters ran (on
111both normal and pathological cases), but 4 and 6 weren't significantly worse.
112
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000113Historical: Reimer Behrends contributed the idea of using a polynomial-based
Tim Peterseb28ef22001-06-02 05:27:19 +0000114approach, using repeated multiplication by x in GF(2**n) where an irreducible
115polynomial for each table size was chosen such that x was a primitive root.
116Christian Tismer later extended that to use division by x instead, as an
117efficient way to get the high bits of the hash code into play. This scheme
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000118also gave excellent collision statistics, but was more expensive: two
119if-tests were required inside the loop; computing "the next" index took about
120the same number of operations but without as much potential parallelism
121(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
122above, and then shifting perturb can be done while the table index is being
123masked); and the PyDictObject struct required a member to hold the table's
124polynomial. In Tim's experiments the current scheme ran faster, produced
125equally good collision statistics, needed less code & used less memory.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000126
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000127*/
Tim Petersdea48ec2001-05-22 20:40:22 +0000128
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000129/* Object used as dummy key to fill deleted entries */
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000130static PyObject *dummy = NULL; /* Initialized by first call to newPyDictObject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000131
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000132#ifdef Py_REF_DEBUG
133PyObject *
134_PyDict_Dummy(void)
135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 return dummy;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000137}
138#endif
139
Fred Drake1bff34a2000-08-31 19:31:38 +0000140/* forward declarations */
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000141static PyDictEntry *
Benjamin Petersone6baa462010-10-17 21:20:58 +0000142lookdict_unicode(PyDictObject *mp, PyObject *key, Py_hash_t hash);
Fred Drake1bff34a2000-08-31 19:31:38 +0000143
144#ifdef SHOW_CONVERSION_COUNTS
145static long created = 0L;
146static long converted = 0L;
147
148static void
149show_counts(void)
150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 fprintf(stderr, "created %ld string dicts\n", created);
152 fprintf(stderr, "converted %ld to normal dicts\n", converted);
153 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
Fred Drake1bff34a2000-08-31 19:31:38 +0000154}
155#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000156
Christian Heimes77c02eb2008-02-09 02:18:51 +0000157/* Debug statistic to compare allocations with reuse through the free list */
158#undef SHOW_ALLOC_COUNT
159#ifdef SHOW_ALLOC_COUNT
160static size_t count_alloc = 0;
161static size_t count_reuse = 0;
162
163static void
164show_alloc(void)
165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 fprintf(stderr, "Dict allocations: %" PY_FORMAT_SIZE_T "d\n",
167 count_alloc);
168 fprintf(stderr, "Dict reuse through freelist: %" PY_FORMAT_SIZE_T
169 "d\n", count_reuse);
170 fprintf(stderr, "%.2f%% reuse rate\n\n",
171 (100.0*count_reuse/(count_alloc+count_reuse)));
Christian Heimes77c02eb2008-02-09 02:18:51 +0000172}
173#endif
174
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000175/* Debug statistic to count GC tracking of dicts */
176#ifdef SHOW_TRACK_COUNT
177static Py_ssize_t count_untracked = 0;
178static Py_ssize_t count_tracked = 0;
179
180static void
181show_track(void)
182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 fprintf(stderr, "Dicts created: %" PY_FORMAT_SIZE_T "d\n",
184 count_tracked + count_untracked);
185 fprintf(stderr, "Dicts tracked by the GC: %" PY_FORMAT_SIZE_T
186 "d\n", count_tracked);
187 fprintf(stderr, "%.2f%% dict tracking rate\n\n",
188 (100.0*count_tracked/(count_untracked+count_tracked)));
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000189}
190#endif
191
192
Tim Peters6d6c1a32001-08-02 04:15:00 +0000193/* Initialization macros.
194 There are two ways to create a dict: PyDict_New() is the main C API
195 function, and the tp_new slot maps to dict_new(). In the latter case we
196 can save a little time over what PyDict_New does because it's guaranteed
197 that the PyDictObject struct is already zeroed out.
198 Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
199 an excellent reason not to).
200*/
201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202#define INIT_NONZERO_DICT_SLOTS(mp) do { \
203 (mp)->ma_table = (mp)->ma_smalltable; \
204 (mp)->ma_mask = PyDict_MINSIZE - 1; \
Tim Peters6d6c1a32001-08-02 04:15:00 +0000205 } while(0)
206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207#define EMPTY_TO_MINSIZE(mp) do { \
208 memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
209 (mp)->ma_used = (mp)->ma_fill = 0; \
210 INIT_NONZERO_DICT_SLOTS(mp); \
Tim Petersdea48ec2001-05-22 20:40:22 +0000211 } while(0)
212
Raymond Hettinger43442782004-03-17 21:55:03 +0000213/* Dictionary reuse scheme to save calls to malloc, free, and memset */
Christian Heimes2202f872008-02-06 14:31:34 +0000214#ifndef PyDict_MAXFREELIST
215#define PyDict_MAXFREELIST 80
216#endif
217static PyDictObject *free_list[PyDict_MAXFREELIST];
218static int numfree = 0;
Raymond Hettinger43442782004-03-17 21:55:03 +0000219
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100220int
221PyDict_ClearFreeList(void)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 PyDictObject *op;
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100224 int ret = numfree;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000225 while (numfree) {
226 op = free_list[--numfree];
227 assert(PyDict_CheckExact(op));
228 PyObject_GC_Del(op);
229 }
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100230 return ret;
231}
232
233void
234PyDict_Fini(void)
235{
236 PyDict_ClearFreeList();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000237}
238
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000240PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 register PyDictObject *mp;
243 if (dummy == NULL) { /* Auto-initialize dummy */
244 dummy = PyUnicode_FromString("<dummy key>");
245 if (dummy == NULL)
246 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000247#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 Py_AtExit(show_counts);
Fred Drake1bff34a2000-08-31 19:31:38 +0000249#endif
Christian Heimes77c02eb2008-02-09 02:18:51 +0000250#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 Py_AtExit(show_alloc);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000252#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000253#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 Py_AtExit(show_track);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000255#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 }
257 if (numfree) {
258 mp = free_list[--numfree];
259 assert (mp != NULL);
260 assert (Py_TYPE(mp) == &PyDict_Type);
261 _Py_NewReference((PyObject *)mp);
262 if (mp->ma_fill) {
263 EMPTY_TO_MINSIZE(mp);
264 } else {
265 /* At least set ma_table and ma_mask; these are wrong
266 if an empty but presized dict is added to freelist */
267 INIT_NONZERO_DICT_SLOTS(mp);
268 }
269 assert (mp->ma_used == 0);
270 assert (mp->ma_table == mp->ma_smalltable);
271 assert (mp->ma_mask == PyDict_MINSIZE - 1);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000272#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 count_reuse++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 } else {
276 mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
277 if (mp == NULL)
278 return NULL;
279 EMPTY_TO_MINSIZE(mp);
Christian Heimes77c02eb2008-02-09 02:18:51 +0000280#ifdef SHOW_ALLOC_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 count_alloc++;
Christian Heimes77c02eb2008-02-09 02:18:51 +0000282#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 }
284 mp->ma_lookup = lookdict_unicode;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000285#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 count_untracked++;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000287#endif
Fred Drake1bff34a2000-08-31 19:31:38 +0000288#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 ++created;
Fred Drake1bff34a2000-08-31 19:31:38 +0000290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000292}
293
294/*
295The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000296This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000297Open addressing is preferred over chaining since the link overhead for
298chaining would be substantial (100% with typical malloc overhead).
299
Tim Peterseb28ef22001-06-02 05:27:19 +0000300The initial probe index is computed as hash mod the table size. Subsequent
301probe indices are computed as explained earlier.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000302
303All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000304
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000305The details in this version are due to Tim Peters, building on many past
Tim Peterseb28ef22001-06-02 05:27:19 +0000306contributions by Reimer Behrends, Jyrki Alakuijala, Vladimir Marangozov and
Guido van Rossumdc5f6b22006-08-24 21:29:26 +0000307Christian Tismer.
Fred Drake1bff34a2000-08-31 19:31:38 +0000308
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000309lookdict() is general-purpose, and may return NULL if (and only if) a
310comparison raises an exception (this was new in Python 2.5).
Guido van Rossum89d8c602007-09-18 17:26:56 +0000311lookdict_unicode() below is specialized to string keys, comparison of which can
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000312never raise an exception; that function can never return NULL. For both, when
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000313the key isn't found a PyDictEntry* is returned for which the me_value field is
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000314NULL; this is the slot in the dict at which the key would have been found, and
315the caller can (if it wishes) add the <key, value> pair to the returned
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000316PyDictEntry*.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000317*/
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000318static PyDictEntry *
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000319lookdict(PyDictObject *mp, PyObject *key, register Py_hash_t hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000320{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 register size_t i;
322 register size_t perturb;
323 register PyDictEntry *freeslot;
324 register size_t mask = (size_t)mp->ma_mask;
325 PyDictEntry *ep0 = mp->ma_table;
326 register PyDictEntry *ep;
327 register int cmp;
328 PyObject *startkey;
Tim Peterseb28ef22001-06-02 05:27:19 +0000329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 i = (size_t)hash & mask;
331 ep = &ep0[i];
332 if (ep->me_key == NULL || ep->me_key == key)
333 return ep;
Tim Peters7b5d0af2001-06-03 04:14:43 +0000334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 if (ep->me_key == dummy)
336 freeslot = ep;
337 else {
338 if (ep->me_hash == hash) {
339 startkey = ep->me_key;
340 Py_INCREF(startkey);
341 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
342 Py_DECREF(startkey);
343 if (cmp < 0)
344 return NULL;
345 if (ep0 == mp->ma_table && ep->me_key == startkey) {
346 if (cmp > 0)
347 return ep;
348 }
349 else {
Victor Stinner198b2912012-03-06 01:03:13 +0100350 PyErr_SetString(PyExc_RuntimeError,
351 "dictionary changed size during lookup");
352 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 }
354 }
355 freeslot = NULL;
356 }
Tim Peters15d49292001-05-27 07:39:22 +0000357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 /* In the loop, me_key == dummy is by far (factor of 100s) the
359 least likely outcome, so test for that last. */
360 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
361 i = (i << 2) + i + perturb + 1;
362 ep = &ep0[i & mask];
363 if (ep->me_key == NULL)
364 return freeslot == NULL ? ep : freeslot;
365 if (ep->me_key == key)
366 return ep;
367 if (ep->me_hash == hash && ep->me_key != dummy) {
368 startkey = ep->me_key;
369 Py_INCREF(startkey);
370 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
371 Py_DECREF(startkey);
372 if (cmp < 0)
373 return NULL;
374 if (ep0 == mp->ma_table && ep->me_key == startkey) {
375 if (cmp > 0)
376 return ep;
377 }
378 else {
Victor Stinner198b2912012-03-06 01:03:13 +0100379 PyErr_SetString(PyExc_RuntimeError,
380 "dictionary changed size during lookup");
381 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 }
383 }
384 else if (ep->me_key == dummy && freeslot == NULL)
385 freeslot = ep;
386 }
387 assert(0); /* NOT REACHED */
388 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000389}
390
391/*
Guido van Rossum89d8c602007-09-18 17:26:56 +0000392 * Hacked up version of lookdict which can assume keys are always
393 * unicodes; this assumption allows testing for errors during
394 * PyObject_RichCompareBool() to be dropped; unicode-unicode
395 * comparisons never raise exceptions. This also means we don't need
396 * to go through PyObject_RichCompareBool(); we can always use
397 * unicode_eq() directly.
Fred Drake1bff34a2000-08-31 19:31:38 +0000398 *
Guido van Rossum89d8c602007-09-18 17:26:56 +0000399 * This is valuable because dicts with only unicode keys are very common.
Fred Drake1bff34a2000-08-31 19:31:38 +0000400 */
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000401static PyDictEntry *
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000402lookdict_unicode(PyDictObject *mp, PyObject *key, register Py_hash_t hash)
Fred Drake1bff34a2000-08-31 19:31:38 +0000403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 register size_t i;
405 register size_t perturb;
406 register PyDictEntry *freeslot;
407 register size_t mask = (size_t)mp->ma_mask;
408 PyDictEntry *ep0 = mp->ma_table;
409 register PyDictEntry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 /* Make sure this function doesn't have to handle non-unicode keys,
412 including subclasses of str; e.g., one reason to subclass
413 unicodes is to override __eq__, and for speed we don't cater to
414 that here. */
415 if (!PyUnicode_CheckExact(key)) {
Fred Drake1bff34a2000-08-31 19:31:38 +0000416#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 ++converted;
Fred Drake1bff34a2000-08-31 19:31:38 +0000418#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 mp->ma_lookup = lookdict;
420 return lookdict(mp, key, hash);
421 }
Mark Dickinson57e683e2011-09-24 18:18:40 +0100422 i = (size_t)hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 ep = &ep0[i];
424 if (ep->me_key == NULL || ep->me_key == key)
425 return ep;
426 if (ep->me_key == dummy)
427 freeslot = ep;
428 else {
429 if (ep->me_hash == hash && unicode_eq(ep->me_key, key))
430 return ep;
431 freeslot = NULL;
432 }
Tim Peters15d49292001-05-27 07:39:22 +0000433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 /* In the loop, me_key == dummy is by far (factor of 100s) the
435 least likely outcome, so test for that last. */
436 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
437 i = (i << 2) + i + perturb + 1;
438 ep = &ep0[i & mask];
439 if (ep->me_key == NULL)
440 return freeslot == NULL ? ep : freeslot;
441 if (ep->me_key == key
442 || (ep->me_hash == hash
443 && ep->me_key != dummy
444 && unicode_eq(ep->me_key, key)))
445 return ep;
446 if (ep->me_key == dummy && freeslot == NULL)
447 freeslot = ep;
448 }
449 assert(0); /* NOT REACHED */
450 return 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000451}
452
Benjamin Petersonfb886362010-04-24 18:21:17 +0000453int
454_PyDict_HasOnlyStringKeys(PyObject *dict)
455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 Py_ssize_t pos = 0;
457 PyObject *key, *value;
Benjamin Petersonf6096542010-11-17 22:33:12 +0000458 assert(PyDict_Check(dict));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 /* Shortcut */
460 if (((PyDictObject *)dict)->ma_lookup == lookdict_unicode)
461 return 1;
462 while (PyDict_Next(dict, &pos, &key, &value))
463 if (!PyUnicode_Check(key))
464 return 0;
465 return 1;
Benjamin Petersonfb886362010-04-24 18:21:17 +0000466}
467
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000468#ifdef SHOW_TRACK_COUNT
469#define INCREASE_TRACK_COUNT \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 (count_tracked++, count_untracked--);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000471#define DECREASE_TRACK_COUNT \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 (count_tracked--, count_untracked++);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000473#else
474#define INCREASE_TRACK_COUNT
475#define DECREASE_TRACK_COUNT
476#endif
477
478#define MAINTAIN_TRACKING(mp, key, value) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 do { \
480 if (!_PyObject_GC_IS_TRACKED(mp)) { \
481 if (_PyObject_GC_MAY_BE_TRACKED(key) || \
482 _PyObject_GC_MAY_BE_TRACKED(value)) { \
483 _PyObject_GC_TRACK(mp); \
484 INCREASE_TRACK_COUNT \
485 } \
486 } \
487 } while(0)
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000488
489void
490_PyDict_MaybeUntrack(PyObject *op)
491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 PyDictObject *mp;
493 PyObject *value;
494 Py_ssize_t mask, i;
495 PyDictEntry *ep;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
498 return;
499
500 mp = (PyDictObject *) op;
501 ep = mp->ma_table;
502 mask = mp->ma_mask;
503 for (i = 0; i <= mask; i++) {
504 if ((value = ep[i].me_value) == NULL)
505 continue;
506 if (_PyObject_GC_MAY_BE_TRACKED(value) ||
507 _PyObject_GC_MAY_BE_TRACKED(ep[i].me_key))
508 return;
509 }
510 DECREASE_TRACK_COUNT
511 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000512}
513
Fred Drake1bff34a2000-08-31 19:31:38 +0000514/*
Antoine Pitroue965d972012-02-27 00:45:12 +0100515Internal routine to insert a new item into the table when you have entry object.
516Used by insertdict.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000517*/
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000518static int
Antoine Pitroue965d972012-02-27 00:45:12 +0100519insertdict_by_entry(register PyDictObject *mp, PyObject *key, Py_hash_t hash,
520 PyDictEntry *ep, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 PyObject *old_value;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 MAINTAIN_TRACKING(mp, key, value);
525 if (ep->me_value != NULL) {
526 old_value = ep->me_value;
527 ep->me_value = value;
528 Py_DECREF(old_value); /* which **CAN** re-enter */
529 Py_DECREF(key);
530 }
531 else {
532 if (ep->me_key == NULL)
533 mp->ma_fill++;
534 else {
535 assert(ep->me_key == dummy);
536 Py_DECREF(dummy);
537 }
538 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000539 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 ep->me_value = value;
541 mp->ma_used++;
542 }
543 return 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000544}
545
Antoine Pitroue965d972012-02-27 00:45:12 +0100546
547/*
548Internal routine to insert a new item into the table.
549Used both by the internal resize routine and by the public insert routine.
550Eats a reference to key and one to value.
551Returns -1 if an error occurred, or 0 on success.
552*/
553static int
554insertdict(register PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
555{
556 register PyDictEntry *ep;
557
558 assert(mp->ma_lookup != NULL);
559 ep = mp->ma_lookup(mp, key, hash);
560 if (ep == NULL) {
561 Py_DECREF(key);
562 Py_DECREF(value);
563 return -1;
564 }
565 return insertdict_by_entry(mp, key, hash, ep, value);
566}
567
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000568/*
569Internal routine used by dictresize() to insert an item which is
570known to be absent from the dict. This routine also assumes that
571the dict contains no deleted entries. Besides the performance benefit,
572using insertdict() in dictresize() is dangerous (SF bug #1456209).
573Note that no refcounts are changed by this routine; if needed, the caller
574is responsible for incref'ing `key` and `value`.
575*/
576static void
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000577insertdict_clean(register PyDictObject *mp, PyObject *key, Py_hash_t hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 PyObject *value)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 register size_t i;
581 register size_t perturb;
582 register size_t mask = (size_t)mp->ma_mask;
583 PyDictEntry *ep0 = mp->ma_table;
584 register PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 MAINTAIN_TRACKING(mp, key, value);
Mark Dickinson57e683e2011-09-24 18:18:40 +0100587 i = (size_t)hash & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 ep = &ep0[i];
589 for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
590 i = (i << 2) + i + perturb + 1;
591 ep = &ep0[i & mask];
592 }
593 assert(ep->me_value == NULL);
594 mp->ma_fill++;
595 ep->me_key = key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000596 ep->me_hash = hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 ep->me_value = value;
598 mp->ma_used++;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000599}
600
601/*
602Restructure the table by allocating a new table and reinserting all
603items again. When entries have been deleted, the new table may
604actually be smaller than the old one.
605*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000606static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000607dictresize(PyDictObject *mp, Py_ssize_t minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 Py_ssize_t newsize;
610 PyDictEntry *oldtable, *newtable, *ep;
611 Py_ssize_t i;
612 int is_oldtable_malloced;
613 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Peters91a364d2001-05-19 07:04:38 +0000614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 assert(minused >= 0);
Tim Peters0c6010b2001-05-23 23:33:57 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 /* Find the smallest table size > minused. */
618 for (newsize = PyDict_MINSIZE;
619 newsize <= minused && newsize > 0;
620 newsize <<= 1)
621 ;
622 if (newsize <= 0) {
623 PyErr_NoMemory();
624 return -1;
625 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 /* Get space for a new table. */
628 oldtable = mp->ma_table;
629 assert(oldtable != NULL);
630 is_oldtable_malloced = oldtable != mp->ma_smalltable;
Tim Peters0c6010b2001-05-23 23:33:57 +0000631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 if (newsize == PyDict_MINSIZE) {
633 /* A large table is shrinking, or we can't get any smaller. */
634 newtable = mp->ma_smalltable;
635 if (newtable == oldtable) {
636 if (mp->ma_fill == mp->ma_used) {
637 /* No dummies, so no point doing anything. */
638 return 0;
639 }
640 /* We're not going to resize it, but rebuild the
641 table anyway to purge old dummy entries.
642 Subtle: This is *necessary* if fill==size,
643 as lookdict needs at least one virgin slot to
644 terminate failing searches. If fill < size, it's
645 merely desirable, as dummies slow searches. */
646 assert(mp->ma_fill > mp->ma_used);
647 memcpy(small_copy, oldtable, sizeof(small_copy));
648 oldtable = small_copy;
649 }
650 }
651 else {
652 newtable = PyMem_NEW(PyDictEntry, newsize);
653 if (newtable == NULL) {
654 PyErr_NoMemory();
655 return -1;
656 }
657 }
Tim Peters0c6010b2001-05-23 23:33:57 +0000658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 /* Make the dict empty, using the new table. */
660 assert(newtable != oldtable);
661 mp->ma_table = newtable;
662 mp->ma_mask = newsize - 1;
663 memset(newtable, 0, sizeof(PyDictEntry) * newsize);
664 mp->ma_used = 0;
665 i = mp->ma_fill;
666 mp->ma_fill = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 /* Copy the data over; this is refcount-neutral for active entries;
669 dummy entries aren't copied over, of course */
670 for (ep = oldtable; i > 0; ep++) {
671 if (ep->me_value != NULL) { /* active entry */
672 --i;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000673 insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 }
675 else if (ep->me_key != NULL) { /* dummy entry */
676 --i;
677 assert(ep->me_key == dummy);
678 Py_DECREF(ep->me_key);
679 }
680 /* else key == value == NULL: nothing to do */
681 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 if (is_oldtable_malloced)
684 PyMem_DEL(oldtable);
685 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000686}
687
Christian Heimes99170a52007-12-19 02:07:34 +0000688/* Create a new dictionary pre-sized to hold an estimated number of elements.
689 Underestimates are okay because the dictionary will resize as necessary.
690 Overestimates just mean the dictionary will be more sparse than usual.
691*/
692
693PyObject *
694_PyDict_NewPresized(Py_ssize_t minused)
695{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 PyObject *op = PyDict_New();
Christian Heimes99170a52007-12-19 02:07:34 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
699 Py_DECREF(op);
700 return NULL;
701 }
702 return op;
Christian Heimes99170a52007-12-19 02:07:34 +0000703}
704
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000705/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
706 * that may occur (originally dicts supported only string keys, and exceptions
707 * weren't possible). So, while the original intent was that a NULL return
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000708 * meant the key wasn't present, in reality it can mean that, or that an error
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000709 * (suppressed) occurred while computing the key's hash, or that some error
710 * (suppressed) occurred when comparing keys in the dict's internal probe
711 * sequence. A nasty example of the latter is when a Python-coded comparison
712 * function hits a stack-depth error, which can cause this to return NULL
713 * even if the key is present.
714 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000716PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000717{
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000718 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 PyDictObject *mp = (PyDictObject *)op;
720 PyDictEntry *ep;
721 PyThreadState *tstate;
722 if (!PyDict_Check(op))
723 return NULL;
724 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200725 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 {
727 hash = PyObject_Hash(key);
728 if (hash == -1) {
729 PyErr_Clear();
730 return NULL;
731 }
732 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 /* We can arrive here with a NULL tstate during initialization: try
735 running "python -Wi" for an example related to string interning.
736 Let's just hope that no exception occurs then... This must be
737 _PyThreadState_Current and not PyThreadState_GET() because in debug
738 mode, the latter complains if tstate is NULL. */
739 tstate = (PyThreadState*)_Py_atomic_load_relaxed(
740 &_PyThreadState_Current);
741 if (tstate != NULL && tstate->curexc_type != NULL) {
742 /* preserve the existing exception */
743 PyObject *err_type, *err_value, *err_tb;
744 PyErr_Fetch(&err_type, &err_value, &err_tb);
745 ep = (mp->ma_lookup)(mp, key, hash);
746 /* ignore errors */
747 PyErr_Restore(err_type, err_value, err_tb);
748 if (ep == NULL)
749 return NULL;
750 }
751 else {
752 ep = (mp->ma_lookup)(mp, key, hash);
753 if (ep == NULL) {
754 PyErr_Clear();
755 return NULL;
756 }
757 }
758 return ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000759}
760
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000761/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
762 This returns NULL *with* an exception set if an exception occurred.
763 It returns NULL *without* an exception set if the key wasn't present.
764*/
765PyObject *
766PyDict_GetItemWithError(PyObject *op, PyObject *key)
767{
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000768 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 PyDictObject*mp = (PyDictObject *)op;
770 PyDictEntry *ep;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 if (!PyDict_Check(op)) {
773 PyErr_BadInternalCall();
774 return NULL;
775 }
776 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200777 (hash = ((PyASCIIObject *) key)->hash) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 {
779 hash = PyObject_Hash(key);
780 if (hash == -1) {
781 return NULL;
782 }
783 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 ep = (mp->ma_lookup)(mp, key, hash);
786 if (ep == NULL)
787 return NULL;
788 return ep->me_value;
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000789}
790
Antoine Pitroue965d972012-02-27 00:45:12 +0100791static int
792dict_set_item_by_hash_or_entry(register PyObject *op, PyObject *key,
793 Py_hash_t hash, PyDictEntry *ep, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 register PyDictObject *mp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 register Py_ssize_t n_used;
Guido van Rossuma4dd0112001-04-15 22:16:26 +0000797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 mp = (PyDictObject *)op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
800 n_used = mp->ma_used;
801 Py_INCREF(value);
802 Py_INCREF(key);
Antoine Pitroue965d972012-02-27 00:45:12 +0100803 if (ep == NULL) {
804 if (insertdict(mp, key, hash, value) != 0)
805 return -1;
806 }
807 else {
808 if (insertdict_by_entry(mp, key, hash, ep, value) != 0)
809 return -1;
810 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 /* If we added a key, we can safely resize. Otherwise just return!
812 * If fill >= 2/3 size, adjust size. Normally, this doubles or
813 * quaduples the size, but it's also possible for the dict to shrink
814 * (if ma_fill is much larger than ma_used, meaning a lot of dict
815 * keys have been * deleted).
816 *
817 * Quadrupling the size improves average dictionary sparseness
818 * (reducing collisions) at the cost of some memory and iteration
819 * speed (which loops over every possible entry). It also halves
820 * the number of expensive resize operations in a growing dictionary.
821 *
822 * Very large dictionaries (over 50K items) use doubling instead.
823 * This may help applications with severe memory constraints.
824 */
825 if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
826 return 0;
827 return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000828}
829
Antoine Pitroue965d972012-02-27 00:45:12 +0100830/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
831 * dictionary if it's merely replacing the value for an existing key.
832 * This means that it's safe to loop over a dictionary with PyDict_Next()
833 * and occasionally replace a value -- but you can't insert new keys or
834 * remove them.
835 */
836int
837PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
838{
839 register Py_hash_t hash;
840
841 if (!PyDict_Check(op)) {
842 PyErr_BadInternalCall();
843 return -1;
844 }
845 assert(key);
846 assert(value);
847 if (PyUnicode_CheckExact(key)) {
Antoine Pitrou70d27172012-02-27 00:59:34 +0100848 hash = ((PyASCIIObject *) key)->hash;
Antoine Pitroue965d972012-02-27 00:45:12 +0100849 if (hash == -1)
850 hash = PyObject_Hash(key);
851 }
852 else {
853 hash = PyObject_Hash(key);
854 if (hash == -1)
855 return -1;
856 }
857 return dict_set_item_by_hash_or_entry(op, key, hash, NULL, value);
858}
859
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000860int
Tim Peters1f5871e2000-07-04 17:44:48 +0000861PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000862{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 register PyDictObject *mp;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000864 register Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 register PyDictEntry *ep;
866 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 if (!PyDict_Check(op)) {
869 PyErr_BadInternalCall();
870 return -1;
871 }
872 assert(key);
873 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200874 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 hash = PyObject_Hash(key);
876 if (hash == -1)
877 return -1;
878 }
879 mp = (PyDictObject *)op;
880 ep = (mp->ma_lookup)(mp, key, hash);
881 if (ep == NULL)
882 return -1;
883 if (ep->me_value == NULL) {
884 set_key_error(key);
885 return -1;
886 }
887 old_key = ep->me_key;
888 Py_INCREF(dummy);
889 ep->me_key = dummy;
890 old_value = ep->me_value;
891 ep->me_value = NULL;
892 mp->ma_used--;
893 Py_DECREF(old_value);
894 Py_DECREF(old_key);
895 return 0;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000896}
897
Guido van Rossum25831651993-05-19 14:50:45 +0000898void
Tim Peters1f5871e2000-07-04 17:44:48 +0000899PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 PyDictObject *mp;
902 PyDictEntry *ep, *table;
903 int table_is_malloced;
904 Py_ssize_t fill;
905 PyDictEntry small_copy[PyDict_MINSIZE];
Tim Petersdea48ec2001-05-22 20:40:22 +0000906#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 Py_ssize_t i, n;
Tim Petersdea48ec2001-05-22 20:40:22 +0000908#endif
909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 if (!PyDict_Check(op))
911 return;
912 mp = (PyDictObject *)op;
Tim Petersdea48ec2001-05-22 20:40:22 +0000913#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 n = mp->ma_mask + 1;
915 i = 0;
Tim Petersdea48ec2001-05-22 20:40:22 +0000916#endif
917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 table = mp->ma_table;
919 assert(table != NULL);
920 table_is_malloced = table != mp->ma_smalltable;
Tim Petersdea48ec2001-05-22 20:40:22 +0000921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 /* This is delicate. During the process of clearing the dict,
923 * decrefs can cause the dict to mutate. To avoid fatal confusion
924 * (voice of experience), we have to make the dict empty before
925 * clearing the slots, and never refer to anything via mp->xxx while
926 * clearing.
927 */
928 fill = mp->ma_fill;
929 if (table_is_malloced)
930 EMPTY_TO_MINSIZE(mp);
Tim Petersdea48ec2001-05-22 20:40:22 +0000931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 else if (fill > 0) {
933 /* It's a small table with something that needs to be cleared.
934 * Afraid the only safe way is to copy the dict entries into
935 * another small table first.
936 */
937 memcpy(small_copy, table, sizeof(small_copy));
938 table = small_copy;
939 EMPTY_TO_MINSIZE(mp);
940 }
941 /* else it's a small table that's already empty */
Tim Petersdea48ec2001-05-22 20:40:22 +0000942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 /* Now we can finally clear things. If C had refcounts, we could
944 * assert that the refcount on table is 1 now, i.e. that this function
945 * has unique access to it, so decref side-effects can't alter it.
946 */
947 for (ep = table; fill > 0; ++ep) {
Tim Petersdea48ec2001-05-22 20:40:22 +0000948#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 assert(i < n);
950 ++i;
Tim Petersdea48ec2001-05-22 20:40:22 +0000951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 if (ep->me_key) {
953 --fill;
954 Py_DECREF(ep->me_key);
955 Py_XDECREF(ep->me_value);
956 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000957#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 else
959 assert(ep->me_value == NULL);
Tim Petersdea48ec2001-05-22 20:40:22 +0000960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 }
Tim Petersdea48ec2001-05-22 20:40:22 +0000962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 if (table_is_malloced)
964 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000965}
966
Tim Peters080c88b2003-02-15 03:01:11 +0000967/*
968 * Iterate over a dict. Use like so:
969 *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000970 * Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +0000971 * PyObject *key, *value;
972 * i = 0; # important! i should not otherwise be changed by you
Neal Norwitz07323012003-02-15 14:45:12 +0000973 * while (PyDict_Next(yourdict, &i, &key, &value)) {
Tim Peters080c88b2003-02-15 03:01:11 +0000974 * Refer to borrowed references in key and value.
975 * }
976 *
977 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
Tim Peters67830702001-03-21 19:23:56 +0000978 * mutates the dict. One exception: it is safe if the loop merely changes
979 * the values associated with the keys (but doesn't insert new keys or
980 * delete keys), via PyDict_SetItem().
981 */
Guido van Rossum25831651993-05-19 14:50:45 +0000982int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000983PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000984{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 register Py_ssize_t i;
986 register Py_ssize_t mask;
987 register PyDictEntry *ep;
Raymond Hettinger43442782004-03-17 21:55:03 +0000988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 if (!PyDict_Check(op))
990 return 0;
991 i = *ppos;
992 if (i < 0)
993 return 0;
994 ep = ((PyDictObject *)op)->ma_table;
995 mask = ((PyDictObject *)op)->ma_mask;
996 while (i <= mask && ep[i].me_value == NULL)
997 i++;
998 *ppos = i+1;
999 if (i > mask)
1000 return 0;
1001 if (pkey)
1002 *pkey = ep[i].me_key;
1003 if (pvalue)
1004 *pvalue = ep[i].me_value;
1005 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001006}
1007
Thomas Wouterscf297e42007-02-23 15:07:44 +00001008/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
1009int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001010_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, Py_hash_t *phash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 register Py_ssize_t i;
1013 register Py_ssize_t mask;
1014 register PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 if (!PyDict_Check(op))
1017 return 0;
1018 i = *ppos;
1019 if (i < 0)
1020 return 0;
1021 ep = ((PyDictObject *)op)->ma_table;
1022 mask = ((PyDictObject *)op)->ma_mask;
1023 while (i <= mask && ep[i].me_value == NULL)
1024 i++;
1025 *ppos = i+1;
1026 if (i > mask)
1027 return 0;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001028 *phash = ep[i].me_hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 if (pkey)
1030 *pkey = ep[i].me_key;
1031 if (pvalue)
1032 *pvalue = ep[i].me_value;
1033 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001034}
1035
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001036/* Methods */
1037
1038static void
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001039dict_dealloc(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 register PyDictEntry *ep;
1042 Py_ssize_t fill = mp->ma_fill;
1043 PyObject_GC_UnTrack(mp);
1044 Py_TRASHCAN_SAFE_BEGIN(mp)
1045 for (ep = mp->ma_table; fill > 0; ep++) {
1046 if (ep->me_key) {
1047 --fill;
1048 Py_DECREF(ep->me_key);
1049 Py_XDECREF(ep->me_value);
1050 }
1051 }
1052 if (mp->ma_table != mp->ma_smalltable)
1053 PyMem_DEL(mp->ma_table);
1054 if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
1055 free_list[numfree++] = mp;
1056 else
1057 Py_TYPE(mp)->tp_free((PyObject *)mp);
1058 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001059}
1060
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001062dict_repr(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001063{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 Py_ssize_t i;
1065 PyObject *s, *temp, *colon = NULL;
1066 PyObject *pieces = NULL, *result = NULL;
1067 PyObject *key, *value;
Guido van Rossum255443b1998-04-10 22:47:14 +00001068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 i = Py_ReprEnter((PyObject *)mp);
1070 if (i != 0) {
1071 return i > 0 ? PyUnicode_FromString("{...}") : NULL;
1072 }
Guido van Rossum255443b1998-04-10 22:47:14 +00001073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 if (mp->ma_used == 0) {
1075 result = PyUnicode_FromString("{}");
1076 goto Done;
1077 }
Tim Petersa7259592001-06-16 05:11:17 +00001078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 pieces = PyList_New(0);
1080 if (pieces == NULL)
1081 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 colon = PyUnicode_FromString(": ");
1084 if (colon == NULL)
1085 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 /* Do repr() on each key+value pair, and insert ": " between them.
1088 Note that repr may mutate the dict. */
1089 i = 0;
1090 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
1091 int status;
1092 /* Prevent repr from deleting value during key format. */
1093 Py_INCREF(value);
1094 s = PyObject_Repr(key);
1095 PyUnicode_Append(&s, colon);
1096 PyUnicode_AppendAndDel(&s, PyObject_Repr(value));
1097 Py_DECREF(value);
1098 if (s == NULL)
1099 goto Done;
1100 status = PyList_Append(pieces, s);
1101 Py_DECREF(s); /* append created a new ref */
1102 if (status < 0)
1103 goto Done;
1104 }
Tim Petersa7259592001-06-16 05:11:17 +00001105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 /* Add "{}" decorations to the first and last items. */
1107 assert(PyList_GET_SIZE(pieces) > 0);
1108 s = PyUnicode_FromString("{");
1109 if (s == NULL)
1110 goto Done;
1111 temp = PyList_GET_ITEM(pieces, 0);
1112 PyUnicode_AppendAndDel(&s, temp);
1113 PyList_SET_ITEM(pieces, 0, s);
1114 if (s == NULL)
1115 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 s = PyUnicode_FromString("}");
1118 if (s == NULL)
1119 goto Done;
1120 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
1121 PyUnicode_AppendAndDel(&temp, s);
1122 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
1123 if (temp == NULL)
1124 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +00001125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 /* Paste them all together with ", " between. */
1127 s = PyUnicode_FromString(", ");
1128 if (s == NULL)
1129 goto Done;
1130 result = PyUnicode_Join(s, pieces);
1131 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +00001132
1133Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 Py_XDECREF(pieces);
1135 Py_XDECREF(colon);
1136 Py_ReprLeave((PyObject *)mp);
1137 return result;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001138}
1139
Martin v. Löwis18e16552006-02-15 17:27:45 +00001140static Py_ssize_t
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001141dict_length(PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 return mp->ma_used;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001144}
1145
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001146static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001147dict_subscript(PyDictObject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 PyObject *v;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001150 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 PyDictEntry *ep;
1152 assert(mp->ma_table != NULL);
1153 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001154 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 hash = PyObject_Hash(key);
1156 if (hash == -1)
1157 return NULL;
1158 }
1159 ep = (mp->ma_lookup)(mp, key, hash);
1160 if (ep == NULL)
1161 return NULL;
1162 v = ep->me_value;
1163 if (v == NULL) {
1164 if (!PyDict_CheckExact(mp)) {
1165 /* Look up __missing__ method if we're a subclass. */
1166 PyObject *missing, *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05001167 _Py_IDENTIFIER(__missing__);
1168 missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 if (missing != NULL) {
1170 res = PyObject_CallFunctionObjArgs(missing,
1171 key, NULL);
1172 Py_DECREF(missing);
1173 return res;
1174 }
1175 else if (PyErr_Occurred())
1176 return NULL;
1177 }
1178 set_key_error(key);
1179 return NULL;
1180 }
1181 else
1182 Py_INCREF(v);
1183 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001184}
1185
1186static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001187dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 if (w == NULL)
1190 return PyDict_DelItem((PyObject *)mp, v);
1191 else
1192 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001193}
1194
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001195static PyMappingMethods dict_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 (lenfunc)dict_length, /*mp_length*/
1197 (binaryfunc)dict_subscript, /*mp_subscript*/
1198 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001199};
1200
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001201static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001202dict_keys(register PyDictObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 register PyObject *v;
1205 register Py_ssize_t i, j;
1206 PyDictEntry *ep;
1207 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001208
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001209 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 n = mp->ma_used;
1211 v = PyList_New(n);
1212 if (v == NULL)
1213 return NULL;
1214 if (n != mp->ma_used) {
1215 /* Durnit. The allocations caused the dict to resize.
1216 * Just start over, this shouldn't normally happen.
1217 */
1218 Py_DECREF(v);
1219 goto again;
1220 }
1221 ep = mp->ma_table;
1222 mask = mp->ma_mask;
1223 for (i = 0, j = 0; i <= mask; i++) {
1224 if (ep[i].me_value != NULL) {
1225 PyObject *key = ep[i].me_key;
1226 Py_INCREF(key);
1227 PyList_SET_ITEM(v, j, key);
1228 j++;
1229 }
1230 }
1231 assert(j == n);
1232 return v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001233}
1234
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001236dict_values(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 register PyObject *v;
1239 register Py_ssize_t i, j;
1240 PyDictEntry *ep;
1241 Py_ssize_t mask, n;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001242
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001243 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 n = mp->ma_used;
1245 v = PyList_New(n);
1246 if (v == NULL)
1247 return NULL;
1248 if (n != mp->ma_used) {
1249 /* Durnit. The allocations caused the dict to resize.
1250 * Just start over, this shouldn't normally happen.
1251 */
1252 Py_DECREF(v);
1253 goto again;
1254 }
1255 ep = mp->ma_table;
1256 mask = mp->ma_mask;
1257 for (i = 0, j = 0; i <= mask; i++) {
1258 if (ep[i].me_value != NULL) {
1259 PyObject *value = ep[i].me_value;
1260 Py_INCREF(value);
1261 PyList_SET_ITEM(v, j, value);
1262 j++;
1263 }
1264 }
1265 assert(j == n);
1266 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001267}
1268
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001269static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001270dict_items(register PyDictObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001271{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 register PyObject *v;
1273 register Py_ssize_t i, j, n;
1274 Py_ssize_t mask;
1275 PyObject *item, *key, *value;
1276 PyDictEntry *ep;
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 /* Preallocate the list of tuples, to avoid allocations during
1279 * the loop over the items, which could trigger GC, which
1280 * could resize the dict. :-(
1281 */
Guido van Rossuma4dd0112001-04-15 22:16:26 +00001282 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 n = mp->ma_used;
1284 v = PyList_New(n);
1285 if (v == NULL)
1286 return NULL;
1287 for (i = 0; i < n; i++) {
1288 item = PyTuple_New(2);
1289 if (item == NULL) {
1290 Py_DECREF(v);
1291 return NULL;
1292 }
1293 PyList_SET_ITEM(v, i, item);
1294 }
1295 if (n != mp->ma_used) {
1296 /* Durnit. The allocations caused the dict to resize.
1297 * Just start over, this shouldn't normally happen.
1298 */
1299 Py_DECREF(v);
1300 goto again;
1301 }
1302 /* Nothing we do below makes any function calls. */
1303 ep = mp->ma_table;
1304 mask = mp->ma_mask;
1305 for (i = 0, j = 0; i <= mask; i++) {
1306 if ((value=ep[i].me_value) != NULL) {
1307 key = ep[i].me_key;
1308 item = PyList_GET_ITEM(v, j);
1309 Py_INCREF(key);
1310 PyTuple_SET_ITEM(item, 0, key);
1311 Py_INCREF(value);
1312 PyTuple_SET_ITEM(item, 1, value);
1313 j++;
1314 }
1315 }
1316 assert(j == n);
1317 return v;
Guido van Rossum25831651993-05-19 14:50:45 +00001318}
1319
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001320static PyObject *
Tim Petersbca1cbc2002-12-09 22:56:13 +00001321dict_fromkeys(PyObject *cls, PyObject *args)
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 PyObject *seq;
1324 PyObject *value = Py_None;
1325 PyObject *it; /* iter(seq) */
1326 PyObject *key;
1327 PyObject *d;
1328 int status;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 if (!PyArg_UnpackTuple(args, "fromkeys", 1, 2, &seq, &value))
1331 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 d = PyObject_CallObject(cls, NULL);
1334 if (d == NULL)
1335 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) {
1338 PyDictObject *mp = (PyDictObject *)d;
1339 PyObject *oldvalue;
1340 Py_ssize_t pos = 0;
1341 PyObject *key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001342 Py_hash_t hash;
Guido van Rossum58da9312007-11-10 23:39:45 +00001343
Petri Lehtinena94200e2011-10-24 21:12:58 +03001344 if (dictresize(mp, Py_SIZE(seq))) {
1345 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001347 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
1350 Py_INCREF(key);
1351 Py_INCREF(value);
Petri Lehtinena94200e2011-10-24 21:12:58 +03001352 if (insertdict(mp, key, hash, value)) {
1353 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001355 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 }
1357 return d;
1358 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) {
1361 PyDictObject *mp = (PyDictObject *)d;
1362 Py_ssize_t pos = 0;
1363 PyObject *key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001364 Py_hash_t hash;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001365
Petri Lehtinena94200e2011-10-24 21:12:58 +03001366 if (dictresize(mp, PySet_GET_SIZE(seq))) {
1367 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001369 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
1372 Py_INCREF(key);
1373 Py_INCREF(value);
Petri Lehtinena94200e2011-10-24 21:12:58 +03001374 if (insertdict(mp, key, hash, value)) {
1375 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 return NULL;
Petri Lehtinena94200e2011-10-24 21:12:58 +03001377 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 }
1379 return d;
1380 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 it = PyObject_GetIter(seq);
1383 if (it == NULL){
1384 Py_DECREF(d);
1385 return NULL;
1386 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 if (PyDict_CheckExact(d)) {
1389 while ((key = PyIter_Next(it)) != NULL) {
1390 status = PyDict_SetItem(d, key, value);
1391 Py_DECREF(key);
1392 if (status < 0)
1393 goto Fail;
1394 }
1395 } else {
1396 while ((key = PyIter_Next(it)) != NULL) {
1397 status = PyObject_SetItem(d, key, value);
1398 Py_DECREF(key);
1399 if (status < 0)
1400 goto Fail;
1401 }
1402 }
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 if (PyErr_Occurred())
1405 goto Fail;
1406 Py_DECREF(it);
1407 return d;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001408
1409Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 Py_DECREF(it);
1411 Py_DECREF(d);
1412 return NULL;
Raymond Hettingere33d3df2002-11-27 07:29:33 +00001413}
1414
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001415static int
1416dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methname)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 PyObject *arg = NULL;
1419 int result = 0;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg))
1422 result = -1;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 else if (arg != NULL) {
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02001425 _Py_IDENTIFIER(keys);
1426 if (_PyObject_HasAttrId(arg, &PyId_keys))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 result = PyDict_Merge(self, arg, 1);
1428 else
1429 result = PyDict_MergeFromSeq2(self, arg, 1);
1430 }
1431 if (result == 0 && kwds != NULL) {
1432 if (PyArg_ValidateKeywordArguments(kwds))
1433 result = PyDict_Merge(self, kwds, 1);
1434 else
1435 result = -1;
1436 }
1437 return result;
Raymond Hettinger31017ae2004-03-04 08:25:44 +00001438}
1439
1440static PyObject *
1441dict_update(PyObject *self, PyObject *args, PyObject *kwds)
1442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 if (dict_update_common(self, args, kwds, "update") != -1)
1444 Py_RETURN_NONE;
1445 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001446}
1447
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001448/* Update unconditionally replaces existing items.
1449 Merge has a 3rd argument 'override'; if set, it acts like Update,
Tim Peters1fc240e2001-10-26 05:06:50 +00001450 otherwise it leaves existing items unchanged.
1451
1452 PyDict_{Update,Merge} update/merge from a mapping object.
1453
Tim Petersf582b822001-12-11 18:51:08 +00001454 PyDict_MergeFromSeq2 updates/merges from any iterable object
Tim Peters1fc240e2001-10-26 05:06:50 +00001455 producing iterable objects of length 2.
1456*/
1457
Tim Petersf582b822001-12-11 18:51:08 +00001458int
Tim Peters1fc240e2001-10-26 05:06:50 +00001459PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
1460{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 PyObject *it; /* iter(seq2) */
1462 Py_ssize_t i; /* index into seq2 of current element */
1463 PyObject *item; /* seq2[i] */
1464 PyObject *fast; /* item as a 2-tuple or 2-list */
Tim Peters1fc240e2001-10-26 05:06:50 +00001465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 assert(d != NULL);
1467 assert(PyDict_Check(d));
1468 assert(seq2 != NULL);
Tim Peters1fc240e2001-10-26 05:06:50 +00001469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 it = PyObject_GetIter(seq2);
1471 if (it == NULL)
1472 return -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 for (i = 0; ; ++i) {
1475 PyObject *key, *value;
1476 Py_ssize_t n;
Tim Peters1fc240e2001-10-26 05:06:50 +00001477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 fast = NULL;
1479 item = PyIter_Next(it);
1480 if (item == NULL) {
1481 if (PyErr_Occurred())
1482 goto Fail;
1483 break;
1484 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 /* Convert item to sequence, and verify length 2. */
1487 fast = PySequence_Fast(item, "");
1488 if (fast == NULL) {
1489 if (PyErr_ExceptionMatches(PyExc_TypeError))
1490 PyErr_Format(PyExc_TypeError,
1491 "cannot convert dictionary update "
1492 "sequence element #%zd to a sequence",
1493 i);
1494 goto Fail;
1495 }
1496 n = PySequence_Fast_GET_SIZE(fast);
1497 if (n != 2) {
1498 PyErr_Format(PyExc_ValueError,
1499 "dictionary update sequence element #%zd "
1500 "has length %zd; 2 is required",
1501 i, n);
1502 goto Fail;
1503 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 /* Update/merge with this (key, value) pair. */
1506 key = PySequence_Fast_GET_ITEM(fast, 0);
1507 value = PySequence_Fast_GET_ITEM(fast, 1);
1508 if (override || PyDict_GetItem(d, key) == NULL) {
1509 int status = PyDict_SetItem(d, key, value);
1510 if (status < 0)
1511 goto Fail;
1512 }
1513 Py_DECREF(fast);
1514 Py_DECREF(item);
1515 }
Tim Peters1fc240e2001-10-26 05:06:50 +00001516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 i = 0;
1518 goto Return;
Tim Peters1fc240e2001-10-26 05:06:50 +00001519Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 Py_XDECREF(item);
1521 Py_XDECREF(fast);
1522 i = -1;
Tim Peters1fc240e2001-10-26 05:06:50 +00001523Return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 Py_DECREF(it);
1525 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int);
Tim Peters1fc240e2001-10-26 05:06:50 +00001526}
1527
Tim Peters6d6c1a32001-08-02 04:15:00 +00001528int
1529PyDict_Update(PyObject *a, PyObject *b)
1530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 return PyDict_Merge(a, b, 1);
Guido van Rossum05ac6de2001-08-10 20:28:28 +00001532}
1533
1534int
1535PyDict_Merge(PyObject *a, PyObject *b, int override)
1536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 register PyDictObject *mp, *other;
1538 register Py_ssize_t i;
1539 PyDictEntry *entry;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 /* We accept for the argument either a concrete dictionary object,
1542 * or an abstract "mapping" object. For the former, we can do
1543 * things quite efficiently. For the latter, we only require that
1544 * PyMapping_Keys() and PyObject_GetItem() be supported.
1545 */
1546 if (a == NULL || !PyDict_Check(a) || b == NULL) {
1547 PyErr_BadInternalCall();
1548 return -1;
1549 }
1550 mp = (PyDictObject*)a;
1551 if (PyDict_Check(b)) {
1552 other = (PyDictObject*)b;
1553 if (other == mp || other->ma_used == 0)
1554 /* a.update(a) or a.update({}); nothing to do */
1555 return 0;
1556 if (mp->ma_used == 0)
1557 /* Since the target dict is empty, PyDict_GetItem()
1558 * always returns NULL. Setting override to 1
1559 * skips the unnecessary test.
1560 */
1561 override = 1;
1562 /* Do one big resize at the start, rather than
1563 * incrementally resizing as we insert new items. Expect
1564 * that there will be no (or few) overlapping keys.
1565 */
1566 if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
1567 if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
1568 return -1;
1569 }
1570 for (i = 0; i <= other->ma_mask; i++) {
1571 entry = &other->ma_table[i];
1572 if (entry->me_value != NULL &&
1573 (override ||
1574 PyDict_GetItem(a, entry->me_key) == NULL)) {
1575 Py_INCREF(entry->me_key);
1576 Py_INCREF(entry->me_value);
1577 if (insertdict(mp, entry->me_key,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001578 entry->me_hash,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 entry->me_value) != 0)
1580 return -1;
1581 }
1582 }
1583 }
1584 else {
1585 /* Do it the generic, slower way */
1586 PyObject *keys = PyMapping_Keys(b);
1587 PyObject *iter;
1588 PyObject *key, *value;
1589 int status;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 if (keys == NULL)
1592 /* Docstring says this is equivalent to E.keys() so
1593 * if E doesn't have a .keys() method we want
1594 * AttributeError to percolate up. Might as well
1595 * do the same for any other error.
1596 */
1597 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 iter = PyObject_GetIter(keys);
1600 Py_DECREF(keys);
1601 if (iter == NULL)
1602 return -1;
Barry Warsaw66a0d1d2001-06-26 20:08:32 +00001603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
1605 if (!override && PyDict_GetItem(a, key) != NULL) {
1606 Py_DECREF(key);
1607 continue;
1608 }
1609 value = PyObject_GetItem(b, key);
1610 if (value == NULL) {
1611 Py_DECREF(iter);
1612 Py_DECREF(key);
1613 return -1;
1614 }
1615 status = PyDict_SetItem(a, key, value);
1616 Py_DECREF(key);
1617 Py_DECREF(value);
1618 if (status < 0) {
1619 Py_DECREF(iter);
1620 return -1;
1621 }
1622 }
1623 Py_DECREF(iter);
1624 if (PyErr_Occurred())
1625 /* Iterator completed, via error */
1626 return -1;
1627 }
1628 return 0;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001629}
1630
1631static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001632dict_copy(register PyDictObject *mp)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 return PyDict_Copy((PyObject*)mp);
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001635}
1636
1637PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001638PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001639{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 PyObject *copy;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +00001641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 if (o == NULL || !PyDict_Check(o)) {
1643 PyErr_BadInternalCall();
1644 return NULL;
1645 }
1646 copy = PyDict_New();
1647 if (copy == NULL)
1648 return NULL;
1649 if (PyDict_Merge(copy, o, 1) == 0)
1650 return copy;
1651 Py_DECREF(copy);
1652 return NULL;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001653}
1654
Martin v. Löwis18e16552006-02-15 17:27:45 +00001655Py_ssize_t
Tim Peters1f5871e2000-07-04 17:44:48 +00001656PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +00001657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 if (mp == NULL || !PyDict_Check(mp)) {
1659 PyErr_BadInternalCall();
1660 return -1;
1661 }
1662 return ((PyDictObject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +00001663}
1664
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001666PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 if (mp == NULL || !PyDict_Check(mp)) {
1669 PyErr_BadInternalCall();
1670 return NULL;
1671 }
1672 return dict_keys((PyDictObject *)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001673}
1674
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001675PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001676PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001677{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 if (mp == NULL || !PyDict_Check(mp)) {
1679 PyErr_BadInternalCall();
1680 return NULL;
1681 }
1682 return dict_values((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001683}
1684
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001685PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001686PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +00001687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 if (mp == NULL || !PyDict_Check(mp)) {
1689 PyErr_BadInternalCall();
1690 return NULL;
1691 }
1692 return dict_items((PyDictObject *)mp);
Guido van Rossum25831651993-05-19 14:50:45 +00001693}
1694
Tim Peterse63415e2001-05-08 04:38:29 +00001695/* Return 1 if dicts equal, 0 if not, -1 if error.
1696 * Gets out as soon as any difference is detected.
1697 * Uses only Py_EQ comparison.
1698 */
1699static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001700dict_equal(PyDictObject *a, PyDictObject *b)
Tim Peterse63415e2001-05-08 04:38:29 +00001701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 Py_ssize_t i;
Tim Peterse63415e2001-05-08 04:38:29 +00001703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 if (a->ma_used != b->ma_used)
1705 /* can't be equal if # of entries differ */
1706 return 0;
Tim Peterseb28ef22001-06-02 05:27:19 +00001707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 /* Same # of entries -- check all of 'em. Exit early on any diff. */
1709 for (i = 0; i <= a->ma_mask; i++) {
1710 PyObject *aval = a->ma_table[i].me_value;
1711 if (aval != NULL) {
1712 int cmp;
1713 PyObject *bval;
1714 PyObject *key = a->ma_table[i].me_key;
1715 /* temporarily bump aval's refcount to ensure it stays
1716 alive until we're done with it */
1717 Py_INCREF(aval);
1718 /* ditto for key */
1719 Py_INCREF(key);
1720 bval = PyDict_GetItemWithError((PyObject *)b, key);
1721 Py_DECREF(key);
1722 if (bval == NULL) {
1723 Py_DECREF(aval);
1724 if (PyErr_Occurred())
1725 return -1;
1726 return 0;
1727 }
1728 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
1729 Py_DECREF(aval);
1730 if (cmp <= 0) /* error or not equal */
1731 return cmp;
1732 }
1733 }
1734 return 1;
Tim Peterse63415e2001-05-08 04:38:29 +00001735 }
1736
1737static PyObject *
1738dict_richcompare(PyObject *v, PyObject *w, int op)
1739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 int cmp;
1741 PyObject *res;
Tim Peterse63415e2001-05-08 04:38:29 +00001742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 if (!PyDict_Check(v) || !PyDict_Check(w)) {
1744 res = Py_NotImplemented;
1745 }
1746 else if (op == Py_EQ || op == Py_NE) {
1747 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w);
1748 if (cmp < 0)
1749 return NULL;
1750 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False;
1751 }
1752 else
1753 res = Py_NotImplemented;
1754 Py_INCREF(res);
1755 return res;
Tim Peterse63415e2001-05-08 04:38:29 +00001756 }
1757
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001758static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001759dict_contains(register PyDictObject *mp, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001760{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001761 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 PyDictEntry *ep;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001765 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 hash = PyObject_Hash(key);
1767 if (hash == -1)
1768 return NULL;
1769 }
1770 ep = (mp->ma_lookup)(mp, key, hash);
1771 if (ep == NULL)
1772 return NULL;
1773 return PyBool_FromLong(ep->me_value != NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001774}
1775
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001776static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001777dict_get(register PyDictObject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001778{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 PyObject *key;
1780 PyObject *failobj = Py_None;
1781 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001782 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 PyDictEntry *ep;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
1786 return NULL;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001789 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 hash = PyObject_Hash(key);
1791 if (hash == -1)
1792 return NULL;
1793 }
1794 ep = (mp->ma_lookup)(mp, key, hash);
1795 if (ep == NULL)
1796 return NULL;
1797 val = ep->me_value;
1798 if (val == NULL)
1799 val = failobj;
1800 Py_INCREF(val);
1801 return val;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001802}
1803
1804
1805static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001806dict_setdefault(register PyDictObject *mp, PyObject *args)
Guido van Rossum164452c2000-08-08 16:12:54 +00001807{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 PyObject *key;
1809 PyObject *failobj = Py_None;
1810 PyObject *val = NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001811 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 PyDictEntry *ep;
Guido van Rossum164452c2000-08-08 16:12:54 +00001813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
1815 return NULL;
Guido van Rossum164452c2000-08-08 16:12:54 +00001816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001818 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 hash = PyObject_Hash(key);
1820 if (hash == -1)
1821 return NULL;
1822 }
1823 ep = (mp->ma_lookup)(mp, key, hash);
1824 if (ep == NULL)
1825 return NULL;
1826 val = ep->me_value;
1827 if (val == NULL) {
Antoine Pitroue965d972012-02-27 00:45:12 +01001828 if (dict_set_item_by_hash_or_entry((PyObject*)mp, key, hash, ep,
1829 failobj) == 0)
1830 val = failobj;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 }
1832 Py_XINCREF(val);
1833 return val;
Guido van Rossum164452c2000-08-08 16:12:54 +00001834}
1835
1836
1837static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001838dict_clear(register PyDictObject *mp)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001839{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 PyDict_Clear((PyObject *)mp);
1841 Py_RETURN_NONE;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001842}
1843
Guido van Rossumba6ab842000-12-12 22:02:18 +00001844static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001845dict_pop(PyDictObject *mp, PyObject *args)
Guido van Rossume027d982002-04-12 15:11:59 +00001846{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001847 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 PyDictEntry *ep;
1849 PyObject *old_value, *old_key;
1850 PyObject *key, *deflt = NULL;
Guido van Rossume027d982002-04-12 15:11:59 +00001851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
1853 return NULL;
1854 if (mp->ma_used == 0) {
1855 if (deflt) {
1856 Py_INCREF(deflt);
1857 return deflt;
1858 }
Raymond Hettingerdd421542010-10-30 08:10:29 +00001859 set_key_error(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 return NULL;
1861 }
1862 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001863 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 hash = PyObject_Hash(key);
1865 if (hash == -1)
1866 return NULL;
1867 }
1868 ep = (mp->ma_lookup)(mp, key, hash);
1869 if (ep == NULL)
1870 return NULL;
1871 if (ep->me_value == NULL) {
1872 if (deflt) {
1873 Py_INCREF(deflt);
1874 return deflt;
1875 }
1876 set_key_error(key);
1877 return NULL;
1878 }
1879 old_key = ep->me_key;
1880 Py_INCREF(dummy);
1881 ep->me_key = dummy;
1882 old_value = ep->me_value;
1883 ep->me_value = NULL;
1884 mp->ma_used--;
1885 Py_DECREF(old_key);
1886 return old_value;
Guido van Rossume027d982002-04-12 15:11:59 +00001887}
1888
1889static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001890dict_popitem(PyDictObject *mp)
Guido van Rossumba6ab842000-12-12 22:02:18 +00001891{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001892 Py_hash_t i = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 PyDictEntry *ep;
1894 PyObject *res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 /* Allocate the result tuple before checking the size. Believe it
1897 * or not, this allocation could trigger a garbage collection which
1898 * could empty the dict, so if we checked the size first and that
1899 * happened, the result would be an infinite loop (searching for an
1900 * entry that no longer exists). Note that the usual popitem()
1901 * idiom is "while d: k, v = d.popitem()". so needing to throw the
1902 * tuple away if the dict *is* empty isn't a significant
1903 * inefficiency -- possible, but unlikely in practice.
1904 */
1905 res = PyTuple_New(2);
1906 if (res == NULL)
1907 return NULL;
1908 if (mp->ma_used == 0) {
1909 Py_DECREF(res);
1910 PyErr_SetString(PyExc_KeyError,
1911 "popitem(): dictionary is empty");
1912 return NULL;
1913 }
1914 /* Set ep to "the first" dict entry with a value. We abuse the hash
1915 * field of slot 0 to hold a search finger:
1916 * If slot 0 has a value, use slot 0.
1917 * Else slot 0 is being used to hold a search finger,
1918 * and we use its hash value as the first index to look.
1919 */
1920 ep = &mp->ma_table[0];
1921 if (ep->me_value == NULL) {
1922 i = ep->me_hash;
1923 /* The hash field may be a real hash value, or it may be a
1924 * legit search finger, or it may be a once-legit search
1925 * finger that's out of bounds now because it wrapped around
1926 * or the table shrunk -- simply make sure it's in bounds now.
1927 */
1928 if (i > mp->ma_mask || i < 1)
1929 i = 1; /* skip slot 0 */
1930 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1931 i++;
1932 if (i > mp->ma_mask)
1933 i = 1;
1934 }
1935 }
1936 PyTuple_SET_ITEM(res, 0, ep->me_key);
1937 PyTuple_SET_ITEM(res, 1, ep->me_value);
1938 Py_INCREF(dummy);
1939 ep->me_key = dummy;
1940 ep->me_value = NULL;
1941 mp->ma_used--;
1942 assert(mp->ma_table[0].me_value == NULL);
1943 mp->ma_table[0].me_hash = i + 1; /* next place to start */
1944 return res;
Guido van Rossumba6ab842000-12-12 22:02:18 +00001945}
1946
Jeremy Hylton8caad492000-06-23 14:18:11 +00001947static int
1948dict_traverse(PyObject *op, visitproc visit, void *arg)
1949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 Py_ssize_t i = 0;
1951 PyObject *pk;
1952 PyObject *pv;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 while (PyDict_Next(op, &i, &pk, &pv)) {
1955 Py_VISIT(pk);
1956 Py_VISIT(pv);
1957 }
1958 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001959}
1960
1961static int
1962dict_tp_clear(PyObject *op)
1963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 PyDict_Clear(op);
1965 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001966}
1967
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001968static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
Guido van Rossum09e563a2001-05-01 12:10:21 +00001969
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001970static PyObject *
1971dict_sizeof(PyDictObject *mp)
1972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 res = sizeof(PyDictObject);
1976 if (mp->ma_table != mp->ma_smalltable)
1977 res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry);
1978 return PyLong_FromSsize_t(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001979}
1980
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001981PyDoc_STRVAR(contains__doc__,
1982"D.__contains__(k) -> True if D has a key k, else False");
1983
1984PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
1985
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001986PyDoc_STRVAR(sizeof__doc__,
1987"D.__sizeof__() -> size of D in memory, in bytes");
1988
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001989PyDoc_STRVAR(get__doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001990"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.");
Tim Petersf7f88b12000-12-13 23:18:45 +00001991
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001992PyDoc_STRVAR(setdefault_doc__,
Guido van Rossumefae8862002-09-04 11:29:45 +00001993"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 +00001994
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001995PyDoc_STRVAR(pop__doc__,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001996"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
Raymond Hettingera3e1e4c2003-03-06 23:54:28 +00001997If key is not found, d is returned if given, otherwise KeyError is raised");
Guido van Rossume027d982002-04-12 15:11:59 +00001998
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001999PyDoc_STRVAR(popitem__doc__,
Tim Petersf7f88b12000-12-13 23:18:45 +00002000"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000020012-tuple; but raise KeyError if D is empty.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002002
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002003PyDoc_STRVAR(update__doc__,
Georg Brandlac0675c2011-12-18 19:30:55 +01002004"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n"
2005"If E present and has a .keys() method, does: for k in E: D[k] = E[k]\n\
2006If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00002007In either case, this is followed by: for k in F: D[k] = F[k]");
Tim Petersf7f88b12000-12-13 23:18:45 +00002008
Raymond Hettingere33d3df2002-11-27 07:29:33 +00002009PyDoc_STRVAR(fromkeys__doc__,
2010"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
2011v defaults to None.");
2012
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002013PyDoc_STRVAR(clear__doc__,
2014"D.clear() -> None. Remove all items from D.");
Tim Petersf7f88b12000-12-13 23:18:45 +00002015
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002016PyDoc_STRVAR(copy__doc__,
2017"D.copy() -> a shallow copy of D");
Tim Petersf7f88b12000-12-13 23:18:45 +00002018
Guido van Rossumb90c8482007-02-10 01:11:45 +00002019/* Forward */
2020static PyObject *dictkeys_new(PyObject *);
2021static PyObject *dictitems_new(PyObject *);
2022static PyObject *dictvalues_new(PyObject *);
2023
Guido van Rossum45c85d12007-07-27 16:31:40 +00002024PyDoc_STRVAR(keys__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 "D.keys() -> a set-like object providing a view on D's keys");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002026PyDoc_STRVAR(items__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 "D.items() -> a set-like object providing a view on D's items");
Guido van Rossum45c85d12007-07-27 16:31:40 +00002028PyDoc_STRVAR(values__doc__,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 "D.values() -> an object providing a view on D's values");
Guido van Rossumb90c8482007-02-10 01:11:45 +00002030
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002031static PyMethodDef mapp_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 {"__contains__",(PyCFunction)dict_contains, METH_O | METH_COEXIST,
2033 contains__doc__},
2034 {"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
2035 getitem__doc__},
2036 {"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
2037 sizeof__doc__},
2038 {"get", (PyCFunction)dict_get, METH_VARARGS,
2039 get__doc__},
2040 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
2041 setdefault_doc__},
2042 {"pop", (PyCFunction)dict_pop, METH_VARARGS,
2043 pop__doc__},
2044 {"popitem", (PyCFunction)dict_popitem, METH_NOARGS,
2045 popitem__doc__},
2046 {"keys", (PyCFunction)dictkeys_new, METH_NOARGS,
2047 keys__doc__},
2048 {"items", (PyCFunction)dictitems_new, METH_NOARGS,
2049 items__doc__},
2050 {"values", (PyCFunction)dictvalues_new, METH_NOARGS,
2051 values__doc__},
2052 {"update", (PyCFunction)dict_update, METH_VARARGS | METH_KEYWORDS,
2053 update__doc__},
2054 {"fromkeys", (PyCFunction)dict_fromkeys, METH_VARARGS | METH_CLASS,
2055 fromkeys__doc__},
2056 {"clear", (PyCFunction)dict_clear, METH_NOARGS,
2057 clear__doc__},
2058 {"copy", (PyCFunction)dict_copy, METH_NOARGS,
2059 copy__doc__},
2060 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002061};
2062
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002063/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */
Raymond Hettingerbc0f2ab2003-11-25 21:12:14 +00002064int
2065PyDict_Contains(PyObject *op, PyObject *key)
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002066{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002067 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 PyDictObject *mp = (PyDictObject *)op;
2069 PyDictEntry *ep;
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002072 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 hash = PyObject_Hash(key);
2074 if (hash == -1)
2075 return -1;
2076 }
2077 ep = (mp->ma_lookup)(mp, key, hash);
2078 return ep == NULL ? -1 : (ep->me_value != NULL);
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002079}
2080
Thomas Wouterscf297e42007-02-23 15:07:44 +00002081/* Internal version of PyDict_Contains used when the hash value is already known */
2082int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002083_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 PyDictObject *mp = (PyDictObject *)op;
2086 PyDictEntry *ep;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 ep = (mp->ma_lookup)(mp, key, hash);
2089 return ep == NULL ? -1 : (ep->me_value != NULL);
Thomas Wouterscf297e42007-02-23 15:07:44 +00002090}
2091
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002092/* Hack to implement "key in dict" */
2093static PySequenceMethods dict_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 0, /* sq_length */
2095 0, /* sq_concat */
2096 0, /* sq_repeat */
2097 0, /* sq_item */
2098 0, /* sq_slice */
2099 0, /* sq_ass_item */
2100 0, /* sq_ass_slice */
2101 PyDict_Contains, /* sq_contains */
2102 0, /* sq_inplace_concat */
2103 0, /* sq_inplace_repeat */
Guido van Rossum0dbb4fb2001-04-20 16:50:40 +00002104};
2105
Guido van Rossum09e563a2001-05-01 12:10:21 +00002106static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002107dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 PyObject *self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 assert(type != NULL && type->tp_alloc != NULL);
2112 self = type->tp_alloc(type, 0);
2113 if (self != NULL) {
2114 PyDictObject *d = (PyDictObject *)self;
2115 /* It's guaranteed that tp->alloc zeroed out the struct. */
2116 assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
2117 INIT_NONZERO_DICT_SLOTS(d);
2118 d->ma_lookup = lookdict_unicode;
Ezio Melotti13925002011-03-16 11:05:33 +02002119 /* The object has been implicitly tracked by tp_alloc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 if (type == &PyDict_Type)
2121 _PyObject_GC_UNTRACK(d);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002122#ifdef SHOW_CONVERSION_COUNTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 ++created;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002124#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002125#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 if (_PyObject_GC_IS_TRACKED(d))
2127 count_tracked++;
2128 else
2129 count_untracked++;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00002130#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 }
2132 return self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002133}
2134
Tim Peters25786c02001-09-02 08:22:48 +00002135static int
2136dict_init(PyObject *self, PyObject *args, PyObject *kwds)
2137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 return dict_update_common(self, args, kwds, "dict");
Tim Peters25786c02001-09-02 08:22:48 +00002139}
2140
Tim Peters6d6c1a32001-08-02 04:15:00 +00002141static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002142dict_iter(PyDictObject *dict)
Guido van Rossum09e563a2001-05-01 12:10:21 +00002143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 return dictiter_new(dict, &PyDictIterKey_Type);
Guido van Rossum09e563a2001-05-01 12:10:21 +00002145}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002146
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002147PyDoc_STRVAR(dictionary_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002148"dict() -> new empty dictionary\n"
Tim Petersa427a2b2001-10-29 22:25:45 +00002149"dict(mapping) -> new dictionary initialized from a mapping object's\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002150" (key, value) pairs\n"
2151"dict(iterable) -> new dictionary initialized as if via:\n"
Tim Peters4d859532001-10-27 18:27:48 +00002152" d = {}\n"
Ezio Melotti7f807b72010-03-01 04:08:34 +00002153" for k, v in iterable:\n"
Just van Rossuma797d812002-11-23 09:45:04 +00002154" d[k] = v\n"
2155"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n"
2156" in the keyword argument list. For example: dict(one=1, two=2)");
Tim Peters25786c02001-09-02 08:22:48 +00002157
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002158PyTypeObject PyDict_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2160 "dict",
2161 sizeof(PyDictObject),
2162 0,
2163 (destructor)dict_dealloc, /* tp_dealloc */
2164 0, /* tp_print */
2165 0, /* tp_getattr */
2166 0, /* tp_setattr */
2167 0, /* tp_reserved */
2168 (reprfunc)dict_repr, /* tp_repr */
2169 0, /* tp_as_number */
2170 &dict_as_sequence, /* tp_as_sequence */
2171 &dict_as_mapping, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002172 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 0, /* tp_call */
2174 0, /* tp_str */
2175 PyObject_GenericGetAttr, /* tp_getattro */
2176 0, /* tp_setattro */
2177 0, /* tp_as_buffer */
2178 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2179 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, /* tp_flags */
2180 dictionary_doc, /* tp_doc */
2181 dict_traverse, /* tp_traverse */
2182 dict_tp_clear, /* tp_clear */
2183 dict_richcompare, /* tp_richcompare */
2184 0, /* tp_weaklistoffset */
2185 (getiterfunc)dict_iter, /* tp_iter */
2186 0, /* tp_iternext */
2187 mapp_methods, /* tp_methods */
2188 0, /* tp_members */
2189 0, /* tp_getset */
2190 0, /* tp_base */
2191 0, /* tp_dict */
2192 0, /* tp_descr_get */
2193 0, /* tp_descr_set */
2194 0, /* tp_dictoffset */
2195 dict_init, /* tp_init */
2196 PyType_GenericAlloc, /* tp_alloc */
2197 dict_new, /* tp_new */
2198 PyObject_GC_Del, /* tp_free */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002199};
2200
Victor Stinner3c1e4812012-03-26 22:10:51 +02002201PyObject *
2202_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
2203{
2204 PyObject *kv;
2205 kv = _PyUnicode_FromId(key); /* borrowed */
2206 if (kv == NULL)
2207 return NULL;
2208 return PyDict_GetItem(dp, kv);
2209}
2210
Guido van Rossum3cca2451997-05-16 14:23:33 +00002211/* For backward compatibility with old dictionary interface */
2212
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002213PyObject *
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002214PyDict_GetItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 PyObject *kv, *rv;
2217 kv = PyUnicode_FromString(key);
2218 if (kv == NULL)
2219 return NULL;
2220 rv = PyDict_GetItem(v, kv);
2221 Py_DECREF(kv);
2222 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002223}
2224
2225int
Victor Stinner3c1e4812012-03-26 22:10:51 +02002226_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
2227{
2228 PyObject *kv;
2229 kv = _PyUnicode_FromId(key); /* borrowed */
2230 if (kv == NULL)
2231 return -1;
2232 return PyDict_SetItem(v, kv, item);
2233}
2234
2235int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002236PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 PyObject *kv;
2239 int err;
2240 kv = PyUnicode_FromString(key);
2241 if (kv == NULL)
2242 return -1;
2243 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
2244 err = PyDict_SetItem(v, kv, item);
2245 Py_DECREF(kv);
2246 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002247}
2248
2249int
Martin v. Löwis32b4a1b2002-12-11 13:21:12 +00002250PyDict_DelItemString(PyObject *v, const char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 PyObject *kv;
2253 int err;
2254 kv = PyUnicode_FromString(key);
2255 if (kv == NULL)
2256 return -1;
2257 err = PyDict_DelItem(v, kv);
2258 Py_DECREF(kv);
2259 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00002260}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002261
Raymond Hettinger019a1482004-03-18 02:41:19 +00002262/* Dictionary iterator types */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002263
2264typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 PyObject_HEAD
2266 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */
2267 Py_ssize_t di_used;
2268 Py_ssize_t di_pos;
2269 PyObject* di_result; /* reusable result tuple for iteritems */
2270 Py_ssize_t len;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002271} dictiterobject;
2272
2273static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002274dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 dictiterobject *di;
2277 di = PyObject_GC_New(dictiterobject, itertype);
2278 if (di == NULL)
2279 return NULL;
2280 Py_INCREF(dict);
2281 di->di_dict = dict;
2282 di->di_used = dict->ma_used;
2283 di->di_pos = 0;
2284 di->len = dict->ma_used;
2285 if (itertype == &PyDictIterItem_Type) {
2286 di->di_result = PyTuple_Pack(2, Py_None, Py_None);
2287 if (di->di_result == NULL) {
2288 Py_DECREF(di);
2289 return NULL;
2290 }
2291 }
2292 else
2293 di->di_result = NULL;
2294 _PyObject_GC_TRACK(di);
2295 return (PyObject *)di;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002296}
2297
2298static void
2299dictiter_dealloc(dictiterobject *di)
2300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 Py_XDECREF(di->di_dict);
2302 Py_XDECREF(di->di_result);
2303 PyObject_GC_Del(di);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002304}
2305
2306static int
2307dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
2308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 Py_VISIT(di->di_dict);
2310 Py_VISIT(di->di_result);
2311 return 0;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002312}
2313
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002314static PyObject *
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002315dictiter_len(dictiterobject *di)
2316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 Py_ssize_t len = 0;
2318 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used)
2319 len = di->len;
2320 return PyLong_FromSize_t(len);
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002321}
2322
Guido van Rossumb90c8482007-02-10 01:11:45 +00002323PyDoc_STRVAR(length_hint_doc,
2324 "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002325
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002326static PyObject *
2327dictiter_reduce(dictiterobject *di);
2328
2329PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2330
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00002331static PyMethodDef dictiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 {"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
2333 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002334 {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
2335 reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 {NULL, NULL} /* sentinel */
Raymond Hettinger0ce6dc82004-03-18 08:38:00 +00002337};
2338
Raymond Hettinger019a1482004-03-18 02:41:19 +00002339static PyObject *dictiter_iternextkey(dictiterobject *di)
Guido van Rossum213c7a62001-04-23 14:08:49 +00002340{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 PyObject *key;
2342 register Py_ssize_t i, mask;
2343 register PyDictEntry *ep;
2344 PyDictObject *d = di->di_dict;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 if (d == NULL)
2347 return NULL;
2348 assert (PyDict_Check(d));
Guido van Rossum2147df72002-07-16 20:30:22 +00002349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 if (di->di_used != d->ma_used) {
2351 PyErr_SetString(PyExc_RuntimeError,
2352 "dictionary changed size during iteration");
2353 di->di_used = -1; /* Make this state sticky */
2354 return NULL;
2355 }
Guido van Rossum2147df72002-07-16 20:30:22 +00002356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 i = di->di_pos;
2358 if (i < 0)
2359 goto fail;
2360 ep = d->ma_table;
2361 mask = d->ma_mask;
2362 while (i <= mask && ep[i].me_value == NULL)
2363 i++;
2364 di->di_pos = i+1;
2365 if (i > mask)
2366 goto fail;
2367 di->len--;
2368 key = ep[i].me_key;
2369 Py_INCREF(key);
2370 return key;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002371
2372fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 Py_DECREF(d);
2374 di->di_dict = NULL;
2375 return NULL;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002376}
2377
Raymond Hettinger019a1482004-03-18 02:41:19 +00002378PyTypeObject PyDictIterKey_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2380 "dict_keyiterator", /* tp_name */
2381 sizeof(dictiterobject), /* tp_basicsize */
2382 0, /* tp_itemsize */
2383 /* methods */
2384 (destructor)dictiter_dealloc, /* tp_dealloc */
2385 0, /* tp_print */
2386 0, /* tp_getattr */
2387 0, /* tp_setattr */
2388 0, /* tp_reserved */
2389 0, /* tp_repr */
2390 0, /* tp_as_number */
2391 0, /* tp_as_sequence */
2392 0, /* tp_as_mapping */
2393 0, /* tp_hash */
2394 0, /* tp_call */
2395 0, /* tp_str */
2396 PyObject_GenericGetAttr, /* tp_getattro */
2397 0, /* tp_setattro */
2398 0, /* tp_as_buffer */
2399 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2400 0, /* tp_doc */
2401 (traverseproc)dictiter_traverse, /* tp_traverse */
2402 0, /* tp_clear */
2403 0, /* tp_richcompare */
2404 0, /* tp_weaklistoffset */
2405 PyObject_SelfIter, /* tp_iter */
2406 (iternextfunc)dictiter_iternextkey, /* tp_iternext */
2407 dictiter_methods, /* tp_methods */
2408 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002409};
2410
2411static PyObject *dictiter_iternextvalue(dictiterobject *di)
2412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 PyObject *value;
2414 register Py_ssize_t i, mask;
2415 register PyDictEntry *ep;
2416 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 if (d == NULL)
2419 return NULL;
2420 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 if (di->di_used != d->ma_used) {
2423 PyErr_SetString(PyExc_RuntimeError,
2424 "dictionary changed size during iteration");
2425 di->di_used = -1; /* Make this state sticky */
2426 return NULL;
2427 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 i = di->di_pos;
2430 mask = d->ma_mask;
2431 if (i < 0 || i > mask)
2432 goto fail;
2433 ep = d->ma_table;
2434 while ((value=ep[i].me_value) == NULL) {
2435 i++;
2436 if (i > mask)
2437 goto fail;
2438 }
2439 di->di_pos = i+1;
2440 di->len--;
2441 Py_INCREF(value);
2442 return value;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002443
2444fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 Py_DECREF(d);
2446 di->di_dict = NULL;
2447 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002448}
2449
2450PyTypeObject PyDictIterValue_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2452 "dict_valueiterator", /* tp_name */
2453 sizeof(dictiterobject), /* tp_basicsize */
2454 0, /* tp_itemsize */
2455 /* methods */
2456 (destructor)dictiter_dealloc, /* tp_dealloc */
2457 0, /* tp_print */
2458 0, /* tp_getattr */
2459 0, /* tp_setattr */
2460 0, /* tp_reserved */
2461 0, /* tp_repr */
2462 0, /* tp_as_number */
2463 0, /* tp_as_sequence */
2464 0, /* tp_as_mapping */
2465 0, /* tp_hash */
2466 0, /* tp_call */
2467 0, /* tp_str */
2468 PyObject_GenericGetAttr, /* tp_getattro */
2469 0, /* tp_setattro */
2470 0, /* tp_as_buffer */
2471 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2472 0, /* tp_doc */
2473 (traverseproc)dictiter_traverse, /* tp_traverse */
2474 0, /* tp_clear */
2475 0, /* tp_richcompare */
2476 0, /* tp_weaklistoffset */
2477 PyObject_SelfIter, /* tp_iter */
2478 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */
2479 dictiter_methods, /* tp_methods */
2480 0,
Raymond Hettinger019a1482004-03-18 02:41:19 +00002481};
2482
2483static PyObject *dictiter_iternextitem(dictiterobject *di)
2484{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 PyObject *key, *value, *result = di->di_result;
2486 register Py_ssize_t i, mask;
2487 register PyDictEntry *ep;
2488 PyDictObject *d = di->di_dict;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 if (d == NULL)
2491 return NULL;
2492 assert (PyDict_Check(d));
Raymond Hettinger019a1482004-03-18 02:41:19 +00002493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 if (di->di_used != d->ma_used) {
2495 PyErr_SetString(PyExc_RuntimeError,
2496 "dictionary changed size during iteration");
2497 di->di_used = -1; /* Make this state sticky */
2498 return NULL;
2499 }
Raymond Hettinger019a1482004-03-18 02:41:19 +00002500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 i = di->di_pos;
2502 if (i < 0)
2503 goto fail;
2504 ep = d->ma_table;
2505 mask = d->ma_mask;
2506 while (i <= mask && ep[i].me_value == NULL)
2507 i++;
2508 di->di_pos = i+1;
2509 if (i > mask)
2510 goto fail;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 if (result->ob_refcnt == 1) {
2513 Py_INCREF(result);
2514 Py_DECREF(PyTuple_GET_ITEM(result, 0));
2515 Py_DECREF(PyTuple_GET_ITEM(result, 1));
2516 } else {
2517 result = PyTuple_New(2);
2518 if (result == NULL)
2519 return NULL;
2520 }
2521 di->len--;
2522 key = ep[i].me_key;
2523 value = ep[i].me_value;
2524 Py_INCREF(key);
2525 Py_INCREF(value);
2526 PyTuple_SET_ITEM(result, 0, key);
2527 PyTuple_SET_ITEM(result, 1, value);
2528 return result;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002529
2530fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 Py_DECREF(d);
2532 di->di_dict = NULL;
2533 return NULL;
Raymond Hettinger019a1482004-03-18 02:41:19 +00002534}
2535
2536PyTypeObject PyDictIterItem_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2538 "dict_itemiterator", /* tp_name */
2539 sizeof(dictiterobject), /* tp_basicsize */
2540 0, /* tp_itemsize */
2541 /* methods */
2542 (destructor)dictiter_dealloc, /* tp_dealloc */
2543 0, /* tp_print */
2544 0, /* tp_getattr */
2545 0, /* tp_setattr */
2546 0, /* tp_reserved */
2547 0, /* tp_repr */
2548 0, /* tp_as_number */
2549 0, /* tp_as_sequence */
2550 0, /* tp_as_mapping */
2551 0, /* tp_hash */
2552 0, /* tp_call */
2553 0, /* tp_str */
2554 PyObject_GenericGetAttr, /* tp_getattro */
2555 0, /* tp_setattro */
2556 0, /* tp_as_buffer */
2557 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2558 0, /* tp_doc */
2559 (traverseproc)dictiter_traverse, /* tp_traverse */
2560 0, /* tp_clear */
2561 0, /* tp_richcompare */
2562 0, /* tp_weaklistoffset */
2563 PyObject_SelfIter, /* tp_iter */
2564 (iternextfunc)dictiter_iternextitem, /* tp_iternext */
2565 dictiter_methods, /* tp_methods */
2566 0,
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002567};
Guido van Rossumb90c8482007-02-10 01:11:45 +00002568
2569
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002570static PyObject *
2571dictiter_reduce(dictiterobject *di)
2572{
2573 PyObject *list;
2574 dictiterobject tmp;
2575
2576 list = PyList_New(0);
2577 if (!list)
2578 return NULL;
2579
2580 /* copy the itertor state */
2581 tmp = *di;
2582 Py_XINCREF(tmp.di_dict);
2583
2584 /* iterate the temporary into a list */
2585 for(;;) {
2586 PyObject *element = 0;
2587 if (Py_TYPE(di) == &PyDictIterItem_Type)
2588 element = dictiter_iternextitem(&tmp);
2589 else if (Py_TYPE(di) == &PyDictIterKey_Type)
2590 element = dictiter_iternextkey(&tmp);
2591 else if (Py_TYPE(di) == &PyDictIterValue_Type)
2592 element = dictiter_iternextvalue(&tmp);
2593 else
2594 assert(0);
2595 if (element) {
2596 if (PyList_Append(list, element)) {
2597 Py_DECREF(element);
2598 Py_DECREF(list);
2599 Py_XDECREF(tmp.di_dict);
2600 return NULL;
2601 }
2602 Py_DECREF(element);
2603 } else
2604 break;
2605 }
2606 Py_XDECREF(tmp.di_dict);
2607 /* check for error */
2608 if (tmp.di_dict != NULL) {
2609 /* we have an error */
2610 Py_DECREF(list);
2611 return NULL;
2612 }
Antoine Pitroua7013882012-04-05 00:04:20 +02002613 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002614}
2615
Guido van Rossum3ac67412007-02-10 18:55:06 +00002616/***********************************************/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002617/* View objects for keys(), items(), values(). */
Guido van Rossum3ac67412007-02-10 18:55:06 +00002618/***********************************************/
2619
Guido van Rossumb90c8482007-02-10 01:11:45 +00002620/* The instance lay-out is the same for all three; but the type differs. */
2621
2622typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 PyObject_HEAD
2624 PyDictObject *dv_dict;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002625} dictviewobject;
2626
2627
2628static void
Guido van Rossum3ac67412007-02-10 18:55:06 +00002629dictview_dealloc(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002630{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 Py_XDECREF(dv->dv_dict);
2632 PyObject_GC_Del(dv);
Antoine Pitrou7ddda782009-01-01 15:35:33 +00002633}
2634
2635static int
2636dictview_traverse(dictviewobject *dv, visitproc visit, void *arg)
2637{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 Py_VISIT(dv->dv_dict);
2639 return 0;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002640}
2641
Guido van Rossum83825ac2007-02-10 04:54:19 +00002642static Py_ssize_t
Guido van Rossum3ac67412007-02-10 18:55:06 +00002643dictview_len(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 Py_ssize_t len = 0;
2646 if (dv->dv_dict != NULL)
2647 len = dv->dv_dict->ma_used;
2648 return len;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002649}
2650
2651static PyObject *
2652dictview_new(PyObject *dict, PyTypeObject *type)
2653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 dictviewobject *dv;
2655 if (dict == NULL) {
2656 PyErr_BadInternalCall();
2657 return NULL;
2658 }
2659 if (!PyDict_Check(dict)) {
2660 /* XXX Get rid of this restriction later */
2661 PyErr_Format(PyExc_TypeError,
2662 "%s() requires a dict argument, not '%s'",
2663 type->tp_name, dict->ob_type->tp_name);
2664 return NULL;
2665 }
2666 dv = PyObject_GC_New(dictviewobject, type);
2667 if (dv == NULL)
2668 return NULL;
2669 Py_INCREF(dict);
2670 dv->dv_dict = (PyDictObject *)dict;
2671 _PyObject_GC_TRACK(dv);
2672 return (PyObject *)dv;
Guido van Rossumb90c8482007-02-10 01:11:45 +00002673}
2674
Neal Norwitze36f2ba2007-02-26 23:12:28 +00002675/* TODO(guido): The views objects are not complete:
2676
2677 * support more set operations
2678 * support arbitrary mappings?
2679 - either these should be static or exported in dictobject.h
2680 - if public then they should probably be in builtins
2681*/
2682
Guido van Rossumaac530c2007-08-24 22:33:45 +00002683/* Return 1 if self is a subset of other, iterating over self;
2684 0 if not; -1 if an error occurred. */
Guido van Rossumd9214d12007-02-12 02:23:40 +00002685static int
2686all_contained_in(PyObject *self, PyObject *other)
2687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 PyObject *iter = PyObject_GetIter(self);
2689 int ok = 1;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002691 if (iter == NULL)
2692 return -1;
2693 for (;;) {
2694 PyObject *next = PyIter_Next(iter);
2695 if (next == NULL) {
2696 if (PyErr_Occurred())
2697 ok = -1;
2698 break;
2699 }
2700 ok = PySequence_Contains(other, next);
2701 Py_DECREF(next);
2702 if (ok <= 0)
2703 break;
2704 }
2705 Py_DECREF(iter);
2706 return ok;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002707}
2708
2709static PyObject *
2710dictview_richcompare(PyObject *self, PyObject *other, int op)
2711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 Py_ssize_t len_self, len_other;
2713 int ok;
2714 PyObject *result;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 assert(self != NULL);
2717 assert(PyDictViewSet_Check(self));
2718 assert(other != NULL);
Guido van Rossumd9214d12007-02-12 02:23:40 +00002719
Brian Curtindfc80e32011-08-10 20:28:54 -05002720 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
2721 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 len_self = PyObject_Size(self);
2724 if (len_self < 0)
2725 return NULL;
2726 len_other = PyObject_Size(other);
2727 if (len_other < 0)
2728 return NULL;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 ok = 0;
2731 switch(op) {
Guido van Rossumaac530c2007-08-24 22:33:45 +00002732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 case Py_NE:
2734 case Py_EQ:
2735 if (len_self == len_other)
2736 ok = all_contained_in(self, other);
2737 if (op == Py_NE && ok >= 0)
2738 ok = !ok;
2739 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 case Py_LT:
2742 if (len_self < len_other)
2743 ok = all_contained_in(self, other);
2744 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 case Py_LE:
2747 if (len_self <= len_other)
2748 ok = all_contained_in(self, other);
2749 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 case Py_GT:
2752 if (len_self > len_other)
2753 ok = all_contained_in(other, self);
2754 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 case Py_GE:
2757 if (len_self >= len_other)
2758 ok = all_contained_in(other, self);
2759 break;
Guido van Rossumaac530c2007-08-24 22:33:45 +00002760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 }
2762 if (ok < 0)
2763 return NULL;
2764 result = ok ? Py_True : Py_False;
2765 Py_INCREF(result);
2766 return result;
Guido van Rossumd9214d12007-02-12 02:23:40 +00002767}
2768
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002769static PyObject *
2770dictview_repr(dictviewobject *dv)
2771{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002772 PyObject *seq;
2773 PyObject *result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 seq = PySequence_List((PyObject *)dv);
2776 if (seq == NULL)
2777 return NULL;
2778
2779 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
2780 Py_DECREF(seq);
2781 return result;
Raymond Hettingerb0d56af2009-03-03 10:52:49 +00002782}
2783
Guido van Rossum3ac67412007-02-10 18:55:06 +00002784/*** dict_keys ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00002785
2786static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00002787dictkeys_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00002788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 if (dv->dv_dict == NULL) {
2790 Py_RETURN_NONE;
2791 }
2792 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00002793}
2794
2795static int
2796dictkeys_contains(dictviewobject *dv, PyObject *obj)
2797{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 if (dv->dv_dict == NULL)
2799 return 0;
2800 return PyDict_Contains((PyObject *)dv->dv_dict, obj);
Guido van Rossumb90c8482007-02-10 01:11:45 +00002801}
2802
Guido van Rossum83825ac2007-02-10 04:54:19 +00002803static PySequenceMethods dictkeys_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 (lenfunc)dictview_len, /* sq_length */
2805 0, /* sq_concat */
2806 0, /* sq_repeat */
2807 0, /* sq_item */
2808 0, /* sq_slice */
2809 0, /* sq_ass_item */
2810 0, /* sq_ass_slice */
2811 (objobjproc)dictkeys_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00002812};
2813
Guido van Rossum523259b2007-08-24 23:41:22 +00002814static PyObject*
2815dictviews_sub(PyObject* self, PyObject *other)
2816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 PyObject *result = PySet_New(self);
2818 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002819 _Py_IDENTIFIER(difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 if (result == NULL)
2822 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002823
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002824 tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 if (tmp == NULL) {
2826 Py_DECREF(result);
2827 return NULL;
2828 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 Py_DECREF(tmp);
2831 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002832}
2833
2834static PyObject*
2835dictviews_and(PyObject* self, PyObject *other)
2836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 PyObject *result = PySet_New(self);
2838 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002839 _Py_IDENTIFIER(intersection_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 if (result == NULL)
2842 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002843
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002844 tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 if (tmp == NULL) {
2846 Py_DECREF(result);
2847 return NULL;
2848 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 Py_DECREF(tmp);
2851 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002852}
2853
2854static PyObject*
2855dictviews_or(PyObject* self, PyObject *other)
2856{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002857 PyObject *result = PySet_New(self);
2858 PyObject *tmp;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002859 _Py_IDENTIFIER(update);
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02002860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002861 if (result == NULL)
2862 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002863
Victor Stinnerd1a9cc22011-10-13 22:51:17 +02002864 tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 if (tmp == NULL) {
2866 Py_DECREF(result);
2867 return NULL;
2868 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 Py_DECREF(tmp);
2871 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002872}
2873
2874static PyObject*
2875dictviews_xor(PyObject* self, PyObject *other)
2876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 PyObject *result = PySet_New(self);
2878 PyObject *tmp;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002879 _Py_IDENTIFIER(symmetric_difference_update);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 if (result == NULL)
2882 return NULL;
Guido van Rossum523259b2007-08-24 23:41:22 +00002883
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002884 tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 other);
2886 if (tmp == NULL) {
2887 Py_DECREF(result);
2888 return NULL;
2889 }
Guido van Rossum523259b2007-08-24 23:41:22 +00002890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 Py_DECREF(tmp);
2892 return result;
Guido van Rossum523259b2007-08-24 23:41:22 +00002893}
2894
2895static PyNumberMethods dictviews_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 0, /*nb_add*/
2897 (binaryfunc)dictviews_sub, /*nb_subtract*/
2898 0, /*nb_multiply*/
2899 0, /*nb_remainder*/
2900 0, /*nb_divmod*/
2901 0, /*nb_power*/
2902 0, /*nb_negative*/
2903 0, /*nb_positive*/
2904 0, /*nb_absolute*/
2905 0, /*nb_bool*/
2906 0, /*nb_invert*/
2907 0, /*nb_lshift*/
2908 0, /*nb_rshift*/
2909 (binaryfunc)dictviews_and, /*nb_and*/
2910 (binaryfunc)dictviews_xor, /*nb_xor*/
2911 (binaryfunc)dictviews_or, /*nb_or*/
Guido van Rossum523259b2007-08-24 23:41:22 +00002912};
2913
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00002914static PyObject*
2915dictviews_isdisjoint(PyObject *self, PyObject *other)
2916{
2917 PyObject *it;
2918 PyObject *item = NULL;
2919
2920 if (self == other) {
2921 if (dictview_len((dictviewobject *)self) == 0)
2922 Py_RETURN_TRUE;
2923 else
2924 Py_RETURN_FALSE;
2925 }
2926
2927 /* Iterate over the shorter object (only if other is a set,
2928 * because PySequence_Contains may be expensive otherwise): */
2929 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) {
2930 Py_ssize_t len_self = dictview_len((dictviewobject *)self);
2931 Py_ssize_t len_other = PyObject_Size(other);
2932 if (len_other == -1)
2933 return NULL;
2934
2935 if ((len_other > len_self)) {
2936 PyObject *tmp = other;
2937 other = self;
2938 self = tmp;
2939 }
2940 }
2941
2942 it = PyObject_GetIter(other);
2943 if (it == NULL)
2944 return NULL;
2945
2946 while ((item = PyIter_Next(it)) != NULL) {
2947 int contains = PySequence_Contains(self, item);
2948 Py_DECREF(item);
2949 if (contains == -1) {
2950 Py_DECREF(it);
2951 return NULL;
2952 }
2953
2954 if (contains) {
2955 Py_DECREF(it);
2956 Py_RETURN_FALSE;
2957 }
2958 }
2959 Py_DECREF(it);
2960 if (PyErr_Occurred())
2961 return NULL; /* PyIter_Next raised an exception. */
2962 Py_RETURN_TRUE;
2963}
2964
2965PyDoc_STRVAR(isdisjoint_doc,
2966"Return True if the view and the given iterable have a null intersection.");
2967
Guido van Rossumb90c8482007-02-10 01:11:45 +00002968static PyMethodDef dictkeys_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00002969 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
2970 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00002972};
2973
2974PyTypeObject PyDictKeys_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2976 "dict_keys", /* tp_name */
2977 sizeof(dictviewobject), /* tp_basicsize */
2978 0, /* tp_itemsize */
2979 /* methods */
2980 (destructor)dictview_dealloc, /* tp_dealloc */
2981 0, /* tp_print */
2982 0, /* tp_getattr */
2983 0, /* tp_setattr */
2984 0, /* tp_reserved */
2985 (reprfunc)dictview_repr, /* tp_repr */
2986 &dictviews_as_number, /* tp_as_number */
2987 &dictkeys_as_sequence, /* tp_as_sequence */
2988 0, /* tp_as_mapping */
2989 0, /* tp_hash */
2990 0, /* tp_call */
2991 0, /* tp_str */
2992 PyObject_GenericGetAttr, /* tp_getattro */
2993 0, /* tp_setattro */
2994 0, /* tp_as_buffer */
2995 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2996 0, /* tp_doc */
2997 (traverseproc)dictview_traverse, /* tp_traverse */
2998 0, /* tp_clear */
2999 dictview_richcompare, /* tp_richcompare */
3000 0, /* tp_weaklistoffset */
3001 (getiterfunc)dictkeys_iter, /* tp_iter */
3002 0, /* tp_iternext */
3003 dictkeys_methods, /* tp_methods */
3004 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003005};
3006
3007static PyObject *
3008dictkeys_new(PyObject *dict)
3009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003010 return dictview_new(dict, &PyDictKeys_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003011}
3012
Guido van Rossum3ac67412007-02-10 18:55:06 +00003013/*** dict_items ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003014
3015static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003016dictitems_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 if (dv->dv_dict == NULL) {
3019 Py_RETURN_NONE;
3020 }
3021 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type);
Guido van Rossum3ac67412007-02-10 18:55:06 +00003022}
3023
3024static int
3025dictitems_contains(dictviewobject *dv, PyObject *obj)
3026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003027 PyObject *key, *value, *found;
3028 if (dv->dv_dict == NULL)
3029 return 0;
3030 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2)
3031 return 0;
3032 key = PyTuple_GET_ITEM(obj, 0);
3033 value = PyTuple_GET_ITEM(obj, 1);
3034 found = PyDict_GetItem((PyObject *)dv->dv_dict, key);
3035 if (found == NULL) {
3036 if (PyErr_Occurred())
3037 return -1;
3038 return 0;
3039 }
3040 return PyObject_RichCompareBool(value, found, Py_EQ);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003041}
3042
Guido van Rossum83825ac2007-02-10 04:54:19 +00003043static PySequenceMethods dictitems_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 (lenfunc)dictview_len, /* sq_length */
3045 0, /* sq_concat */
3046 0, /* sq_repeat */
3047 0, /* sq_item */
3048 0, /* sq_slice */
3049 0, /* sq_ass_item */
3050 0, /* sq_ass_slice */
3051 (objobjproc)dictitems_contains, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003052};
3053
Guido van Rossumb90c8482007-02-10 01:11:45 +00003054static PyMethodDef dictitems_methods[] = {
Daniel Stutzbach045b3ba2010-09-02 15:06:06 +00003055 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O,
3056 isdisjoint_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003058};
3059
3060PyTypeObject PyDictItems_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3062 "dict_items", /* tp_name */
3063 sizeof(dictviewobject), /* tp_basicsize */
3064 0, /* tp_itemsize */
3065 /* methods */
3066 (destructor)dictview_dealloc, /* tp_dealloc */
3067 0, /* tp_print */
3068 0, /* tp_getattr */
3069 0, /* tp_setattr */
3070 0, /* tp_reserved */
3071 (reprfunc)dictview_repr, /* tp_repr */
3072 &dictviews_as_number, /* tp_as_number */
3073 &dictitems_as_sequence, /* tp_as_sequence */
3074 0, /* tp_as_mapping */
3075 0, /* tp_hash */
3076 0, /* tp_call */
3077 0, /* tp_str */
3078 PyObject_GenericGetAttr, /* tp_getattro */
3079 0, /* tp_setattro */
3080 0, /* tp_as_buffer */
3081 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3082 0, /* tp_doc */
3083 (traverseproc)dictview_traverse, /* tp_traverse */
3084 0, /* tp_clear */
3085 dictview_richcompare, /* tp_richcompare */
3086 0, /* tp_weaklistoffset */
3087 (getiterfunc)dictitems_iter, /* tp_iter */
3088 0, /* tp_iternext */
3089 dictitems_methods, /* tp_methods */
3090 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003091};
3092
3093static PyObject *
3094dictitems_new(PyObject *dict)
3095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 return dictview_new(dict, &PyDictItems_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003097}
3098
Guido van Rossum3ac67412007-02-10 18:55:06 +00003099/*** dict_values ***/
Guido van Rossumb90c8482007-02-10 01:11:45 +00003100
3101static PyObject *
Guido van Rossum3ac67412007-02-10 18:55:06 +00003102dictvalues_iter(dictviewobject *dv)
Guido van Rossumb90c8482007-02-10 01:11:45 +00003103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 if (dv->dv_dict == NULL) {
3105 Py_RETURN_NONE;
3106 }
3107 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003108}
3109
Guido van Rossum83825ac2007-02-10 04:54:19 +00003110static PySequenceMethods dictvalues_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 (lenfunc)dictview_len, /* sq_length */
3112 0, /* sq_concat */
3113 0, /* sq_repeat */
3114 0, /* sq_item */
3115 0, /* sq_slice */
3116 0, /* sq_ass_item */
3117 0, /* sq_ass_slice */
3118 (objobjproc)0, /* sq_contains */
Guido van Rossum83825ac2007-02-10 04:54:19 +00003119};
3120
Guido van Rossumb90c8482007-02-10 01:11:45 +00003121static PyMethodDef dictvalues_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122 {NULL, NULL} /* sentinel */
Guido van Rossumb90c8482007-02-10 01:11:45 +00003123};
3124
3125PyTypeObject PyDictValues_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3127 "dict_values", /* tp_name */
3128 sizeof(dictviewobject), /* tp_basicsize */
3129 0, /* tp_itemsize */
3130 /* methods */
3131 (destructor)dictview_dealloc, /* tp_dealloc */
3132 0, /* tp_print */
3133 0, /* tp_getattr */
3134 0, /* tp_setattr */
3135 0, /* tp_reserved */
3136 (reprfunc)dictview_repr, /* tp_repr */
3137 0, /* tp_as_number */
3138 &dictvalues_as_sequence, /* tp_as_sequence */
3139 0, /* tp_as_mapping */
3140 0, /* tp_hash */
3141 0, /* tp_call */
3142 0, /* tp_str */
3143 PyObject_GenericGetAttr, /* tp_getattro */
3144 0, /* tp_setattro */
3145 0, /* tp_as_buffer */
3146 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3147 0, /* tp_doc */
3148 (traverseproc)dictview_traverse, /* tp_traverse */
3149 0, /* tp_clear */
3150 0, /* tp_richcompare */
3151 0, /* tp_weaklistoffset */
3152 (getiterfunc)dictvalues_iter, /* tp_iter */
3153 0, /* tp_iternext */
3154 dictvalues_methods, /* tp_methods */
3155 0,
Guido van Rossumb90c8482007-02-10 01:11:45 +00003156};
3157
3158static PyObject *
3159dictvalues_new(PyObject *dict)
3160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003161 return dictview_new(dict, &PyDictValues_Type);
Guido van Rossumb90c8482007-02-10 01:11:45 +00003162}