blob: ea3af486e3b89c3b9dbab794029ae0fcdb528d25 [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 Rossum2bc13791999-03-24 19:06:42 +000032/* Dictionary 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/*
Guido van Rossum2bc13791999-03-24 19:06:42 +000084Invariant for entries: when in use, me_value is not NULL and me_key is
85not NULL and not dummy; when not in use, me_value is NULL and me_key
Guido van Rossum4b1302b1993-03-27 18:11:32 +000086is 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;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000132 PyObject_GC_Init(mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 return (PyObject *)mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000134}
135
136/*
137The basic lookup function used by all operations.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000138This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000139Open addressing is preferred over chaining since the link overhead for
140chaining would be substantial (100% with typical malloc overhead).
Guido van Rossum16e93a81997-01-28 00:00:11 +0000141However, instead of going through the table at constant steps, we cycle
142through the values of GF(2^n)-{0}. This avoids modulo computations, being
143much cheaper on RISC machines, without leading to clustering.
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000144
Guido van Rossum2bc13791999-03-24 19:06:42 +0000145The initial probe index is computed as hash mod the table size.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000146Subsequent probe indices use the values of x^i in GF(2^n) as an offset,
Guido van Rossum2bc13791999-03-24 19:06:42 +0000147where x is a root. The initial value is derived from hash, too.
148
149All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000150
151(This version is due to Reimer Behrends, some ideas are also due to
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000152Jyrki Alakuijala and Vladimir Marangozov.)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000153*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000154static dictentry *lookdict Py_PROTO((dictobject *, PyObject *, long));
155static dictentry *
156lookdict(mp, key, hash)
157 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000158 PyObject *key;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000159 register long hash;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000160{
Guido van Rossum16e93a81997-01-28 00:00:11 +0000161 register int i;
162 register unsigned incr;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000163 register dictentry *freeslot;
Guido van Rossum2095d241997-04-09 19:41:24 +0000164 register unsigned int mask = mp->ma_size-1;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000165 dictentry *ep0 = mp->ma_table;
166 register dictentry *ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000167 /* We must come up with (i, incr) such that 0 <= i < ma_size
168 and 0 < incr < ma_size and both are a function of hash */
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000169 i = (~hash) & mask;
170 /* We use ~hash instead of hash, as degenerate hash functions, such
Guido van Rossum16e93a81997-01-28 00:00:11 +0000171 as for ints <sigh>, can have lots of leading zeros. It's not
172 really a performance risk, but better safe than sorry. */
Guido van Rossumefb46091997-01-29 15:53:56 +0000173 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000174 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000175 return ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000176 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000177 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000178 else {
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000179 if (ep->me_hash == hash &&
180 PyObject_Compare(ep->me_key, key) == 0)
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000181 {
182 return ep;
183 }
184 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000185 }
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000186 /* XXX What if PyObject_Compare returned an exception? */
Guido van Rossum2bc13791999-03-24 19:06:42 +0000187 /* Derive incr from hash, just to make it more arbitrary. Note that
Guido van Rossum16e93a81997-01-28 00:00:11 +0000188 incr must not be 0, or we will get into an infinite loop.*/
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000189 incr = (hash ^ ((unsigned long)hash >> 3)) & mask;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000190 if (!incr)
191 incr = mask;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000192 for (;;) {
Guido van Rossumefb46091997-01-29 15:53:56 +0000193 ep = &ep0[(i+incr)&mask];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000194 if (ep->me_key == NULL) {
195 if (freeslot != NULL)
196 return freeslot;
197 else
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000198 return ep;
199 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000200 if (ep->me_key == dummy) {
201 if (freeslot == NULL)
202 freeslot = ep;
203 }
204 else if (ep->me_key == key ||
205 (ep->me_hash == hash &&
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 PyObject_Compare(ep->me_key, key) == 0)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000207 return ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000208 }
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000209 /* XXX What if PyObject_Compare returned an exception? */
Guido van Rossum16e93a81997-01-28 00:00:11 +0000210 /* Cycle through GF(2^n)-{0} */
211 incr = incr << 1;
212 if (incr > mask)
Guido van Rossumf05fc711998-11-16 22:46:30 +0000213 incr ^= mp->ma_poly; /* This will implicitely clear
214 the highest bit */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000215 }
216}
217
218/*
219Internal routine to insert a new item into the table.
220Used both by the internal resize routine and by the public insert routine.
221Eats a reference to key and one to value.
222*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000223static void insertdict
224 Py_PROTO((dictobject *, PyObject *, long, PyObject *));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000225static void
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000226insertdict(mp, key, hash, value)
227 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000229 long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 PyObject *value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000231{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000233 register dictentry *ep;
234 ep = lookdict(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000235 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000236 old_value = ep->me_value;
237 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000238 Py_DECREF(old_value); /* which **CAN** re-enter */
239 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000240 }
241 else {
242 if (ep->me_key == NULL)
243 mp->ma_fill++;
244 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000245 Py_DECREF(ep->me_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000246 ep->me_key = key;
247 ep->me_hash = hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000248 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000249 mp->ma_used++;
250 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000251}
252
253/*
254Restructure the table by allocating a new table and reinserting all
255items again. When entries have been deleted, the new table may
256actually be smaller than the old one.
257*/
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000258static int dictresize Py_PROTO((dictobject *, int));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000259static int
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000260dictresize(mp, minused)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000261 dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000262 int minused;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000263{
264 register int oldsize = mp->ma_size;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000265 register int newsize, newpoly;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000266 register dictentry *oldtable = mp->ma_table;
267 register dictentry *newtable;
268 register dictentry *ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000269 register int i;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000270 for (i = 0, newsize = MINSIZE; ; i++, newsize <<= 1) {
271 if (i > sizeof(polys)/sizeof(polys[0])) {
272 /* Ran out of polynomials */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000273 PyErr_NoMemory();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000274 return -1;
275 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000276 if (newsize > minused) {
Guido van Rossum16e93a81997-01-28 00:00:11 +0000277 newpoly = polys[i];
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000278 break;
279 }
280 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000281 newtable = PyMem_NEW(dictentry, newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000282 if (newtable == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000283 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000284 return -1;
285 }
Guido van Rossum0fd00331998-07-16 15:06:13 +0000286 memset(newtable, '\0', sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000287 mp->ma_size = newsize;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000288 mp->ma_poly = newpoly;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000289 mp->ma_table = newtable;
290 mp->ma_fill = 0;
291 mp->ma_used = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000292
293 /* Make two passes, so we can avoid decrefs
294 (and possible side effects) till the table is copied */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000295 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
296 if (ep->me_value != NULL)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000297 insertdict(mp,ep->me_key,ep->me_hash,ep->me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000298 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000299 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000300 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301 Py_XDECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000302 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000303 }
304
Guido van Rossumb18618d2000-05-03 23:44:39 +0000305 if (oldtable != NULL)
306 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000307 return 0;
308}
309
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000310PyObject *
311PyDict_GetItem(op, key)
312 PyObject *op;
313 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000314{
315 long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 if (!PyDict_Check(op)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000317 return NULL;
318 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000319 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumd7047b31995-01-02 19:07:15 +0000320 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000321#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322 if (!PyString_Check(key) ||
323 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000324#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000325 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000327 if (hash == -1) {
328 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000329 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000330 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000331 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000332 return lookdict((dictobject *)op, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000333}
334
335int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336PyDict_SetItem(op, key, value)
337 register PyObject *op;
338 PyObject *key;
339 PyObject *value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000340{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000341 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000342 register long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 if (!PyDict_Check(op)) {
344 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000345 return -1;
346 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000347 mp = (dictobject *)op;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000348#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 if (PyString_Check(key)) {
Guido van Rossum2a61e741997-01-18 07:55:05 +0000350#ifdef INTERN_STRINGS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351 if (((PyStringObject *)key)->ob_sinterned != NULL) {
352 key = ((PyStringObject *)key)->ob_sinterned;
353 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000354 }
355 else
356#endif
357 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000359 if (hash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000361 }
362 }
363 else
364#endif
365 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000367 if (hash == -1)
368 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000369 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000370 /* if fill >= 2/3 size, double in size */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000371 if (mp->ma_fill*3 >= mp->ma_size*2) {
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000372 if (dictresize(mp, mp->ma_used*2) != 0) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000373 if (mp->ma_fill+1 > mp->ma_size)
374 return -1;
375 }
376 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377 Py_INCREF(value);
378 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000379 insertdict(mp, key, hash, value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000380 return 0;
381}
382
383int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384PyDict_DelItem(op, key)
385 PyObject *op;
386 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000387{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000388 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000389 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000390 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000392
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393 if (!PyDict_Check(op)) {
394 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000395 return -1;
396 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000397#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 if (!PyString_Check(key) ||
399 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000400#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000401 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000403 if (hash == -1)
404 return -1;
405 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000406 mp = (dictobject *)op;
407 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumefc87131995-01-02 19:42:39 +0000408 goto empty;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000409 ep = lookdict(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000410 if (ep->me_value == NULL) {
Guido van Rossumefc87131995-01-02 19:42:39 +0000411 empty:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000413 return -1;
414 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000415 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000417 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000418 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000419 ep->me_value = NULL;
420 mp->ma_used--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 Py_DECREF(old_value);
422 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000423 return 0;
424}
425
Guido van Rossum25831651993-05-19 14:50:45 +0000426void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427PyDict_Clear(op)
428 PyObject *op;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000429{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000430 int i, n;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000431 register dictentry *table;
432 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000434 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000435 mp = (dictobject *)op;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000436 table = mp->ma_table;
437 if (table == NULL)
438 return;
439 n = mp->ma_size;
440 mp->ma_size = mp->ma_used = mp->ma_fill = 0;
441 mp->ma_table = NULL;
442 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 Py_XDECREF(table[i].me_key);
444 Py_XDECREF(table[i].me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000445 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000447}
448
Guido van Rossum25831651993-05-19 14:50:45 +0000449int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450PyDict_Next(op, ppos, pkey, pvalue)
451 PyObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000452 int *ppos;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453 PyObject **pkey;
454 PyObject **pvalue;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000455{
Guido van Rossum25831651993-05-19 14:50:45 +0000456 int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000457 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000459 return 0;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000460 mp = (dictobject *)op;
Guido van Rossum25831651993-05-19 14:50:45 +0000461 i = *ppos;
462 if (i < 0)
463 return 0;
464 while (i < mp->ma_size && mp->ma_table[i].me_value == NULL)
465 i++;
466 *ppos = i+1;
467 if (i >= mp->ma_size)
468 return 0;
469 if (pkey)
470 *pkey = mp->ma_table[i].me_key;
471 if (pvalue)
472 *pvalue = mp->ma_table[i].me_value;
473 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000474}
475
476/* Methods */
477
478static void
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000479dict_dealloc(mp)
480 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000481{
482 register int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000483 register dictentry *ep;
Guido van Rossumd724b232000-03-13 16:01:29 +0000484 Py_TRASHCAN_SAFE_BEGIN(mp)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000485 PyObject_GC_Fini(mp);
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 Rossumb18618d2000-05-03 23:44:39 +0000494 if (mp->ma_table != NULL)
495 PyMem_DEL(mp->ma_table);
496 PyObject_DEL(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000497 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000498}
499
500static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000501dict_print(mp, fp, flags)
502 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000503 register FILE *fp;
504 register int flags;
505{
506 register int i;
507 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000508 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000509
510 i = Py_ReprEnter((PyObject*)mp);
511 if (i != 0) {
512 if (i < 0)
513 return i;
514 fprintf(fp, "{...}");
515 return 0;
516 }
517
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000518 fprintf(fp, "{");
519 any = 0;
520 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
521 if (ep->me_value != NULL) {
522 if (any++ > 0)
523 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000524 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
525 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000526 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000527 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000528 fprintf(fp, ": ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000529 if (PyObject_Print(ep->me_value, fp, 0) != 0) {
530 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000531 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000532 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000533 }
534 }
535 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000536 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000537 return 0;
538}
539
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000541dict_repr(mp)
542 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000543{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544 auto PyObject *v;
545 PyObject *sepa, *colon;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000546 register int i;
547 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000548 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000549
550 i = Py_ReprEnter((PyObject*)mp);
551 if (i != 0) {
552 if (i > 0)
553 return PyString_FromString("{...}");
554 return NULL;
555 }
556
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000557 v = PyString_FromString("{");
558 sepa = PyString_FromString(", ");
559 colon = PyString_FromString(": ");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000560 any = 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000561 for (i = 0, ep = mp->ma_table; i < mp->ma_size && v; i++, ep++) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000562 if (ep->me_value != NULL) {
563 if (any++)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000564 PyString_Concat(&v, sepa);
565 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_key));
566 PyString_Concat(&v, colon);
567 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_value));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000568 }
569 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 PyString_ConcatAndDel(&v, PyString_FromString("}"));
Guido van Rossum255443b1998-04-10 22:47:14 +0000571 Py_ReprLeave((PyObject*)mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 Py_XDECREF(sepa);
573 Py_XDECREF(colon);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000574 return v;
575}
576
577static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000578dict_length(mp)
579 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000580{
581 return mp->ma_used;
582}
583
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000585dict_subscript(mp, key)
586 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 register PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000588{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000590 long hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000591 if (mp->ma_table == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000593 return NULL;
594 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000595#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 if (!PyString_Check(key) ||
597 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000598#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000599 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000600 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000601 if (hash == -1)
602 return NULL;
603 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000604 v = lookdict(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000605 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000607 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000609 return v;
610}
611
612static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000613dict_ass_sub(mp, v, w)
614 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 PyObject *v, *w;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000616{
617 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000618 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000619 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000621}
622
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000623static PyMappingMethods dict_as_mapping = {
624 (inquiry)dict_length, /*mp_length*/
625 (binaryfunc)dict_subscript, /*mp_subscript*/
626 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000627};
628
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000630dict_keys(mp, args)
631 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 PyObject *args;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000633{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000634 register PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000635 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 if (!PyArg_NoArgs(args))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000637 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 v = PyList_New(mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000639 if (v == NULL)
640 return NULL;
641 for (i = 0, j = 0; i < mp->ma_size; i++) {
642 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643 PyObject *key = mp->ma_table[i].me_key;
644 Py_INCREF(key);
645 PyList_SetItem(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000646 j++;
647 }
648 }
649 return v;
650}
651
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000653dict_values(mp, args)
654 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 PyObject *args;
Guido van Rossum25831651993-05-19 14:50:45 +0000656{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000657 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000658 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000660 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000662 if (v == NULL)
663 return NULL;
664 for (i = 0, j = 0; i < mp->ma_size; i++) {
665 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666 PyObject *value = mp->ma_table[i].me_value;
667 Py_INCREF(value);
668 PyList_SetItem(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000669 j++;
670 }
671 }
672 return v;
673}
674
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000676dict_items(mp, args)
677 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 PyObject *args;
Guido van Rossum25831651993-05-19 14:50:45 +0000679{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000681 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000683 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000684 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000685 if (v == NULL)
686 return NULL;
687 for (i = 0, j = 0; i < mp->ma_size; i++) {
688 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 PyObject *key = mp->ma_table[i].me_key;
690 PyObject *value = mp->ma_table[i].me_value;
691 PyObject *item = PyTuple_New(2);
Guido van Rossum25831651993-05-19 14:50:45 +0000692 if (item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +0000694 return NULL;
695 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 Py_INCREF(key);
697 PyTuple_SetItem(item, 0, key);
698 Py_INCREF(value);
699 PyTuple_SetItem(item, 1, value);
700 PyList_SetItem(v, j, item);
Guido van Rossum25831651993-05-19 14:50:45 +0000701 j++;
702 }
703 }
704 return v;
705}
706
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000707static PyObject *
Guido van Rossuma8d51311997-06-02 17:13:37 +0000708dict_update(mp, args)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000709 register dictobject *mp;
710 PyObject *args;
711{
712 register int i;
713 dictobject *other;
714 dictentry *entry;
715 if (!PyArg_Parse(args, "O!", &PyDict_Type, &other))
716 return NULL;
717 if (other == mp)
Guido van Rossuma8d51311997-06-02 17:13:37 +0000718 goto done; /* a.update(a); nothing to do */
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000719 /* Do one big resize at the start, rather than incrementally
720 resizing as we insert new items. Expect that there will be
721 no (or few) overlapping keys. */
722 if ((mp->ma_fill + other->ma_used)*3 >= mp->ma_size*2) {
723 if (dictresize(mp, (mp->ma_used + other->ma_used)*3/2) != 0)
724 return NULL;
725 }
726 for (i = 0; i < other->ma_size; i++) {
727 entry = &other->ma_table[i];
728 if (entry->me_value != NULL) {
729 Py_INCREF(entry->me_key);
730 Py_INCREF(entry->me_value);
731 insertdict(mp, entry->me_key, entry->me_hash,
732 entry->me_value);
733 }
734 }
735 done:
736 Py_INCREF(Py_None);
737 return Py_None;
738}
739
740static PyObject *
741dict_copy(mp, args)
742 register dictobject *mp;
743 PyObject *args;
744{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000745 if (!PyArg_Parse(args, ""))
746 return NULL;
747 return PyDict_Copy((PyObject*)mp);
748}
749
750PyObject *
751PyDict_Copy(o)
752 PyObject *o;
753{
754 register dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000755 register int i;
756 dictobject *copy;
757 dictentry *entry;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000758
759 if (o == NULL || !PyDict_Check(o)) {
760 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000761 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000762 }
763 mp = (dictobject *)o;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000764 copy = (dictobject *)PyDict_New();
765 if (copy == NULL)
766 return NULL;
767 if (mp->ma_used > 0) {
768 if (dictresize(copy, mp->ma_used*3/2) != 0)
769 return NULL;
770 for (i = 0; i < mp->ma_size; i++) {
771 entry = &mp->ma_table[i];
772 if (entry->me_value != NULL) {
773 Py_INCREF(entry->me_key);
774 Py_INCREF(entry->me_value);
775 insertdict(copy, entry->me_key, entry->me_hash,
776 entry->me_value);
777 }
778 }
779 }
780 return (PyObject *)copy;
781}
782
Guido van Rossum4199fac1993-11-05 10:18:44 +0000783int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784PyDict_Size(mp)
785 PyObject *mp;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000786{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787 if (mp == NULL || !PyDict_Check(mp)) {
788 PyErr_BadInternalCall();
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000789 return 0;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000790 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000791 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000792}
793
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794PyObject *
795PyDict_Keys(mp)
796 PyObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000797{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 if (mp == NULL || !PyDict_Check(mp)) {
799 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000800 return NULL;
801 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000802 return dict_keys((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000803}
804
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805PyObject *
806PyDict_Values(mp)
807 PyObject *mp;
Guido van Rossum25831651993-05-19 14:50:45 +0000808{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809 if (mp == NULL || !PyDict_Check(mp)) {
810 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000811 return NULL;
812 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000813 return dict_values((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000814}
815
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816PyObject *
817PyDict_Items(mp)
818 PyObject *mp;
Guido van Rossum25831651993-05-19 14:50:45 +0000819{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000820 if (mp == NULL || !PyDict_Check(mp)) {
821 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000822 return NULL;
823 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000824 return dict_items((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000825}
826
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000827#define NEWCMP
828
829#ifdef NEWCMP
830
831/* Subroutine which returns the smallest key in a for which b's value
832 is different or absent. The value is returned too, through the
833 pval argument. No reference counts are incremented. */
834
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835static PyObject *
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000836characterize(a, b, pval)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000837 dictobject *a;
838 dictobject *b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 PyObject **pval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000840{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000841 PyObject *diff = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000842 int i;
843
844 *pval = NULL;
845 for (i = 0; i < a->ma_size; i++) {
846 if (a->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000847 PyObject *key = a->ma_table[i].me_key;
848 PyObject *aval, *bval;
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000849 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000850 if (diff != NULL && PyObject_Compare(key, diff) > 0)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000851 continue;
852 aval = a->ma_table[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 bval = PyDict_GetItem((PyObject *)b, key);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000854 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 if (bval == NULL || PyObject_Compare(aval, bval) != 0)
856 {
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000857 diff = key;
858 *pval = aval;
859 }
860 }
861 }
862 return diff;
863}
864
865static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000866dict_compare(a, b)
867 dictobject *a, *b;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000868{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000870 int res;
871
872 /* Compare lengths first */
873 if (a->ma_used < b->ma_used)
874 return -1; /* a is shorter */
875 else if (a->ma_used > b->ma_used)
876 return 1; /* b is shorter */
877 /* Same length -- check all keys */
878 adiff = characterize(a, b, &aval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000879 if (PyErr_Occurred())
880 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000881 if (adiff == NULL)
882 return 0; /* a is a subset with the same length */
883 bdiff = characterize(b, a, &bval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000884 if (PyErr_Occurred())
885 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000886 /* bdiff == NULL would be impossible now */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000887 res = PyObject_Compare(adiff, bdiff);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000888 if (res == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 res = PyObject_Compare(aval, bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000890 return res;
891}
892
893#else /* !NEWCMP */
894
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000895static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000896dict_compare(a, b)
897 dictobject *a, *b;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000898{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000899 PyObject *akeys, *bkeys;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000900 int i, n, res;
901 if (a == b)
902 return 0;
903 if (a->ma_used == 0) {
904 if (b->ma_used != 0)
905 return -1;
906 else
907 return 0;
908 }
909 else {
910 if (b->ma_used == 0)
911 return 1;
912 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000913 akeys = dict_keys(a, (PyObject *)NULL);
914 bkeys = dict_keys(b, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000915 if (akeys == NULL || bkeys == NULL) {
916 /* Oops, out of memory -- what to do? */
917 /* For now, sort on address! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 Py_XDECREF(akeys);
919 Py_XDECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000920 if (a < b)
921 return -1;
922 else
923 return 1;
924 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 PyList_Sort(akeys);
926 PyList_Sort(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000927 n = a->ma_used < b->ma_used ? a->ma_used : b->ma_used; /* smallest */
928 res = 0;
929 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 PyObject *akey, *bkey, *aval, *bval;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000931 long ahash, bhash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 akey = PyList_GetItem(akeys, i);
933 bkey = PyList_GetItem(bkeys, i);
934 res = PyObject_Compare(akey, bkey);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000935 if (res != 0)
936 break;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000937#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938 if (!PyString_Check(akey) ||
939 (ahash = ((PyStringObject *) akey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000940#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000941 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942 ahash = PyObject_Hash(akey);
Guido van Rossumca756f21997-01-23 19:39:29 +0000943 if (ahash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000944 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +0000945 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000946#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947 if (!PyString_Check(bkey) ||
948 (bhash = ((PyStringObject *) bkey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000949#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000950 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000951 bhash = PyObject_Hash(bkey);
Guido van Rossumca756f21997-01-23 19:39:29 +0000952 if (bhash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000953 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +0000954 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000955 aval = lookdict(a, akey, ahash) -> me_value;
956 bval = lookdict(b, bkey, bhash) -> me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957 res = PyObject_Compare(aval, bval);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000958 if (res != 0)
959 break;
960 }
961 if (res == 0) {
962 if (a->ma_used < b->ma_used)
963 res = -1;
964 else if (a->ma_used > b->ma_used)
965 res = 1;
966 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 Py_DECREF(akeys);
968 Py_DECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000969 return res;
970}
971
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000972#endif /* !NEWCMP */
973
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000975dict_has_key(mp, args)
976 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 PyObject *args;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000978{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000980 long hash;
981 register long ok;
Fred Drake52fccfd2000-02-23 15:47:16 +0000982 if (!PyArg_ParseTuple(args, "O:has_key", &key))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000983 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000984#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 if (!PyString_Check(key) ||
986 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000987#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000988 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000990 if (hash == -1)
991 return NULL;
992 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000993 ok = mp->ma_size != 0 && lookdict(mp, key, hash)->me_value != NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 return PyInt_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000995}
996
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997static PyObject *
Barry Warsawc38c5da1997-10-06 17:49:20 +0000998dict_get(mp, args)
999 register dictobject *mp;
1000 PyObject *args;
1001{
1002 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001003 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001004 PyObject *val = NULL;
1005 long hash;
1006
Fred Drake52fccfd2000-02-23 15:47:16 +00001007 if (!PyArg_ParseTuple(args, "O|O:get", &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001008 return NULL;
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001009 if (mp->ma_table == NULL)
1010 goto finally;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001011
Barry Warsawc38c5da1997-10-06 17:49:20 +00001012#ifdef CACHE_HASH
1013 if (!PyString_Check(key) ||
1014 (hash = ((PyStringObject *) key)->ob_shash) == -1)
1015#endif
1016 {
1017 hash = PyObject_Hash(key);
1018 if (hash == -1)
1019 return NULL;
1020 }
1021 val = lookdict(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001022
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001023 finally:
Barry Warsawc38c5da1997-10-06 17:49:20 +00001024 if (val == NULL)
1025 val = failobj;
1026 Py_INCREF(val);
1027 return val;
1028}
1029
1030
1031static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001032dict_clear(mp, args)
1033 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034 PyObject *args;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001035{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 if (!PyArg_NoArgs(args))
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001037 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 PyDict_Clear((PyObject *)mp);
1039 Py_INCREF(Py_None);
1040 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001041}
1042
Jeremy Hylton8caad492000-06-23 14:18:11 +00001043static int
1044dict_traverse(PyObject *op, visitproc visit, void *arg)
1045{
1046 int i = 0, err;
1047 PyObject *pk;
1048 PyObject *pv;
1049
1050 while (PyDict_Next(op, &i, &pk, &pv)) {
1051 err = visit(pk, arg);
1052 if (err)
1053 return err;
1054 err = visit(pv, arg);
1055 if (err)
1056 return err;
1057 }
1058 return 0;
1059}
1060
1061static int
1062dict_tp_clear(PyObject *op)
1063{
1064 PyDict_Clear(op);
1065 return 0;
1066}
1067
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001068static PyMethodDef mapp_methods[] = {
Fred Drake52fccfd2000-02-23 15:47:16 +00001069 {"has_key", (PyCFunction)dict_has_key, METH_VARARGS},
Guido van Rossum5d8123f1997-07-13 03:58:01 +00001070 {"keys", (PyCFunction)dict_keys},
1071 {"items", (PyCFunction)dict_items},
1072 {"values", (PyCFunction)dict_values},
Guido van Rossuma8d51311997-06-02 17:13:37 +00001073 {"update", (PyCFunction)dict_update},
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001074 {"clear", (PyCFunction)dict_clear},
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001075 {"copy", (PyCFunction)dict_copy},
Fred Drake52fccfd2000-02-23 15:47:16 +00001076 {"get", (PyCFunction)dict_get, METH_VARARGS},
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001077 {NULL, NULL} /* sentinel */
1078};
1079
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001081dict_getattr(mp, name)
1082 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001083 char *name;
1084{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085 return Py_FindMethod(mapp_methods, (PyObject *)mp, name);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001086}
1087
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001088PyTypeObject PyDict_Type = {
1089 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001090 0,
Guido van Rossum9bfef441993-03-29 10:43:31 +00001091 "dictionary",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001092 sizeof(dictobject) + PyGC_HEAD_SIZE,
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001093 0,
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001094 (destructor)dict_dealloc, /*tp_dealloc*/
1095 (printfunc)dict_print, /*tp_print*/
1096 (getattrfunc)dict_getattr, /*tp_getattr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001097 0, /*tp_setattr*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001098 (cmpfunc)dict_compare, /*tp_compare*/
1099 (reprfunc)dict_repr, /*tp_repr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001100 0, /*tp_as_number*/
1101 0, /*tp_as_sequence*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001102 &dict_as_mapping, /*tp_as_mapping*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001103 0, /* tp_hash */
1104 0, /* tp_call */
1105 0, /* tp_str */
1106 0, /* tp_getattro */
1107 0, /* tp_setattro */
1108 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001109 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001110 0, /* tp_doc */
1111 (traverseproc)dict_traverse, /* tp_traverse */
1112 (inquiry)dict_tp_clear, /* tp_clear */
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001113};
1114
Guido van Rossum3cca2451997-05-16 14:23:33 +00001115/* For backward compatibility with old dictionary interface */
1116
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117PyObject *
1118PyDict_GetItemString(v, key)
1119 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001120 char *key;
1121{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001122 PyObject *kv, *rv;
1123 kv = PyString_FromString(key);
1124 if (kv == NULL)
1125 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001126 rv = PyDict_GetItem(v, kv);
1127 Py_DECREF(kv);
1128 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001129}
1130
1131int
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001132PyDict_SetItemString(v, key, item)
1133 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001134 char *key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135 PyObject *item;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001136{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001137 PyObject *kv;
1138 int err;
1139 kv = PyString_FromString(key);
1140 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001141 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001142 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001143 err = PyDict_SetItem(v, kv, item);
1144 Py_DECREF(kv);
1145 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001146}
1147
1148int
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149PyDict_DelItemString(v, key)
1150 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001151 char *key;
1152{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001153 PyObject *kv;
1154 int err;
1155 kv = PyString_FromString(key);
1156 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001157 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001158 err = PyDict_DelItem(v, kv);
1159 Py_DECREF(kv);
1160 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001161}