blob: ddf82ca6575ea1581a4b963a7caf6ec58a697352 [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
Tim Peters67830702001-03-21 19:23:56 +000095it's two-thirds full.
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 }
Tim Peters67830702001-03-21 19:23:56 +0000489 /* If fill >= 2/3 size, adjust size. Normally, this doubles the
490 * size, but it's also possible for the dict to shrink (if ma_fill is
491 * much larger than ma_used, meaning a lot of dict keys have been
492 * deleted).
493 * CAUTION: this resize logic must match the logic in PyDict_Next.
494 */
495 if (mp->ma_fill*3 >= mp->ma_size*2 &&
496 dictresize(mp, mp->ma_used*2) != 0)
497 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498 Py_INCREF(value);
499 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000500 insertdict(mp, key, hash, value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000501 return 0;
502}
503
504int
Tim Peters1f5871e2000-07-04 17:44:48 +0000505PyDict_DelItem(PyObject *op, PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000506{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000507 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000508 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000509 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000511
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 if (!PyDict_Check(op)) {
513 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000514 return -1;
515 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000516#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 if (!PyString_Check(key) ||
518 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000519#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000520 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000522 if (hash == -1)
523 return -1;
524 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000525 mp = (dictobject *)op;
526 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumefc87131995-01-02 19:42:39 +0000527 goto empty;
Fred Drake1bff34a2000-08-31 19:31:38 +0000528 ep = (mp->ma_lookup)(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000529 if (ep->me_value == NULL) {
Guido van Rossumefc87131995-01-02 19:42:39 +0000530 empty:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000532 return -1;
533 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000534 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000536 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000537 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000538 ep->me_value = NULL;
539 mp->ma_used--;
Tim Petersea8f2bf2000-12-13 01:02:46 +0000540 Py_DECREF(old_value);
541 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000542 return 0;
543}
544
Guido van Rossum25831651993-05-19 14:50:45 +0000545void
Tim Peters1f5871e2000-07-04 17:44:48 +0000546PyDict_Clear(PyObject *op)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000547{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000548 int i, n;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000549 register dictentry *table;
550 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000552 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000553 mp = (dictobject *)op;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000554 table = mp->ma_table;
555 if (table == NULL)
556 return;
557 n = mp->ma_size;
558 mp->ma_size = mp->ma_used = mp->ma_fill = 0;
559 mp->ma_table = NULL;
560 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561 Py_XDECREF(table[i].me_key);
562 Py_XDECREF(table[i].me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000563 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000564 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000565}
566
Tim Peters67830702001-03-21 19:23:56 +0000567/* CAUTION: In general, it isn't safe to use PyDict_Next in a loop that
568 * mutates the dict. One exception: it is safe if the loop merely changes
569 * the values associated with the keys (but doesn't insert new keys or
570 * delete keys), via PyDict_SetItem().
571 */
Guido van Rossum25831651993-05-19 14:50:45 +0000572int
Tim Peters1f5871e2000-07-04 17:44:48 +0000573PyDict_Next(PyObject *op, int *ppos, PyObject **pkey, PyObject **pvalue)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000574{
Guido van Rossum25831651993-05-19 14:50:45 +0000575 int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000576 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000578 return 0;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000579 mp = (dictobject *)op;
Guido van Rossum25831651993-05-19 14:50:45 +0000580 i = *ppos;
581 if (i < 0)
582 return 0;
Tim Peters67830702001-03-21 19:23:56 +0000583
584 /* A hack to support loops that merely change values.
585 * The problem: PyDict_SetItem() can either grow or shrink the dict
586 * even when passed a key that's already in the dict. This was a
587 * repeated source of subtle bugs, bad enough to justify a hack here.
588 * Approach: If this is the first time PyDict_Next() is being called
589 * (i==0), first figure out whether PyDict_SetItem() *will* change the
590 * size, and if so get it changed before we start passing out internal
591 * indices.
592 */
593 if (i == 0) {
594 /* This must be a clone of PyDict_SetItem's resize logic. */
595 if (mp->ma_fill*3 >= mp->ma_size*2 &&
596 dictresize(mp, mp->ma_used*2) != 0)
597 return -1;
598 }
599
Guido van Rossum25831651993-05-19 14:50:45 +0000600 while (i < mp->ma_size && mp->ma_table[i].me_value == NULL)
601 i++;
602 *ppos = i+1;
603 if (i >= mp->ma_size)
604 return 0;
605 if (pkey)
606 *pkey = mp->ma_table[i].me_key;
607 if (pvalue)
608 *pvalue = mp->ma_table[i].me_value;
609 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000610}
611
612/* Methods */
613
614static void
Tim Peters1f5871e2000-07-04 17:44:48 +0000615dict_dealloc(register dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000616{
617 register int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000618 register dictentry *ep;
Guido van Rossumd724b232000-03-13 16:01:29 +0000619 Py_TRASHCAN_SAFE_BEGIN(mp)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000620 PyObject_GC_Fini(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000621 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000622 if (ep->me_key != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000624 }
625 if (ep->me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 Py_DECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000627 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000628 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000629 if (mp->ma_table != NULL)
630 PyMem_DEL(mp->ma_table);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000631 mp = (dictobject *) PyObject_AS_GC(mp);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000632 PyObject_DEL(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000633 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000634}
635
636static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000637dict_print(register dictobject *mp, register FILE *fp, register int flags)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000638{
639 register int i;
640 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000641 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000642
643 i = Py_ReprEnter((PyObject*)mp);
644 if (i != 0) {
645 if (i < 0)
646 return i;
647 fprintf(fp, "{...}");
648 return 0;
649 }
650
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000651 fprintf(fp, "{");
652 any = 0;
653 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
654 if (ep->me_value != NULL) {
655 if (any++ > 0)
656 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000657 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
658 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000659 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000660 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000661 fprintf(fp, ": ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000662 if (PyObject_Print(ep->me_value, fp, 0) != 0) {
663 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000664 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000665 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000666 }
667 }
668 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000669 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000670 return 0;
671}
672
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000674dict_repr(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000675{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 auto PyObject *v;
677 PyObject *sepa, *colon;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000678 register int i;
679 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000680 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000681
682 i = Py_ReprEnter((PyObject*)mp);
683 if (i != 0) {
684 if (i > 0)
685 return PyString_FromString("{...}");
686 return NULL;
687 }
688
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 v = PyString_FromString("{");
690 sepa = PyString_FromString(", ");
691 colon = PyString_FromString(": ");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000692 any = 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000693 for (i = 0, ep = mp->ma_table; i < mp->ma_size && v; i++, ep++) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000694 if (ep->me_value != NULL) {
695 if (any++)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 PyString_Concat(&v, sepa);
697 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_key));
698 PyString_Concat(&v, colon);
699 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_value));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000700 }
701 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000702 PyString_ConcatAndDel(&v, PyString_FromString("}"));
Guido van Rossum255443b1998-04-10 22:47:14 +0000703 Py_ReprLeave((PyObject*)mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000704 Py_XDECREF(sepa);
705 Py_XDECREF(colon);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000706 return v;
707}
708
709static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000710dict_length(dictobject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000711{
712 return mp->ma_used;
713}
714
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000716dict_subscript(dictobject *mp, register PyObject *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000717{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000719 long hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000720 if (mp->ma_table == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000722 return NULL;
723 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000724#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 if (!PyString_Check(key) ||
726 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000727#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000728 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000729 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000730 if (hash == -1)
731 return NULL;
732 }
Fred Drake1bff34a2000-08-31 19:31:38 +0000733 v = (mp->ma_lookup)(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000734 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000736 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000738 return v;
739}
740
741static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000742dict_ass_sub(dictobject *mp, PyObject *v, PyObject *w)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000743{
744 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000746 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000747 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000748}
749
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000750static PyMappingMethods dict_as_mapping = {
751 (inquiry)dict_length, /*mp_length*/
752 (binaryfunc)dict_subscript, /*mp_subscript*/
753 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000754};
755
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000757dict_keys(register dictobject *mp, PyObject *args)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000758{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759 register PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000760 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000761 if (!PyArg_NoArgs(args))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000762 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000763 v = PyList_New(mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000764 if (v == NULL)
765 return NULL;
766 for (i = 0, j = 0; i < mp->ma_size; i++) {
767 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768 PyObject *key = mp->ma_table[i].me_key;
769 Py_INCREF(key);
770 PyList_SetItem(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000771 j++;
772 }
773 }
774 return v;
775}
776
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000778dict_values(register dictobject *mp, PyObject *args)
Guido van Rossum25831651993-05-19 14:50:45 +0000779{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000780 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000781 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000783 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000785 if (v == NULL)
786 return NULL;
787 for (i = 0, j = 0; i < mp->ma_size; i++) {
788 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000789 PyObject *value = mp->ma_table[i].me_value;
790 Py_INCREF(value);
791 PyList_SetItem(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000792 j++;
793 }
794 }
795 return v;
796}
797
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000799dict_items(register dictobject *mp, PyObject *args)
Guido van Rossum25831651993-05-19 14:50:45 +0000800{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000802 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000804 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000806 if (v == NULL)
807 return NULL;
808 for (i = 0, j = 0; i < mp->ma_size; i++) {
809 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 PyObject *key = mp->ma_table[i].me_key;
811 PyObject *value = mp->ma_table[i].me_value;
812 PyObject *item = PyTuple_New(2);
Guido van Rossum25831651993-05-19 14:50:45 +0000813 if (item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000814 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +0000815 return NULL;
816 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 Py_INCREF(key);
818 PyTuple_SetItem(item, 0, key);
819 Py_INCREF(value);
820 PyTuple_SetItem(item, 1, value);
821 PyList_SetItem(v, j, item);
Guido van Rossum25831651993-05-19 14:50:45 +0000822 j++;
823 }
824 }
825 return v;
826}
827
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000828static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000829dict_update(register dictobject *mp, PyObject *args)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000830{
831 register int i;
832 dictobject *other;
833 dictentry *entry;
834 if (!PyArg_Parse(args, "O!", &PyDict_Type, &other))
835 return NULL;
Jeremy Hylton1fb60882001-01-03 22:34:59 +0000836 if (other == mp || other->ma_used == 0)
837 goto done; /* a.update(a) or a.update({}); nothing to do */
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000838 /* Do one big resize at the start, rather than incrementally
839 resizing as we insert new items. Expect that there will be
840 no (or few) overlapping keys. */
841 if ((mp->ma_fill + other->ma_used)*3 >= mp->ma_size*2) {
842 if (dictresize(mp, (mp->ma_used + other->ma_used)*3/2) != 0)
843 return NULL;
844 }
845 for (i = 0; i < other->ma_size; i++) {
846 entry = &other->ma_table[i];
847 if (entry->me_value != NULL) {
848 Py_INCREF(entry->me_key);
849 Py_INCREF(entry->me_value);
850 insertdict(mp, entry->me_key, entry->me_hash,
851 entry->me_value);
852 }
853 }
854 done:
855 Py_INCREF(Py_None);
856 return Py_None;
857}
858
859static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000860dict_copy(register dictobject *mp, PyObject *args)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000861{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000862 if (!PyArg_Parse(args, ""))
863 return NULL;
864 return PyDict_Copy((PyObject*)mp);
865}
866
867PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000868PyDict_Copy(PyObject *o)
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000869{
870 register dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000871 register int i;
872 dictobject *copy;
873 dictentry *entry;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000874
875 if (o == NULL || !PyDict_Check(o)) {
876 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000877 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000878 }
879 mp = (dictobject *)o;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000880 copy = (dictobject *)PyDict_New();
881 if (copy == NULL)
882 return NULL;
883 if (mp->ma_used > 0) {
884 if (dictresize(copy, mp->ma_used*3/2) != 0)
885 return NULL;
886 for (i = 0; i < mp->ma_size; i++) {
887 entry = &mp->ma_table[i];
888 if (entry->me_value != NULL) {
889 Py_INCREF(entry->me_key);
890 Py_INCREF(entry->me_value);
891 insertdict(copy, entry->me_key, entry->me_hash,
892 entry->me_value);
893 }
894 }
895 }
896 return (PyObject *)copy;
897}
898
Guido van Rossum4199fac1993-11-05 10:18:44 +0000899int
Tim Peters1f5871e2000-07-04 17:44:48 +0000900PyDict_Size(PyObject *mp)
Guido van Rossum4199fac1993-11-05 10:18:44 +0000901{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 if (mp == NULL || !PyDict_Check(mp)) {
903 PyErr_BadInternalCall();
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000904 return 0;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000905 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000906 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000907}
908
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000910PyDict_Keys(PyObject *mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000911{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000912 if (mp == NULL || !PyDict_Check(mp)) {
913 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000914 return NULL;
915 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000916 return dict_keys((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000917}
918
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000920PyDict_Values(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000921{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 if (mp == NULL || !PyDict_Check(mp)) {
923 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000924 return NULL;
925 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000926 return dict_values((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000927}
928
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000930PyDict_Items(PyObject *mp)
Guido van Rossum25831651993-05-19 14:50:45 +0000931{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 if (mp == NULL || !PyDict_Check(mp)) {
933 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000934 return NULL;
935 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000936 return dict_items((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000937}
938
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000939/* Subroutine which returns the smallest key in a for which b's value
940 is different or absent. The value is returned too, through the
941 pval argument. No reference counts are incremented. */
942
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +0000944characterize(dictobject *a, dictobject *b, PyObject **pval)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000945{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 PyObject *diff = NULL;
Guido van Rossumb9324202001-01-18 00:39:02 +0000947 int i, cmp;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000948
949 *pval = NULL;
950 for (i = 0; i < a->ma_size; i++) {
951 if (a->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952 PyObject *key = a->ma_table[i].me_key;
953 PyObject *aval, *bval;
Guido van Rossumb9324202001-01-18 00:39:02 +0000954 if (diff != NULL) {
955 cmp = PyObject_RichCompareBool(diff, key, Py_LT);
956 if (cmp < 0)
957 return NULL;
958 if (cmp > 0)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000959 continue;
Guido van Rossumb9324202001-01-18 00:39:02 +0000960 }
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000961 aval = a->ma_table[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962 bval = PyDict_GetItem((PyObject *)b, key);
Guido van Rossumb9324202001-01-18 00:39:02 +0000963 if (bval == NULL)
964 cmp = 0;
965 else {
966 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ);
967 if (cmp < 0)
968 return NULL;
969 }
970 if (cmp == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 {
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000972 diff = key;
973 *pval = aval;
974 }
975 }
976 }
977 return diff;
978}
979
980static int
Tim Peters1f5871e2000-07-04 17:44:48 +0000981dict_compare(dictobject *a, dictobject *b)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000982{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000983 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000984 int res;
985
986 /* Compare lengths first */
987 if (a->ma_used < b->ma_used)
988 return -1; /* a is shorter */
989 else if (a->ma_used > b->ma_used)
990 return 1; /* b is shorter */
991 /* Same length -- check all keys */
992 adiff = characterize(a, b, &aval);
Guido van Rossumb9324202001-01-18 00:39:02 +0000993 if (adiff == NULL && PyErr_Occurred())
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000994 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000995 if (adiff == NULL)
996 return 0; /* a is a subset with the same length */
997 bdiff = characterize(b, a, &bval);
Guido van Rossumb9324202001-01-18 00:39:02 +0000998 if (bdiff == NULL && PyErr_Occurred())
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000999 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001000 /* bdiff == NULL would be impossible now */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001 res = PyObject_Compare(adiff, bdiff);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001002 if (res == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 res = PyObject_Compare(aval, bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +00001004 return res;
1005}
1006
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001007static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001008dict_has_key(register dictobject *mp, PyObject *args)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001009{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001010 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001011 long hash;
1012 register long ok;
Fred Drake52fccfd2000-02-23 15:47:16 +00001013 if (!PyArg_ParseTuple(args, "O:has_key", &key))
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001014 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001015#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 if (!PyString_Check(key) ||
1017 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001018#endif
Guido van Rossumca756f21997-01-23 19:39:29 +00001019 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +00001021 if (hash == -1)
1022 return NULL;
1023 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001024 ok = (mp->ma_size != 0
1025 && (mp->ma_lookup)(mp, key, hash)->me_value != NULL);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026 return PyInt_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001027}
1028
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001029static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001030dict_get(register dictobject *mp, PyObject *args)
Barry Warsawc38c5da1997-10-06 17:49:20 +00001031{
1032 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001033 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001034 PyObject *val = NULL;
1035 long hash;
1036
Fred Drake52fccfd2000-02-23 15:47:16 +00001037 if (!PyArg_ParseTuple(args, "O|O:get", &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001038 return NULL;
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001039 if (mp->ma_table == NULL)
1040 goto finally;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001041
Barry Warsawc38c5da1997-10-06 17:49:20 +00001042#ifdef CACHE_HASH
1043 if (!PyString_Check(key) ||
1044 (hash = ((PyStringObject *) key)->ob_shash) == -1)
1045#endif
1046 {
1047 hash = PyObject_Hash(key);
1048 if (hash == -1)
1049 return NULL;
1050 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001051 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001052
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001053 finally:
Barry Warsawc38c5da1997-10-06 17:49:20 +00001054 if (val == NULL)
1055 val = failobj;
1056 Py_INCREF(val);
1057 return val;
1058}
1059
1060
1061static PyObject *
Guido van Rossum164452c2000-08-08 16:12:54 +00001062dict_setdefault(register dictobject *mp, PyObject *args)
1063{
1064 PyObject *key;
1065 PyObject *failobj = Py_None;
1066 PyObject *val = NULL;
1067 long hash;
1068
1069 if (!PyArg_ParseTuple(args, "O|O:setdefault", &key, &failobj))
1070 return NULL;
1071 if (mp->ma_table == NULL)
1072 goto finally;
1073
1074#ifdef CACHE_HASH
1075 if (!PyString_Check(key) ||
1076 (hash = ((PyStringObject *) key)->ob_shash) == -1)
1077#endif
1078 {
1079 hash = PyObject_Hash(key);
1080 if (hash == -1)
1081 return NULL;
1082 }
Fred Drake1bff34a2000-08-31 19:31:38 +00001083 val = (mp->ma_lookup)(mp, key, hash)->me_value;
Guido van Rossum164452c2000-08-08 16:12:54 +00001084
1085 finally:
1086 if (val == NULL) {
1087 val = failobj;
1088 if (PyDict_SetItem((PyObject*)mp, key, failobj))
1089 val = NULL;
1090 }
1091 Py_XINCREF(val);
1092 return val;
1093}
1094
1095
1096static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001097dict_clear(register dictobject *mp, PyObject *args)
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001098{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 if (!PyArg_NoArgs(args))
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001100 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 PyDict_Clear((PyObject *)mp);
1102 Py_INCREF(Py_None);
1103 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001104}
1105
Guido van Rossumba6ab842000-12-12 22:02:18 +00001106static PyObject *
1107dict_popitem(dictobject *mp, PyObject *args)
1108{
1109 int i = 0;
1110 dictentry *ep;
1111 PyObject *res;
1112
1113 if (!PyArg_NoArgs(args))
1114 return NULL;
1115 if (mp->ma_used == 0) {
1116 PyErr_SetString(PyExc_KeyError,
1117 "popitem(): dictionary is empty");
1118 return NULL;
1119 }
1120 /* Set ep to "the first" dict entry with a value. We abuse the hash
1121 * field of slot 0 to hold a search finger:
1122 * If slot 0 has a value, use slot 0.
1123 * Else slot 0 is being used to hold a search finger,
1124 * and we use its hash value as the first index to look.
1125 */
1126 ep = &mp->ma_table[0];
1127 if (ep->me_value == NULL) {
1128 i = (int)ep->me_hash;
1129 /* The hash field may be uninitialized trash, or it
1130 * may be a real hash value, or it may be a legit
1131 * search finger, or it may be a once-legit search
1132 * finger that's out of bounds now because it
1133 * wrapped around or the table shrunk -- simply
1134 * make sure it's in bounds now.
1135 */
1136 if (i >= mp->ma_size || i < 1)
1137 i = 1; /* skip slot 0 */
1138 while ((ep = &mp->ma_table[i])->me_value == NULL) {
1139 i++;
1140 if (i >= mp->ma_size)
1141 i = 1;
1142 }
1143 }
1144 res = PyTuple_New(2);
1145 if (res != NULL) {
1146 PyTuple_SET_ITEM(res, 0, ep->me_key);
1147 PyTuple_SET_ITEM(res, 1, ep->me_value);
1148 Py_INCREF(dummy);
1149 ep->me_key = dummy;
1150 ep->me_value = NULL;
1151 mp->ma_used--;
1152 assert(mp->ma_table[0].me_value == NULL);
1153 mp->ma_table[0].me_hash = i + 1; /* next place to start */
1154 }
1155 return res;
1156}
1157
Jeremy Hylton8caad492000-06-23 14:18:11 +00001158static int
1159dict_traverse(PyObject *op, visitproc visit, void *arg)
1160{
1161 int i = 0, err;
1162 PyObject *pk;
1163 PyObject *pv;
1164
1165 while (PyDict_Next(op, &i, &pk, &pv)) {
1166 err = visit(pk, arg);
1167 if (err)
1168 return err;
1169 err = visit(pv, arg);
1170 if (err)
1171 return err;
1172 }
1173 return 0;
1174}
1175
1176static int
1177dict_tp_clear(PyObject *op)
1178{
1179 PyDict_Clear(op);
1180 return 0;
1181}
1182
Tim Petersf7f88b12000-12-13 23:18:45 +00001183
1184static char has_key__doc__[] =
1185"D.has_key(k) -> 1 if D has a key k, else 0";
1186
1187static char get__doc__[] =
1188"D.get(k[,d]) -> D[k] if D.has_key(k), else d. d defaults to None.";
1189
1190static char setdefault_doc__[] =
1191"D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if not D.has_key(k)";
1192
1193static char popitem__doc__[] =
1194"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
11952-tuple; but raise KeyError if D is empty";
1196
1197static char keys__doc__[] =
1198"D.keys() -> list of D's keys";
1199
1200static char items__doc__[] =
1201"D.items() -> list of D's (key, value) pairs, as 2-tuples";
1202
1203static char values__doc__[] =
1204"D.values() -> list of D's values";
1205
1206static char update__doc__[] =
1207"D.update(E) -> None. Update D from E: for k in E.keys(): D[k] = E[k]";
1208
1209static char clear__doc__[] =
1210"D.clear() -> None. Remove all items from D.";
1211
1212static char copy__doc__[] =
1213"D.copy() -> a shallow copy of D";
1214
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215static PyMethodDef mapp_methods[] = {
Tim Petersf7f88b12000-12-13 23:18:45 +00001216 {"has_key", (PyCFunction)dict_has_key, METH_VARARGS,
1217 has_key__doc__},
1218 {"get", (PyCFunction)dict_get, METH_VARARGS,
1219 get__doc__},
1220 {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS,
1221 setdefault_doc__},
1222 {"popitem", (PyCFunction)dict_popitem, METH_OLDARGS,
1223 popitem__doc__},
1224 {"keys", (PyCFunction)dict_keys, METH_OLDARGS,
1225 keys__doc__},
1226 {"items", (PyCFunction)dict_items, METH_OLDARGS,
1227 items__doc__},
1228 {"values", (PyCFunction)dict_values, METH_OLDARGS,
1229 values__doc__},
1230 {"update", (PyCFunction)dict_update, METH_OLDARGS,
1231 update__doc__},
1232 {"clear", (PyCFunction)dict_clear, METH_OLDARGS,
1233 clear__doc__},
1234 {"copy", (PyCFunction)dict_copy, METH_OLDARGS,
1235 copy__doc__},
1236 {NULL, NULL} /* sentinel */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001237};
1238
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239static PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001240dict_getattr(dictobject *mp, char *name)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001241{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242 return Py_FindMethod(mapp_methods, (PyObject *)mp, name);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001243}
1244
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001245PyTypeObject PyDict_Type = {
1246 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001247 0,
Guido van Rossum9bfef441993-03-29 10:43:31 +00001248 "dictionary",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001249 sizeof(dictobject) + PyGC_HEAD_SIZE,
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001250 0,
Guido van Rossumb9324202001-01-18 00:39:02 +00001251 (destructor)dict_dealloc, /* tp_dealloc */
1252 (printfunc)dict_print, /* tp_print */
1253 (getattrfunc)dict_getattr, /* tp_getattr */
1254 0, /* tp_setattr */
1255 (cmpfunc)dict_compare, /* tp_compare */
1256 (reprfunc)dict_repr, /* tp_repr */
1257 0, /* tp_as_number */
1258 0, /* tp_as_sequence */
1259 &dict_as_mapping, /* tp_as_mapping */
1260 0, /* tp_hash */
1261 0, /* tp_call */
1262 0, /* tp_str */
1263 0, /* tp_getattro */
1264 0, /* tp_setattro */
1265 0, /* tp_as_buffer */
1266 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
1267 0, /* tp_doc */
1268 (traverseproc)dict_traverse, /* tp_traverse */
1269 (inquiry)dict_tp_clear, /* tp_clear */
1270 0, /* tp_richcompare */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001271};
1272
Guido van Rossum3cca2451997-05-16 14:23:33 +00001273/* For backward compatibility with old dictionary interface */
1274
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275PyObject *
Tim Peters1f5871e2000-07-04 17:44:48 +00001276PyDict_GetItemString(PyObject *v, char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001277{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001278 PyObject *kv, *rv;
1279 kv = PyString_FromString(key);
1280 if (kv == NULL)
1281 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001282 rv = PyDict_GetItem(v, kv);
1283 Py_DECREF(kv);
1284 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001285}
1286
1287int
Tim Peters1f5871e2000-07-04 17:44:48 +00001288PyDict_SetItemString(PyObject *v, char *key, PyObject *item)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001289{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001290 PyObject *kv;
1291 int err;
1292 kv = PyString_FromString(key);
1293 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001294 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001295 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001296 err = PyDict_SetItem(v, kv, item);
1297 Py_DECREF(kv);
1298 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001299}
1300
1301int
Tim Peters1f5871e2000-07-04 17:44:48 +00001302PyDict_DelItemString(PyObject *v, char *key)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001303{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001304 PyObject *kv;
1305 int err;
1306 kv = PyString_FromString(key);
1307 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001308 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001309 err = PyDict_DelItem(v, kv);
1310 Py_DECREF(kv);
1311 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001312}