blob: 06d2dc4f92ccb808dcd370d31ff5e4b935c7b9e3 [file] [log] [blame]
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum4b1302b1993-03-27 18:11:32 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum4b1302b1993-03-27 18:11:32 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum4b1302b1993-03-27 18:11:32 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum4b1302b1993-03-27 18:11:32 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum4b1302b1993-03-27 18:11:32 +000029
30******************************************************************/
31
Guido van Rossuma9e7a811997-05-13 21:02:11 +000032/* Dictionaru object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +000033
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000035
36
37/*
Guido van Rossuma9e7a811997-05-13 21:02:11 +000038 * MINSIZE is the minimum size of a dictionary.
Guido van Rossum16e93a81997-01-28 00:00:11 +000039 */
40
41#define MINSIZE 4
42
43/*
44Table of irreducible polynomials to efficiently cycle through
45GF(2^n)-{0}, 2<=n<=30.
Guido van Rossum4b1302b1993-03-27 18:11:32 +000046*/
Guido van Rossum16e93a81997-01-28 00:00:11 +000047static long polys[] = {
Guido van Rossum9e5656c1997-01-29 04:45:16 +000048 4 + 3,
49 8 + 3,
50 16 + 3,
51 32 + 5,
52 64 + 3,
53 128 + 3,
54 256 + 29,
55 512 + 17,
56 1024 + 9,
57 2048 + 5,
58 4096 + 83,
59 8192 + 27,
60 16384 + 43,
61 32768 + 3,
62 65536 + 45,
63 131072 + 9,
64 262144 + 39,
65 524288 + 39,
66 1048576 + 9,
67 2097152 + 5,
68 4194304 + 3,
69 8388608 + 33,
70 16777216 + 27,
71 33554432 + 9,
72 67108864 + 71,
73 134217728 + 39,
74 268435456 + 9,
75 536870912 + 5,
76 1073741824 + 83,
77 0
Guido van Rossum4b1302b1993-03-27 18:11:32 +000078};
79
80/* Object used as dummy key to fill deleted entries */
Guido van Rossuma9e7a811997-05-13 21:02:11 +000081static PyObject *dummy; /* Initialized by first call to newdictobject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +000082
83/*
84Invariant for entries: when in use, de_value is not NULL and de_key is
85not NULL and not dummy; when not in use, de_value is NULL and de_key
86is either NULL or dummy. A dummy key value cannot be replaced by
87NULL, since otherwise other keys may be lost.
88*/
89typedef struct {
90 long me_hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 PyObject *me_key;
92 PyObject *me_value;
Guido van Rossum36488841997-04-11 19:14:07 +000093#ifdef USE_CACHE_ALIGNED
94 long aligner;
95#endif
Guido van Rossuma9e7a811997-05-13 21:02:11 +000096} dictentry;
Guido van Rossum4b1302b1993-03-27 18:11:32 +000097
98/*
99To ensure the lookup algorithm terminates, the table size must be a
100prime number and there must be at least one NULL key in the table.
101The value ma_fill is the number of non-NULL keys; ma_used is the number
102of non-NULL, non-dummy keys.
103To avoid slowing down lookups on a near-full table, we resize the table
104when it is more than half filled.
105*/
106typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107 PyObject_HEAD
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000108 int ma_fill;
109 int ma_used;
110 int ma_size;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000111 int ma_poly;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000112 dictentry *ma_table;
113} dictobject;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000114
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
116PyDict_New()
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000117{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000118 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000119 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000121 if (dummy == NULL)
122 return NULL;
123 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000124 mp = PyObject_NEW(dictobject, &PyDict_Type);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000125 if (mp == NULL)
126 return NULL;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000127 mp->ma_size = 0;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000128 mp->ma_poly = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000129 mp->ma_table = NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000130 mp->ma_fill = 0;
131 mp->ma_used = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000133}
134
135/*
136The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000137This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000138Open addressing is preferred over chaining since the link overhead for
139chaining would be substantial (100% with typical malloc overhead).
Guido van Rossum16e93a81997-01-28 00:00:11 +0000140However, instead of going through the table at constant steps, we cycle
141through the values of GF(2^n)-{0}. This avoids modulo computations, being
142much cheaper on RISC machines, without leading to clustering.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000143
144First a 32-bit hash value, 'sum', is computed from the key string.
145The first character is added an extra time shifted by 8 to avoid hashing
146single-character keys (often heavily used variables) too close together.
147All arithmetic on sum should ignore overflow.
148
149The initial probe index is then computed as sum mod the table size.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000150Subsequent probe indices use the values of x^i in GF(2^n) as an offset,
151where x is a root. The initial value is derived from sum, too.
152
153(This version is due to Reimer Behrends, some ideas are also due to
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000154Jyrki Alakuijala and Vladimir Marangozov.)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000155*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000156static dictentry *lookdict Py_PROTO((dictobject *, PyObject *, long));
157static dictentry *
158lookdict(mp, key, hash)
159 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 PyObject *key;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000161 register long hash;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000162{
Guido van Rossum16e93a81997-01-28 00:00:11 +0000163 register int i;
164 register unsigned incr;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000165 register dictentry *freeslot;
Guido van Rossum2095d241997-04-09 19:41:24 +0000166 register unsigned int mask = mp->ma_size-1;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000167 dictentry *ep0 = mp->ma_table;
168 register dictentry *ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000169 /* We must come up with (i, incr) such that 0 <= i < ma_size
170 and 0 < incr < ma_size and both are a function of hash */
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000171 i = (~hash) & mask;
172 /* We use ~hash instead of hash, as degenerate hash functions, such
Guido van Rossum16e93a81997-01-28 00:00:11 +0000173 as for ints <sigh>, can have lots of leading zeros. It's not
174 really a performance risk, but better safe than sorry. */
Guido van Rossumefb46091997-01-29 15:53:56 +0000175 ep = &ep0[i];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000176 if (ep->me_key == NULL)
Guido van Rossum7d181591997-01-16 21:06:45 +0000177 return ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000178 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000179 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000180 else {
181 if (ep->me_key == key ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 (ep->me_hash == hash &&
183 PyObject_Compare(ep->me_key, key) == 0))
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000184 {
185 return ep;
186 }
187 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000188 }
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000189 /* XXX What if PyObject_Compare returned an exception? */
Guido van Rossumefb46091997-01-29 15:53:56 +0000190 /* Derive incr from sum, just to make it more arbitrary. Note that
Guido van Rossum16e93a81997-01-28 00:00:11 +0000191 incr must not be 0, or we will get into an infinite loop.*/
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000192 incr = (hash ^ ((unsigned long)hash >> 3)) & mask;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000193 if (!incr)
194 incr = mask;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000195 else if (incr > mask) /* Cycle through GF(2^n)-{0} */
Guido van Rossum16e93a81997-01-28 00:00:11 +0000196 incr ^= mp->ma_poly; /* This will implicitly clear the
197 highest bit */
198 for (;;) {
Guido van Rossumefb46091997-01-29 15:53:56 +0000199 ep = &ep0[(i+incr)&mask];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000200 if (ep->me_key == NULL) {
201 if (freeslot != NULL)
202 return freeslot;
203 else
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000204 return ep;
205 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000206 if (ep->me_key == dummy) {
207 if (freeslot == NULL)
208 freeslot = ep;
209 }
210 else if (ep->me_key == key ||
211 (ep->me_hash == hash &&
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 PyObject_Compare(ep->me_key, key) == 0)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000213 return ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000214 }
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000215 /* XXX What if PyObject_Compare returned an exception? */
Guido van Rossum16e93a81997-01-28 00:00:11 +0000216 /* Cycle through GF(2^n)-{0} */
217 incr = incr << 1;
218 if (incr > mask)
219 incr ^= mp->ma_poly;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000220 }
221}
222
223/*
224Internal routine to insert a new item into the table.
225Used both by the internal resize routine and by the public insert routine.
226Eats a reference to key and one to value.
227*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000228static void insertdict
229 Py_PROTO((dictobject *, PyObject *, long, PyObject *));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000230static void
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000231insertdict(mp, key, hash, value)
232 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000234 long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 PyObject *value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000236{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000238 register dictentry *ep;
239 ep = lookdict(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000240 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000241 old_value = ep->me_value;
242 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 Py_DECREF(old_value); /* which **CAN** re-enter */
244 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000245 }
246 else {
247 if (ep->me_key == NULL)
248 mp->ma_fill++;
249 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000250 Py_DECREF(ep->me_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000251 ep->me_key = key;
252 ep->me_hash = hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000253 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000254 mp->ma_used++;
255 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000256}
257
258/*
259Restructure the table by allocating a new table and reinserting all
260items again. When entries have been deleted, the new table may
261actually be smaller than the old one.
262*/
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000263static int dictresize Py_PROTO((dictobject *, int));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000264static int
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000265dictresize(mp, minused)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000266 dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000267 int minused;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000268{
269 register int oldsize = mp->ma_size;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000270 register int newsize, newpoly;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000271 register dictentry *oldtable = mp->ma_table;
272 register dictentry *newtable;
273 register dictentry *ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000274 register int i;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000275 for (i = 0, newsize = MINSIZE; ; i++, newsize <<= 1) {
276 if (i > sizeof(polys)/sizeof(polys[0])) {
277 /* Ran out of polynomials */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000278 PyErr_NoMemory();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000279 return -1;
280 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000281 if (newsize > minused) {
Guido van Rossum16e93a81997-01-28 00:00:11 +0000282 newpoly = polys[i];
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000283 break;
284 }
285 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000286 newtable = (dictentry *) calloc(sizeof(dictentry), newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000287 if (newtable == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000288 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000289 return -1;
290 }
291 mp->ma_size = newsize;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000292 mp->ma_poly = newpoly;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000293 mp->ma_table = newtable;
294 mp->ma_fill = 0;
295 mp->ma_used = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000296
297 /* Make two passes, so we can avoid decrefs
298 (and possible side effects) till the table is copied */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000299 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
300 if (ep->me_value != NULL)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000301 insertdict(mp,ep->me_key,ep->me_hash,ep->me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000302 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000303 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000304 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305 Py_XDECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000306 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000307 }
308
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 PyMem_XDEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000310 return 0;
311}
312
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000313PyObject *
314PyDict_GetItem(op, key)
315 PyObject *op;
316 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000317{
318 long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 if (!PyDict_Check(op)) {
320 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000321 return NULL;
322 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000323 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumd7047b31995-01-02 19:07:15 +0000324 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000325#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326 if (!PyString_Check(key) ||
327 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000328#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000329 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000331 if (hash == -1)
332 return NULL;
333 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000334 return lookdict((dictobject *)op, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000335}
336
337int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338PyDict_SetItem(op, key, value)
339 register PyObject *op;
340 PyObject *key;
341 PyObject *value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000342{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000343 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000344 register long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 if (!PyDict_Check(op)) {
346 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000347 return -1;
348 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000349 mp = (dictobject *)op;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000350#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351 if (PyString_Check(key)) {
Guido van Rossum2a61e741997-01-18 07:55:05 +0000352#ifdef INTERN_STRINGS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000353 if (((PyStringObject *)key)->ob_sinterned != NULL) {
354 key = ((PyStringObject *)key)->ob_sinterned;
355 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000356 }
357 else
358#endif
359 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000361 if (hash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000362 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000363 }
364 }
365 else
366#endif
367 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000369 if (hash == -1)
370 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000371 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000372 /* if fill >= 2/3 size, double in size */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000373 if (mp->ma_fill*3 >= mp->ma_size*2) {
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000374 if (dictresize(mp, mp->ma_used*2) != 0) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000375 if (mp->ma_fill+1 > mp->ma_size)
376 return -1;
377 }
378 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379 Py_INCREF(value);
380 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000381 insertdict(mp, key, hash, value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000382 return 0;
383}
384
385int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386PyDict_DelItem(op, key)
387 PyObject *op;
388 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000389{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000390 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000391 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000392 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000394
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395 if (!PyDict_Check(op)) {
396 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000397 return -1;
398 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000399#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400 if (!PyString_Check(key) ||
401 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000402#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000403 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000405 if (hash == -1)
406 return -1;
407 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000408 mp = (dictobject *)op;
409 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumefc87131995-01-02 19:42:39 +0000410 goto empty;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000411 ep = lookdict(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000412 if (ep->me_value == NULL) {
Guido van Rossumefc87131995-01-02 19:42:39 +0000413 empty:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000415 return -1;
416 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000417 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000419 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000420 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000421 ep->me_value = NULL;
422 mp->ma_used--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 Py_DECREF(old_value);
424 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000425 return 0;
426}
427
Guido van Rossum25831651993-05-19 14:50:45 +0000428void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429PyDict_Clear(op)
430 PyObject *op;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000431{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000432 int i, n;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000433 register dictentry *table;
434 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000436 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000437 mp = (dictobject *)op;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000438 table = mp->ma_table;
439 if (table == NULL)
440 return;
441 n = mp->ma_size;
442 mp->ma_size = mp->ma_used = mp->ma_fill = 0;
443 mp->ma_table = NULL;
444 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 Py_XDECREF(table[i].me_key);
446 Py_XDECREF(table[i].me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000447 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000449}
450
Guido van Rossum25831651993-05-19 14:50:45 +0000451int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452PyDict_Next(op, ppos, pkey, pvalue)
453 PyObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000454 int *ppos;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 PyObject **pkey;
456 PyObject **pvalue;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000457{
Guido van Rossum25831651993-05-19 14:50:45 +0000458 int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000459 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000461 return 0;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000462 mp = (dictobject *)op;
Guido van Rossum25831651993-05-19 14:50:45 +0000463 i = *ppos;
464 if (i < 0)
465 return 0;
466 while (i < mp->ma_size && mp->ma_table[i].me_value == NULL)
467 i++;
468 *ppos = i+1;
469 if (i >= mp->ma_size)
470 return 0;
471 if (pkey)
472 *pkey = mp->ma_table[i].me_key;
473 if (pvalue)
474 *pvalue = mp->ma_table[i].me_value;
475 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000476}
477
478/* Methods */
479
480static void
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000481dict_dealloc(mp)
482 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000483{
484 register int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000485 register dictentry *ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000486 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000487 if (ep->me_key != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000489 }
490 if (ep->me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 Py_DECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000492 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000493 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 PyMem_XDEL(mp->ma_table);
495 PyMem_DEL(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000496}
497
498static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000499dict_print(mp, fp, flags)
500 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000501 register FILE *fp;
502 register int flags;
503{
504 register int i;
505 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000506 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000507
508 i = Py_ReprEnter((PyObject*)mp);
509 if (i != 0) {
510 if (i < 0)
511 return i;
512 fprintf(fp, "{...}");
513 return 0;
514 }
515
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000516 fprintf(fp, "{");
517 any = 0;
518 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
519 if (ep->me_value != NULL) {
520 if (any++ > 0)
521 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000522 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
523 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000524 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000525 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000526 fprintf(fp, ": ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000527 if (PyObject_Print(ep->me_value, fp, 0) != 0) {
528 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000529 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000530 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000531 }
532 }
533 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000534 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000535 return 0;
536}
537
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000539dict_repr(mp)
540 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000541{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 auto PyObject *v;
543 PyObject *sepa, *colon;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000544 register int i;
545 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000546 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000547
548 i = Py_ReprEnter((PyObject*)mp);
549 if (i != 0) {
550 if (i > 0)
551 return PyString_FromString("{...}");
552 return NULL;
553 }
554
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 v = PyString_FromString("{");
556 sepa = PyString_FromString(", ");
557 colon = PyString_FromString(": ");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000558 any = 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000559 for (i = 0, ep = mp->ma_table; i < mp->ma_size && v; i++, ep++) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000560 if (ep->me_value != NULL) {
561 if (any++)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 PyString_Concat(&v, sepa);
563 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_key));
564 PyString_Concat(&v, colon);
565 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_value));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000566 }
567 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 PyString_ConcatAndDel(&v, PyString_FromString("}"));
Guido van Rossum255443b1998-04-10 22:47:14 +0000569 Py_ReprLeave((PyObject*)mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 Py_XDECREF(sepa);
571 Py_XDECREF(colon);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000572 return v;
573}
574
575static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000576dict_length(mp)
577 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000578{
579 return mp->ma_used;
580}
581
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000583dict_subscript(mp, key)
584 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 register PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000586{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000588 long hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000589 if (mp->ma_table == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000591 return NULL;
592 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000593#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594 if (!PyString_Check(key) ||
595 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000596#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000597 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000599 if (hash == -1)
600 return NULL;
601 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000602 v = lookdict(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000603 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000605 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000607 return v;
608}
609
610static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000611dict_ass_sub(mp, v, w)
612 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613 PyObject *v, *w;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000614{
615 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000617 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000618 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000619}
620
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000621static PyMappingMethods dict_as_mapping = {
622 (inquiry)dict_length, /*mp_length*/
623 (binaryfunc)dict_subscript, /*mp_subscript*/
624 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000625};
626
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000628dict_keys(mp, args)
629 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 PyObject *args;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000631{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 register PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000633 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000634 if (!PyArg_NoArgs(args))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000635 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 v = PyList_New(mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000637 if (v == NULL)
638 return NULL;
639 for (i = 0, j = 0; i < mp->ma_size; i++) {
640 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 PyObject *key = mp->ma_table[i].me_key;
642 Py_INCREF(key);
643 PyList_SetItem(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000644 j++;
645 }
646 }
647 return v;
648}
649
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000651dict_values(mp, args)
652 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 PyObject *args;
Guido van Rossum25831651993-05-19 14:50:45 +0000654{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000656 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000657 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000658 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000660 if (v == NULL)
661 return NULL;
662 for (i = 0, j = 0; i < mp->ma_size; i++) {
663 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 PyObject *value = mp->ma_table[i].me_value;
665 Py_INCREF(value);
666 PyList_SetItem(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000667 j++;
668 }
669 }
670 return v;
671}
672
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000674dict_items(mp, args)
675 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 PyObject *args;
Guido van Rossum25831651993-05-19 14:50:45 +0000677{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000679 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000681 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000683 if (v == NULL)
684 return NULL;
685 for (i = 0, j = 0; i < mp->ma_size; i++) {
686 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000687 PyObject *key = mp->ma_table[i].me_key;
688 PyObject *value = mp->ma_table[i].me_value;
689 PyObject *item = PyTuple_New(2);
Guido van Rossum25831651993-05-19 14:50:45 +0000690 if (item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +0000692 return NULL;
693 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 Py_INCREF(key);
695 PyTuple_SetItem(item, 0, key);
696 Py_INCREF(value);
697 PyTuple_SetItem(item, 1, value);
698 PyList_SetItem(v, j, item);
Guido van Rossum25831651993-05-19 14:50:45 +0000699 j++;
700 }
701 }
702 return v;
703}
704
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000705static PyObject *
Guido van Rossuma8d51311997-06-02 17:13:37 +0000706dict_update(mp, args)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000707 register dictobject *mp;
708 PyObject *args;
709{
710 register int i;
711 dictobject *other;
712 dictentry *entry;
713 if (!PyArg_Parse(args, "O!", &PyDict_Type, &other))
714 return NULL;
715 if (other == mp)
Guido van Rossuma8d51311997-06-02 17:13:37 +0000716 goto done; /* a.update(a); nothing to do */
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000717 /* Do one big resize at the start, rather than incrementally
718 resizing as we insert new items. Expect that there will be
719 no (or few) overlapping keys. */
720 if ((mp->ma_fill + other->ma_used)*3 >= mp->ma_size*2) {
721 if (dictresize(mp, (mp->ma_used + other->ma_used)*3/2) != 0)
722 return NULL;
723 }
724 for (i = 0; i < other->ma_size; i++) {
725 entry = &other->ma_table[i];
726 if (entry->me_value != NULL) {
727 Py_INCREF(entry->me_key);
728 Py_INCREF(entry->me_value);
729 insertdict(mp, entry->me_key, entry->me_hash,
730 entry->me_value);
731 }
732 }
733 done:
734 Py_INCREF(Py_None);
735 return Py_None;
736}
737
738static PyObject *
739dict_copy(mp, args)
740 register dictobject *mp;
741 PyObject *args;
742{
743 register int i;
744 dictobject *copy;
745 dictentry *entry;
746 if (!PyArg_Parse(args, ""))
747 return NULL;
748 copy = (dictobject *)PyDict_New();
749 if (copy == NULL)
750 return NULL;
751 if (mp->ma_used > 0) {
752 if (dictresize(copy, mp->ma_used*3/2) != 0)
753 return NULL;
754 for (i = 0; i < mp->ma_size; i++) {
755 entry = &mp->ma_table[i];
756 if (entry->me_value != NULL) {
757 Py_INCREF(entry->me_key);
758 Py_INCREF(entry->me_value);
759 insertdict(copy, entry->me_key, entry->me_hash,
760 entry->me_value);
761 }
762 }
763 }
764 return (PyObject *)copy;
765}
766
Guido van Rossum4199fac1993-11-05 10:18:44 +0000767int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768PyDict_Size(mp)
769 PyObject *mp;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000770{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771 if (mp == NULL || !PyDict_Check(mp)) {
772 PyErr_BadInternalCall();
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000773 return 0;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000774 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000775 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000776}
777
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778PyObject *
779PyDict_Keys(mp)
780 PyObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000781{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 if (mp == NULL || !PyDict_Check(mp)) {
783 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000784 return NULL;
785 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000786 return dict_keys((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000787}
788
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000789PyObject *
790PyDict_Values(mp)
791 PyObject *mp;
Guido van Rossum25831651993-05-19 14:50:45 +0000792{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000793 if (mp == NULL || !PyDict_Check(mp)) {
794 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000795 return NULL;
796 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000797 return dict_values((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000798}
799
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800PyObject *
801PyDict_Items(mp)
802 PyObject *mp;
Guido van Rossum25831651993-05-19 14:50:45 +0000803{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 if (mp == NULL || !PyDict_Check(mp)) {
805 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000806 return NULL;
807 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000808 return dict_items((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000809}
810
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000811#define NEWCMP
812
813#ifdef NEWCMP
814
815/* Subroutine which returns the smallest key in a for which b's value
816 is different or absent. The value is returned too, through the
817 pval argument. No reference counts are incremented. */
818
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819static PyObject *
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000820characterize(a, b, pval)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000821 dictobject *a;
822 dictobject *b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 PyObject **pval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000824{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000825 PyObject *diff = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000826 int i;
827
828 *pval = NULL;
829 for (i = 0; i < a->ma_size; i++) {
830 if (a->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 PyObject *key = a->ma_table[i].me_key;
832 PyObject *aval, *bval;
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000833 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834 if (diff != NULL && PyObject_Compare(key, diff) > 0)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000835 continue;
836 aval = a->ma_table[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 bval = PyDict_GetItem((PyObject *)b, key);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000838 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 if (bval == NULL || PyObject_Compare(aval, bval) != 0)
840 {
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000841 diff = key;
842 *pval = aval;
843 }
844 }
845 }
846 return diff;
847}
848
849static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000850dict_compare(a, b)
851 dictobject *a, *b;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000852{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000854 int res;
855
856 /* Compare lengths first */
857 if (a->ma_used < b->ma_used)
858 return -1; /* a is shorter */
859 else if (a->ma_used > b->ma_used)
860 return 1; /* b is shorter */
861 /* Same length -- check all keys */
862 adiff = characterize(a, b, &aval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000863 if (PyErr_Occurred())
864 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000865 if (adiff == NULL)
866 return 0; /* a is a subset with the same length */
867 bdiff = characterize(b, a, &bval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000868 if (PyErr_Occurred())
869 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000870 /* bdiff == NULL would be impossible now */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871 res = PyObject_Compare(adiff, bdiff);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000872 if (res == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873 res = PyObject_Compare(aval, bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000874 return res;
875}
876
877#else /* !NEWCMP */
878
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000879static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000880dict_compare(a, b)
881 dictobject *a, *b;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000882{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883 PyObject *akeys, *bkeys;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000884 int i, n, res;
885 if (a == b)
886 return 0;
887 if (a->ma_used == 0) {
888 if (b->ma_used != 0)
889 return -1;
890 else
891 return 0;
892 }
893 else {
894 if (b->ma_used == 0)
895 return 1;
896 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000897 akeys = dict_keys(a, (PyObject *)NULL);
898 bkeys = dict_keys(b, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000899 if (akeys == NULL || bkeys == NULL) {
900 /* Oops, out of memory -- what to do? */
901 /* For now, sort on address! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 Py_XDECREF(akeys);
903 Py_XDECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000904 if (a < b)
905 return -1;
906 else
907 return 1;
908 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909 PyList_Sort(akeys);
910 PyList_Sort(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000911 n = a->ma_used < b->ma_used ? a->ma_used : b->ma_used; /* smallest */
912 res = 0;
913 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000914 PyObject *akey, *bkey, *aval, *bval;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000915 long ahash, bhash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 akey = PyList_GetItem(akeys, i);
917 bkey = PyList_GetItem(bkeys, i);
918 res = PyObject_Compare(akey, bkey);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000919 if (res != 0)
920 break;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000921#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 if (!PyString_Check(akey) ||
923 (ahash = ((PyStringObject *) akey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000924#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000925 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 ahash = PyObject_Hash(akey);
Guido van Rossumca756f21997-01-23 19:39:29 +0000927 if (ahash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +0000929 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000930#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 if (!PyString_Check(bkey) ||
932 (bhash = ((PyStringObject *) bkey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000933#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000934 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 bhash = PyObject_Hash(bkey);
Guido van Rossumca756f21997-01-23 19:39:29 +0000936 if (bhash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +0000938 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000939 aval = lookdict(a, akey, ahash) -> me_value;
940 bval = lookdict(b, bkey, bhash) -> me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 res = PyObject_Compare(aval, bval);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000942 if (res != 0)
943 break;
944 }
945 if (res == 0) {
946 if (a->ma_used < b->ma_used)
947 res = -1;
948 else if (a->ma_used > b->ma_used)
949 res = 1;
950 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000951 Py_DECREF(akeys);
952 Py_DECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000953 return res;
954}
955
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000956#endif /* !NEWCMP */
957
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000959dict_has_key(mp, args)
960 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 PyObject *args;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000962{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000964 long hash;
965 register long ok;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000966 if (!PyArg_Parse(args, "O", &key))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000967 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000968#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 if (!PyString_Check(key) ||
970 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000971#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000972 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000974 if (hash == -1)
975 return NULL;
976 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000977 ok = mp->ma_size != 0 && lookdict(mp, key, hash)->me_value != NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 return PyInt_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000979}
980
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981static PyObject *
Barry Warsawc38c5da1997-10-06 17:49:20 +0000982dict_get(mp, args)
983 register dictobject *mp;
984 PyObject *args;
985{
986 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +0000987 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +0000988 PyObject *val = NULL;
989 long hash;
990
Barry Warsawc38c5da1997-10-06 17:49:20 +0000991 if (!PyArg_ParseTuple(args, "O|O", &key, &failobj))
992 return NULL;
Guido van Rossum6fcfa721997-10-20 20:10:00 +0000993 if (mp->ma_table == NULL)
994 goto finally;
Barry Warsawc38c5da1997-10-06 17:49:20 +0000995
Barry Warsawc38c5da1997-10-06 17:49:20 +0000996#ifdef CACHE_HASH
997 if (!PyString_Check(key) ||
998 (hash = ((PyStringObject *) key)->ob_shash) == -1)
999#endif
1000 {
1001 hash = PyObject_Hash(key);
1002 if (hash == -1)
1003 return NULL;
1004 }
1005 val = lookdict(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001006
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001007 finally:
Barry Warsawc38c5da1997-10-06 17:49:20 +00001008 if (val == NULL)
1009 val = failobj;
1010 Py_INCREF(val);
1011 return val;
1012}
1013
1014
1015static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001016dict_clear(mp, args)
1017 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001018 PyObject *args;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001019{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 if (!PyArg_NoArgs(args))
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001021 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 PyDict_Clear((PyObject *)mp);
1023 Py_INCREF(Py_None);
1024 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001025}
1026
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027static PyMethodDef mapp_methods[] = {
Guido van Rossum5d8123f1997-07-13 03:58:01 +00001028 {"has_key", (PyCFunction)dict_has_key},
1029 {"keys", (PyCFunction)dict_keys},
1030 {"items", (PyCFunction)dict_items},
1031 {"values", (PyCFunction)dict_values},
Guido van Rossuma8d51311997-06-02 17:13:37 +00001032 {"update", (PyCFunction)dict_update},
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001033 {"clear", (PyCFunction)dict_clear},
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001034 {"copy", (PyCFunction)dict_copy},
Barry Warsawc38c5da1997-10-06 17:49:20 +00001035 {"get", (PyCFunction)dict_get, 1},
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001036 {NULL, NULL} /* sentinel */
1037};
1038
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001040dict_getattr(mp, name)
1041 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001042 char *name;
1043{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001044 return Py_FindMethod(mapp_methods, (PyObject *)mp, name);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001045}
1046
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001047PyTypeObject PyDict_Type = {
1048 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001049 0,
Guido van Rossum9bfef441993-03-29 10:43:31 +00001050 "dictionary",
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001051 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001052 0,
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001053 (destructor)dict_dealloc, /*tp_dealloc*/
1054 (printfunc)dict_print, /*tp_print*/
1055 (getattrfunc)dict_getattr, /*tp_getattr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001056 0, /*tp_setattr*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001057 (cmpfunc)dict_compare, /*tp_compare*/
1058 (reprfunc)dict_repr, /*tp_repr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001059 0, /*tp_as_number*/
1060 0, /*tp_as_sequence*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001061 &dict_as_mapping, /*tp_as_mapping*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001062};
1063
Guido van Rossum3cca2451997-05-16 14:23:33 +00001064/* For backward compatibility with old dictionary interface */
1065
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001066PyObject *
1067PyDict_GetItemString(v, key)
1068 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001069 char *key;
1070{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001071 PyObject *kv, *rv;
1072 kv = PyString_FromString(key);
1073 if (kv == NULL)
1074 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001075 rv = PyDict_GetItem(v, kv);
1076 Py_DECREF(kv);
1077 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001078}
1079
1080int
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081PyDict_SetItemString(v, key, item)
1082 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001083 char *key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001084 PyObject *item;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001085{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001086 PyObject *kv;
1087 int err;
1088 kv = PyString_FromString(key);
1089 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001090 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001091 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001092 err = PyDict_SetItem(v, kv, item);
1093 Py_DECREF(kv);
1094 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001095}
1096
1097int
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001098PyDict_DelItemString(v, key)
1099 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001100 char *key;
1101{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001102 PyObject *kv;
1103 int err;
1104 kv = PyString_FromString(key);
1105 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001106 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001107 err = PyDict_DelItem(v, kv);
1108 Py_DECREF(kv);
1109 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001110}