blob: 32bf647bffd62f5b2290524af958c93d3b8163c1 [file] [log] [blame]
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001
Guido van Rossum2bc13791999-03-24 19:06:42 +00002/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +00005
6
7/*
Guido van Rossuma9e7a811997-05-13 21:02:11 +00008 * MINSIZE is the minimum size of a dictionary.
Guido van Rossum16e93a81997-01-28 00:00:11 +00009 */
10
11#define MINSIZE 4
12
Fred Drake1bff34a2000-08-31 19:31:38 +000013/* define this out if you don't want conversion statistics on exit */
14#undef SHOW_CONVERSION_COUNTS
15
Guido van Rossum16e93a81997-01-28 00:00:11 +000016/*
17Table of irreducible polynomials to efficiently cycle through
Tim Petersea8f2bf2000-12-13 01:02:46 +000018GF(2^n)-{0}, 2<=n<=30. A table size is always a power of 2.
Guido van Rossum4b1302b1993-03-27 18:11:32 +000019*/
Guido van Rossum16e93a81997-01-28 00:00:11 +000020static long polys[] = {
Guido van Rossum9e5656c1997-01-29 04:45:16 +000021 4 + 3,
22 8 + 3,
23 16 + 3,
24 32 + 5,
25 64 + 3,
26 128 + 3,
27 256 + 29,
28 512 + 17,
29 1024 + 9,
30 2048 + 5,
31 4096 + 83,
32 8192 + 27,
33 16384 + 43,
34 32768 + 3,
35 65536 + 45,
36 131072 + 9,
37 262144 + 39,
38 524288 + 39,
39 1048576 + 9,
40 2097152 + 5,
41 4194304 + 3,
42 8388608 + 33,
43 16777216 + 27,
44 33554432 + 9,
45 67108864 + 71,
46 134217728 + 39,
47 268435456 + 9,
48 536870912 + 5,
49 1073741824 + 83,
50 0
Guido van Rossum4b1302b1993-03-27 18:11:32 +000051};
52
53/* Object used as dummy key to fill deleted entries */
Guido van Rossuma9e7a811997-05-13 21:02:11 +000054static PyObject *dummy; /* Initialized by first call to newdictobject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +000055
56/*
Tim Petersea8f2bf2000-12-13 01:02:46 +000057There are three kinds of slots in the table:
58
591. Unused. me_key == me_value == NULL
60 Does not hold an active (key, value) pair now and never did. Unused can
61 transition to Active upon key insertion. This is the only case in which
62 me_key is NULL, and is each slot's initial state.
63
642. Active. me_key != NULL and me_key != dummy and me_value != NULL
65 Holds an active (key, value) pair. Active can transition to Dummy upon
66 key deletion. This is the only case in which me_value != NULL.
67
683. Dummy. me_key == dummy && me_value == NULL
69 Previously held an active (key, value) pair, but that was deleted and an
70 active pair has not yet overwritten the slot. Dummy can transition to
71 Active upon key insertion. Dummy slots cannot be made Unused again
72 (cannot have me_key set to NULL), else the probe sequence in case of
73 collision would have no way to know they were once active.
Guido van Rossum4b1302b1993-03-27 18:11:32 +000074*/
75typedef struct {
Tim Petersea8f2bf2000-12-13 01:02:46 +000076 long me_hash; /* cached hash code of me_key */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000077 PyObject *me_key;
78 PyObject *me_value;
Guido van Rossum36488841997-04-11 19:14:07 +000079#ifdef USE_CACHE_ALIGNED
80 long aligner;
81#endif
Guido van Rossuma9e7a811997-05-13 21:02:11 +000082} dictentry;
Guido van Rossum4b1302b1993-03-27 18:11:32 +000083
84/*
Tim Petersea8f2bf2000-12-13 01:02:46 +000085To ensure the lookup algorithm terminates, there must be at least one Unsused
86slot (NULL key) in the table.
87The value ma_fill is the number of non-NULL keys (sum of Active and Dummy);
88ma_used is the number of non-NULL, non-dummy keys (== the number of non-NULL
89values == the number of Active items).
90To avoid slowing down lookups on a near-full table, we resize the table when
91it is more than half filled.
Guido van Rossum4b1302b1993-03-27 18:11:32 +000092*/
Fred Drake1bff34a2000-08-31 19:31:38 +000093typedef struct dictobject dictobject;
94struct dictobject {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 PyObject_HEAD
Tim Petersea8f2bf2000-12-13 01:02:46 +000096 int ma_fill; /* # Active + # Dummy */
97 int ma_used; /* # Active */
98 int ma_size; /* total # slots in ma_table */
99 int ma_poly; /* appopriate entry from polys vector */
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000100 dictentry *ma_table;
Fred Drake1bff34a2000-08-31 19:31:38 +0000101 dictentry *(*ma_lookup)(dictobject *mp, PyObject *key, long hash);
102};
103
104/* forward declarations */
105static dictentry *
106lookdict_string(dictobject *mp, PyObject *key, long hash);
107
108#ifdef SHOW_CONVERSION_COUNTS
109static long created = 0L;
110static long converted = 0L;
111
112static void
113show_counts(void)
114{
115 fprintf(stderr, "created %ld string dicts\n", created);
116 fprintf(stderr, "converted %ld to normal dicts\n", converted);
117 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
118}
119#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000120
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000122PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000123{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000124 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000125 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000127 if (dummy == NULL)
128 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000129#ifdef SHOW_CONVERSION_COUNTS
130 Py_AtExit(show_counts);
131#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000132 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000133 mp = PyObject_NEW(dictobject, &PyDict_Type);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000134 if (mp == NULL)
135 return NULL;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000136 mp->ma_size = 0;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000137 mp->ma_poly = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000138 mp->ma_table = NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000139 mp->ma_fill = 0;
140 mp->ma_used = 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000141 mp->ma_lookup = lookdict_string;
142#ifdef SHOW_CONVERSION_COUNTS
143 ++created;
144#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000145 PyObject_GC_Init(mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000147}
148
149/*
150The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000151This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000152Open addressing is preferred over chaining since the link overhead for
153chaining would be substantial (100% with typical malloc overhead).
Guido van Rossum16e93a81997-01-28 00:00:11 +0000154However, instead of going through the table at constant steps, we cycle
Tim Petersea8f2bf2000-12-13 01:02:46 +0000155through the values of GF(2^n). This avoids modulo computations, being
Guido van Rossum16e93a81997-01-28 00:00:11 +0000156much cheaper on RISC machines, without leading to clustering.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000157
Guido van Rossum2bc13791999-03-24 19:06:42 +0000158The initial probe index is computed as hash mod the table size.
Tim Petersea8f2bf2000-12-13 01:02:46 +0000159Subsequent probe indices use the values of x^i in GF(2^n)-{0} as an offset,
160where x is a root. The initial offset is derived from hash, too.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000161
162All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000163
164(This version is due to Reimer Behrends, some ideas are also due to
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000165Jyrki Alakuijala and Vladimir Marangozov.)
Fred Drake1bff34a2000-08-31 19:31:38 +0000166
167This function must never return NULL; failures are indicated by returning
168a dictentry* for which the me_value field is NULL. Exceptions are never
169reported by this function, and outstanding exceptions are maintained.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000170*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000171static dictentry *
Tim Peters1f5871e2000-07-04 17:44:48 +0000172lookdict(dictobject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000173{
Guido van Rossum16e93a81997-01-28 00:00:11 +0000174 register int i;
175 register unsigned incr;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000176 register dictentry *freeslot;
Guido van Rossum2095d241997-04-09 19:41:24 +0000177 register unsigned int mask = mp->ma_size-1;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000178 dictentry *ep0 = mp->ma_table;
179 register dictentry *ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000180 register int restore_error = 0;
181 register int checked_error = 0;
182 register int cmp;
183 PyObject *err_type, *err_value, *err_tb;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000184 /* We must come up with (i, incr) such that 0 <= i < ma_size
Tim Petersea8f2bf2000-12-13 01:02:46 +0000185 and 0 < incr < ma_size and both are a function of hash.
186 i is the initial table index and incr the initial probe offset. */
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000187 i = (~hash) & mask;
188 /* We use ~hash instead of hash, as degenerate hash functions, such
Guido van Rossum16e93a81997-01-28 00:00:11 +0000189 as for ints <sigh>, can have lots of leading zeros. It's not
Tim Petersea8f2bf2000-12-13 01:02:46 +0000190 really a performance risk, but better safe than sorry.
191 12-Dec-00 tim: so ~hash produces lots of leading ones instead --
192 what's the gain? */
Guido van Rossumefb46091997-01-29 15:53:56 +0000193 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000194 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000195 return ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000196 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000197 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000198 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000199 if (ep->me_hash == hash) {
200 /* error can't have been checked yet */
201 checked_error = 1;
202 if (PyErr_Occurred()) {
203 restore_error = 1;
204 PyErr_Fetch(&err_type, &err_value, &err_tb);
205 }
206 cmp = PyObject_Compare(ep->me_key, key);
207 if (PyErr_Occurred())
208 PyErr_Clear();
209 else if (cmp == 0) {
210 if (restore_error)
211 PyErr_Restore(err_type, err_value,
212 err_tb);
213 return ep;
214 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000215 }
216 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000217 }
Guido van Rossum2bc13791999-03-24 19:06:42 +0000218 /* Derive incr from hash, just to make it more arbitrary. Note that
Guido van Rossum16e93a81997-01-28 00:00:11 +0000219 incr must not be 0, or we will get into an infinite loop.*/
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000220 incr = (hash ^ ((unsigned long)hash >> 3)) & mask;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000221 if (!incr)
222 incr = mask;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000223 for (;;) {
Guido van Rossumefb46091997-01-29 15:53:56 +0000224 ep = &ep0[(i+incr)&mask];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000225 if (ep->me_key == NULL) {
Fred Drakec88b99c2000-08-31 19:04:07 +0000226 if (restore_error)
227 PyErr_Restore(err_type, err_value, err_tb);
Guido van Rossum16e93a81997-01-28 00:00:11 +0000228 if (freeslot != NULL)
229 return freeslot;
230 else
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000231 return ep;
232 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000233 if (ep->me_key == dummy) {
234 if (freeslot == NULL)
235 freeslot = ep;
236 }
Fred Drakec88b99c2000-08-31 19:04:07 +0000237 else if (ep->me_key == key) {
238 if (restore_error)
239 PyErr_Restore(err_type, err_value, err_tb);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000240 return ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000241 }
242 else if (ep->me_hash == hash) {
243 if (!checked_error) {
244 checked_error = 1;
245 if (PyErr_Occurred()) {
246 restore_error = 1;
247 PyErr_Fetch(&err_type, &err_value,
248 &err_tb);
249 }
250 }
251 cmp = PyObject_Compare(ep->me_key, key);
252 if (PyErr_Occurred())
253 PyErr_Clear();
254 else if (cmp == 0) {
255 if (restore_error)
256 PyErr_Restore(err_type, err_value,
257 err_tb);
258 return ep;
259 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000260 }
261 /* Cycle through GF(2^n)-{0} */
262 incr = incr << 1;
263 if (incr > mask)
Thomas Wouters7e474022000-07-16 12:04:32 +0000264 incr ^= mp->ma_poly; /* This will implicitly clear
Guido van Rossumf05fc711998-11-16 22:46:30 +0000265 the highest bit */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000266 }
267}
268
269/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000270 * Hacked up version of lookdict which can assume keys are always strings;
271 * this assumption allows testing for errors during PyObject_Compare() to
272 * be dropped; string-string comparisons never raise exceptions. This also
273 * means we don't need to go through PyObject_Compare(); we can always use
274 * the tp_compare slot of the string type object directly.
275 *
276 * This really only becomes meaningful if proper error handling in lookdict()
277 * is too expensive.
278 */
279static dictentry *
280lookdict_string(dictobject *mp, PyObject *key, register long hash)
281{
282 register int i;
283 register unsigned incr;
284 register dictentry *freeslot;
285 register unsigned int mask = mp->ma_size-1;
286 dictentry *ep0 = mp->ma_table;
287 register dictentry *ep;
288 cmpfunc compare = PyString_Type.tp_compare;
289
290 /* make sure this function doesn't have to handle non-string keys */
291 if (!PyString_Check(key)) {
292#ifdef SHOW_CONVERSION_COUNTS
293 ++converted;
294#endif
295 mp->ma_lookup = lookdict;
296 return lookdict(mp, key, hash);
297 }
298 /* We must come up with (i, incr) such that 0 <= i < ma_size
299 and 0 < incr < ma_size and both are a function of hash */
300 i = (~hash) & mask;
301 /* We use ~hash instead of hash, as degenerate hash functions, such
302 as for ints <sigh>, can have lots of leading zeros. It's not
303 really a performance risk, but better safe than sorry. */
304 ep = &ep0[i];
305 if (ep->me_key == NULL || ep->me_key == key)
306 return ep;
307 if (ep->me_key == dummy)
308 freeslot = ep;
309 else {
310 if (ep->me_hash == hash
311 && compare(ep->me_key, key) == 0) {
312 return ep;
313 }
314 freeslot = NULL;
315 }
316 /* Derive incr from hash, just to make it more arbitrary. Note that
317 incr must not be 0, or we will get into an infinite loop.*/
318 incr = (hash ^ ((unsigned long)hash >> 3)) & mask;
319 if (!incr)
320 incr = mask;
321 for (;;) {
322 ep = &ep0[(i+incr)&mask];
323 if (ep->me_key == NULL) {
324 if (freeslot != NULL)
325 return freeslot;
326 else
327 return ep;
328 }
329 if (ep->me_key == dummy) {
330 if (freeslot == NULL)
331 freeslot = ep;
332 }
333 else if (ep->me_key == key
334 || (ep->me_hash == hash
335 && compare(ep->me_key, key) == 0)) {
336 return ep;
337 }
338 /* Cycle through GF(2^n)-{0} */
339 incr = incr << 1;
340 if (incr > mask)
341 incr ^= mp->ma_poly; /* This will implicitly clear
342 the highest bit */
343 }
344}
345
346/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000347Internal routine to insert a new item into the table.
348Used both by the internal resize routine and by the public insert routine.
349Eats a reference to key and one to value.
350*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000351static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000352insertdict(register dictobject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000353{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000355 register dictentry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000356 ep = (mp->ma_lookup)(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000357 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000358 old_value = ep->me_value;
359 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 Py_DECREF(old_value); /* which **CAN** re-enter */
361 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000362 }
363 else {
364 if (ep->me_key == NULL)
365 mp->ma_fill++;
366 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000367 Py_DECREF(ep->me_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000368 ep->me_key = key;
369 ep->me_hash = hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000370 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000371 mp->ma_used++;
372 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000373}
374
375/*
376Restructure the table by allocating a new table and reinserting all
377items again. When entries have been deleted, the new table may
378actually be smaller than the old one.
379*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000380static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000381dictresize(dictobject *mp, int minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000382{
383 register int oldsize = mp->ma_size;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000384 register int newsize, newpoly;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000385 register dictentry *oldtable = mp->ma_table;
386 register dictentry *newtable;
387 register dictentry *ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000388 register int i;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000389 for (i = 0, newsize = MINSIZE; ; i++, newsize <<= 1) {
390 if (i > sizeof(polys)/sizeof(polys[0])) {
391 /* Ran out of polynomials */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 PyErr_NoMemory();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000393 return -1;
394 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000395 if (newsize > minused) {
Guido van Rossum16e93a81997-01-28 00:00:11 +0000396 newpoly = polys[i];
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000397 break;
398 }
399 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000400 newtable = PyMem_NEW(dictentry, newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000401 if (newtable == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000403 return -1;
404 }
Guido van Rossum0fd00331998-07-16 15:06:13 +0000405 memset(newtable, '\0', sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000406 mp->ma_size = newsize;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000407 mp->ma_poly = newpoly;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000408 mp->ma_table = newtable;
409 mp->ma_fill = 0;
410 mp->ma_used = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000411
412 /* Make two passes, so we can avoid decrefs
413 (and possible side effects) till the table is copied */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000414 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
415 if (ep->me_value != NULL)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000416 insertdict(mp,ep->me_key,ep->me_hash,ep->me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000417 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000418 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000419 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420 Py_XDECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000421 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000422 }
423
Guido van Rossumb18618d2000-05-03 23:44:39 +0000424 if (oldtable != NULL)
425 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000426 return 0;
427}
428
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000430PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000431{
432 long hash;
Fred Drake1bff34a2000-08-31 19:31:38 +0000433 dictobject *mp = (dictobject *)op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 if (!PyDict_Check(op)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000435 return NULL;
436 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000437 if (mp->ma_table == NULL)
Guido van Rossumd7047b31995-01-02 19:07:15 +0000438 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000439#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 if (!PyString_Check(key) ||
441 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000442#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000443 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000445 if (hash == -1) {
446 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000447 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000448 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000449 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000450 return (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000451}
452
453int
Tim Peters1f5871e2000-07-04 17:44:48 +0000454PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000455{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000456 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000457 register long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 if (!PyDict_Check(op)) {
459 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000460 return -1;
461 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000462 mp = (dictobject *)op;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000463#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 if (PyString_Check(key)) {
Guido van Rossum2a61e741997-01-18 07:55:05 +0000465#ifdef INTERN_STRINGS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 if (((PyStringObject *)key)->ob_sinterned != NULL) {
467 key = ((PyStringObject *)key)->ob_sinterned;
468 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000469 }
470 else
471#endif
472 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000474 if (hash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000476 }
477 }
478 else
479#endif
480 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000481 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000482 if (hash == -1)
483 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000484 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000485 /* if fill >= 2/3 size, double in size */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000486 if (mp->ma_fill*3 >= mp->ma_size*2) {
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000487 if (dictresize(mp, mp->ma_used*2) != 0) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000488 if (mp->ma_fill+1 > mp->ma_size)
489 return -1;
490 }
491 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 Py_INCREF(value);
493 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000494 insertdict(mp, key, hash, value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000495 return 0;
496}
497
498int
Tim Peters1f5871e2000-07-04 17:44:48 +0000499PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000500{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000501 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000502 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000503 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000505
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 if (!PyDict_Check(op)) {
507 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000508 return -1;
509 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000510#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 if (!PyString_Check(key) ||
512 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000513#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000514 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000516 if (hash == -1)
517 return -1;
518 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000519 mp = (dictobject *)op;
520 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumefc87131995-01-02 19:42:39 +0000521 goto empty;
Fred Drake1bff34a2000-08-31 19:31:38 +0000522 ep = (mp->ma_lookup)(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000523 if (ep->me_value == NULL) {
Guido van Rossumefc87131995-01-02 19:42:39 +0000524 empty:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000526 return -1;
527 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000528 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000529 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000530 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000531 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000532 ep->me_value = NULL;
533 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000534 Py_DECREF(old_value);
535 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000536 return 0;
537}
538
Guido van Rossum25831651993-05-19 14:50:45 +0000539void
Tim Peters1f5871e2000-07-04 17:44:48 +0000540PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000541{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000542 int i, n;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000543 register dictentry *table;
544 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000546 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000547 mp = (dictobject *)op;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000548 table = mp->ma_table;
549 if (table == NULL)
550 return;
551 n = mp->ma_size;
552 mp->ma_size = mp->ma_used = mp->ma_fill = 0;
553 mp->ma_table = NULL;
554 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 Py_XDECREF(table[i].me_key);
556 Py_XDECREF(table[i].me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000557 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000559}
560
Guido van Rossum25831651993-05-19 14:50:45 +0000561int
Tim Peters1f5871e2000-07-04 17:44:48 +0000562PyDict_Next(PyObject *op, int *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000563{
Guido van Rossum25831651993-05-19 14:50:45 +0000564 int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000565 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000567 return 0;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000568 mp = (dictobject *)op;
Guido van Rossum25831651993-05-19 14:50:45 +0000569 i = *ppos;
570 if (i < 0)
571 return 0;
572 while (i < mp->ma_size && mp->ma_table[i].me_value == NULL)
573 i++;
574 *ppos = i+1;
575 if (i >= mp->ma_size)
576 return 0;
577 if (pkey)
578 *pkey = mp->ma_table[i].me_key;
579 if (pvalue)
580 *pvalue = mp->ma_table[i].me_value;
581 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000582}
583
584/* Methods */
585
586static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000587dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000588{
589 register int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000590 register dictentry *ep;
Guido van Rossumd724b232000-03-13 16:01:29 +0000591 Py_TRASHCAN_SAFE_BEGIN(mp)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000592 PyObject_GC_Fini(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000593 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000594 if (ep->me_key != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000596 }
597 if (ep->me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 Py_DECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000599 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000600 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000601 if (mp->ma_table != NULL)
602 PyMem_DEL(mp->ma_table);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000603 mp = (dictobject *) PyObject_AS_GC(mp);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000604 PyObject_DEL(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000605 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000606}
607
608static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000609dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000610{
611 register int i;
612 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000613 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000614
615 i = Py_ReprEnter((PyObject*)mp);
616 if (i != 0) {
617 if (i < 0)
618 return i;
619 fprintf(fp, "{...}");
620 return 0;
621 }
622
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000623 fprintf(fp, "{");
624 any = 0;
625 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
626 if (ep->me_value != NULL) {
627 if (any++ > 0)
628 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000629 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
630 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000631 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000632 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000633 fprintf(fp, ": ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000634 if (PyObject_Print(ep->me_value, fp, 0) != 0) {
635 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000636 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000637 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000638 }
639 }
640 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000641 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000642 return 0;
643}
644
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000645static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000646dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000647{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 auto PyObject *v;
649 PyObject *sepa, *colon;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000650 register int i;
651 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000652 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000653
654 i = Py_ReprEnter((PyObject*)mp);
655 if (i != 0) {
656 if (i > 0)
657 return PyString_FromString("{...}");
658 return NULL;
659 }
660
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 v = PyString_FromString("{");
662 sepa = PyString_FromString(", ");
663 colon = PyString_FromString(": ");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000664 any = 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000665 for (i = 0, ep = mp->ma_table; i < mp->ma_size && v; i++, ep++) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000666 if (ep->me_value != NULL) {
667 if (any++)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 PyString_Concat(&v, sepa);
669 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_key));
670 PyString_Concat(&v, colon);
671 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_value));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000672 }
673 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 PyString_ConcatAndDel(&v, PyString_FromString("}"));
Guido van Rossum255443b1998-04-10 22:47:14 +0000675 Py_ReprLeave((PyObject*)mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 Py_XDECREF(sepa);
677 Py_XDECREF(colon);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000678 return v;
679}
680
681static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000682dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000683{
684 return mp->ma_used;
685}
686
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000687static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000688dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000689{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000691 long hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000692 if (mp->ma_table == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000694 return NULL;
695 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000696#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697 if (!PyString_Check(key) ||
698 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000699#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000700 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000702 if (hash == -1)
703 return NULL;
704 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000705 v = (mp->ma_lookup)(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000706 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000708 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000709 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000710 return v;
711}
712
713static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000714dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000715{
716 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000718 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000720}
721
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000722static PyMappingMethods dict_as_mapping = {
723 (inquiry)dict_length, /*mp_length*/
724 (binaryfunc)dict_subscript, /*mp_subscript*/
725 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000726};
727
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000729dict_keys(register dictobject *mp, PyObject *args)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000730{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 register PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000732 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000733 if (!PyArg_NoArgs(args))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000734 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 v = PyList_New(mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000736 if (v == NULL)
737 return NULL;
738 for (i = 0, j = 0; i < mp->ma_size; i++) {
739 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740 PyObject *key = mp->ma_table[i].me_key;
741 Py_INCREF(key);
742 PyList_SetItem(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000743 j++;
744 }
745 }
746 return v;
747}
748
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000750dict_values(register dictobject *mp, PyObject *args)
Guido van Rossum25831651993-05-19 14:50:45 +0000751{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000752 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000753 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000755 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000757 if (v == NULL)
758 return NULL;
759 for (i = 0, j = 0; i < mp->ma_size; i++) {
760 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000761 PyObject *value = mp->ma_table[i].me_value;
762 Py_INCREF(value);
763 PyList_SetItem(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000764 j++;
765 }
766 }
767 return v;
768}
769
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000771dict_items(register dictobject *mp, PyObject *args)
Guido van Rossum25831651993-05-19 14:50:45 +0000772{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000774 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000775 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000776 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000778 if (v == NULL)
779 return NULL;
780 for (i = 0, j = 0; i < mp->ma_size; i++) {
781 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 PyObject *key = mp->ma_table[i].me_key;
783 PyObject *value = mp->ma_table[i].me_value;
784 PyObject *item = PyTuple_New(2);
Guido van Rossum25831651993-05-19 14:50:45 +0000785 if (item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +0000787 return NULL;
788 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000789 Py_INCREF(key);
790 PyTuple_SetItem(item, 0, key);
791 Py_INCREF(value);
792 PyTuple_SetItem(item, 1, value);
793 PyList_SetItem(v, j, item);
Guido van Rossum25831651993-05-19 14:50:45 +0000794 j++;
795 }
796 }
797 return v;
798}
799
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000800static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000801dict_update(register dictobject *mp, PyObject *args)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000802{
803 register int i;
804 dictobject *other;
805 dictentry *entry;
806 if (!PyArg_Parse(args, "O!", &PyDict_Type, &other))
807 return NULL;
808 if (other == mp)
Guido van Rossuma8d51311997-06-02 17:13:37 +0000809 goto done; /* a.update(a); nothing to do */
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000810 /* Do one big resize at the start, rather than incrementally
811 resizing as we insert new items. Expect that there will be
812 no (or few) overlapping keys. */
813 if ((mp->ma_fill + other->ma_used)*3 >= mp->ma_size*2) {
814 if (dictresize(mp, (mp->ma_used + other->ma_used)*3/2) != 0)
815 return NULL;
816 }
817 for (i = 0; i < other->ma_size; i++) {
818 entry = &other->ma_table[i];
819 if (entry->me_value != NULL) {
820 Py_INCREF(entry->me_key);
821 Py_INCREF(entry->me_value);
822 insertdict(mp, entry->me_key, entry->me_hash,
823 entry->me_value);
824 }
825 }
826 done:
827 Py_INCREF(Py_None);
828 return Py_None;
829}
830
831static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000832dict_copy(register dictobject *mp, PyObject *args)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000833{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000834 if (!PyArg_Parse(args, ""))
835 return NULL;
836 return PyDict_Copy((PyObject*)mp);
837}
838
839PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000840PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000841{
842 register dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000843 register int i;
844 dictobject *copy;
845 dictentry *entry;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000846
847 if (o == NULL || !PyDict_Check(o)) {
848 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000849 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000850 }
851 mp = (dictobject *)o;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000852 copy = (dictobject *)PyDict_New();
853 if (copy == NULL)
854 return NULL;
855 if (mp->ma_used > 0) {
856 if (dictresize(copy, mp->ma_used*3/2) != 0)
857 return NULL;
858 for (i = 0; i < mp->ma_size; i++) {
859 entry = &mp->ma_table[i];
860 if (entry->me_value != NULL) {
861 Py_INCREF(entry->me_key);
862 Py_INCREF(entry->me_value);
863 insertdict(copy, entry->me_key, entry->me_hash,
864 entry->me_value);
865 }
866 }
867 }
868 return (PyObject *)copy;
869}
870
Guido van Rossum4199fac1993-11-05 10:18:44 +0000871int
Tim Peters1f5871e2000-07-04 17:44:48 +0000872PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +0000873{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874 if (mp == NULL || !PyDict_Check(mp)) {
875 PyErr_BadInternalCall();
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000876 return 0;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000877 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000878 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000879}
880
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000881PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000882PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000883{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 if (mp == NULL || !PyDict_Check(mp)) {
885 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000886 return NULL;
887 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000888 return dict_keys((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000889}
890
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000892PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000893{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000894 if (mp == NULL || !PyDict_Check(mp)) {
895 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000896 return NULL;
897 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000898 return dict_values((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000899}
900
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000901PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000902PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000903{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 if (mp == NULL || !PyDict_Check(mp)) {
905 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000906 return NULL;
907 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000908 return dict_items((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000909}
910
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000911#define NEWCMP
912
913#ifdef NEWCMP
914
915/* Subroutine which returns the smallest key in a for which b's value
916 is different or absent. The value is returned too, through the
917 pval argument. No reference counts are incremented. */
918
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000920characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000921{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 PyObject *diff = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000923 int i;
924
925 *pval = NULL;
926 for (i = 0; i < a->ma_size; i++) {
927 if (a->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928 PyObject *key = a->ma_table[i].me_key;
929 PyObject *aval, *bval;
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000930 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 if (diff != NULL && PyObject_Compare(key, diff) > 0)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000932 continue;
933 aval = a->ma_table[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000934 bval = PyDict_GetItem((PyObject *)b, key);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000935 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 if (bval == NULL || PyObject_Compare(aval, bval) != 0)
937 {
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000938 diff = key;
939 *pval = aval;
940 }
941 }
942 }
943 return diff;
944}
945
946static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000947dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000948{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000950 int res;
951
952 /* Compare lengths first */
953 if (a->ma_used < b->ma_used)
954 return -1; /* a is shorter */
955 else if (a->ma_used > b->ma_used)
956 return 1; /* b is shorter */
957 /* Same length -- check all keys */
958 adiff = characterize(a, b, &aval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000959 if (PyErr_Occurred())
960 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000961 if (adiff == NULL)
962 return 0; /* a is a subset with the same length */
963 bdiff = characterize(b, a, &bval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000964 if (PyErr_Occurred())
965 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000966 /* bdiff == NULL would be impossible now */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 res = PyObject_Compare(adiff, bdiff);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000968 if (res == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 res = PyObject_Compare(aval, bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000970 return res;
971}
972
973#else /* !NEWCMP */
974
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000975static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000976dict_compare(dictobject *a, dictobject *b)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000977{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 PyObject *akeys, *bkeys;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000979 int i, n, res;
980 if (a == b)
981 return 0;
982 if (a->ma_used == 0) {
983 if (b->ma_used != 0)
984 return -1;
985 else
986 return 0;
987 }
988 else {
989 if (b->ma_used == 0)
990 return 1;
991 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000992 akeys = dict_keys(a, (PyObject *)NULL);
993 bkeys = dict_keys(b, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000994 if (akeys == NULL || bkeys == NULL) {
995 /* Oops, out of memory -- what to do? */
996 /* For now, sort on address! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 Py_XDECREF(akeys);
998 Py_XDECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000999 if (a < b)
1000 return -1;
1001 else
1002 return 1;
1003 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001004 PyList_Sort(akeys);
1005 PyList_Sort(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001006 n = a->ma_used < b->ma_used ? a->ma_used : b->ma_used; /* smallest */
1007 res = 0;
1008 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 PyObject *akey, *bkey, *aval, *bval;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001010 long ahash, bhash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 akey = PyList_GetItem(akeys, i);
1012 bkey = PyList_GetItem(bkeys, i);
1013 res = PyObject_Compare(akey, bkey);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001014 if (res != 0)
1015 break;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001016#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 if (!PyString_Check(akey) ||
1018 (ahash = ((PyStringObject *) akey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001019#endif
Guido van Rossumca756f21997-01-23 19:39:29 +00001020 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 ahash = PyObject_Hash(akey);
Guido van Rossumca756f21997-01-23 19:39:29 +00001022 if (ahash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +00001024 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001025#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026 if (!PyString_Check(bkey) ||
1027 (bhash = ((PyStringObject *) bkey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001028#endif
Guido van Rossumca756f21997-01-23 19:39:29 +00001029 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030 bhash = PyObject_Hash(bkey);
Guido van Rossumca756f21997-01-23 19:39:29 +00001031 if (bhash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +00001033 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001034 aval = (a->ma_lookup)(a, akey, ahash) -> me_value;
1035 bval = (b->ma_lookup)(b, bkey, bhash) -> me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 res = PyObject_Compare(aval, bval);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001037 if (res != 0)
1038 break;
1039 }
1040 if (res == 0) {
1041 if (a->ma_used < b->ma_used)
1042 res = -1;
1043 else if (a->ma_used > b->ma_used)
1044 res = 1;
1045 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046 Py_DECREF(akeys);
1047 Py_DECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001048 return res;
1049}
1050
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001051#endif /* !NEWCMP */
1052
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001054dict_has_key(register dictobject *mp, PyObject *args)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001055{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001057 long hash;
1058 register long ok;
Fred Drake52fccfd2000-02-23 15:47:16 +00001059 if (!PyArg_ParseTuple(args, "O:has_key", &key))
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001060 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001061#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062 if (!PyString_Check(key) ||
1063 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001064#endif
Guido van Rossumca756f21997-01-23 19:39:29 +00001065 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001066 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001067 if (hash == -1)
1068 return NULL;
1069 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001070 ok = (mp->ma_size != 0
1071 && (mp->ma_lookup)(mp, key, hash)->me_value != NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001072 return PyInt_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001073}
1074
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001076dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001077{
1078 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001079 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001080 PyObject *val = NULL;
1081 long hash;
1082
Fred Drake52fccfd2000-02-23 15:47:16 +00001083 if (!PyArg_ParseTuple(args, "O|O:get", &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001084 return NULL;
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001085 if (mp->ma_table == NULL)
1086 goto finally;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001087
Barry Warsawc38c5da1997-10-06 17:49:20 +00001088#ifdef CACHE_HASH
1089 if (!PyString_Check(key) ||
1090 (hash = ((PyStringObject *) key)->ob_shash) == -1)
1091#endif
1092 {
1093 hash = PyObject_Hash(key);
1094 if (hash == -1)
1095 return NULL;
1096 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001097 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001098
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001099 finally:
Barry Warsawc38c5da1997-10-06 17:49:20 +00001100 if (val == NULL)
1101 val = failobj;
1102 Py_INCREF(val);
1103 return val;
1104}
1105
1106
1107static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001108dict_setdefault(register dictobject *mp, PyObject *args)
1109{
1110 PyObject *key;
1111 PyObject *failobj = Py_None;
1112 PyObject *val = NULL;
1113 long hash;
1114
1115 if (!PyArg_ParseTuple(args, "O|O:setdefault", &key, &failobj))
1116 return NULL;
1117 if (mp->ma_table == NULL)
1118 goto finally;
1119
1120#ifdef CACHE_HASH
1121 if (!PyString_Check(key) ||
1122 (hash = ((PyStringObject *) key)->ob_shash) == -1)
1123#endif
1124 {
1125 hash = PyObject_Hash(key);
1126 if (hash == -1)
1127 return NULL;
1128 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001129 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001130
1131 finally:
1132 if (val == NULL) {
1133 val = failobj;
1134 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1135 val = NULL;
1136 }
1137 Py_XINCREF(val);
1138 return val;
1139}
1140
1141
1142static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001143dict_clear(register dictobject *mp, PyObject *args)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001144{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001145 if (!PyArg_NoArgs(args))
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001146 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001147 PyDict_Clear((PyObject *)mp);
1148 Py_INCREF(Py_None);
1149 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001150}
1151
Guido van Rossumba6ab842000-12-12 22:02:18 +00001152static PyObject *
1153dict_popitem(dictobject *mp, PyObject *args)
1154{
1155 int i = 0;
1156 dictentry *ep;
1157 PyObject *res;
1158
1159 if (!PyArg_NoArgs(args))
1160 return NULL;
1161 if (mp->ma_used == 0) {
1162 PyErr_SetString(PyExc_KeyError,
1163 "popitem(): dictionary is empty");
1164 return NULL;
1165 }
1166 /* Set ep to "the first" dict entry with a value. We abuse the hash
1167 * field of slot 0 to hold a search finger:
1168 * If slot 0 has a value, use slot 0.
1169 * Else slot 0 is being used to hold a search finger,
1170 * and we use its hash value as the first index to look.
1171 */
1172 ep = &mp->ma_table[0];
1173 if (ep->me_value == NULL) {
1174 i = (int)ep->me_hash;
1175 /* The hash field may be uninitialized trash, or it
1176 * may be a real hash value, or it may be a legit
1177 * search finger, or it may be a once-legit search
1178 * finger that's out of bounds now because it
1179 * wrapped around or the table shrunk -- simply
1180 * make sure it's in bounds now.
1181 */
1182 if (i >= mp->ma_size || i < 1)
1183 i = 1; /* skip slot 0 */
1184 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1185 i++;
1186 if (i >= mp->ma_size)
1187 i = 1;
1188 }
1189 }
1190 res = PyTuple_New(2);
1191 if (res != NULL) {
1192 PyTuple_SET_ITEM(res, 0, ep->me_key);
1193 PyTuple_SET_ITEM(res, 1, ep->me_value);
1194 Py_INCREF(dummy);
1195 ep->me_key = dummy;
1196 ep->me_value = NULL;
1197 mp->ma_used--;
1198 assert(mp->ma_table[0].me_value == NULL);
1199 mp->ma_table[0].me_hash = i + 1; /* next place to start */
1200 }
1201 return res;
1202}
1203
Jeremy Hylton8caad492000-06-23 14:18:11 +00001204static int
1205dict_traverse(PyObject *op, visitproc visit, void *arg)
1206{
1207 int i = 0, err;
1208 PyObject *pk;
1209 PyObject *pv;
1210
1211 while (PyDict_Next(op, &i, &pk, &pv)) {
1212 err = visit(pk, arg);
1213 if (err)
1214 return err;
1215 err = visit(pv, arg);
1216 if (err)
1217 return err;
1218 }
1219 return 0;
1220}
1221
1222static int
1223dict_tp_clear(PyObject *op)
1224{
1225 PyDict_Clear(op);
1226 return 0;
1227}
1228
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229static PyMethodDef mapp_methods[] = {
Fred Drake52fccfd2000-02-23 15:47:16 +00001230 {"has_key", (PyCFunction)dict_has_key, METH_VARARGS},
Guido van Rossum5d8123f1997-07-13 03:58:01 +00001231 {"keys", (PyCFunction)dict_keys},
1232 {"items", (PyCFunction)dict_items},
1233 {"values", (PyCFunction)dict_values},
Guido van Rossuma8d51311997-06-02 17:13:37 +00001234 {"update", (PyCFunction)dict_update},
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001235 {"clear", (PyCFunction)dict_clear},
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001236 {"copy", (PyCFunction)dict_copy},
Fred Drake52fccfd2000-02-23 15:47:16 +00001237 {"get", (PyCFunction)dict_get, METH_VARARGS},
Guido van Rossum164452c2000-08-08 16:12:54 +00001238 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS},
Guido van Rossumba6ab842000-12-12 22:02:18 +00001239 {"popitem", (PyCFunction)dict_popitem},
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001240 {NULL, NULL} /* sentinel */
1241};
1242
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001244dict_getattr(dictobject *mp, char *name)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001245{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246 return Py_FindMethod(mapp_methods, (PyObject *)mp, name);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001247}
1248
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001249PyTypeObject PyDict_Type = {
1250 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001251 0,
Guido van Rossum9bfef441993-03-29 10:43:31 +00001252 "dictionary",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001253 sizeof(dictobject) + PyGC_HEAD_SIZE,
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001254 0,
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001255 (destructor)dict_dealloc, /*tp_dealloc*/
1256 (printfunc)dict_print, /*tp_print*/
1257 (getattrfunc)dict_getattr, /*tp_getattr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001258 0, /*tp_setattr*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001259 (cmpfunc)dict_compare, /*tp_compare*/
1260 (reprfunc)dict_repr, /*tp_repr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001261 0, /*tp_as_number*/
1262 0, /*tp_as_sequence*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001263 &dict_as_mapping, /*tp_as_mapping*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001264 0, /* tp_hash */
1265 0, /* tp_call */
1266 0, /* tp_str */
1267 0, /* tp_getattro */
1268 0, /* tp_setattro */
1269 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001270 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001271 0, /* tp_doc */
1272 (traverseproc)dict_traverse, /* tp_traverse */
1273 (inquiry)dict_tp_clear, /* tp_clear */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001274};
1275
Guido van Rossum3cca2451997-05-16 14:23:33 +00001276/* For backward compatibility with old dictionary interface */
1277
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001279PyDict_GetItemString(PyObject *v, char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001280{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001281 PyObject *kv, *rv;
1282 kv = PyString_FromString(key);
1283 if (kv == NULL)
1284 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001285 rv = PyDict_GetItem(v, kv);
1286 Py_DECREF(kv);
1287 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001288}
1289
1290int
Tim Peters1f5871e2000-07-04 17:44:48 +00001291PyDict_SetItemString(PyObject *v, char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001292{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001293 PyObject *kv;
1294 int err;
1295 kv = PyString_FromString(key);
1296 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001297 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001298 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001299 err = PyDict_SetItem(v, kv, item);
1300 Py_DECREF(kv);
1301 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001302}
1303
1304int
Tim Peters1f5871e2000-07-04 17:44:48 +00001305PyDict_DelItemString(PyObject *v, char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001306{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001307 PyObject *kv;
1308 int err;
1309 kv = PyString_FromString(key);
1310 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001311 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001312 err = PyDict_DelItem(v, kv);
1313 Py_DECREF(kv);
1314 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001315}