blob: ad8ba199973e6ddf88b322ff3580a29e9c4a4418 [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 }
Guido van Rossumb9324202001-01-18 00:39:02 +0000210 cmp = PyObject_RichCompareBool(ep->me_key, key, Py_EQ);
211 if (cmp > 0) {
Fred Drakec88b99c2000-08-31 19:04:07 +0000212 if (restore_error)
213 PyErr_Restore(err_type, err_value,
214 err_tb);
215 return ep;
216 }
Guido van Rossumb9324202001-01-18 00:39:02 +0000217 else if (cmp < 0)
218 PyErr_Clear();
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 }
Guido van Rossumb9324202001-01-18 00:39:02 +0000255 cmp = PyObject_RichCompareBool(ep->me_key, key, Py_EQ);
256 if (cmp > 0) {
Fred Drakec88b99c2000-08-31 19:04:07 +0000257 if (restore_error)
258 PyErr_Restore(err_type, err_value,
259 err_tb);
260 return ep;
261 }
Guido van Rossumb9324202001-01-18 00:39:02 +0000262 else if (cmp < 0)
263 PyErr_Clear();
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;
Jeremy Hylton1fb60882001-01-03 22:34:59 +0000812 if (other == mp || other->ma_used == 0)
813 goto done; /* a.update(a) or a.update({}); 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/* 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 Rossumb9324202001-01-18 00:39:02 +0000923 int i, cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000924
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 Rossumb9324202001-01-18 00:39:02 +0000930 if (diff != NULL) {
931 cmp = PyObject_RichCompareBool(diff, key, Py_LT);
932 if (cmp < 0)
933 return NULL;
934 if (cmp > 0)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000935 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +0000936 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000937 aval = a->ma_table[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938 bval = PyDict_GetItem((PyObject *)b, key);
Guido van Rossumb9324202001-01-18 00:39:02 +0000939 if (bval == NULL)
940 cmp = 0;
941 else {
942 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
943 if (cmp < 0)
944 return NULL;
945 }
946 if (cmp == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947 {
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000948 diff = key;
949 *pval = aval;
950 }
951 }
952 }
953 return diff;
954}
955
956static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000957dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000958{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000960 int res;
961
962 /* Compare lengths first */
963 if (a->ma_used < b->ma_used)
964 return -1; /* a is shorter */
965 else if (a->ma_used > b->ma_used)
966 return 1; /* b is shorter */
967 /* Same length -- check all keys */
968 adiff = characterize(a, b, &aval);
Guido van Rossumb9324202001-01-18 00:39:02 +0000969 if (adiff == NULL && PyErr_Occurred())
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000970 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000971 if (adiff == NULL)
972 return 0; /* a is a subset with the same length */
973 bdiff = characterize(b, a, &bval);
Guido van Rossumb9324202001-01-18 00:39:02 +0000974 if (bdiff == NULL && PyErr_Occurred())
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000975 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000976 /* bdiff == NULL would be impossible now */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 res = PyObject_Compare(adiff, bdiff);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000978 if (res == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 res = PyObject_Compare(aval, bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000980 return res;
981}
982
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000983static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000984dict_has_key(register dictobject *mp, PyObject *args)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000985{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000986 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000987 long hash;
988 register long ok;
Fred Drake52fccfd2000-02-23 15:47:16 +0000989 if (!PyArg_ParseTuple(args, "O:has_key", &key))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000990 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000991#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992 if (!PyString_Check(key) ||
993 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000994#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000995 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000997 if (hash == -1)
998 return NULL;
999 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001000 ok = (mp->ma_size != 0
1001 && (mp->ma_lookup)(mp, key, hash)->me_value != NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 return PyInt_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001003}
1004
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001006dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001007{
1008 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001009 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001010 PyObject *val = NULL;
1011 long hash;
1012
Fred Drake52fccfd2000-02-23 15:47:16 +00001013 if (!PyArg_ParseTuple(args, "O|O:get", &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001014 return NULL;
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001015 if (mp->ma_table == NULL)
1016 goto finally;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001017
Barry Warsawc38c5da1997-10-06 17:49:20 +00001018#ifdef CACHE_HASH
1019 if (!PyString_Check(key) ||
1020 (hash = ((PyStringObject *) key)->ob_shash) == -1)
1021#endif
1022 {
1023 hash = PyObject_Hash(key);
1024 if (hash == -1)
1025 return NULL;
1026 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001027 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001028
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001029 finally:
Barry Warsawc38c5da1997-10-06 17:49:20 +00001030 if (val == NULL)
1031 val = failobj;
1032 Py_INCREF(val);
1033 return val;
1034}
1035
1036
1037static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001038dict_setdefault(register dictobject *mp, PyObject *args)
1039{
1040 PyObject *key;
1041 PyObject *failobj = Py_None;
1042 PyObject *val = NULL;
1043 long hash;
1044
1045 if (!PyArg_ParseTuple(args, "O|O:setdefault", &key, &failobj))
1046 return NULL;
1047 if (mp->ma_table == NULL)
1048 goto finally;
1049
1050#ifdef CACHE_HASH
1051 if (!PyString_Check(key) ||
1052 (hash = ((PyStringObject *) key)->ob_shash) == -1)
1053#endif
1054 {
1055 hash = PyObject_Hash(key);
1056 if (hash == -1)
1057 return NULL;
1058 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001059 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001060
1061 finally:
1062 if (val == NULL) {
1063 val = failobj;
1064 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1065 val = NULL;
1066 }
1067 Py_XINCREF(val);
1068 return val;
1069}
1070
1071
1072static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001073dict_clear(register dictobject *mp, PyObject *args)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001074{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075 if (!PyArg_NoArgs(args))
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001076 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001077 PyDict_Clear((PyObject *)mp);
1078 Py_INCREF(Py_None);
1079 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001080}
1081
Guido van Rossumba6ab842000-12-12 22:02:18 +00001082static PyObject *
1083dict_popitem(dictobject *mp, PyObject *args)
1084{
1085 int i = 0;
1086 dictentry *ep;
1087 PyObject *res;
1088
1089 if (!PyArg_NoArgs(args))
1090 return NULL;
1091 if (mp->ma_used == 0) {
1092 PyErr_SetString(PyExc_KeyError,
1093 "popitem(): dictionary is empty");
1094 return NULL;
1095 }
1096 /* Set ep to "the first" dict entry with a value. We abuse the hash
1097 * field of slot 0 to hold a search finger:
1098 * If slot 0 has a value, use slot 0.
1099 * Else slot 0 is being used to hold a search finger,
1100 * and we use its hash value as the first index to look.
1101 */
1102 ep = &mp->ma_table[0];
1103 if (ep->me_value == NULL) {
1104 i = (int)ep->me_hash;
1105 /* The hash field may be uninitialized trash, or it
1106 * may be a real hash value, or it may be a legit
1107 * search finger, or it may be a once-legit search
1108 * finger that's out of bounds now because it
1109 * wrapped around or the table shrunk -- simply
1110 * make sure it's in bounds now.
1111 */
1112 if (i >= mp->ma_size || i < 1)
1113 i = 1; /* skip slot 0 */
1114 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1115 i++;
1116 if (i >= mp->ma_size)
1117 i = 1;
1118 }
1119 }
1120 res = PyTuple_New(2);
1121 if (res != NULL) {
1122 PyTuple_SET_ITEM(res, 0, ep->me_key);
1123 PyTuple_SET_ITEM(res, 1, ep->me_value);
1124 Py_INCREF(dummy);
1125 ep->me_key = dummy;
1126 ep->me_value = NULL;
1127 mp->ma_used--;
1128 assert(mp->ma_table[0].me_value == NULL);
1129 mp->ma_table[0].me_hash = i + 1; /* next place to start */
1130 }
1131 return res;
1132}
1133
Jeremy Hylton8caad492000-06-23 14:18:11 +00001134static int
1135dict_traverse(PyObject *op, visitproc visit, void *arg)
1136{
1137 int i = 0, err;
1138 PyObject *pk;
1139 PyObject *pv;
1140
1141 while (PyDict_Next(op, &i, &pk, &pv)) {
1142 err = visit(pk, arg);
1143 if (err)
1144 return err;
1145 err = visit(pv, arg);
1146 if (err)
1147 return err;
1148 }
1149 return 0;
1150}
1151
1152static int
1153dict_tp_clear(PyObject *op)
1154{
1155 PyDict_Clear(op);
1156 return 0;
1157}
1158
Tim Petersf7f88b12000-12-13 23:18:45 +00001159
1160static char has_key__doc__[] =
1161"D.has_key(k) -> 1 if D has a key k, else 0";
1162
1163static char get__doc__[] =
1164"D.get(k[,d]) -> D[k] if D.has_key(k), else d. d defaults to None.";
1165
1166static char setdefault_doc__[] =
1167"D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if not D.has_key(k)";
1168
1169static char popitem__doc__[] =
1170"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
11712-tuple; but raise KeyError if D is empty";
1172
1173static char keys__doc__[] =
1174"D.keys() -> list of D's keys";
1175
1176static char items__doc__[] =
1177"D.items() -> list of D's (key, value) pairs, as 2-tuples";
1178
1179static char values__doc__[] =
1180"D.values() -> list of D's values";
1181
1182static char update__doc__[] =
1183"D.update(E) -> None. Update D from E: for k in E.keys(): D[k] = E[k]";
1184
1185static char clear__doc__[] =
1186"D.clear() -> None. Remove all items from D.";
1187
1188static char copy__doc__[] =
1189"D.copy() -> a shallow copy of D";
1190
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191static PyMethodDef mapp_methods[] = {
Tim Petersf7f88b12000-12-13 23:18:45 +00001192 {"has_key", (PyCFunction)dict_has_key, METH_VARARGS,
1193 has_key__doc__},
1194 {"get", (PyCFunction)dict_get, METH_VARARGS,
1195 get__doc__},
1196 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1197 setdefault_doc__},
1198 {"popitem", (PyCFunction)dict_popitem, METH_OLDARGS,
1199 popitem__doc__},
1200 {"keys", (PyCFunction)dict_keys, METH_OLDARGS,
1201 keys__doc__},
1202 {"items", (PyCFunction)dict_items, METH_OLDARGS,
1203 items__doc__},
1204 {"values", (PyCFunction)dict_values, METH_OLDARGS,
1205 values__doc__},
1206 {"update", (PyCFunction)dict_update, METH_OLDARGS,
1207 update__doc__},
1208 {"clear", (PyCFunction)dict_clear, METH_OLDARGS,
1209 clear__doc__},
1210 {"copy", (PyCFunction)dict_copy, METH_OLDARGS,
1211 copy__doc__},
1212 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001213};
1214
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001216dict_getattr(dictobject *mp, char *name)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001217{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001218 return Py_FindMethod(mapp_methods, (PyObject *)mp, name);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001219}
1220
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221PyTypeObject PyDict_Type = {
1222 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001223 0,
Guido van Rossum9bfef441993-03-29 10:43:31 +00001224 "dictionary",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001225 sizeof(dictobject) + PyGC_HEAD_SIZE,
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001226 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00001227 (destructor)dict_dealloc, /* tp_dealloc */
1228 (printfunc)dict_print, /* tp_print */
1229 (getattrfunc)dict_getattr, /* tp_getattr */
1230 0, /* tp_setattr */
1231 (cmpfunc)dict_compare, /* tp_compare */
1232 (reprfunc)dict_repr, /* tp_repr */
1233 0, /* tp_as_number */
1234 0, /* tp_as_sequence */
1235 &dict_as_mapping, /* tp_as_mapping */
1236 0, /* tp_hash */
1237 0, /* tp_call */
1238 0, /* tp_str */
1239 0, /* tp_getattro */
1240 0, /* tp_setattro */
1241 0, /* tp_as_buffer */
1242 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
1243 0, /* tp_doc */
1244 (traverseproc)dict_traverse, /* tp_traverse */
1245 (inquiry)dict_tp_clear, /* tp_clear */
1246 0, /* tp_richcompare */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001247};
1248
Guido van Rossum3cca2451997-05-16 14:23:33 +00001249/* For backward compatibility with old dictionary interface */
1250
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001252PyDict_GetItemString(PyObject *v, char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001253{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001254 PyObject *kv, *rv;
1255 kv = PyString_FromString(key);
1256 if (kv == NULL)
1257 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001258 rv = PyDict_GetItem(v, kv);
1259 Py_DECREF(kv);
1260 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001261}
1262
1263int
Tim Peters1f5871e2000-07-04 17:44:48 +00001264PyDict_SetItemString(PyObject *v, char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001265{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001266 PyObject *kv;
1267 int err;
1268 kv = PyString_FromString(key);
1269 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001270 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001271 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001272 err = PyDict_SetItem(v, kv, item);
1273 Py_DECREF(kv);
1274 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001275}
1276
1277int
Tim Peters1f5871e2000-07-04 17:44:48 +00001278PyDict_DelItemString(PyObject *v, char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001279{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001280 PyObject *kv;
1281 int err;
1282 kv = PyString_FromString(key);
1283 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001284 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001285 err = PyDict_DelItem(v, kv);
1286 Py_DECREF(kv);
1287 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001288}