blob: 6e7fa3d0ef6172bee4a68d68f5204b65d3064ff4 [file] [log] [blame]
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum4b1302b1993-03-27 18:11:32 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum4b1302b1993-03-27 18:11:32 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum4b1302b1993-03-27 18:11:32 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum4b1302b1993-03-27 18:11:32 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum4b1302b1993-03-27 18:11:32 +000029
30******************************************************************/
31
Guido van Rossum2bc13791999-03-24 19:06:42 +000032/* Dictionary object implementation using a hash table */
Guido van Rossum9bfef441993-03-29 10:43:31 +000033
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum4b1302b1993-03-27 18:11:32 +000035
36
37/*
Guido van Rossuma9e7a811997-05-13 21:02:11 +000038 * MINSIZE is the minimum size of a dictionary.
Guido van Rossum16e93a81997-01-28 00:00:11 +000039 */
40
41#define MINSIZE 4
42
43/*
44Table of irreducible polynomials to efficiently cycle through
45GF(2^n)-{0}, 2<=n<=30.
Guido van Rossum4b1302b1993-03-27 18:11:32 +000046*/
Guido van Rossum16e93a81997-01-28 00:00:11 +000047static long polys[] = {
Guido van Rossum9e5656c1997-01-29 04:45:16 +000048 4 + 3,
49 8 + 3,
50 16 + 3,
51 32 + 5,
52 64 + 3,
53 128 + 3,
54 256 + 29,
55 512 + 17,
56 1024 + 9,
57 2048 + 5,
58 4096 + 83,
59 8192 + 27,
60 16384 + 43,
61 32768 + 3,
62 65536 + 45,
63 131072 + 9,
64 262144 + 39,
65 524288 + 39,
66 1048576 + 9,
67 2097152 + 5,
68 4194304 + 3,
69 8388608 + 33,
70 16777216 + 27,
71 33554432 + 9,
72 67108864 + 71,
73 134217728 + 39,
74 268435456 + 9,
75 536870912 + 5,
76 1073741824 + 83,
77 0
Guido van Rossum4b1302b1993-03-27 18:11:32 +000078};
79
80/* Object used as dummy key to fill deleted entries */
Guido van Rossuma9e7a811997-05-13 21:02:11 +000081static PyObject *dummy; /* Initialized by first call to newdictobject() */
Guido van Rossum4b1302b1993-03-27 18:11:32 +000082
83/*
Guido van Rossum2bc13791999-03-24 19:06:42 +000084Invariant for entries: when in use, me_value is not NULL and me_key is
85not NULL and not dummy; when not in use, me_value is NULL and me_key
Guido van Rossum4b1302b1993-03-27 18:11:32 +000086is either NULL or dummy. A dummy key value cannot be replaced by
87NULL, since otherwise other keys may be lost.
88*/
89typedef struct {
90 long me_hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 PyObject *me_key;
92 PyObject *me_value;
Guido van Rossum36488841997-04-11 19:14:07 +000093#ifdef USE_CACHE_ALIGNED
94 long aligner;
95#endif
Guido van Rossuma9e7a811997-05-13 21:02:11 +000096} dictentry;
Guido van Rossum4b1302b1993-03-27 18:11:32 +000097
98/*
99To ensure the lookup algorithm terminates, the table size must be a
100prime number and there must be at least one NULL key in the table.
101The value ma_fill is the number of non-NULL keys; ma_used is the number
102of non-NULL, non-dummy keys.
103To avoid slowing down lookups on a near-full table, we resize the table
104when it is more than half filled.
105*/
106typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107 PyObject_HEAD
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000108 int ma_fill;
109 int ma_used;
110 int ma_size;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000111 int ma_poly;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000112 dictentry *ma_table;
113} dictobject;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000114
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
116PyDict_New()
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000117{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000118 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000119 if (dummy == NULL) { /* Auto-initialize dummy */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 dummy = PyString_FromString("<dummy key>");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000121 if (dummy == NULL)
122 return NULL;
123 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000124 mp = PyObject_NEW(dictobject, &PyDict_Type);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000125 if (mp == NULL)
126 return NULL;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000127 mp->ma_size = 0;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000128 mp->ma_poly = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000129 mp->ma_table = NULL;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000130 mp->ma_fill = 0;
131 mp->ma_used = 0;
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
Guido van Rossum2bc13791999-03-24 19:06:42 +0000144The initial probe index is computed as hash mod the table size.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000145Subsequent probe indices use the values of x^i in GF(2^n) as an offset,
Guido van Rossum2bc13791999-03-24 19:06:42 +0000146where x is a root. The initial value is derived from hash, too.
147
148All arithmetic on hash should ignore overflow.
Guido van Rossum16e93a81997-01-28 00:00:11 +0000149
150(This version is due to Reimer Behrends, some ideas are also due to
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000151Jyrki Alakuijala and Vladimir Marangozov.)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000152*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000153static dictentry *lookdict Py_PROTO((dictobject *, PyObject *, long));
154static dictentry *
155lookdict(mp, key, hash)
156 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 PyObject *key;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000158 register long hash;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000159{
Guido van Rossum16e93a81997-01-28 00:00:11 +0000160 register int i;
161 register unsigned incr;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000162 register dictentry *freeslot;
Guido van Rossum2095d241997-04-09 19:41:24 +0000163 register unsigned int mask = mp->ma_size-1;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000164 dictentry *ep0 = mp->ma_table;
165 register dictentry *ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000166 /* We must come up with (i, incr) such that 0 <= i < ma_size
167 and 0 < incr < ma_size and both are a function of hash */
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000168 i = (~hash) & mask;
169 /* We use ~hash instead of hash, as degenerate hash functions, such
Guido van Rossum16e93a81997-01-28 00:00:11 +0000170 as for ints <sigh>, can have lots of leading zeros. It's not
171 really a performance risk, but better safe than sorry. */
Guido van Rossumefb46091997-01-29 15:53:56 +0000172 ep = &ep0[i];
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000173 if (ep->me_key == NULL || ep->me_key == key)
Guido van Rossum7d181591997-01-16 21:06:45 +0000174 return ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000175 if (ep->me_key == dummy)
Guido van Rossum7d181591997-01-16 21:06:45 +0000176 freeslot = ep;
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000177 else {
Guido van Rossumc1c7b1a1998-10-06 16:01:14 +0000178 if (ep->me_hash == hash &&
179 PyObject_Compare(ep->me_key, key) == 0)
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000180 {
181 return ep;
182 }
183 freeslot = NULL;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000184 }
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000185 /* XXX What if PyObject_Compare returned an exception? */
Guido van Rossum2bc13791999-03-24 19:06:42 +0000186 /* Derive incr from hash, just to make it more arbitrary. Note that
Guido van Rossum16e93a81997-01-28 00:00:11 +0000187 incr must not be 0, or we will get into an infinite loop.*/
Guido van Rossumfd7a0b81997-08-18 21:52:47 +0000188 incr = (hash ^ ((unsigned long)hash >> 3)) & mask;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000189 if (!incr)
190 incr = mask;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000191 for (;;) {
Guido van Rossumefb46091997-01-29 15:53:56 +0000192 ep = &ep0[(i+incr)&mask];
Guido van Rossum16e93a81997-01-28 00:00:11 +0000193 if (ep->me_key == NULL) {
194 if (freeslot != NULL)
195 return freeslot;
196 else
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000197 return ep;
198 }
Guido van Rossum16e93a81997-01-28 00:00:11 +0000199 if (ep->me_key == dummy) {
200 if (freeslot == NULL)
201 freeslot = ep;
202 }
203 else if (ep->me_key == key ||
204 (ep->me_hash == hash &&
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 PyObject_Compare(ep->me_key, key) == 0)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000206 return ep;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000207 }
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000208 /* XXX What if PyObject_Compare returned an exception? */
Guido van Rossum16e93a81997-01-28 00:00:11 +0000209 /* Cycle through GF(2^n)-{0} */
210 incr = incr << 1;
211 if (incr > mask)
Guido van Rossumf05fc711998-11-16 22:46:30 +0000212 incr ^= mp->ma_poly; /* This will implicitely clear
213 the highest bit */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000214 }
215}
216
217/*
218Internal routine to insert a new item into the table.
219Used both by the internal resize routine and by the public insert routine.
220Eats a reference to key and one to value.
221*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000222static void insertdict
223 Py_PROTO((dictobject *, PyObject *, long, PyObject *));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000224static void
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000225insertdict(mp, key, hash, value)
226 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000228 long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 PyObject *value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000230{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 PyObject *old_value;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000232 register dictentry *ep;
233 ep = lookdict(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000234 if (ep->me_value != NULL) {
Guido van Rossumd7047b31995-01-02 19:07:15 +0000235 old_value = ep->me_value;
236 ep->me_value = value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 Py_DECREF(old_value); /* which **CAN** re-enter */
238 Py_DECREF(key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000239 }
240 else {
241 if (ep->me_key == NULL)
242 mp->ma_fill++;
243 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244 Py_DECREF(ep->me_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000245 ep->me_key = key;
246 ep->me_hash = hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000247 ep->me_value = value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000248 mp->ma_used++;
249 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000250}
251
252/*
253Restructure the table by allocating a new table and reinserting all
254items again. When entries have been deleted, the new table may
255actually be smaller than the old one.
256*/
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000257static int dictresize Py_PROTO((dictobject *, int));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000258static int
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000259dictresize(mp, minused)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000260 dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000261 int minused;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000262{
263 register int oldsize = mp->ma_size;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000264 register int newsize, newpoly;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000265 register dictentry *oldtable = mp->ma_table;
266 register dictentry *newtable;
267 register dictentry *ep;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000268 register int i;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000269 for (i = 0, newsize = MINSIZE; ; i++, newsize <<= 1) {
270 if (i > sizeof(polys)/sizeof(polys[0])) {
271 /* Ran out of polynomials */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000272 PyErr_NoMemory();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000273 return -1;
274 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000275 if (newsize > minused) {
Guido van Rossum16e93a81997-01-28 00:00:11 +0000276 newpoly = polys[i];
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000277 break;
278 }
279 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000280 newtable = PyMem_NEW(dictentry, newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000281 if (newtable == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 PyErr_NoMemory();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000283 return -1;
284 }
Guido van Rossum0fd00331998-07-16 15:06:13 +0000285 memset(newtable, '\0', sizeof(dictentry) * newsize);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000286 mp->ma_size = newsize;
Guido van Rossum16e93a81997-01-28 00:00:11 +0000287 mp->ma_poly = newpoly;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000288 mp->ma_table = newtable;
289 mp->ma_fill = 0;
290 mp->ma_used = 0;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000291
292 /* Make two passes, so we can avoid decrefs
293 (and possible side effects) till the table is copied */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000294 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
295 if (ep->me_value != NULL)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000296 insertdict(mp,ep->me_key,ep->me_hash,ep->me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000297 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000298 for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000299 if (ep->me_value == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000300 Py_XDECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000301 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000302 }
303
Guido van Rossumb18618d2000-05-03 23:44:39 +0000304 if (oldtable != NULL)
305 PyMem_DEL(oldtable);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000306 return 0;
307}
308
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309PyObject *
310PyDict_GetItem(op, key)
311 PyObject *op;
312 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000313{
314 long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 if (!PyDict_Check(op)) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000316 return NULL;
317 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000318 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumd7047b31995-01-02 19:07:15 +0000319 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000320#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000321 if (!PyString_Check(key) ||
322 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000323#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000324 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 hash = PyObject_Hash(key);
Guido van Rossum474b19e1998-05-14 01:00:51 +0000326 if (hash == -1) {
327 PyErr_Clear();
Guido van Rossumca756f21997-01-23 19:39:29 +0000328 return NULL;
Guido van Rossum474b19e1998-05-14 01:00:51 +0000329 }
Guido van Rossumca756f21997-01-23 19:39:29 +0000330 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000331 return lookdict((dictobject *)op, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000332}
333
334int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335PyDict_SetItem(op, key, value)
336 register PyObject *op;
337 PyObject *key;
338 PyObject *value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000339{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000340 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000341 register long hash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342 if (!PyDict_Check(op)) {
343 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000344 return -1;
345 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000346 mp = (dictobject *)op;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000347#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 if (PyString_Check(key)) {
Guido van Rossum2a61e741997-01-18 07:55:05 +0000349#ifdef INTERN_STRINGS
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350 if (((PyStringObject *)key)->ob_sinterned != NULL) {
351 key = ((PyStringObject *)key)->ob_sinterned;
352 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000353 }
354 else
355#endif
356 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357 hash = ((PyStringObject *)key)->ob_shash;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000358 if (hash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000360 }
361 }
362 else
363#endif
364 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 hash = PyObject_Hash(key);
Guido van Rossum2a61e741997-01-18 07:55:05 +0000366 if (hash == -1)
367 return -1;
Guido van Rossum2a61e741997-01-18 07:55:05 +0000368 }
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000369 /* if fill >= 2/3 size, double in size */
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000370 if (mp->ma_fill*3 >= mp->ma_size*2) {
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000371 if (dictresize(mp, mp->ma_used*2) != 0) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000372 if (mp->ma_fill+1 > mp->ma_size)
373 return -1;
374 }
375 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376 Py_INCREF(value);
377 Py_INCREF(key);
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000378 insertdict(mp, key, hash, value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000379 return 0;
380}
381
382int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383PyDict_DelItem(op, key)
384 PyObject *op;
385 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000386{
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000387 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000388 register long hash;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000389 register dictentry *ep;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390 PyObject *old_value, *old_key;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000391
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 if (!PyDict_Check(op)) {
393 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000394 return -1;
395 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000396#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000397 if (!PyString_Check(key) ||
398 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000399#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000400 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000402 if (hash == -1)
403 return -1;
404 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000405 mp = (dictobject *)op;
406 if (((dictobject *)op)->ma_table == NULL)
Guido van Rossumefc87131995-01-02 19:42:39 +0000407 goto empty;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000408 ep = lookdict(mp, key, hash);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000409 if (ep->me_value == NULL) {
Guido van Rossumefc87131995-01-02 19:42:39 +0000410 empty:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000412 return -1;
413 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000414 old_key = ep->me_key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415 Py_INCREF(dummy);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000416 ep->me_key = dummy;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000417 old_value = ep->me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000418 ep->me_value = NULL;
419 mp->ma_used--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420 Py_DECREF(old_value);
421 Py_DECREF(old_key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000422 return 0;
423}
424
Guido van Rossum25831651993-05-19 14:50:45 +0000425void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000426PyDict_Clear(op)
427 PyObject *op;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000428{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000429 int i, n;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000430 register dictentry *table;
431 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000433 return;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000434 mp = (dictobject *)op;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000435 table = mp->ma_table;
436 if (table == NULL)
437 return;
438 n = mp->ma_size;
439 mp->ma_size = mp->ma_used = mp->ma_fill = 0;
440 mp->ma_table = NULL;
441 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442 Py_XDECREF(table[i].me_key);
443 Py_XDECREF(table[i].me_value);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000444 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 PyMem_DEL(table);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000446}
447
Guido van Rossum25831651993-05-19 14:50:45 +0000448int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449PyDict_Next(op, ppos, pkey, pvalue)
450 PyObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000451 int *ppos;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452 PyObject **pkey;
453 PyObject **pvalue;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000454{
Guido van Rossum25831651993-05-19 14:50:45 +0000455 int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000456 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 if (!PyDict_Check(op))
Guido van Rossum25831651993-05-19 14:50:45 +0000458 return 0;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000459 mp = (dictobject *)op;
Guido van Rossum25831651993-05-19 14:50:45 +0000460 i = *ppos;
461 if (i < 0)
462 return 0;
463 while (i < mp->ma_size && mp->ma_table[i].me_value == NULL)
464 i++;
465 *ppos = i+1;
466 if (i >= mp->ma_size)
467 return 0;
468 if (pkey)
469 *pkey = mp->ma_table[i].me_key;
470 if (pvalue)
471 *pvalue = mp->ma_table[i].me_value;
472 return 1;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000473}
474
475/* Methods */
476
477static void
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000478dict_dealloc(mp)
479 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000480{
481 register int i;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000482 register dictentry *ep;
Guido van Rossumd724b232000-03-13 16:01:29 +0000483 Py_TRASHCAN_SAFE_BEGIN(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000484 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
Guido van Rossum255443b1998-04-10 22:47:14 +0000485 if (ep->me_key != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 Py_DECREF(ep->me_key);
Guido van Rossum255443b1998-04-10 22:47:14 +0000487 }
488 if (ep->me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 Py_DECREF(ep->me_value);
Guido van Rossum255443b1998-04-10 22:47:14 +0000490 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000491 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000492 if (mp->ma_table != NULL)
493 PyMem_DEL(mp->ma_table);
494 PyObject_DEL(mp);
Guido van Rossumd724b232000-03-13 16:01:29 +0000495 Py_TRASHCAN_SAFE_END(mp)
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000496}
497
498static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000499dict_print(mp, fp, flags)
500 register dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000501 register FILE *fp;
502 register int flags;
503{
504 register int i;
505 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000506 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000507
508 i = Py_ReprEnter((PyObject*)mp);
509 if (i != 0) {
510 if (i < 0)
511 return i;
512 fprintf(fp, "{...}");
513 return 0;
514 }
515
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000516 fprintf(fp, "{");
517 any = 0;
518 for (i = 0, ep = mp->ma_table; i < mp->ma_size; i++, ep++) {
519 if (ep->me_value != NULL) {
520 if (any++ > 0)
521 fprintf(fp, ", ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000522 if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
523 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000524 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000525 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000526 fprintf(fp, ": ");
Guido van Rossum255443b1998-04-10 22:47:14 +0000527 if (PyObject_Print(ep->me_value, fp, 0) != 0) {
528 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000529 return -1;
Guido van Rossum255443b1998-04-10 22:47:14 +0000530 }
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000531 }
532 }
533 fprintf(fp, "}");
Guido van Rossum255443b1998-04-10 22:47:14 +0000534 Py_ReprLeave((PyObject*)mp);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000535 return 0;
536}
537
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000539dict_repr(mp)
540 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000541{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 auto PyObject *v;
543 PyObject *sepa, *colon;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000544 register int i;
545 register int any;
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000546 register dictentry *ep;
Guido van Rossum255443b1998-04-10 22:47:14 +0000547
548 i = Py_ReprEnter((PyObject*)mp);
549 if (i != 0) {
550 if (i > 0)
551 return PyString_FromString("{...}");
552 return NULL;
553 }
554
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 v = PyString_FromString("{");
556 sepa = PyString_FromString(", ");
557 colon = PyString_FromString(": ");
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000558 any = 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000559 for (i = 0, ep = mp->ma_table; i < mp->ma_size && v; i++, ep++) {
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000560 if (ep->me_value != NULL) {
561 if (any++)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 PyString_Concat(&v, sepa);
563 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_key));
564 PyString_Concat(&v, colon);
565 PyString_ConcatAndDel(&v, PyObject_Repr(ep->me_value));
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000566 }
567 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 PyString_ConcatAndDel(&v, PyString_FromString("}"));
Guido van Rossum255443b1998-04-10 22:47:14 +0000569 Py_ReprLeave((PyObject*)mp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 Py_XDECREF(sepa);
571 Py_XDECREF(colon);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000572 return v;
573}
574
575static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000576dict_length(mp)
577 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000578{
579 return mp->ma_used;
580}
581
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000583dict_subscript(mp, key)
584 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 register PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000586{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 PyObject *v;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000588 long hash;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000589 if (mp->ma_table == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000591 return NULL;
592 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000593#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594 if (!PyString_Check(key) ||
595 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000596#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000597 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000599 if (hash == -1)
600 return NULL;
601 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000602 v = lookdict(mp, key, hash) -> me_value;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000603 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 PyErr_SetObject(PyExc_KeyError, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000605 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 Py_INCREF(v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000607 return v;
608}
609
610static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000611dict_ass_sub(mp, v, w)
612 dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613 PyObject *v, *w;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000614{
615 if (w == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 return PyDict_DelItem((PyObject *)mp, v);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000617 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000618 return PyDict_SetItem((PyObject *)mp, v, w);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000619}
620
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000621static PyMappingMethods dict_as_mapping = {
622 (inquiry)dict_length, /*mp_length*/
623 (binaryfunc)dict_subscript, /*mp_subscript*/
624 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000625};
626
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000628dict_keys(mp, args)
629 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 PyObject *args;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000631{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 register PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000633 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000634 if (!PyArg_NoArgs(args))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000635 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 v = PyList_New(mp->ma_used);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000637 if (v == NULL)
638 return NULL;
639 for (i = 0, j = 0; i < mp->ma_size; i++) {
640 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 PyObject *key = mp->ma_table[i].me_key;
642 Py_INCREF(key);
643 PyList_SetItem(v, j, key);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000644 j++;
645 }
646 }
647 return v;
648}
649
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000651dict_values(mp, args)
652 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 PyObject *args;
Guido van Rossum25831651993-05-19 14:50:45 +0000654{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000656 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000657 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000658 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000660 if (v == NULL)
661 return NULL;
662 for (i = 0, j = 0; i < mp->ma_size; i++) {
663 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 PyObject *value = mp->ma_table[i].me_value;
665 Py_INCREF(value);
666 PyList_SetItem(v, j, value);
Guido van Rossum25831651993-05-19 14:50:45 +0000667 j++;
668 }
669 }
670 return v;
671}
672
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000674dict_items(mp, args)
675 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 PyObject *args;
Guido van Rossum25831651993-05-19 14:50:45 +0000677{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 register PyObject *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000679 register int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 if (!PyArg_NoArgs(args))
Guido van Rossum25831651993-05-19 14:50:45 +0000681 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 v = PyList_New(mp->ma_used);
Guido van Rossum25831651993-05-19 14:50:45 +0000683 if (v == NULL)
684 return NULL;
685 for (i = 0, j = 0; i < mp->ma_size; i++) {
686 if (mp->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000687 PyObject *key = mp->ma_table[i].me_key;
688 PyObject *value = mp->ma_table[i].me_value;
689 PyObject *item = PyTuple_New(2);
Guido van Rossum25831651993-05-19 14:50:45 +0000690 if (item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +0000692 return NULL;
693 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 Py_INCREF(key);
695 PyTuple_SetItem(item, 0, key);
696 Py_INCREF(value);
697 PyTuple_SetItem(item, 1, value);
698 PyList_SetItem(v, j, item);
Guido van Rossum25831651993-05-19 14:50:45 +0000699 j++;
700 }
701 }
702 return v;
703}
704
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000705static PyObject *
Guido van Rossuma8d51311997-06-02 17:13:37 +0000706dict_update(mp, args)
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000707 register dictobject *mp;
708 PyObject *args;
709{
710 register int i;
711 dictobject *other;
712 dictentry *entry;
713 if (!PyArg_Parse(args, "O!", &PyDict_Type, &other))
714 return NULL;
715 if (other == mp)
Guido van Rossuma8d51311997-06-02 17:13:37 +0000716 goto done; /* a.update(a); nothing to do */
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000717 /* Do one big resize at the start, rather than incrementally
718 resizing as we insert new items. Expect that there will be
719 no (or few) overlapping keys. */
720 if ((mp->ma_fill + other->ma_used)*3 >= mp->ma_size*2) {
721 if (dictresize(mp, (mp->ma_used + other->ma_used)*3/2) != 0)
722 return NULL;
723 }
724 for (i = 0; i < other->ma_size; i++) {
725 entry = &other->ma_table[i];
726 if (entry->me_value != NULL) {
727 Py_INCREF(entry->me_key);
728 Py_INCREF(entry->me_value);
729 insertdict(mp, entry->me_key, entry->me_hash,
730 entry->me_value);
731 }
732 }
733 done:
734 Py_INCREF(Py_None);
735 return Py_None;
736}
737
738static PyObject *
739dict_copy(mp, args)
740 register dictobject *mp;
741 PyObject *args;
742{
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000743 if (!PyArg_Parse(args, ""))
744 return NULL;
745 return PyDict_Copy((PyObject*)mp);
746}
747
748PyObject *
749PyDict_Copy(o)
750 PyObject *o;
751{
752 register dictobject *mp;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000753 register int i;
754 dictobject *copy;
755 dictentry *entry;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000756
757 if (o == NULL || !PyDict_Check(o)) {
758 PyErr_BadInternalCall();
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000759 return NULL;
Jeremy Hyltona12c7a72000-03-30 22:27:31 +0000760 }
761 mp = (dictobject *)o;
Guido van Rossume3f5b9c1997-05-28 19:15:28 +0000762 copy = (dictobject *)PyDict_New();
763 if (copy == NULL)
764 return NULL;
765 if (mp->ma_used > 0) {
766 if (dictresize(copy, mp->ma_used*3/2) != 0)
767 return NULL;
768 for (i = 0; i < mp->ma_size; i++) {
769 entry = &mp->ma_table[i];
770 if (entry->me_value != NULL) {
771 Py_INCREF(entry->me_key);
772 Py_INCREF(entry->me_value);
773 insertdict(copy, entry->me_key, entry->me_hash,
774 entry->me_value);
775 }
776 }
777 }
778 return (PyObject *)copy;
779}
780
Guido van Rossum4199fac1993-11-05 10:18:44 +0000781int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782PyDict_Size(mp)
783 PyObject *mp;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000784{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785 if (mp == NULL || !PyDict_Check(mp)) {
786 PyErr_BadInternalCall();
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000787 return 0;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000788 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000789 return ((dictobject *)mp)->ma_used;
Guido van Rossum4199fac1993-11-05 10:18:44 +0000790}
791
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792PyObject *
793PyDict_Keys(mp)
794 PyObject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000795{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796 if (mp == NULL || !PyDict_Check(mp)) {
797 PyErr_BadInternalCall();
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000798 return NULL;
799 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000800 return dict_keys((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000801}
802
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803PyObject *
804PyDict_Values(mp)
805 PyObject *mp;
Guido van Rossum25831651993-05-19 14:50:45 +0000806{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807 if (mp == NULL || !PyDict_Check(mp)) {
808 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000809 return NULL;
810 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000811 return dict_values((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000812}
813
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000814PyObject *
815PyDict_Items(mp)
816 PyObject *mp;
Guido van Rossum25831651993-05-19 14:50:45 +0000817{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818 if (mp == NULL || !PyDict_Check(mp)) {
819 PyErr_BadInternalCall();
Guido van Rossum25831651993-05-19 14:50:45 +0000820 return NULL;
821 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000822 return dict_items((dictobject *)mp, (PyObject *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000823}
824
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000825#define NEWCMP
826
827#ifdef NEWCMP
828
829/* Subroutine which returns the smallest key in a for which b's value
830 is different or absent. The value is returned too, through the
831 pval argument. No reference counts are incremented. */
832
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833static PyObject *
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000834characterize(a, b, pval)
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000835 dictobject *a;
836 dictobject *b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 PyObject **pval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000838{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 PyObject *diff = NULL;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000840 int i;
841
842 *pval = NULL;
843 for (i = 0; i < a->ma_size; i++) {
844 if (a->ma_table[i].me_value != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000845 PyObject *key = a->ma_table[i].me_key;
846 PyObject *aval, *bval;
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000847 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848 if (diff != NULL && PyObject_Compare(key, diff) > 0)
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000849 continue;
850 aval = a->ma_table[i].me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000851 bval = PyDict_GetItem((PyObject *)b, key);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000852 /* XXX What if PyObject_Compare raises an exception? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 if (bval == NULL || PyObject_Compare(aval, bval) != 0)
854 {
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000855 diff = key;
856 *pval = aval;
857 }
858 }
859 }
860 return diff;
861}
862
863static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000864dict_compare(a, b)
865 dictobject *a, *b;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000866{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867 PyObject *adiff, *bdiff, *aval, *bval;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000868 int res;
869
870 /* Compare lengths first */
871 if (a->ma_used < b->ma_used)
872 return -1; /* a is shorter */
873 else if (a->ma_used > b->ma_used)
874 return 1; /* b is shorter */
875 /* Same length -- check all keys */
876 adiff = characterize(a, b, &aval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000877 if (PyErr_Occurred())
878 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000879 if (adiff == NULL)
880 return 0; /* a is a subset with the same length */
881 bdiff = characterize(b, a, &bval);
Guido van Rossum5b2121b1997-05-23 00:01:41 +0000882 if (PyErr_Occurred())
883 return -1;
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000884 /* bdiff == NULL would be impossible now */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 res = PyObject_Compare(adiff, bdiff);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000886 if (res == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000887 res = PyObject_Compare(aval, bval);
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000888 return res;
889}
890
891#else /* !NEWCMP */
892
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000893static int
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000894dict_compare(a, b)
895 dictobject *a, *b;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000896{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897 PyObject *akeys, *bkeys;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000898 int i, n, res;
899 if (a == b)
900 return 0;
901 if (a->ma_used == 0) {
902 if (b->ma_used != 0)
903 return -1;
904 else
905 return 0;
906 }
907 else {
908 if (b->ma_used == 0)
909 return 1;
910 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000911 akeys = dict_keys(a, (PyObject *)NULL);
912 bkeys = dict_keys(b, (PyObject *)NULL);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000913 if (akeys == NULL || bkeys == NULL) {
914 /* Oops, out of memory -- what to do? */
915 /* For now, sort on address! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 Py_XDECREF(akeys);
917 Py_XDECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000918 if (a < b)
919 return -1;
920 else
921 return 1;
922 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923 PyList_Sort(akeys);
924 PyList_Sort(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000925 n = a->ma_used < b->ma_used ? a->ma_used : b->ma_used; /* smallest */
926 res = 0;
927 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928 PyObject *akey, *bkey, *aval, *bval;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000929 long ahash, bhash;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 akey = PyList_GetItem(akeys, i);
931 bkey = PyList_GetItem(bkeys, i);
932 res = PyObject_Compare(akey, bkey);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000933 if (res != 0)
934 break;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000935#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 if (!PyString_Check(akey) ||
937 (ahash = ((PyStringObject *) akey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000938#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000939 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 ahash = PyObject_Hash(akey);
Guido van Rossumca756f21997-01-23 19:39:29 +0000941 if (ahash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +0000943 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000944#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000945 if (!PyString_Check(bkey) ||
946 (bhash = ((PyStringObject *) bkey)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000947#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000948 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 bhash = PyObject_Hash(bkey);
Guido van Rossumca756f21997-01-23 19:39:29 +0000950 if (bhash == -1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000951 PyErr_Clear(); /* Don't want errors here */
Guido van Rossumca756f21997-01-23 19:39:29 +0000952 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000953 aval = lookdict(a, akey, ahash) -> me_value;
954 bval = lookdict(b, bkey, bhash) -> me_value;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955 res = PyObject_Compare(aval, bval);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000956 if (res != 0)
957 break;
958 }
959 if (res == 0) {
960 if (a->ma_used < b->ma_used)
961 res = -1;
962 else if (a->ma_used > b->ma_used)
963 res = 1;
964 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 Py_DECREF(akeys);
966 Py_DECREF(bkeys);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000967 return res;
968}
969
Guido van Rossuma0a69b81996-12-05 21:55:55 +0000970#endif /* !NEWCMP */
971
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000973dict_has_key(mp, args)
974 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 PyObject *args;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000976{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 PyObject *key;
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000978 long hash;
979 register long ok;
Fred Drake52fccfd2000-02-23 15:47:16 +0000980 if (!PyArg_ParseTuple(args, "O:has_key", &key))
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000981 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000982#ifdef CACHE_HASH
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000983 if (!PyString_Check(key) ||
984 (hash = ((PyStringObject *) key)->ob_shash) == -1)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000985#endif
Guido van Rossumca756f21997-01-23 19:39:29 +0000986 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 hash = PyObject_Hash(key);
Guido van Rossumca756f21997-01-23 19:39:29 +0000988 if (hash == -1)
989 return NULL;
990 }
Guido van Rossuma9e7a811997-05-13 21:02:11 +0000991 ok = mp->ma_size != 0 && lookdict(mp, key, hash)->me_value != NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992 return PyInt_FromLong(ok);
Guido van Rossum4b1302b1993-03-27 18:11:32 +0000993}
994
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000995static PyObject *
Barry Warsawc38c5da1997-10-06 17:49:20 +0000996dict_get(mp, args)
997 register dictobject *mp;
998 PyObject *args;
999{
1000 PyObject *key;
Barry Warsaw320ac331997-10-20 17:26:25 +00001001 PyObject *failobj = Py_None;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001002 PyObject *val = NULL;
1003 long hash;
1004
Fred Drake52fccfd2000-02-23 15:47:16 +00001005 if (!PyArg_ParseTuple(args, "O|O:get", &key, &failobj))
Barry Warsawc38c5da1997-10-06 17:49:20 +00001006 return NULL;
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001007 if (mp->ma_table == NULL)
1008 goto finally;
Barry Warsawc38c5da1997-10-06 17:49:20 +00001009
Barry Warsawc38c5da1997-10-06 17:49:20 +00001010#ifdef CACHE_HASH
1011 if (!PyString_Check(key) ||
1012 (hash = ((PyStringObject *) key)->ob_shash) == -1)
1013#endif
1014 {
1015 hash = PyObject_Hash(key);
1016 if (hash == -1)
1017 return NULL;
1018 }
1019 val = lookdict(mp, key, hash)->me_value;
Barry Warsaw320ac331997-10-20 17:26:25 +00001020
Guido van Rossum6fcfa721997-10-20 20:10:00 +00001021 finally:
Barry Warsawc38c5da1997-10-06 17:49:20 +00001022 if (val == NULL)
1023 val = failobj;
1024 Py_INCREF(val);
1025 return val;
1026}
1027
1028
1029static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001030dict_clear(mp, args)
1031 register dictobject *mp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 PyObject *args;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001033{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034 if (!PyArg_NoArgs(args))
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001035 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 PyDict_Clear((PyObject *)mp);
1037 Py_INCREF(Py_None);
1038 return Py_None;
Guido van Rossumfb8f1ca1997-03-21 21:55:12 +00001039}
1040
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041static PyMethodDef mapp_methods[] = {
Fred Drake52fccfd2000-02-23 15:47:16 +00001042 {"has_key", (PyCFunction)dict_has_key, METH_VARARGS},
Guido van Rossum5d8123f1997-07-13 03:58:01 +00001043 {"keys", (PyCFunction)dict_keys},
1044 {"items", (PyCFunction)dict_items},
1045 {"values", (PyCFunction)dict_values},
Guido van Rossuma8d51311997-06-02 17:13:37 +00001046 {"update", (PyCFunction)dict_update},
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001047 {"clear", (PyCFunction)dict_clear},
Guido van Rossume3f5b9c1997-05-28 19:15:28 +00001048 {"copy", (PyCFunction)dict_copy},
Fred Drake52fccfd2000-02-23 15:47:16 +00001049 {"get", (PyCFunction)dict_get, METH_VARARGS},
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001050 {NULL, NULL} /* sentinel */
1051};
1052
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053static PyObject *
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001054dict_getattr(mp, name)
1055 dictobject *mp;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001056 char *name;
1057{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058 return Py_FindMethod(mapp_methods, (PyObject *)mp, name);
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001059}
1060
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061PyTypeObject PyDict_Type = {
1062 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001063 0,
Guido van Rossum9bfef441993-03-29 10:43:31 +00001064 "dictionary",
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001065 sizeof(dictobject),
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001066 0,
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001067 (destructor)dict_dealloc, /*tp_dealloc*/
1068 (printfunc)dict_print, /*tp_print*/
1069 (getattrfunc)dict_getattr, /*tp_getattr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001070 0, /*tp_setattr*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001071 (cmpfunc)dict_compare, /*tp_compare*/
1072 (reprfunc)dict_repr, /*tp_repr*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001073 0, /*tp_as_number*/
1074 0, /*tp_as_sequence*/
Guido van Rossuma9e7a811997-05-13 21:02:11 +00001075 &dict_as_mapping, /*tp_as_mapping*/
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001076};
1077
Guido van Rossum3cca2451997-05-16 14:23:33 +00001078/* For backward compatibility with old dictionary interface */
1079
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080PyObject *
1081PyDict_GetItemString(v, key)
1082 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001083 char *key;
1084{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001085 PyObject *kv, *rv;
1086 kv = PyString_FromString(key);
1087 if (kv == NULL)
1088 return NULL;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001089 rv = PyDict_GetItem(v, kv);
1090 Py_DECREF(kv);
1091 return rv;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001092}
1093
1094int
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001095PyDict_SetItemString(v, key, item)
1096 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001097 char *key;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001098 PyObject *item;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001099{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001100 PyObject *kv;
1101 int err;
1102 kv = PyString_FromString(key);
1103 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001104 return -1;
Guido van Rossum4f3bf1e1997-09-29 23:31:11 +00001105 PyString_InternInPlace(&kv); /* XXX Should we really? */
Guido van Rossum3cca2451997-05-16 14:23:33 +00001106 err = PyDict_SetItem(v, kv, item);
1107 Py_DECREF(kv);
1108 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001109}
1110
1111int
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112PyDict_DelItemString(v, key)
1113 PyObject *v;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001114 char *key;
1115{
Guido van Rossum3cca2451997-05-16 14:23:33 +00001116 PyObject *kv;
1117 int err;
1118 kv = PyString_FromString(key);
1119 if (kv == NULL)
Guido van Rossum037b2201997-05-20 18:35:19 +00001120 return -1;
Guido van Rossum3cca2451997-05-16 14:23:33 +00001121 err = PyDict_DelItem(v, kv);
1122 Py_DECREF(kv);
1123 return err;
Guido van Rossum4b1302b1993-03-27 18:11:32 +00001124}