blob: be602b51ffa9756af72d08599cb3b288ab1d9d5c [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 Rossumfd7a0b81997-08-18 21:52:47 +0000194 else if (incr > mask) /* Cycle through GF(2^n)-{0} */
Guido van Rossum16e93a81997-01-28 00:00:11 +0000195 incr ^= mp->ma_poly; /* This will implicitly clear the
196 highest bit */
197 for (;;) {
Guido van Rossumefb46091997-01-29 15:53:56 +0000198 ep = &ep0[(i+incr)&mask];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000199 if (ep->me_key == NULL) {
200 if (freeslot != NULL)
201 return freeslot;
202 else
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000203 return ep;
204 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000205 if (ep->me_key == dummy) {
206 if (freeslot == NULL)
207 freeslot = ep;
208 }
209 else if (ep->me_key == key ||
210 (ep->me_hash == hash &&
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000211 PyObject_Compare(ep->me_key, key) == 0)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000212 return ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000213 }
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000214 /* XXX What if PyObject_Compare returned an exception? */
Guido van Rossum16e93a81997-01-28 00:00:11 +0000215 /* Cycle through GF(2^n)-{0} */
216 incr = incr << 1;
217 if (incr > mask)
218 incr ^= mp->ma_poly;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000219 }
220}
221
222/*
223Internal routine to insert a new item into the table.
224Used both by the internal resize routine and by the public insert routine.
225Eats a reference to key and one to value.
226*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000227static void insertdict
228 Py_PROTO((dictobject *, PyObject *, long, PyObject *));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000229static void
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000230insertdict(mp, key, hash, value)
231 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000233 long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 PyObject *value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000235{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000237 register dictentry *ep;
238 ep = lookdict(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000239 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000240 old_value = ep->me_value;
241 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000242 Py_DECREF(old_value); /* which **CAN** re-enter */
243 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000244 }
245 else {
246 if (ep->me_key == NULL)
247 mp->ma_fill++;
248 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000249 Py_DECREF(ep->me_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000250 ep->me_key = key;
251 ep->me_hash = hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000252 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000253 mp->ma_used++;
254 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000255}
256
257/*
258Restructure the table by allocating a new table and reinserting all
259items again. When entries have been deleted, the new table may
260actually be smaller than the old one.
261*/
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000262static int dictresize Py_PROTO((dictobject *, int));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000263static int
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000264dictresize(mp, minused)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000265 dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000266 int minused;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000267{
268 register int oldsize = mp->ma_size;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000269 register int newsize, newpoly;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000270 register dictentry *oldtable = mp->ma_table;
271 register dictentry *newtable;
272 register dictentry *ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000273 register int i;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000274 for (i = 0, newsize = MINSIZE; ; i++, newsize <<= 1) {
275 if (i > sizeof(polys)/sizeof(polys[0])) {
276 /* Ran out of polynomials */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000277 PyErr_NoMemory();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000278 return -1;
279 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000280 if (newsize > minused) {
Guido van Rossum16e93a81997-01-28 00:00:11 +0000281 newpoly = polys[i];
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000282 break;
283 }
284 }
Guido van Rossum0fd00331998-07-16 15:06:13 +0000285 newtable = (dictentry *) malloc(sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000286 if (newtable == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000287 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000288 return -1;
289 }
Guido van Rossum0fd00331998-07-16 15:06:13 +0000290 memset(newtable, '\0', sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000291 mp->ma_size = newsize;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000292 mp->ma_poly = newpoly;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000293 mp->ma_table = newtable;
294 mp->ma_fill = 0;
295 mp->ma_used = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000296
297 /* Make two passes, so we can avoid decrefs
298 (and possible side effects) till the table is copied */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000299 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
300 if (ep->me_value != NULL)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000301 insertdict(mp,ep->me_key,ep->me_hash,ep->me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000302 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000303 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000304 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305 Py_XDECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000306 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000307 }
308
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 PyMem_XDEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000310 return 0;
311}
312
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000313PyObject *
314PyDict_GetItem(op, key)
315 PyObject *op;
316 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000317{
318 long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 if (!PyDict_Check(op)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000320 return NULL;
321 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000322 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumd7047b31995-01-02 19:07:15 +0000323 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000324#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 if (!PyString_Check(key) ||
326 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000327#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000328 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000329 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000330 if (hash == -1) {
331 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000332 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000333 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000334 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000335 return lookdict((dictobject *)op, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000336}
337
338int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339PyDict_SetItem(op, key, value)
340 register PyObject *op;
341 PyObject *key;
342 PyObject *value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000343{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000344 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000345 register long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346 if (!PyDict_Check(op)) {
347 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000348 return -1;
349 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000350 mp = (dictobject *)op;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000351#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 if (PyString_Check(key)) {
Guido van Rossum2a61e741997-01-18 07:55:05 +0000353#ifdef INTERN_STRINGS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 if (((PyStringObject *)key)->ob_sinterned != NULL) {
355 key = ((PyStringObject *)key)->ob_sinterned;
356 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000357 }
358 else
359#endif
360 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000362 if (hash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000364 }
365 }
366 else
367#endif
368 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000370 if (hash == -1)
371 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000372 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000373 /* if fill >= 2/3 size, double in size */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000374 if (mp->ma_fill*3 >= mp->ma_size*2) {
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000375 if (dictresize(mp, mp->ma_used*2) != 0) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000376 if (mp->ma_fill+1 > mp->ma_size)
377 return -1;
378 }
379 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 Py_INCREF(value);
381 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000382 insertdict(mp, key, hash, value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000383 return 0;
384}
385
386int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387PyDict_DelItem(op, key)
388 PyObject *op;
389 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000390{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000391 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000392 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000393 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000394 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000395
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 if (!PyDict_Check(op)) {
397 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000398 return -1;
399 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000400#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 if (!PyString_Check(key) ||
402 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000403#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000404 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000405 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000406 if (hash == -1)
407 return -1;
408 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000409 mp = (dictobject *)op;
410 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumefc87131995-01-02 19:42:39 +0000411 goto empty;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000412 ep = lookdict(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000413 if (ep->me_value == NULL) {
Guido van Rossumefc87131995-01-02 19:42:39 +0000414 empty:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000416 return -1;
417 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000418 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000420 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000421 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000422 ep->me_value = NULL;
423 mp->ma_used--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 Py_DECREF(old_value);
425 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000426 return 0;
427}
428
Guido van Rossum25831651993-05-19 14:50:45 +0000429void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430PyDict_Clear(op)
431 PyObject *op;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000432{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000433 int i, n;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000434 register dictentry *table;
435 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000437 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000438 mp = (dictobject *)op;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000439 table = mp->ma_table;
440 if (table == NULL)
441 return;
442 n = mp->ma_size;
443 mp->ma_size = mp->ma_used = mp->ma_fill = 0;
444 mp->ma_table = NULL;
445 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 Py_XDECREF(table[i].me_key);
447 Py_XDECREF(table[i].me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000448 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000450}
451
Guido van Rossum25831651993-05-19 14:50:45 +0000452int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453PyDict_Next(op, ppos, pkey, pvalue)
454 PyObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000455 int *ppos;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456 PyObject **pkey;
457 PyObject **pvalue;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000458{
Guido van Rossum25831651993-05-19 14:50:45 +0000459 int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000460 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000462 return 0;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000463 mp = (dictobject *)op;
Guido van Rossum25831651993-05-19 14:50:45 +0000464 i = *ppos;
465 if (i < 0)
466 return 0;
467 while (i < mp->ma_size && mp->ma_table[i].me_value == NULL)
468 i++;
469 *ppos = i+1;
470 if (i >= mp->ma_size)
471 return 0;
472 if (pkey)
473 *pkey = mp->ma_table[i].me_key;
474 if (pvalue)
475 *pvalue = mp->ma_table[i].me_value;
476 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000477}
478
479/* Methods */
480
481static void
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000482dict_dealloc(mp)
483 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000484{
485 register int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000486 register dictentry *ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000487 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000488 if (ep->me_key != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000490 }
491 if (ep->me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 Py_DECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000493 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000494 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495 PyMem_XDEL(mp->ma_table);
496 PyMem_DEL(mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000497}
498
499static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000500dict_print(mp, fp, flags)
501 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000502 register FILE *fp;
503 register int flags;
504{
505 register int i;
506 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000507 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000508
509 i = Py_ReprEnter((PyObject*)mp);
510 if (i != 0) {
511 if (i < 0)
512 return i;
513 fprintf(fp, "{...}");
514 return 0;
515 }
516
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000517 fprintf(fp, "{");
518 any = 0;
519 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
520 if (ep->me_value != NULL) {
521 if (any++ > 0)
522 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000523 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
524 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000525 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000526 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000527 fprintf(fp, ": ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000528 if (PyObject_Print(ep->me_value, fp, 0) != 0) {
529 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000530 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000531 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000532 }
533 }
534 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000535 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000536 return 0;
537}
538
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000540dict_repr(mp)
541 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000542{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 auto PyObject *v;
544 PyObject *sepa, *colon;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000545 register int i;
546 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000547 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000548
549 i = Py_ReprEnter((PyObject*)mp);
550 if (i != 0) {
551 if (i > 0)
552 return PyString_FromString("{...}");
553 return NULL;
554 }
555
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 v = PyString_FromString("{");
557 sepa = PyString_FromString(", ");
558 colon = PyString_FromString(": ");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000559 any = 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000560 for (i = 0, ep = mp->ma_table; i < mp->ma_size && v; i++, ep++) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000561 if (ep->me_value != NULL) {
562 if (any++)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 PyString_Concat(&v, sepa);
564 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_key));
565 PyString_Concat(&v, colon);
566 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_value));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000567 }
568 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 PyString_ConcatAndDel(&v, PyString_FromString("}"));
Guido van Rossum255443b1998-04-10 22:47:14 +0000570 Py_ReprLeave((PyObject*)mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571 Py_XDECREF(sepa);
572 Py_XDECREF(colon);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000573 return v;
574}
575
576static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000577dict_length(mp)
578 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000579{
580 return mp->ma_used;
581}
582
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000583static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000584dict_subscript(mp, key)
585 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586 register PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000587{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000589 long hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000590 if (mp->ma_table == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000592 return NULL;
593 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000594#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 if (!PyString_Check(key) ||
596 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000597#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000598 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000600 if (hash == -1)
601 return NULL;
602 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000603 v = lookdict(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000604 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000606 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000608 return v;
609}
610
611static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000612dict_ass_sub(mp, v, w)
613 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000614 PyObject *v, *w;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000615{
616 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000618 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000620}
621
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000622static PyMappingMethods dict_as_mapping = {
623 (inquiry)dict_length, /*mp_length*/
624 (binaryfunc)dict_subscript, /*mp_subscript*/
625 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000626};
627
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000629dict_keys(mp, args)
630 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000631 PyObject *args;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000632{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633 register PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000634 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 if (!PyArg_NoArgs(args))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000636 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 v = PyList_New(mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000638 if (v == NULL)
639 return NULL;
640 for (i = 0, j = 0; i < mp->ma_size; i++) {
641 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642 PyObject *key = mp->ma_table[i].me_key;
643 Py_INCREF(key);
644 PyList_SetItem(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000645 j++;
646 }
647 }
648 return v;
649}
650
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000652dict_values(mp, args)
653 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 PyObject *args;
Guido van Rossum25831651993-05-19 14:50:45 +0000655{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000657 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000659 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000661 if (v == NULL)
662 return NULL;
663 for (i = 0, j = 0; i < mp->ma_size; i++) {
664 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 PyObject *value = mp->ma_table[i].me_value;
666 Py_INCREF(value);
667 PyList_SetItem(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000668 j++;
669 }
670 }
671 return v;
672}
673
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000675dict_items(mp, args)
676 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 PyObject *args;
Guido van Rossum25831651993-05-19 14:50:45 +0000678{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000679 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000680 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000682 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000684 if (v == NULL)
685 return NULL;
686 for (i = 0, j = 0; i < mp->ma_size; i++) {
687 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688 PyObject *key = mp->ma_table[i].me_key;
689 PyObject *value = mp->ma_table[i].me_value;
690 PyObject *item = PyTuple_New(2);
Guido van Rossum25831651993-05-19 14:50:45 +0000691 if (item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +0000693 return NULL;
694 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695 Py_INCREF(key);
696 PyTuple_SetItem(item, 0, key);
697 Py_INCREF(value);
698 PyTuple_SetItem(item, 1, value);
699 PyList_SetItem(v, j, item);
Guido van Rossum25831651993-05-19 14:50:45 +0000700 j++;
701 }
702 }
703 return v;
704}
705
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000706static PyObject *
Guido van Rossuma8d51311997-06-02 17:13:37 +0000707dict_update(mp, args)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000708 register dictobject *mp;
709 PyObject *args;
710{
711 register int i;
712 dictobject *other;
713 dictentry *entry;
714 if (!PyArg_Parse(args, "O!", &PyDict_Type, &other))
715 return NULL;
716 if (other == mp)
Guido van Rossuma8d51311997-06-02 17:13:37 +0000717 goto done; /* a.update(a); nothing to do */
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000718 /* Do one big resize at the start, rather than incrementally
719 resizing as we insert new items. Expect that there will be
720 no (or few) overlapping keys. */
721 if ((mp->ma_fill + other->ma_used)*3 >= mp->ma_size*2) {
722 if (dictresize(mp, (mp->ma_used + other->ma_used)*3/2) != 0)
723 return NULL;
724 }
725 for (i = 0; i < other->ma_size; i++) {
726 entry = &other->ma_table[i];
727 if (entry->me_value != NULL) {
728 Py_INCREF(entry->me_key);
729 Py_INCREF(entry->me_value);
730 insertdict(mp, entry->me_key, entry->me_hash,
731 entry->me_value);
732 }
733 }
734 done:
735 Py_INCREF(Py_None);
736 return Py_None;
737}
738
739static PyObject *
740dict_copy(mp, args)
741 register dictobject *mp;
742 PyObject *args;
743{
744 register int i;
745 dictobject *copy;
746 dictentry *entry;
747 if (!PyArg_Parse(args, ""))
748 return NULL;
749 copy = (dictobject *)PyDict_New();
750 if (copy == NULL)
751 return NULL;
752 if (mp->ma_used > 0) {
753 if (dictresize(copy, mp->ma_used*3/2) != 0)
754 return NULL;
755 for (i = 0; i < mp->ma_size; i++) {
756 entry = &mp->ma_table[i];
757 if (entry->me_value != NULL) {
758 Py_INCREF(entry->me_key);
759 Py_INCREF(entry->me_value);
760 insertdict(copy, entry->me_key, entry->me_hash,
761 entry->me_value);
762 }
763 }
764 }
765 return (PyObject *)copy;
766}
767
Guido van Rossum4199fac1993-11-05 10:18:44 +0000768int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769PyDict_Size(mp)
770 PyObject *mp;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000771{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000772 if (mp == NULL || !PyDict_Check(mp)) {
773 PyErr_BadInternalCall();
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000774 return 0;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000775 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000776 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000777}
778
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779PyObject *
780PyDict_Keys(mp)
781 PyObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000782{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000783 if (mp == NULL || !PyDict_Check(mp)) {
784 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000785 return NULL;
786 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000787 return dict_keys((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000788}
789
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000790PyObject *
791PyDict_Values(mp)
792 PyObject *mp;
Guido van Rossum25831651993-05-19 14:50:45 +0000793{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794 if (mp == NULL || !PyDict_Check(mp)) {
795 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000796 return NULL;
797 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000798 return dict_values((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000799}
800
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801PyObject *
802PyDict_Items(mp)
803 PyObject *mp;
Guido van Rossum25831651993-05-19 14:50:45 +0000804{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805 if (mp == NULL || !PyDict_Check(mp)) {
806 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000807 return NULL;
808 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000809 return dict_items((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000810}
811
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000812#define NEWCMP
813
814#ifdef NEWCMP
815
816/* Subroutine which returns the smallest key in a for which b's value
817 is different or absent. The value is returned too, through the
818 pval argument. No reference counts are incremented. */
819
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000820static PyObject *
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000821characterize(a, b, pval)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000822 dictobject *a;
823 dictobject *b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824 PyObject **pval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000825{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826 PyObject *diff = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000827 int i;
828
829 *pval = NULL;
830 for (i = 0; i < a->ma_size; i++) {
831 if (a->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000832 PyObject *key = a->ma_table[i].me_key;
833 PyObject *aval, *bval;
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000834 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835 if (diff != NULL && PyObject_Compare(key, diff) > 0)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000836 continue;
837 aval = a->ma_table[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000838 bval = PyDict_GetItem((PyObject *)b, key);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000839 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840 if (bval == NULL || PyObject_Compare(aval, bval) != 0)
841 {
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000842 diff = key;
843 *pval = aval;
844 }
845 }
846 }
847 return diff;
848}
849
850static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000851dict_compare(a, b)
852 dictobject *a, *b;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000853{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000855 int res;
856
857 /* Compare lengths first */
858 if (a->ma_used < b->ma_used)
859 return -1; /* a is shorter */
860 else if (a->ma_used > b->ma_used)
861 return 1; /* b is shorter */
862 /* Same length -- check all keys */
863 adiff = characterize(a, b, &aval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000864 if (PyErr_Occurred())
865 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000866 if (adiff == NULL)
867 return 0; /* a is a subset with the same length */
868 bdiff = characterize(b, a, &bval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000869 if (PyErr_Occurred())
870 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000871 /* bdiff == NULL would be impossible now */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 res = PyObject_Compare(adiff, bdiff);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000873 if (res == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874 res = PyObject_Compare(aval, bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000875 return res;
876}
877
878#else /* !NEWCMP */
879
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000880static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000881dict_compare(a, b)
882 dictobject *a, *b;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000883{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 PyObject *akeys, *bkeys;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000885 int i, n, res;
886 if (a == b)
887 return 0;
888 if (a->ma_used == 0) {
889 if (b->ma_used != 0)
890 return -1;
891 else
892 return 0;
893 }
894 else {
895 if (b->ma_used == 0)
896 return 1;
897 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000898 akeys = dict_keys(a, (PyObject *)NULL);
899 bkeys = dict_keys(b, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000900 if (akeys == NULL || bkeys == NULL) {
901 /* Oops, out of memory -- what to do? */
902 /* For now, sort on address! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000903 Py_XDECREF(akeys);
904 Py_XDECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000905 if (a < b)
906 return -1;
907 else
908 return 1;
909 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000910 PyList_Sort(akeys);
911 PyList_Sort(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000912 n = a->ma_used < b->ma_used ? a->ma_used : b->ma_used; /* smallest */
913 res = 0;
914 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 PyObject *akey, *bkey, *aval, *bval;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000916 long ahash, bhash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000917 akey = PyList_GetItem(akeys, i);
918 bkey = PyList_GetItem(bkeys, i);
919 res = PyObject_Compare(akey, bkey);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000920 if (res != 0)
921 break;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000922#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923 if (!PyString_Check(akey) ||
924 (ahash = ((PyStringObject *) akey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000925#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000926 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927 ahash = PyObject_Hash(akey);
Guido van Rossumca756f21997-01-23 19:39:29 +0000928 if (ahash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +0000930 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000931#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 if (!PyString_Check(bkey) ||
933 (bhash = ((PyStringObject *) bkey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000934#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000935 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 bhash = PyObject_Hash(bkey);
Guido van Rossumca756f21997-01-23 19:39:29 +0000937 if (bhash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +0000939 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000940 aval = lookdict(a, akey, ahash) -> me_value;
941 bval = lookdict(b, bkey, bhash) -> me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942 res = PyObject_Compare(aval, bval);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000943 if (res != 0)
944 break;
945 }
946 if (res == 0) {
947 if (a->ma_used < b->ma_used)
948 res = -1;
949 else if (a->ma_used > b->ma_used)
950 res = 1;
951 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952 Py_DECREF(akeys);
953 Py_DECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000954 return res;
955}
956
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000957#endif /* !NEWCMP */
958
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000960dict_has_key(mp, args)
961 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962 PyObject *args;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000963{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000965 long hash;
966 register long ok;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 if (!PyArg_Parse(args, "O", &key))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000968 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000969#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 if (!PyString_Check(key) ||
971 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000972#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000973 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000975 if (hash == -1)
976 return NULL;
977 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000978 ok = mp->ma_size != 0 && lookdict(mp, key, hash)->me_value != NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 return PyInt_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000980}
981
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982static PyObject *
Barry Warsawc38c5da1997-10-06 17:49:20 +0000983dict_get(mp, args)
984 register dictobject *mp;
985 PyObject *args;
986{
987 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +0000988 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +0000989 PyObject *val = NULL;
990 long hash;
991
Barry Warsawc38c5da1997-10-06 17:49:20 +0000992 if (!PyArg_ParseTuple(args, "O|O", &key, &failobj))
993 return NULL;
Guido van Rossum6fcfa721997-10-20 20:10:00 +0000994 if (mp->ma_table == NULL)
995 goto finally;
Barry Warsawc38c5da1997-10-06 17:49:20 +0000996
Barry Warsawc38c5da1997-10-06 17:49:20 +0000997#ifdef CACHE_HASH
998 if (!PyString_Check(key) ||
999 (hash = ((PyStringObject *) key)->ob_shash) == -1)
1000#endif
1001 {
1002 hash = PyObject_Hash(key);
1003 if (hash == -1)
1004 return NULL;
1005 }
1006 val = lookdict(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001007
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001008 finally:
Barry Warsawc38c5da1997-10-06 17:49:20 +00001009 if (val == NULL)
1010 val = failobj;
1011 Py_INCREF(val);
1012 return val;
1013}
1014
1015
1016static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001017dict_clear(mp, args)
1018 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001019 PyObject *args;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001020{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 if (!PyArg_NoArgs(args))
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001022 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 PyDict_Clear((PyObject *)mp);
1024 Py_INCREF(Py_None);
1025 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001026}
1027
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028static PyMethodDef mapp_methods[] = {
Guido van Rossum5d8123f1997-07-13 03:58:01 +00001029 {"has_key", (PyCFunction)dict_has_key},
1030 {"keys", (PyCFunction)dict_keys},
1031 {"items", (PyCFunction)dict_items},
1032 {"values", (PyCFunction)dict_values},
Guido van Rossuma8d51311997-06-02 17:13:37 +00001033 {"update", (PyCFunction)dict_update},
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001034 {"clear", (PyCFunction)dict_clear},
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001035 {"copy", (PyCFunction)dict_copy},
Barry Warsawc38c5da1997-10-06 17:49:20 +00001036 {"get", (PyCFunction)dict_get, 1},
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001037 {NULL, NULL} /* sentinel */
1038};
1039
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001040static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001041dict_getattr(mp, name)
1042 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001043 char *name;
1044{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 return Py_FindMethod(mapp_methods, (PyObject *)mp, name);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001046}
1047
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048PyTypeObject PyDict_Type = {
1049 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001050 0,
Guido van Rossum9bfef441993-03-29 10:43:31 +00001051 "dictionary",
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001052 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001053 0,
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001054 (destructor)dict_dealloc, /*tp_dealloc*/
1055 (printfunc)dict_print, /*tp_print*/
1056 (getattrfunc)dict_getattr, /*tp_getattr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001057 0, /*tp_setattr*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001058 (cmpfunc)dict_compare, /*tp_compare*/
1059 (reprfunc)dict_repr, /*tp_repr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001060 0, /*tp_as_number*/
1061 0, /*tp_as_sequence*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001062 &dict_as_mapping, /*tp_as_mapping*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001063};
1064
Guido van Rossum3cca2451997-05-16 14:23:33 +00001065/* For backward compatibility with old dictionary interface */
1066
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067PyObject *
1068PyDict_GetItemString(v, key)
1069 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001070 char *key;
1071{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001072 PyObject *kv, *rv;
1073 kv = PyString_FromString(key);
1074 if (kv == NULL)
1075 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001076 rv = PyDict_GetItem(v, kv);
1077 Py_DECREF(kv);
1078 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001079}
1080
1081int
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001082PyDict_SetItemString(v, key, item)
1083 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001084 char *key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085 PyObject *item;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001086{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001087 PyObject *kv;
1088 int err;
1089 kv = PyString_FromString(key);
1090 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001091 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001092 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001093 err = PyDict_SetItem(v, kv, item);
1094 Py_DECREF(kv);
1095 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001096}
1097
1098int
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099PyDict_DelItemString(v, key)
1100 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001101 char *key;
1102{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001103 PyObject *kv;
1104 int err;
1105 kv = PyString_FromString(key);
1106 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001107 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001108 err = PyDict_DelItem(v, kv);
1109 Py_DECREF(kv);
1110 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001111}