blob: 044b9e1f4a2566c020f5886705eb5bba2199e20d [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 Rossumc1c7b1a1998-10-06 16:01:14 +0000176 if (ep->me_key == NULL || ep->me_key == key)
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 {
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000181 if (ep->me_hash == hash &&
182 PyObject_Compare(ep->me_key, key) == 0)
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000183 {
184 return ep;
185 }
186 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000187 }
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000188 /* XXX What if PyObject_Compare returned an exception? */
Guido van Rossumefb46091997-01-29 15:53:56 +0000189 /* Derive incr from sum, just to make it more arbitrary. Note that
Guido van Rossum16e93a81997-01-28 00:00:11 +0000190 incr must not be 0, or we will get into an infinite loop.*/
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000191 incr = (hash ^ ((unsigned long)hash >> 3)) & mask;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000192 if (!incr)
193 incr = mask;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000194 for (;;) {
Guido van Rossumefb46091997-01-29 15:53:56 +0000195 ep = &ep0[(i+incr)&mask];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000196 if (ep->me_key == NULL) {
197 if (freeslot != NULL)
198 return freeslot;
199 else
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000200 return ep;
201 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000202 if (ep->me_key == dummy) {
203 if (freeslot == NULL)
204 freeslot = ep;
205 }
206 else if (ep->me_key == key ||
207 (ep->me_hash == hash &&
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000208 PyObject_Compare(ep->me_key, key) == 0)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000209 return ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000210 }
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000211 /* XXX What if PyObject_Compare returned an exception? */
Guido van Rossum16e93a81997-01-28 00:00:11 +0000212 /* Cycle through GF(2^n)-{0} */
213 incr = incr << 1;
214 if (incr > mask)
Guido van Rossumf05fc711998-11-16 22:46:30 +0000215 incr ^= mp->ma_poly; /* This will implicitely clear
216 the highest bit */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000217 }
218}
219
220/*
221Internal routine to insert a new item into the table.
222Used both by the internal resize routine and by the public insert routine.
223Eats a reference to key and one to value.
224*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000225static void insertdict
226 Py_PROTO((dictobject *, PyObject *, long, PyObject *));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000227static void
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000228insertdict(mp, key, hash, value)
229 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000231 long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 PyObject *value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000233{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000235 register dictentry *ep;
236 ep = lookdict(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000237 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000238 old_value = ep->me_value;
239 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 Py_DECREF(old_value); /* which **CAN** re-enter */
241 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000242 }
243 else {
244 if (ep->me_key == NULL)
245 mp->ma_fill++;
246 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000247 Py_DECREF(ep->me_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000248 ep->me_key = key;
249 ep->me_hash = hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000250 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000251 mp->ma_used++;
252 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000253}
254
255/*
256Restructure the table by allocating a new table and reinserting all
257items again. When entries have been deleted, the new table may
258actually be smaller than the old one.
259*/
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000260static int dictresize Py_PROTO((dictobject *, int));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000261static int
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000262dictresize(mp, minused)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000263 dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000264 int minused;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000265{
266 register int oldsize = mp->ma_size;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000267 register int newsize, newpoly;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000268 register dictentry *oldtable = mp->ma_table;
269 register dictentry *newtable;
270 register dictentry *ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000271 register int i;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000272 for (i = 0, newsize = MINSIZE; ; i++, newsize <<= 1) {
273 if (i > sizeof(polys)/sizeof(polys[0])) {
274 /* Ran out of polynomials */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000275 PyErr_NoMemory();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000276 return -1;
277 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000278 if (newsize > minused) {
Guido van Rossum16e93a81997-01-28 00:00:11 +0000279 newpoly = polys[i];
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000280 break;
281 }
282 }
Guido van Rossum0fd00331998-07-16 15:06:13 +0000283 newtable = (dictentry *) malloc(sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000284 if (newtable == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000285 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000286 return -1;
287 }
Guido van Rossum0fd00331998-07-16 15:06:13 +0000288 memset(newtable, '\0', sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000289 mp->ma_size = newsize;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000290 mp->ma_poly = newpoly;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000291 mp->ma_table = newtable;
292 mp->ma_fill = 0;
293 mp->ma_used = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000294
295 /* Make two passes, so we can avoid decrefs
296 (and possible side effects) till the table is copied */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000297 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
298 if (ep->me_value != NULL)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000299 insertdict(mp,ep->me_key,ep->me_hash,ep->me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000300 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000301 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000302 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000303 Py_XDECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000304 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000305 }
306
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000307 PyMem_XDEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000308 return 0;
309}
310
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311PyObject *
312PyDict_GetItem(op, key)
313 PyObject *op;
314 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000315{
316 long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000317 if (!PyDict_Check(op)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000318 return NULL;
319 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000320 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumd7047b31995-01-02 19:07:15 +0000321 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000322#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323 if (!PyString_Check(key) ||
324 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000325#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000326 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000327 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000328 if (hash == -1) {
329 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000330 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000331 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000332 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000333 return lookdict((dictobject *)op, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000334}
335
336int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337PyDict_SetItem(op, key, value)
338 register PyObject *op;
339 PyObject *key;
340 PyObject *value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000341{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000342 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000343 register long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 if (!PyDict_Check(op)) {
345 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000346 return -1;
347 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000348 mp = (dictobject *)op;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000349#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350 if (PyString_Check(key)) {
Guido van Rossum2a61e741997-01-18 07:55:05 +0000351#ifdef INTERN_STRINGS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 if (((PyStringObject *)key)->ob_sinterned != NULL) {
353 key = ((PyStringObject *)key)->ob_sinterned;
354 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000355 }
356 else
357#endif
358 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000360 if (hash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000362 }
363 }
364 else
365#endif
366 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000367 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000368 if (hash == -1)
369 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000370 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000371 /* if fill >= 2/3 size, double in size */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000372 if (mp->ma_fill*3 >= mp->ma_size*2) {
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000373 if (dictresize(mp, mp->ma_used*2) != 0) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000374 if (mp->ma_fill+1 > mp->ma_size)
375 return -1;
376 }
377 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000378 Py_INCREF(value);
379 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000380 insertdict(mp, key, hash, value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000381 return 0;
382}
383
384int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000385PyDict_DelItem(op, key)
386 PyObject *op;
387 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000388{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000389 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000390 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000391 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000393
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000394 if (!PyDict_Check(op)) {
395 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000396 return -1;
397 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000398#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399 if (!PyString_Check(key) ||
400 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000401#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000402 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000404 if (hash == -1)
405 return -1;
406 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000407 mp = (dictobject *)op;
408 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumefc87131995-01-02 19:42:39 +0000409 goto empty;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000410 ep = lookdict(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000411 if (ep->me_value == NULL) {
Guido van Rossumefc87131995-01-02 19:42:39 +0000412 empty:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000414 return -1;
415 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000416 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000418 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000419 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000420 ep->me_value = NULL;
421 mp->ma_used--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 Py_DECREF(old_value);
423 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000424 return 0;
425}
426
Guido van Rossum25831651993-05-19 14:50:45 +0000427void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428PyDict_Clear(op)
429 PyObject *op;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000430{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000431 int i, n;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000432 register dictentry *table;
433 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000435 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000436 mp = (dictobject *)op;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000437 table = mp->ma_table;
438 if (table == NULL)
439 return;
440 n = mp->ma_size;
441 mp->ma_size = mp->ma_used = mp->ma_fill = 0;
442 mp->ma_table = NULL;
443 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 Py_XDECREF(table[i].me_key);
445 Py_XDECREF(table[i].me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000446 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000448}
449
Guido van Rossum25831651993-05-19 14:50:45 +0000450int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451PyDict_Next(op, ppos, pkey, pvalue)
452 PyObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000453 int *ppos;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454 PyObject **pkey;
455 PyObject **pvalue;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000456{
Guido van Rossum25831651993-05-19 14:50:45 +0000457 int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000458 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000459 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000460 return 0;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000461 mp = (dictobject *)op;
Guido van Rossum25831651993-05-19 14:50:45 +0000462 i = *ppos;
463 if (i < 0)
464 return 0;
465 while (i < mp->ma_size && mp->ma_table[i].me_value == NULL)
466 i++;
467 *ppos = i+1;
468 if (i >= mp->ma_size)
469 return 0;
470 if (pkey)
471 *pkey = mp->ma_table[i].me_key;
472 if (pvalue)
473 *pvalue = mp->ma_table[i].me_value;
474 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000475}
476
477/* Methods */
478
479static void
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000480dict_dealloc(mp)
481 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000482{
483 register int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000484 register dictentry *ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000485 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000486 if (ep->me_key != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000488 }
489 if (ep->me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 Py_DECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000491 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000492 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493 PyMem_XDEL(mp->ma_table);
494 PyMem_DEL(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000495}
496
497static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000498dict_print(mp, fp, flags)
499 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000500 register FILE *fp;
501 register int flags;
502{
503 register int i;
504 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000505 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000506
507 i = Py_ReprEnter((PyObject*)mp);
508 if (i != 0) {
509 if (i < 0)
510 return i;
511 fprintf(fp, "{...}");
512 return 0;
513 }
514
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000515 fprintf(fp, "{");
516 any = 0;
517 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
518 if (ep->me_value != NULL) {
519 if (any++ > 0)
520 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000521 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
522 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000523 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000524 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000525 fprintf(fp, ": ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000526 if (PyObject_Print(ep->me_value, fp, 0) != 0) {
527 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000528 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000529 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000530 }
531 }
532 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000533 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000534 return 0;
535}
536
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000538dict_repr(mp)
539 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000540{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541 auto PyObject *v;
542 PyObject *sepa, *colon;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000543 register int i;
544 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000545 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000546
547 i = Py_ReprEnter((PyObject*)mp);
548 if (i != 0) {
549 if (i > 0)
550 return PyString_FromString("{...}");
551 return NULL;
552 }
553
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 v = PyString_FromString("{");
555 sepa = PyString_FromString(", ");
556 colon = PyString_FromString(": ");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000557 any = 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000558 for (i = 0, ep = mp->ma_table; i < mp->ma_size && v; i++, ep++) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000559 if (ep->me_value != NULL) {
560 if (any++)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561 PyString_Concat(&v, sepa);
562 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_key));
563 PyString_Concat(&v, colon);
564 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_value));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000565 }
566 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 PyString_ConcatAndDel(&v, PyString_FromString("}"));
Guido van Rossum255443b1998-04-10 22:47:14 +0000568 Py_ReprLeave((PyObject*)mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 Py_XDECREF(sepa);
570 Py_XDECREF(colon);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000571 return v;
572}
573
574static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000575dict_length(mp)
576 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000577{
578 return mp->ma_used;
579}
580
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000582dict_subscript(mp, key)
583 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584 register PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000585{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000587 long hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000588 if (mp->ma_table == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000590 return NULL;
591 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000592#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593 if (!PyString_Check(key) ||
594 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000595#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000596 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000598 if (hash == -1)
599 return NULL;
600 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000601 v = lookdict(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000602 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000604 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000606 return v;
607}
608
609static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000610dict_ass_sub(mp, v, w)
611 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 PyObject *v, *w;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000613{
614 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000616 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000618}
619
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000620static PyMappingMethods dict_as_mapping = {
621 (inquiry)dict_length, /*mp_length*/
622 (binaryfunc)dict_subscript, /*mp_subscript*/
623 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000624};
625
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000627dict_keys(mp, args)
628 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 PyObject *args;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000630{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000631 register PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000632 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633 if (!PyArg_NoArgs(args))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000634 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 v = PyList_New(mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000636 if (v == NULL)
637 return NULL;
638 for (i = 0, j = 0; i < mp->ma_size; i++) {
639 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000640 PyObject *key = mp->ma_table[i].me_key;
641 Py_INCREF(key);
642 PyList_SetItem(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000643 j++;
644 }
645 }
646 return v;
647}
648
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000650dict_values(mp, args)
651 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 PyObject *args;
Guido van Rossum25831651993-05-19 14:50:45 +0000653{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000655 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000657 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000659 if (v == NULL)
660 return NULL;
661 for (i = 0, j = 0; i < mp->ma_size; i++) {
662 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 PyObject *value = mp->ma_table[i].me_value;
664 Py_INCREF(value);
665 PyList_SetItem(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000666 j++;
667 }
668 }
669 return v;
670}
671
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000673dict_items(mp, args)
674 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 PyObject *args;
Guido van Rossum25831651993-05-19 14:50:45 +0000676{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000678 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000679 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000680 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000682 if (v == NULL)
683 return NULL;
684 for (i = 0, j = 0; i < mp->ma_size; i++) {
685 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000686 PyObject *key = mp->ma_table[i].me_key;
687 PyObject *value = mp->ma_table[i].me_value;
688 PyObject *item = PyTuple_New(2);
Guido van Rossum25831651993-05-19 14:50:45 +0000689 if (item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +0000691 return NULL;
692 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 Py_INCREF(key);
694 PyTuple_SetItem(item, 0, key);
695 Py_INCREF(value);
696 PyTuple_SetItem(item, 1, value);
697 PyList_SetItem(v, j, item);
Guido van Rossum25831651993-05-19 14:50:45 +0000698 j++;
699 }
700 }
701 return v;
702}
703
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000704static PyObject *
Guido van Rossuma8d51311997-06-02 17:13:37 +0000705dict_update(mp, args)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000706 register dictobject *mp;
707 PyObject *args;
708{
709 register int i;
710 dictobject *other;
711 dictentry *entry;
712 if (!PyArg_Parse(args, "O!", &PyDict_Type, &other))
713 return NULL;
714 if (other == mp)
Guido van Rossuma8d51311997-06-02 17:13:37 +0000715 goto done; /* a.update(a); nothing to do */
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000716 /* Do one big resize at the start, rather than incrementally
717 resizing as we insert new items. Expect that there will be
718 no (or few) overlapping keys. */
719 if ((mp->ma_fill + other->ma_used)*3 >= mp->ma_size*2) {
720 if (dictresize(mp, (mp->ma_used + other->ma_used)*3/2) != 0)
721 return NULL;
722 }
723 for (i = 0; i < other->ma_size; i++) {
724 entry = &other->ma_table[i];
725 if (entry->me_value != NULL) {
726 Py_INCREF(entry->me_key);
727 Py_INCREF(entry->me_value);
728 insertdict(mp, entry->me_key, entry->me_hash,
729 entry->me_value);
730 }
731 }
732 done:
733 Py_INCREF(Py_None);
734 return Py_None;
735}
736
737static PyObject *
738dict_copy(mp, args)
739 register dictobject *mp;
740 PyObject *args;
741{
742 register int i;
743 dictobject *copy;
744 dictentry *entry;
745 if (!PyArg_Parse(args, ""))
746 return NULL;
747 copy = (dictobject *)PyDict_New();
748 if (copy == NULL)
749 return NULL;
750 if (mp->ma_used > 0) {
751 if (dictresize(copy, mp->ma_used*3/2) != 0)
752 return NULL;
753 for (i = 0; i < mp->ma_size; i++) {
754 entry = &mp->ma_table[i];
755 if (entry->me_value != NULL) {
756 Py_INCREF(entry->me_key);
757 Py_INCREF(entry->me_value);
758 insertdict(copy, entry->me_key, entry->me_hash,
759 entry->me_value);
760 }
761 }
762 }
763 return (PyObject *)copy;
764}
765
Guido van Rossum4199fac1993-11-05 10:18:44 +0000766int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767PyDict_Size(mp)
768 PyObject *mp;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000769{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770 if (mp == NULL || !PyDict_Check(mp)) {
771 PyErr_BadInternalCall();
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000772 return 0;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000773 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000774 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000775}
776
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777PyObject *
778PyDict_Keys(mp)
779 PyObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000780{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 if (mp == NULL || !PyDict_Check(mp)) {
782 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000783 return NULL;
784 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000785 return dict_keys((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000786}
787
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788PyObject *
789PyDict_Values(mp)
790 PyObject *mp;
Guido van Rossum25831651993-05-19 14:50:45 +0000791{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792 if (mp == NULL || !PyDict_Check(mp)) {
793 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000794 return NULL;
795 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000796 return dict_values((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000797}
798
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000799PyObject *
800PyDict_Items(mp)
801 PyObject *mp;
Guido van Rossum25831651993-05-19 14:50:45 +0000802{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803 if (mp == NULL || !PyDict_Check(mp)) {
804 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000805 return NULL;
806 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000807 return dict_items((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000808}
809
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000810#define NEWCMP
811
812#ifdef NEWCMP
813
814/* Subroutine which returns the smallest key in a for which b's value
815 is different or absent. The value is returned too, through the
816 pval argument. No reference counts are incremented. */
817
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818static PyObject *
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000819characterize(a, b, pval)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000820 dictobject *a;
821 dictobject *b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000822 PyObject **pval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000823{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824 PyObject *diff = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000825 int i;
826
827 *pval = NULL;
828 for (i = 0; i < a->ma_size; i++) {
829 if (a->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830 PyObject *key = a->ma_table[i].me_key;
831 PyObject *aval, *bval;
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000832 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 if (diff != NULL && PyObject_Compare(key, diff) > 0)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000834 continue;
835 aval = a->ma_table[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000836 bval = PyDict_GetItem((PyObject *)b, key);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000837 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000838 if (bval == NULL || PyObject_Compare(aval, bval) != 0)
839 {
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000840 diff = key;
841 *pval = aval;
842 }
843 }
844 }
845 return diff;
846}
847
848static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000849dict_compare(a, b)
850 dictobject *a, *b;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000851{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000853 int res;
854
855 /* Compare lengths first */
856 if (a->ma_used < b->ma_used)
857 return -1; /* a is shorter */
858 else if (a->ma_used > b->ma_used)
859 return 1; /* b is shorter */
860 /* Same length -- check all keys */
861 adiff = characterize(a, b, &aval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000862 if (PyErr_Occurred())
863 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000864 if (adiff == NULL)
865 return 0; /* a is a subset with the same length */
866 bdiff = characterize(b, a, &bval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000867 if (PyErr_Occurred())
868 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000869 /* bdiff == NULL would be impossible now */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870 res = PyObject_Compare(adiff, bdiff);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000871 if (res == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 res = PyObject_Compare(aval, bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000873 return res;
874}
875
876#else /* !NEWCMP */
877
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000878static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000879dict_compare(a, b)
880 dictobject *a, *b;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000881{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 PyObject *akeys, *bkeys;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000883 int i, n, res;
884 if (a == b)
885 return 0;
886 if (a->ma_used == 0) {
887 if (b->ma_used != 0)
888 return -1;
889 else
890 return 0;
891 }
892 else {
893 if (b->ma_used == 0)
894 return 1;
895 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000896 akeys = dict_keys(a, (PyObject *)NULL);
897 bkeys = dict_keys(b, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000898 if (akeys == NULL || bkeys == NULL) {
899 /* Oops, out of memory -- what to do? */
900 /* For now, sort on address! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000901 Py_XDECREF(akeys);
902 Py_XDECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000903 if (a < b)
904 return -1;
905 else
906 return 1;
907 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000908 PyList_Sort(akeys);
909 PyList_Sort(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000910 n = a->ma_used < b->ma_used ? a->ma_used : b->ma_used; /* smallest */
911 res = 0;
912 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000913 PyObject *akey, *bkey, *aval, *bval;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000914 long ahash, bhash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 akey = PyList_GetItem(akeys, i);
916 bkey = PyList_GetItem(bkeys, i);
917 res = PyObject_Compare(akey, bkey);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000918 if (res != 0)
919 break;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000920#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000921 if (!PyString_Check(akey) ||
922 (ahash = ((PyStringObject *) akey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000923#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000924 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 ahash = PyObject_Hash(akey);
Guido van Rossumca756f21997-01-23 19:39:29 +0000926 if (ahash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +0000928 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000929#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 if (!PyString_Check(bkey) ||
931 (bhash = ((PyStringObject *) bkey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000932#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000933 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000934 bhash = PyObject_Hash(bkey);
Guido van Rossumca756f21997-01-23 19:39:29 +0000935 if (bhash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +0000937 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000938 aval = lookdict(a, akey, ahash) -> me_value;
939 bval = lookdict(b, bkey, bhash) -> me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 res = PyObject_Compare(aval, bval);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000941 if (res != 0)
942 break;
943 }
944 if (res == 0) {
945 if (a->ma_used < b->ma_used)
946 res = -1;
947 else if (a->ma_used > b->ma_used)
948 res = 1;
949 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950 Py_DECREF(akeys);
951 Py_DECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000952 return res;
953}
954
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000955#endif /* !NEWCMP */
956
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000958dict_has_key(mp, args)
959 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000960 PyObject *args;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000961{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000963 long hash;
964 register long ok;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 if (!PyArg_Parse(args, "O", &key))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000966 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000967#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968 if (!PyString_Check(key) ||
969 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000970#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000971 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000973 if (hash == -1)
974 return NULL;
975 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000976 ok = mp->ma_size != 0 && lookdict(mp, key, hash)->me_value != NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 return PyInt_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000978}
979
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980static PyObject *
Barry Warsawc38c5da1997-10-06 17:49:20 +0000981dict_get(mp, args)
982 register dictobject *mp;
983 PyObject *args;
984{
985 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +0000986 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +0000987 PyObject *val = NULL;
988 long hash;
989
Barry Warsawc38c5da1997-10-06 17:49:20 +0000990 if (!PyArg_ParseTuple(args, "O|O", &key, &failobj))
991 return NULL;
Guido van Rossum6fcfa721997-10-20 20:10:00 +0000992 if (mp->ma_table == NULL)
993 goto finally;
Barry Warsawc38c5da1997-10-06 17:49:20 +0000994
Barry Warsawc38c5da1997-10-06 17:49:20 +0000995#ifdef CACHE_HASH
996 if (!PyString_Check(key) ||
997 (hash = ((PyStringObject *) key)->ob_shash) == -1)
998#endif
999 {
1000 hash = PyObject_Hash(key);
1001 if (hash == -1)
1002 return NULL;
1003 }
1004 val = lookdict(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001005
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001006 finally:
Barry Warsawc38c5da1997-10-06 17:49:20 +00001007 if (val == NULL)
1008 val = failobj;
1009 Py_INCREF(val);
1010 return val;
1011}
1012
1013
1014static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001015dict_clear(mp, args)
1016 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 PyObject *args;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001018{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001019 if (!PyArg_NoArgs(args))
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001020 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 PyDict_Clear((PyObject *)mp);
1022 Py_INCREF(Py_None);
1023 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001024}
1025
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026static PyMethodDef mapp_methods[] = {
Guido van Rossum5d8123f1997-07-13 03:58:01 +00001027 {"has_key", (PyCFunction)dict_has_key},
1028 {"keys", (PyCFunction)dict_keys},
1029 {"items", (PyCFunction)dict_items},
1030 {"values", (PyCFunction)dict_values},
Guido van Rossuma8d51311997-06-02 17:13:37 +00001031 {"update", (PyCFunction)dict_update},
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001032 {"clear", (PyCFunction)dict_clear},
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001033 {"copy", (PyCFunction)dict_copy},
Barry Warsawc38c5da1997-10-06 17:49:20 +00001034 {"get", (PyCFunction)dict_get, 1},
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001035 {NULL, NULL} /* sentinel */
1036};
1037
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001039dict_getattr(mp, name)
1040 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001041 char *name;
1042{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001043 return Py_FindMethod(mapp_methods, (PyObject *)mp, name);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001044}
1045
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046PyTypeObject PyDict_Type = {
1047 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001048 0,
Guido van Rossum9bfef441993-03-29 10:43:31 +00001049 "dictionary",
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001050 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001051 0,
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001052 (destructor)dict_dealloc, /*tp_dealloc*/
1053 (printfunc)dict_print, /*tp_print*/
1054 (getattrfunc)dict_getattr, /*tp_getattr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001055 0, /*tp_setattr*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001056 (cmpfunc)dict_compare, /*tp_compare*/
1057 (reprfunc)dict_repr, /*tp_repr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001058 0, /*tp_as_number*/
1059 0, /*tp_as_sequence*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001060 &dict_as_mapping, /*tp_as_mapping*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001061};
1062
Guido van Rossum3cca2451997-05-16 14:23:33 +00001063/* For backward compatibility with old dictionary interface */
1064
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065PyObject *
1066PyDict_GetItemString(v, key)
1067 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001068 char *key;
1069{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001070 PyObject *kv, *rv;
1071 kv = PyString_FromString(key);
1072 if (kv == NULL)
1073 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001074 rv = PyDict_GetItem(v, kv);
1075 Py_DECREF(kv);
1076 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001077}
1078
1079int
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080PyDict_SetItemString(v, key, item)
1081 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001082 char *key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001083 PyObject *item;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001084{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001085 PyObject *kv;
1086 int err;
1087 kv = PyString_FromString(key);
1088 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001089 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001090 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001091 err = PyDict_SetItem(v, kv, item);
1092 Py_DECREF(kv);
1093 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001094}
1095
1096int
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001097PyDict_DelItemString(v, key)
1098 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001099 char *key;
1100{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001101 PyObject *kv;
1102 int err;
1103 kv = PyString_FromString(key);
1104 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001105 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001106 err = PyDict_DelItem(v, kv);
1107 Py_DECREF(kv);
1108 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001109}