blob: 35b1b2b97c7e19ef28f4e79deabfd6b37c06e229 [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
Tim Petersf1c7c882000-12-13 19:58:25 +0000683. Dummy. me_key == dummy and me_value == NULL
Tim Petersea8f2bf2000-12-13 01:02:46 +000069 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.
Tim Petersf1c7c882000-12-13 19:58:25 +000074
75Note: .popitem() abuses the me_hash field of an Unused or Dummy slot to
76hold a search finger. The me_hash field of Unused or Dummy slots has no
77meaning otherwise.
Guido van Rossum4b1302b1993-03-27 18:11:32 +000078*/
79typedef struct {
Tim Petersea8f2bf2000-12-13 01:02:46 +000080 long me_hash; /* cached hash code of me_key */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 PyObject *me_key;
82 PyObject *me_value;
Guido van Rossum36488841997-04-11 19:14:07 +000083#ifdef USE_CACHE_ALIGNED
84 long aligner;
85#endif
Guido van Rossuma9e7a811997-05-13 21:02:11 +000086} dictentry;
Guido van Rossum4b1302b1993-03-27 18:11:32 +000087
88/*
Tim Petersf1c7c882000-12-13 19:58:25 +000089To ensure the lookup algorithm terminates, there must be at least one Unused
Tim Petersea8f2bf2000-12-13 01:02:46 +000090slot (NULL key) in the table.
91The value ma_fill is the number of non-NULL keys (sum of Active and Dummy);
92ma_used is the number of non-NULL, non-dummy keys (== the number of non-NULL
93values == the number of Active items).
94To avoid slowing down lookups on a near-full table, we resize the table when
95it is more than half filled.
Guido van Rossum4b1302b1993-03-27 18:11:32 +000096*/
Fred Drake1bff34a2000-08-31 19:31:38 +000097typedef struct dictobject dictobject;
98struct dictobject {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099 PyObject_HEAD
Tim Petersea8f2bf2000-12-13 01:02:46 +0000100 int ma_fill; /* # Active + # Dummy */
101 int ma_used; /* # Active */
102 int ma_size; /* total # slots in ma_table */
103 int ma_poly; /* appopriate entry from polys vector */
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000104 dictentry *ma_table;
Fred Drake1bff34a2000-08-31 19:31:38 +0000105 dictentry *(*ma_lookup)(dictobject *mp, PyObject *key, long hash);
106};
107
108/* forward declarations */
109static dictentry *
110lookdict_string(dictobject *mp, PyObject *key, long hash);
111
112#ifdef SHOW_CONVERSION_COUNTS
113static long created = 0L;
114static long converted = 0L;
115
116static void
117show_counts(void)
118{
119 fprintf(stderr, "created %ld string dicts\n", created);
120 fprintf(stderr, "converted %ld to normal dicts\n", converted);
121 fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
122}
123#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000124
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125PyObject *
Thomas Wouters78890102000-07-22 19:25:51 +0000126PyDict_New(void)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000127{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000128 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000129 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000131 if (dummy == NULL)
132 return NULL;
Fred Drake1bff34a2000-08-31 19:31:38 +0000133#ifdef SHOW_CONVERSION_COUNTS
134 Py_AtExit(show_counts);
135#endif
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000136 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000137 mp = PyObject_NEW(dictobject, &PyDict_Type);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000138 if (mp == NULL)
139 return NULL;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000140 mp->ma_size = 0;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000141 mp->ma_poly = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000142 mp->ma_table = NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000143 mp->ma_fill = 0;
144 mp->ma_used = 0;
Fred Drake1bff34a2000-08-31 19:31:38 +0000145 mp->ma_lookup = lookdict_string;
146#ifdef SHOW_CONVERSION_COUNTS
147 ++created;
148#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000149 PyObject_GC_Init(mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000151}
152
153/*
154The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000155This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000156Open addressing is preferred over chaining since the link overhead for
157chaining would be substantial (100% with typical malloc overhead).
Guido van Rossum16e93a81997-01-28 00:00:11 +0000158However, instead of going through the table at constant steps, we cycle
Tim Petersea8f2bf2000-12-13 01:02:46 +0000159through the values of GF(2^n). This avoids modulo computations, being
Guido van Rossum16e93a81997-01-28 00:00:11 +0000160much cheaper on RISC machines, without leading to clustering.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000161
Guido van Rossum2bc13791999-03-24 19:06:42 +0000162The initial probe index is computed as hash mod the table size.
Tim Petersea8f2bf2000-12-13 01:02:46 +0000163Subsequent probe indices use the values of x^i in GF(2^n)-{0} as an offset,
164where x is a root. The initial offset is derived from hash, too.
Guido van Rossum2bc13791999-03-24 19:06:42 +0000165
166All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000167
168(This version is due to Reimer Behrends, some ideas are also due to
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000169Jyrki Alakuijala and Vladimir Marangozov.)
Fred Drake1bff34a2000-08-31 19:31:38 +0000170
171This function must never return NULL; failures are indicated by returning
172a dictentry* for which the me_value field is NULL. Exceptions are never
173reported by this function, and outstanding exceptions are maintained.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000174*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000175static dictentry *
Tim Peters1f5871e2000-07-04 17:44:48 +0000176lookdict(dictobject *mp, PyObject *key, register long hash)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000177{
Guido van Rossum16e93a81997-01-28 00:00:11 +0000178 register int i;
179 register unsigned incr;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000180 register dictentry *freeslot;
Guido van Rossum2095d241997-04-09 19:41:24 +0000181 register unsigned int mask = mp->ma_size-1;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000182 dictentry *ep0 = mp->ma_table;
183 register dictentry *ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000184 register int restore_error = 0;
185 register int checked_error = 0;
186 register int cmp;
187 PyObject *err_type, *err_value, *err_tb;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000188 /* We must come up with (i, incr) such that 0 <= i < ma_size
Tim Petersea8f2bf2000-12-13 01:02:46 +0000189 and 0 < incr < ma_size and both are a function of hash.
190 i is the initial table index and incr the initial probe offset. */
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000191 i = (~hash) & mask;
192 /* We use ~hash instead of hash, as degenerate hash functions, such
Guido van Rossum16e93a81997-01-28 00:00:11 +0000193 as for ints <sigh>, can have lots of leading zeros. It's not
Tim Petersea8f2bf2000-12-13 01:02:46 +0000194 really a performance risk, but better safe than sorry.
195 12-Dec-00 tim: so ~hash produces lots of leading ones instead --
196 what's the gain? */
Guido van Rossumefb46091997-01-29 15:53:56 +0000197 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000198 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000199 return ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000200 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000201 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000202 else {
Fred Drakec88b99c2000-08-31 19:04:07 +0000203 if (ep->me_hash == hash) {
204 /* error can't have been checked yet */
205 checked_error = 1;
206 if (PyErr_Occurred()) {
207 restore_error = 1;
208 PyErr_Fetch(&err_type, &err_value, &err_tb);
209 }
210 cmp = PyObject_Compare(ep->me_key, key);
211 if (PyErr_Occurred())
212 PyErr_Clear();
213 else if (cmp == 0) {
214 if (restore_error)
215 PyErr_Restore(err_type, err_value,
216 err_tb);
217 return ep;
218 }
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000219 }
220 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000221 }
Guido van Rossum2bc13791999-03-24 19:06:42 +0000222 /* Derive incr from hash, just to make it more arbitrary. Note that
Guido van Rossum16e93a81997-01-28 00:00:11 +0000223 incr must not be 0, or we will get into an infinite loop.*/
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000224 incr = (hash ^ ((unsigned long)hash >> 3)) & mask;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000225 if (!incr)
226 incr = mask;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000227 for (;;) {
Guido van Rossumefb46091997-01-29 15:53:56 +0000228 ep = &ep0[(i+incr)&mask];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000229 if (ep->me_key == NULL) {
Fred Drakec88b99c2000-08-31 19:04:07 +0000230 if (restore_error)
231 PyErr_Restore(err_type, err_value, err_tb);
Guido van Rossum16e93a81997-01-28 00:00:11 +0000232 if (freeslot != NULL)
233 return freeslot;
234 else
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000235 return ep;
236 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000237 if (ep->me_key == dummy) {
238 if (freeslot == NULL)
239 freeslot = ep;
240 }
Fred Drakec88b99c2000-08-31 19:04:07 +0000241 else if (ep->me_key == key) {
242 if (restore_error)
243 PyErr_Restore(err_type, err_value, err_tb);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000244 return ep;
Fred Drakec88b99c2000-08-31 19:04:07 +0000245 }
246 else if (ep->me_hash == hash) {
247 if (!checked_error) {
248 checked_error = 1;
249 if (PyErr_Occurred()) {
250 restore_error = 1;
251 PyErr_Fetch(&err_type, &err_value,
252 &err_tb);
253 }
254 }
255 cmp = PyObject_Compare(ep->me_key, key);
256 if (PyErr_Occurred())
257 PyErr_Clear();
258 else if (cmp == 0) {
259 if (restore_error)
260 PyErr_Restore(err_type, err_value,
261 err_tb);
262 return ep;
263 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000264 }
265 /* Cycle through GF(2^n)-{0} */
266 incr = incr << 1;
267 if (incr > mask)
Thomas Wouters7e474022000-07-16 12:04:32 +0000268 incr ^= mp->ma_poly; /* This will implicitly clear
Guido van Rossumf05fc711998-11-16 22:46:30 +0000269 the highest bit */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000270 }
271}
272
273/*
Fred Drake1bff34a2000-08-31 19:31:38 +0000274 * Hacked up version of lookdict which can assume keys are always strings;
275 * this assumption allows testing for errors during PyObject_Compare() to
276 * be dropped; string-string comparisons never raise exceptions. This also
277 * means we don't need to go through PyObject_Compare(); we can always use
278 * the tp_compare slot of the string type object directly.
279 *
280 * This really only becomes meaningful if proper error handling in lookdict()
281 * is too expensive.
282 */
283static dictentry *
284lookdict_string(dictobject *mp, PyObject *key, register long hash)
285{
286 register int i;
287 register unsigned incr;
288 register dictentry *freeslot;
289 register unsigned int mask = mp->ma_size-1;
290 dictentry *ep0 = mp->ma_table;
291 register dictentry *ep;
292 cmpfunc compare = PyString_Type.tp_compare;
293
294 /* make sure this function doesn't have to handle non-string keys */
295 if (!PyString_Check(key)) {
296#ifdef SHOW_CONVERSION_COUNTS
297 ++converted;
298#endif
299 mp->ma_lookup = lookdict;
300 return lookdict(mp, key, hash);
301 }
302 /* We must come up with (i, incr) such that 0 <= i < ma_size
303 and 0 < incr < ma_size and both are a function of hash */
304 i = (~hash) & mask;
305 /* We use ~hash instead of hash, as degenerate hash functions, such
306 as for ints <sigh>, can have lots of leading zeros. It's not
307 really a performance risk, but better safe than sorry. */
308 ep = &ep0[i];
309 if (ep->me_key == NULL || ep->me_key == key)
310 return ep;
311 if (ep->me_key == dummy)
312 freeslot = ep;
313 else {
314 if (ep->me_hash == hash
315 && compare(ep->me_key, key) == 0) {
316 return ep;
317 }
318 freeslot = NULL;
319 }
320 /* Derive incr from hash, just to make it more arbitrary. Note that
321 incr must not be 0, or we will get into an infinite loop.*/
322 incr = (hash ^ ((unsigned long)hash >> 3)) & mask;
323 if (!incr)
324 incr = mask;
325 for (;;) {
326 ep = &ep0[(i+incr)&mask];
327 if (ep->me_key == NULL) {
328 if (freeslot != NULL)
329 return freeslot;
330 else
331 return ep;
332 }
333 if (ep->me_key == dummy) {
334 if (freeslot == NULL)
335 freeslot = ep;
336 }
337 else if (ep->me_key == key
338 || (ep->me_hash == hash
339 && compare(ep->me_key, key) == 0)) {
340 return ep;
341 }
342 /* Cycle through GF(2^n)-{0} */
343 incr = incr << 1;
344 if (incr > mask)
345 incr ^= mp->ma_poly; /* This will implicitly clear
346 the highest bit */
347 }
348}
349
350/*
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000351Internal routine to insert a new item into the table.
352Used both by the internal resize routine and by the public insert routine.
353Eats a reference to key and one to value.
354*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000355static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000356insertdict(register dictobject *mp, PyObject *key, long hash, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000357{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000359 register dictentry *ep;
Fred Drake1bff34a2000-08-31 19:31:38 +0000360 ep = (mp->ma_lookup)(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000361 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000362 old_value = ep->me_value;
363 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 Py_DECREF(old_value); /* which **CAN** re-enter */
365 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000366 }
367 else {
368 if (ep->me_key == NULL)
369 mp->ma_fill++;
370 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371 Py_DECREF(ep->me_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000372 ep->me_key = key;
373 ep->me_hash = hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000374 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000375 mp->ma_used++;
376 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000377}
378
379/*
380Restructure the table by allocating a new table and reinserting all
381items again. When entries have been deleted, the new table may
382actually be smaller than the old one.
383*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000384static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000385dictresize(dictobject *mp, int minused)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000386{
387 register int oldsize = mp->ma_size;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000388 register int newsize, newpoly;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000389 register dictentry *oldtable = mp->ma_table;
390 register dictentry *newtable;
391 register dictentry *ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000392 register int i;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000393 for (i = 0, newsize = MINSIZE; ; i++, newsize <<= 1) {
394 if (i > sizeof(polys)/sizeof(polys[0])) {
395 /* Ran out of polynomials */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 PyErr_NoMemory();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000397 return -1;
398 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000399 if (newsize > minused) {
Guido van Rossum16e93a81997-01-28 00:00:11 +0000400 newpoly = polys[i];
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000401 break;
402 }
403 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000404 newtable = PyMem_NEW(dictentry, newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000405 if (newtable == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000407 return -1;
408 }
Guido van Rossum0fd00331998-07-16 15:06:13 +0000409 memset(newtable, '\0', sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000410 mp->ma_size = newsize;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000411 mp->ma_poly = newpoly;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000412 mp->ma_table = newtable;
413 mp->ma_fill = 0;
414 mp->ma_used = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000415
416 /* Make two passes, so we can avoid decrefs
417 (and possible side effects) till the table is copied */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000418 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
419 if (ep->me_value != NULL)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000420 insertdict(mp,ep->me_key,ep->me_hash,ep->me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000421 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000422 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000423 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 Py_XDECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000425 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000426 }
427
Guido van Rossumb18618d2000-05-03 23:44:39 +0000428 if (oldtable != NULL)
429 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000430 return 0;
431}
432
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000434PyDict_GetItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000435{
436 long hash;
Fred Drake1bff34a2000-08-31 19:31:38 +0000437 dictobject *mp = (dictobject *)op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438 if (!PyDict_Check(op)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000439 return NULL;
440 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000441 if (mp->ma_table == NULL)
Guido van Rossumd7047b31995-01-02 19:07:15 +0000442 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000443#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 if (!PyString_Check(key) ||
445 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000446#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000447 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000449 if (hash == -1) {
450 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000451 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000452 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000453 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000454 return (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000455}
456
457int
Tim Peters1f5871e2000-07-04 17:44:48 +0000458PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000459{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000460 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000461 register long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 if (!PyDict_Check(op)) {
463 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000464 return -1;
465 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000466 mp = (dictobject *)op;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000467#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468 if (PyString_Check(key)) {
Guido van Rossum2a61e741997-01-18 07:55:05 +0000469#ifdef INTERN_STRINGS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 if (((PyStringObject *)key)->ob_sinterned != NULL) {
471 key = ((PyStringObject *)key)->ob_sinterned;
472 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000473 }
474 else
475#endif
476 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000478 if (hash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000480 }
481 }
482 else
483#endif
484 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000485 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000486 if (hash == -1)
487 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000488 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000489 /* if fill >= 2/3 size, double in size */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000490 if (mp->ma_fill*3 >= mp->ma_size*2) {
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000491 if (dictresize(mp, mp->ma_used*2) != 0) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000492 if (mp->ma_fill+1 > mp->ma_size)
493 return -1;
494 }
495 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 Py_INCREF(value);
497 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000498 insertdict(mp, key, hash, value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000499 return 0;
500}
501
502int
Tim Peters1f5871e2000-07-04 17:44:48 +0000503PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000504{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000505 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000506 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000507 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000509
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 if (!PyDict_Check(op)) {
511 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000512 return -1;
513 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000514#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 if (!PyString_Check(key) ||
516 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000517#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000518 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000520 if (hash == -1)
521 return -1;
522 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000523 mp = (dictobject *)op;
524 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumefc87131995-01-02 19:42:39 +0000525 goto empty;
Fred Drake1bff34a2000-08-31 19:31:38 +0000526 ep = (mp->ma_lookup)(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000527 if (ep->me_value == NULL) {
Guido van Rossumefc87131995-01-02 19:42:39 +0000528 empty:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000529 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000530 return -1;
531 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000532 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000534 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000535 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000536 ep->me_value = NULL;
537 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000538 Py_DECREF(old_value);
539 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000540 return 0;
541}
542
Guido van Rossum25831651993-05-19 14:50:45 +0000543void
Tim Peters1f5871e2000-07-04 17:44:48 +0000544PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000545{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000546 int i, n;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000547 register dictentry *table;
548 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000550 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000551 mp = (dictobject *)op;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000552 table = mp->ma_table;
553 if (table == NULL)
554 return;
555 n = mp->ma_size;
556 mp->ma_size = mp->ma_used = mp->ma_fill = 0;
557 mp->ma_table = NULL;
558 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 Py_XDECREF(table[i].me_key);
560 Py_XDECREF(table[i].me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000561 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000563}
564
Guido van Rossum25831651993-05-19 14:50:45 +0000565int
Tim Peters1f5871e2000-07-04 17:44:48 +0000566PyDict_Next(PyObject *op, int *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000567{
Guido van Rossum25831651993-05-19 14:50:45 +0000568 int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000569 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000571 return 0;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000572 mp = (dictobject *)op;
Guido van Rossum25831651993-05-19 14:50:45 +0000573 i = *ppos;
574 if (i < 0)
575 return 0;
576 while (i < mp->ma_size && mp->ma_table[i].me_value == NULL)
577 i++;
578 *ppos = i+1;
579 if (i >= mp->ma_size)
580 return 0;
581 if (pkey)
582 *pkey = mp->ma_table[i].me_key;
583 if (pvalue)
584 *pvalue = mp->ma_table[i].me_value;
585 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000586}
587
588/* Methods */
589
590static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000591dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000592{
593 register int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000594 register dictentry *ep;
Guido van Rossumd724b232000-03-13 16:01:29 +0000595 Py_TRASHCAN_SAFE_BEGIN(mp)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000596 PyObject_GC_Fini(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000597 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000598 if (ep->me_key != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000600 }
601 if (ep->me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 Py_DECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000603 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000604 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000605 if (mp->ma_table != NULL)
606 PyMem_DEL(mp->ma_table);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000607 mp = (dictobject *) PyObject_AS_GC(mp);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000608 PyObject_DEL(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000609 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000610}
611
612static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000613dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000614{
615 register int i;
616 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000617 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000618
619 i = Py_ReprEnter((PyObject*)mp);
620 if (i != 0) {
621 if (i < 0)
622 return i;
623 fprintf(fp, "{...}");
624 return 0;
625 }
626
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000627 fprintf(fp, "{");
628 any = 0;
629 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
630 if (ep->me_value != NULL) {
631 if (any++ > 0)
632 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000633 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
634 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000635 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000636 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000637 fprintf(fp, ": ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000638 if (PyObject_Print(ep->me_value, fp, 0) != 0) {
639 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000640 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000641 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000642 }
643 }
644 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000645 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000646 return 0;
647}
648
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000650dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000651{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 auto PyObject *v;
653 PyObject *sepa, *colon;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000654 register int i;
655 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000656 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000657
658 i = Py_ReprEnter((PyObject*)mp);
659 if (i != 0) {
660 if (i > 0)
661 return PyString_FromString("{...}");
662 return NULL;
663 }
664
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 v = PyString_FromString("{");
666 sepa = PyString_FromString(", ");
667 colon = PyString_FromString(": ");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000668 any = 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000669 for (i = 0, ep = mp->ma_table; i < mp->ma_size && v; i++, ep++) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000670 if (ep->me_value != NULL) {
671 if (any++)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672 PyString_Concat(&v, sepa);
673 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_key));
674 PyString_Concat(&v, colon);
675 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_value));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000676 }
677 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 PyString_ConcatAndDel(&v, PyString_FromString("}"));
Guido van Rossum255443b1998-04-10 22:47:14 +0000679 Py_ReprLeave((PyObject*)mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 Py_XDECREF(sepa);
681 Py_XDECREF(colon);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000682 return v;
683}
684
685static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000686dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000687{
688 return mp->ma_used;
689}
690
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000692dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000693{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000695 long hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000696 if (mp->ma_table == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000698 return NULL;
699 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000700#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 if (!PyString_Check(key) ||
702 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000703#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000704 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000706 if (hash == -1)
707 return NULL;
708 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000709 v = (mp->ma_lookup)(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000710 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000712 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000714 return v;
715}
716
717static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000718dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000719{
720 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000722 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000724}
725
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000726static PyMappingMethods dict_as_mapping = {
727 (inquiry)dict_length, /*mp_length*/
728 (binaryfunc)dict_subscript, /*mp_subscript*/
729 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000730};
731
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000733dict_keys(register dictobject *mp, PyObject *args)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000734{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 register PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000736 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 if (!PyArg_NoArgs(args))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000738 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739 v = PyList_New(mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000740 if (v == NULL)
741 return NULL;
742 for (i = 0, j = 0; i < mp->ma_size; i++) {
743 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000744 PyObject *key = mp->ma_table[i].me_key;
745 Py_INCREF(key);
746 PyList_SetItem(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000747 j++;
748 }
749 }
750 return v;
751}
752
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000754dict_values(register dictobject *mp, PyObject *args)
Guido van Rossum25831651993-05-19 14:50:45 +0000755{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000757 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000758 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000759 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000761 if (v == NULL)
762 return NULL;
763 for (i = 0, j = 0; i < mp->ma_size; i++) {
764 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 PyObject *value = mp->ma_table[i].me_value;
766 Py_INCREF(value);
767 PyList_SetItem(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000768 j++;
769 }
770 }
771 return v;
772}
773
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000775dict_items(register dictobject *mp, PyObject *args)
Guido van Rossum25831651993-05-19 14:50:45 +0000776{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000778 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000780 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000782 if (v == NULL)
783 return NULL;
784 for (i = 0, j = 0; i < mp->ma_size; i++) {
785 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 PyObject *key = mp->ma_table[i].me_key;
787 PyObject *value = mp->ma_table[i].me_value;
788 PyObject *item = PyTuple_New(2);
Guido van Rossum25831651993-05-19 14:50:45 +0000789 if (item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000790 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +0000791 return NULL;
792 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000793 Py_INCREF(key);
794 PyTuple_SetItem(item, 0, key);
795 Py_INCREF(value);
796 PyTuple_SetItem(item, 1, value);
797 PyList_SetItem(v, j, item);
Guido van Rossum25831651993-05-19 14:50:45 +0000798 j++;
799 }
800 }
801 return v;
802}
803
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000804static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000805dict_update(register dictobject *mp, PyObject *args)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000806{
807 register int i;
808 dictobject *other;
809 dictentry *entry;
810 if (!PyArg_Parse(args, "O!", &PyDict_Type, &other))
811 return NULL;
812 if (other == mp)
Guido van Rossuma8d51311997-06-02 17:13:37 +0000813 goto done; /* a.update(a); nothing to do */
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000814 /* Do one big resize at the start, rather than incrementally
815 resizing as we insert new items. Expect that there will be
816 no (or few) overlapping keys. */
817 if ((mp->ma_fill + other->ma_used)*3 >= mp->ma_size*2) {
818 if (dictresize(mp, (mp->ma_used + other->ma_used)*3/2) != 0)
819 return NULL;
820 }
821 for (i = 0; i < other->ma_size; i++) {
822 entry = &other->ma_table[i];
823 if (entry->me_value != NULL) {
824 Py_INCREF(entry->me_key);
825 Py_INCREF(entry->me_value);
826 insertdict(mp, entry->me_key, entry->me_hash,
827 entry->me_value);
828 }
829 }
830 done:
831 Py_INCREF(Py_None);
832 return Py_None;
833}
834
835static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000836dict_copy(register dictobject *mp, PyObject *args)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000837{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000838 if (!PyArg_Parse(args, ""))
839 return NULL;
840 return PyDict_Copy((PyObject*)mp);
841}
842
843PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000844PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000845{
846 register dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000847 register int i;
848 dictobject *copy;
849 dictentry *entry;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000850
851 if (o == NULL || !PyDict_Check(o)) {
852 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000853 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000854 }
855 mp = (dictobject *)o;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000856 copy = (dictobject *)PyDict_New();
857 if (copy == NULL)
858 return NULL;
859 if (mp->ma_used > 0) {
860 if (dictresize(copy, mp->ma_used*3/2) != 0)
861 return NULL;
862 for (i = 0; i < mp->ma_size; i++) {
863 entry = &mp->ma_table[i];
864 if (entry->me_value != NULL) {
865 Py_INCREF(entry->me_key);
866 Py_INCREF(entry->me_value);
867 insertdict(copy, entry->me_key, entry->me_hash,
868 entry->me_value);
869 }
870 }
871 }
872 return (PyObject *)copy;
873}
874
Guido van Rossum4199fac1993-11-05 10:18:44 +0000875int
Tim Peters1f5871e2000-07-04 17:44:48 +0000876PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +0000877{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878 if (mp == NULL || !PyDict_Check(mp)) {
879 PyErr_BadInternalCall();
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000880 return 0;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000881 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000882 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000883}
884
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000886PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000887{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888 if (mp == NULL || !PyDict_Check(mp)) {
889 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000890 return NULL;
891 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000892 return dict_keys((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000893}
894
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000896PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000897{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000898 if (mp == NULL || !PyDict_Check(mp)) {
899 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000900 return NULL;
901 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000902 return dict_values((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000903}
904
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000905PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000906PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000907{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000908 if (mp == NULL || !PyDict_Check(mp)) {
909 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000910 return NULL;
911 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000912 return dict_items((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000913}
914
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000915#define NEWCMP
916
917#ifdef NEWCMP
918
919/* Subroutine which returns the smallest key in a for which b's value
920 is different or absent. The value is returned too, through the
921 pval argument. No reference counts are incremented. */
922
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000924characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000925{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 PyObject *diff = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000927 int i;
928
929 *pval = NULL;
930 for (i = 0; i < a->ma_size; i++) {
931 if (a->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 PyObject *key = a->ma_table[i].me_key;
933 PyObject *aval, *bval;
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000934 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 if (diff != NULL && PyObject_Compare(key, diff) > 0)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000936 continue;
937 aval = a->ma_table[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938 bval = PyDict_GetItem((PyObject *)b, key);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000939 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 if (bval == NULL || PyObject_Compare(aval, bval) != 0)
941 {
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000942 diff = key;
943 *pval = aval;
944 }
945 }
946 }
947 return diff;
948}
949
950static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000951dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000952{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000953 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000954 int res;
955
956 /* Compare lengths first */
957 if (a->ma_used < b->ma_used)
958 return -1; /* a is shorter */
959 else if (a->ma_used > b->ma_used)
960 return 1; /* b is shorter */
961 /* Same length -- check all keys */
962 adiff = characterize(a, b, &aval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000963 if (PyErr_Occurred())
964 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000965 if (adiff == NULL)
966 return 0; /* a is a subset with the same length */
967 bdiff = characterize(b, a, &bval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000968 if (PyErr_Occurred())
969 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000970 /* bdiff == NULL would be impossible now */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 res = PyObject_Compare(adiff, bdiff);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000972 if (res == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973 res = PyObject_Compare(aval, bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000974 return res;
975}
976
977#else /* !NEWCMP */
978
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000979static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000980dict_compare(dictobject *a, dictobject *b)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000981{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 PyObject *akeys, *bkeys;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000983 int i, n, res;
984 if (a == b)
985 return 0;
986 if (a->ma_used == 0) {
987 if (b->ma_used != 0)
988 return -1;
989 else
990 return 0;
991 }
992 else {
993 if (b->ma_used == 0)
994 return 1;
995 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000996 akeys = dict_keys(a, (PyObject *)NULL);
997 bkeys = dict_keys(b, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000998 if (akeys == NULL || bkeys == NULL) {
999 /* Oops, out of memory -- what to do? */
1000 /* For now, sort on address! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001 Py_XDECREF(akeys);
1002 Py_XDECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001003 if (a < b)
1004 return -1;
1005 else
1006 return 1;
1007 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001008 PyList_Sort(akeys);
1009 PyList_Sort(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001010 n = a->ma_used < b->ma_used ? a->ma_used : b->ma_used; /* smallest */
1011 res = 0;
1012 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 PyObject *akey, *bkey, *aval, *bval;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001014 long ahash, bhash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001015 akey = PyList_GetItem(akeys, i);
1016 bkey = PyList_GetItem(bkeys, i);
1017 res = PyObject_Compare(akey, bkey);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001018 if (res != 0)
1019 break;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001020#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 if (!PyString_Check(akey) ||
1022 (ahash = ((PyStringObject *) akey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001023#endif
Guido van Rossumca756f21997-01-23 19:39:29 +00001024 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 ahash = PyObject_Hash(akey);
Guido van Rossumca756f21997-01-23 19:39:29 +00001026 if (ahash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +00001028 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001029#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030 if (!PyString_Check(bkey) ||
1031 (bhash = ((PyStringObject *) bkey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001032#endif
Guido van Rossumca756f21997-01-23 19:39:29 +00001033 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034 bhash = PyObject_Hash(bkey);
Guido van Rossumca756f21997-01-23 19:39:29 +00001035 if (bhash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +00001037 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001038 aval = (a->ma_lookup)(a, akey, ahash) -> me_value;
1039 bval = (b->ma_lookup)(b, bkey, bhash) -> me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001040 res = PyObject_Compare(aval, bval);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001041 if (res != 0)
1042 break;
1043 }
1044 if (res == 0) {
1045 if (a->ma_used < b->ma_used)
1046 res = -1;
1047 else if (a->ma_used > b->ma_used)
1048 res = 1;
1049 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 Py_DECREF(akeys);
1051 Py_DECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001052 return res;
1053}
1054
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001055#endif /* !NEWCMP */
1056
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001058dict_has_key(register dictobject *mp, PyObject *args)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001059{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001060 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001061 long hash;
1062 register long ok;
Fred Drake52fccfd2000-02-23 15:47:16 +00001063 if (!PyArg_ParseTuple(args, "O:has_key", &key))
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001064 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001065#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001066 if (!PyString_Check(key) ||
1067 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001068#endif
Guido van Rossumca756f21997-01-23 19:39:29 +00001069 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001070 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001071 if (hash == -1)
1072 return NULL;
1073 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001074 ok = (mp->ma_size != 0
1075 && (mp->ma_lookup)(mp, key, hash)->me_value != NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076 return PyInt_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001077}
1078
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001080dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001081{
1082 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001083 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001084 PyObject *val = NULL;
1085 long hash;
1086
Fred Drake52fccfd2000-02-23 15:47:16 +00001087 if (!PyArg_ParseTuple(args, "O|O:get", &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001088 return NULL;
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001089 if (mp->ma_table == NULL)
1090 goto finally;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001091
Barry Warsawc38c5da1997-10-06 17:49:20 +00001092#ifdef CACHE_HASH
1093 if (!PyString_Check(key) ||
1094 (hash = ((PyStringObject *) key)->ob_shash) == -1)
1095#endif
1096 {
1097 hash = PyObject_Hash(key);
1098 if (hash == -1)
1099 return NULL;
1100 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001101 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001102
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001103 finally:
Barry Warsawc38c5da1997-10-06 17:49:20 +00001104 if (val == NULL)
1105 val = failobj;
1106 Py_INCREF(val);
1107 return val;
1108}
1109
1110
1111static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001112dict_setdefault(register dictobject *mp, PyObject *args)
1113{
1114 PyObject *key;
1115 PyObject *failobj = Py_None;
1116 PyObject *val = NULL;
1117 long hash;
1118
1119 if (!PyArg_ParseTuple(args, "O|O:setdefault", &key, &failobj))
1120 return NULL;
1121 if (mp->ma_table == NULL)
1122 goto finally;
1123
1124#ifdef CACHE_HASH
1125 if (!PyString_Check(key) ||
1126 (hash = ((PyStringObject *) key)->ob_shash) == -1)
1127#endif
1128 {
1129 hash = PyObject_Hash(key);
1130 if (hash == -1)
1131 return NULL;
1132 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001133 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001134
1135 finally:
1136 if (val == NULL) {
1137 val = failobj;
1138 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1139 val = NULL;
1140 }
1141 Py_XINCREF(val);
1142 return val;
1143}
1144
1145
1146static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001147dict_clear(register dictobject *mp, PyObject *args)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001148{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149 if (!PyArg_NoArgs(args))
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001150 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001151 PyDict_Clear((PyObject *)mp);
1152 Py_INCREF(Py_None);
1153 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001154}
1155
Guido van Rossumba6ab842000-12-12 22:02:18 +00001156static PyObject *
1157dict_popitem(dictobject *mp, PyObject *args)
1158{
1159 int i = 0;
1160 dictentry *ep;
1161 PyObject *res;
1162
1163 if (!PyArg_NoArgs(args))
1164 return NULL;
1165 if (mp->ma_used == 0) {
1166 PyErr_SetString(PyExc_KeyError,
1167 "popitem(): dictionary is empty");
1168 return NULL;
1169 }
1170 /* Set ep to "the first" dict entry with a value. We abuse the hash
1171 * field of slot 0 to hold a search finger:
1172 * If slot 0 has a value, use slot 0.
1173 * Else slot 0 is being used to hold a search finger,
1174 * and we use its hash value as the first index to look.
1175 */
1176 ep = &mp->ma_table[0];
1177 if (ep->me_value == NULL) {
1178 i = (int)ep->me_hash;
1179 /* The hash field may be uninitialized trash, or it
1180 * may be a real hash value, or it may be a legit
1181 * search finger, or it may be a once-legit search
1182 * finger that's out of bounds now because it
1183 * wrapped around or the table shrunk -- simply
1184 * make sure it's in bounds now.
1185 */
1186 if (i >= mp->ma_size || i < 1)
1187 i = 1; /* skip slot 0 */
1188 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1189 i++;
1190 if (i >= mp->ma_size)
1191 i = 1;
1192 }
1193 }
1194 res = PyTuple_New(2);
1195 if (res != NULL) {
1196 PyTuple_SET_ITEM(res, 0, ep->me_key);
1197 PyTuple_SET_ITEM(res, 1, ep->me_value);
1198 Py_INCREF(dummy);
1199 ep->me_key = dummy;
1200 ep->me_value = NULL;
1201 mp->ma_used--;
1202 assert(mp->ma_table[0].me_value == NULL);
1203 mp->ma_table[0].me_hash = i + 1; /* next place to start */
1204 }
1205 return res;
1206}
1207
Jeremy Hylton8caad492000-06-23 14:18:11 +00001208static int
1209dict_traverse(PyObject *op, visitproc visit, void *arg)
1210{
1211 int i = 0, err;
1212 PyObject *pk;
1213 PyObject *pv;
1214
1215 while (PyDict_Next(op, &i, &pk, &pv)) {
1216 err = visit(pk, arg);
1217 if (err)
1218 return err;
1219 err = visit(pv, arg);
1220 if (err)
1221 return err;
1222 }
1223 return 0;
1224}
1225
1226static int
1227dict_tp_clear(PyObject *op)
1228{
1229 PyDict_Clear(op);
1230 return 0;
1231}
1232
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001233static PyMethodDef mapp_methods[] = {
Fred Drake52fccfd2000-02-23 15:47:16 +00001234 {"has_key", (PyCFunction)dict_has_key, METH_VARARGS},
Guido van Rossum5d8123f1997-07-13 03:58:01 +00001235 {"keys", (PyCFunction)dict_keys},
1236 {"items", (PyCFunction)dict_items},
1237 {"values", (PyCFunction)dict_values},
Guido van Rossuma8d51311997-06-02 17:13:37 +00001238 {"update", (PyCFunction)dict_update},
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001239 {"clear", (PyCFunction)dict_clear},
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001240 {"copy", (PyCFunction)dict_copy},
Fred Drake52fccfd2000-02-23 15:47:16 +00001241 {"get", (PyCFunction)dict_get, METH_VARARGS},
Guido van Rossum164452c2000-08-08 16:12:54 +00001242 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS},
Guido van Rossumba6ab842000-12-12 22:02:18 +00001243 {"popitem", (PyCFunction)dict_popitem},
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001244 {NULL, NULL} /* sentinel */
1245};
1246
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001247static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001248dict_getattr(dictobject *mp, char *name)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001249{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 return Py_FindMethod(mapp_methods, (PyObject *)mp, name);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001251}
1252
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253PyTypeObject PyDict_Type = {
1254 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001255 0,
Guido van Rossum9bfef441993-03-29 10:43:31 +00001256 "dictionary",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001257 sizeof(dictobject) + PyGC_HEAD_SIZE,
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001258 0,
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001259 (destructor)dict_dealloc, /*tp_dealloc*/
1260 (printfunc)dict_print, /*tp_print*/
1261 (getattrfunc)dict_getattr, /*tp_getattr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001262 0, /*tp_setattr*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001263 (cmpfunc)dict_compare, /*tp_compare*/
1264 (reprfunc)dict_repr, /*tp_repr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001265 0, /*tp_as_number*/
1266 0, /*tp_as_sequence*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001267 &dict_as_mapping, /*tp_as_mapping*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001268 0, /* tp_hash */
1269 0, /* tp_call */
1270 0, /* tp_str */
1271 0, /* tp_getattro */
1272 0, /* tp_setattro */
1273 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001274 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001275 0, /* tp_doc */
1276 (traverseproc)dict_traverse, /* tp_traverse */
1277 (inquiry)dict_tp_clear, /* tp_clear */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001278};
1279
Guido van Rossum3cca2451997-05-16 14:23:33 +00001280/* For backward compatibility with old dictionary interface */
1281
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001282PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001283PyDict_GetItemString(PyObject *v, char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001284{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001285 PyObject *kv, *rv;
1286 kv = PyString_FromString(key);
1287 if (kv == NULL)
1288 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001289 rv = PyDict_GetItem(v, kv);
1290 Py_DECREF(kv);
1291 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001292}
1293
1294int
Tim Peters1f5871e2000-07-04 17:44:48 +00001295PyDict_SetItemString(PyObject *v, char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001296{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001297 PyObject *kv;
1298 int err;
1299 kv = PyString_FromString(key);
1300 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001301 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001302 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001303 err = PyDict_SetItem(v, kv, item);
1304 Py_DECREF(kv);
1305 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001306}
1307
1308int
Tim Peters1f5871e2000-07-04 17:44:48 +00001309PyDict_DelItemString(PyObject *v, char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001310{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001311 PyObject *kv;
1312 int err;
1313 kv = PyString_FromString(key);
1314 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001315 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001316 err = PyDict_DelItem(v, kv);
1317 Py_DECREF(kv);
1318 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001319}