3 * Copyright (c) 1991-1997, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "I sit beside the fire and think of all that I have seen." --Bilbo
17 static void hsplit _((HV *hv));
18 static void hfreeentries _((HV *hv));
20 static HE* more_he(void);
37 HeNEXT(p) = (HE*)he_root;
46 he_root = (HE*)safemalloc(1008);
48 heend = &he[1008 / sizeof(HE) - 1];
50 HeNEXT(he) = (HE*)(he + 1);
58 save_hek(char *str, I32 len, U32 hash)
63 New(54, k, HEK_BASESIZE + len + 1, char);
65 Copy(str, HEK_KEY(hek), len, char);
66 *(HEK_KEY(hek) + len) = '\0';
75 unsharepvn(HEK_KEY(hek),HEK_LEN(hek),HEK_HASH(hek));
78 /* (klen == HEf_SVKEY) is special for MAGICAL hv entries, meaning key slot
82 hv_fetch(HV *hv, char *key, U32 klen, I32 lval)
93 if (mg_find((SV*)hv,'P')) {
96 mg_copy((SV*)hv, sv, key, klen);
102 xhv = (XPVHV*)SvANY(hv);
103 if (!xhv->xhv_array) {
105 #ifdef DYNAMIC_ENV_FETCH /* if it's an %ENV lookup, we may get it on the fly */
106 || (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME))
109 Newz(503,xhv->xhv_array, sizeof(HE*) * (xhv->xhv_max + 1), char);
114 PERL_HASH(hash, key, klen);
116 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
117 for (; entry; entry = HeNEXT(entry)) {
118 if (HeHASH(entry) != hash) /* strings can't be equal */
120 if (HeKLEN(entry) != klen)
122 if (memNE(HeKEY(entry),key,klen)) /* is this it? */
124 return &HeVAL(entry);
126 #ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
127 if (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME)) {
130 if ((gotenv = ENV_getenv(key)) != Nullch) {
131 sv = newSVpv(gotenv,strlen(gotenv));
133 return hv_store(hv,key,klen,sv,hash);
137 if (lval) { /* gonna assign to this, so it better be there */
139 return hv_store(hv,key,klen,sv,hash);
144 /* returns a HE * structure with the all fields set */
145 /* note that hent_val will be a mortal sv for MAGICAL hashes */
147 hv_fetch_ent(HV *hv, SV *keysv, I32 lval, register U32 hash)
158 if (SvRMAGICAL(hv) && mg_find((SV*)hv,'P')) {
162 keysv = sv_2mortal(newSVsv(keysv));
163 mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
164 if (!HeKEY_hek(&mh)) {
166 New(54, k, HEK_BASESIZE + sizeof(SV*), char);
167 HeKEY_hek(&mh) = (HEK*)k;
169 HeSVKEY_set(&mh, keysv);
174 xhv = (XPVHV*)SvANY(hv);
175 if (!xhv->xhv_array) {
177 #ifdef DYNAMIC_ENV_FETCH /* if it's an %ENV lookup, we may get it on the fly */
178 || (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME))
181 Newz(503,xhv->xhv_array, sizeof(HE*) * (xhv->xhv_max + 1), char);
186 key = SvPV(keysv, klen);
189 PERL_HASH(hash, key, klen);
191 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
192 for (; entry; entry = HeNEXT(entry)) {
193 if (HeHASH(entry) != hash) /* strings can't be equal */
195 if (HeKLEN(entry) != klen)
197 if (memNE(HeKEY(entry),key,klen)) /* is this it? */
201 #ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
202 if (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME)) {
205 if ((gotenv = ENV_getenv(key)) != Nullch) {
206 sv = newSVpv(gotenv,strlen(gotenv));
208 return hv_store_ent(hv,keysv,sv,hash);
212 if (lval) { /* gonna assign to this, so it better be there */
214 return hv_store_ent(hv,keysv,sv,hash);
220 hv_store(HV *hv, char *key, U32 klen, SV *val, register U32 hash)
225 register HE **oentry;
230 xhv = (XPVHV*)SvANY(hv);
232 mg_copy((SV*)hv, val, key, klen);
234 && (SvMAGIC(hv)->mg_moremagic
235 || (SvMAGIC(hv)->mg_type != 'E'
237 && SvMAGIC(hv)->mg_type != 'A'
238 #endif /* OVERLOAD */
243 PERL_HASH(hash, key, klen);
246 Newz(505, xhv->xhv_array, sizeof(HE**) * (xhv->xhv_max + 1), char);
248 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
251 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
252 if (HeHASH(entry) != hash) /* strings can't be equal */
254 if (HeKLEN(entry) != klen)
256 if (memNE(HeKEY(entry),key,klen)) /* is this it? */
258 SvREFCNT_dec(HeVAL(entry));
260 return &HeVAL(entry);
265 HeKEY_hek(entry) = share_hek(key, klen, hash);
266 else /* gotta do the real thing */
267 HeKEY_hek(entry) = save_hek(key, klen, hash);
269 HeNEXT(entry) = *oentry;
273 if (i) { /* initial entry? */
275 if (xhv->xhv_keys > xhv->xhv_max)
279 return &HeVAL(entry);
283 hv_store_ent(HV *hv, SV *keysv, SV *val, register U32 hash)
290 register HE **oentry;
295 xhv = (XPVHV*)SvANY(hv);
297 bool save_taint = tainted;
299 tainted = SvTAINTED(keysv);
300 keysv = sv_2mortal(newSVsv(keysv));
301 mg_copy((SV*)hv, val, (char*)keysv, HEf_SVKEY);
302 TAINT_IF(save_taint);
304 && (SvMAGIC(hv)->mg_moremagic
305 || (SvMAGIC(hv)->mg_type != 'E'
307 && SvMAGIC(hv)->mg_type != 'A'
308 #endif /* OVERLOAD */
313 key = SvPV(keysv, klen);
316 PERL_HASH(hash, key, klen);
319 Newz(505, xhv->xhv_array, sizeof(HE**) * (xhv->xhv_max + 1), char);
321 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
324 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
325 if (HeHASH(entry) != hash) /* strings can't be equal */
327 if (HeKLEN(entry) != klen)
329 if (memNE(HeKEY(entry),key,klen)) /* is this it? */
331 SvREFCNT_dec(HeVAL(entry));
338 HeKEY_hek(entry) = share_hek(key, klen, hash);
339 else /* gotta do the real thing */
340 HeKEY_hek(entry) = save_hek(key, klen, hash);
342 HeNEXT(entry) = *oentry;
346 if (i) { /* initial entry? */
348 if (xhv->xhv_keys > xhv->xhv_max)
356 hv_delete(HV *hv, char *key, U32 klen, I32 flags)
362 register HE **oentry;
367 if (SvRMAGICAL(hv)) {
368 sv = *hv_fetch(hv, key, klen, TRUE);
370 if (mg_find(sv, 's')) {
371 return Nullsv; /* %SIG elements cannot be deleted */
373 if (mg_find(sv, 'p')) {
374 sv_unmagic(sv, 'p'); /* No longer an element */
378 xhv = (XPVHV*)SvANY(hv);
382 PERL_HASH(hash, key, klen);
384 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
387 for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
388 if (HeHASH(entry) != hash) /* strings can't be equal */
390 if (HeKLEN(entry) != klen)
392 if (memNE(HeKEY(entry),key,klen)) /* is this it? */
394 *oentry = HeNEXT(entry);
397 if (flags & G_DISCARD)
400 sv = sv_mortalcopy(HeVAL(entry));
401 if (entry == xhv->xhv_eiter)
404 hv_free_ent(hv, entry);
412 hv_delete_ent(HV *hv, SV *keysv, I32 flags, U32 hash)
419 register HE **oentry;
424 if (SvRMAGICAL(hv)) {
425 entry = hv_fetch_ent(hv, keysv, TRUE, hash);
428 if (mg_find(sv, 'p')) {
429 sv_unmagic(sv, 'p'); /* No longer an element */
433 xhv = (XPVHV*)SvANY(hv);
437 key = SvPV(keysv, klen);
440 PERL_HASH(hash, key, klen);
442 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
445 for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
446 if (HeHASH(entry) != hash) /* strings can't be equal */
448 if (HeKLEN(entry) != klen)
450 if (memNE(HeKEY(entry),key,klen)) /* is this it? */
452 *oentry = HeNEXT(entry);
455 if (flags & G_DISCARD)
458 sv = sv_mortalcopy(HeVAL(entry));
459 if (entry == xhv->xhv_eiter)
462 hv_free_ent(hv, entry);
470 hv_exists(HV *hv, char *key, U32 klen)
480 if (SvRMAGICAL(hv)) {
481 if (mg_find((SV*)hv,'P')) {
484 mg_copy((SV*)hv, sv, key, klen);
485 magic_existspack(sv, mg_find(sv, 'p'));
490 xhv = (XPVHV*)SvANY(hv);
494 PERL_HASH(hash, key, klen);
496 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
497 for (; entry; entry = HeNEXT(entry)) {
498 if (HeHASH(entry) != hash) /* strings can't be equal */
500 if (HeKLEN(entry) != klen)
502 if (memNE(HeKEY(entry),key,klen)) /* is this it? */
511 hv_exists_ent(HV *hv, SV *keysv, U32 hash)
522 if (SvRMAGICAL(hv)) {
523 if (mg_find((SV*)hv,'P')) {
524 dTHR; /* just for SvTRUE */
526 keysv = sv_2mortal(newSVsv(keysv));
527 mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
528 magic_existspack(sv, mg_find(sv, 'p'));
533 xhv = (XPVHV*)SvANY(hv);
537 key = SvPV(keysv, klen);
539 PERL_HASH(hash, key, klen);
541 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
542 for (; entry; entry = HeNEXT(entry)) {
543 if (HeHASH(entry) != hash) /* strings can't be equal */
545 if (HeKLEN(entry) != klen)
547 if (memNE(HeKEY(entry),key,klen)) /* is this it? */
557 register XPVHV* xhv = (XPVHV*)SvANY(hv);
558 I32 oldsize = (I32) xhv->xhv_max + 1; /* sic(k) */
559 register I32 newsize = oldsize * 2;
564 register HE **oentry;
565 #ifndef STRANGE_MALLOC
569 a = (HE**)xhv->xhv_array;
571 #ifdef STRANGE_MALLOC
572 Renew(a, newsize, HE*);
574 i = newsize * sizeof(HE*);
575 #define MALLOC_OVERHEAD 16
576 tmp = MALLOC_OVERHEAD;
577 while (tmp - MALLOC_OVERHEAD < i)
579 tmp -= MALLOC_OVERHEAD;
581 assert(tmp >= newsize);
583 Copy(xhv->xhv_array, a, oldsize, HE*);
585 offer_nice_chunk(xhv->xhv_array,
586 oldsize * sizeof(HE*) * 2 - MALLOC_OVERHEAD);
589 Safefree(xhv->xhv_array);
593 Zero(&a[oldsize], oldsize, HE*); /* zero 2nd half*/
594 xhv->xhv_max = --newsize;
595 xhv->xhv_array = (char*)a;
597 for (i=0; i<oldsize; i++,a++) {
598 if (!*a) /* non-existent */
601 for (oentry = a, entry = *a; entry; entry = *oentry) {
602 if ((HeHASH(entry) & newsize) != i) {
603 *oentry = HeNEXT(entry);
611 oentry = &HeNEXT(entry);
613 if (!*a) /* everything moved */
619 hv_ksplit(HV *hv, IV newmax)
621 register XPVHV* xhv = (XPVHV*)SvANY(hv);
622 I32 oldsize = (I32) xhv->xhv_max + 1; /* sic(k) */
623 register I32 newsize;
628 register HE **oentry;
630 newsize = (I32) newmax; /* possible truncation here */
631 if (newsize != newmax || newmax <= oldsize)
633 while ((newsize & (1 + ~newsize)) != newsize) {
634 newsize &= ~(newsize & (1 + ~newsize)); /* get proper power of 2 */
636 if (newsize < newmax)
638 if (newsize < newmax)
639 return; /* overflow detection */
641 a = (HE**)xhv->xhv_array;
644 #ifdef STRANGE_MALLOC
645 Renew(a, newsize, HE*);
647 i = newsize * sizeof(HE*);
649 while (j - MALLOC_OVERHEAD < i)
651 j -= MALLOC_OVERHEAD;
653 assert(j >= newsize);
655 Copy(xhv->xhv_array, a, oldsize, HE*);
657 offer_nice_chunk(xhv->xhv_array,
658 oldsize * sizeof(HE*) * 2 - MALLOC_OVERHEAD);
661 Safefree(xhv->xhv_array);
664 Zero(&a[oldsize], newsize-oldsize, HE*); /* zero 2nd half*/
667 Newz(0, a, newsize, HE*);
669 xhv->xhv_max = --newsize;
670 xhv->xhv_array = (char*)a;
671 if (!xhv->xhv_fill) /* skip rest if no entries */
674 for (i=0; i<oldsize; i++,a++) {
675 if (!*a) /* non-existent */
677 for (oentry = a, entry = *a; entry; entry = *oentry) {
678 if ((j = (HeHASH(entry) & newsize)) != i) {
680 *oentry = HeNEXT(entry);
681 if (!(HeNEXT(entry) = a[j]))
687 oentry = &HeNEXT(entry);
689 if (!*a) /* everything moved */
700 hv = (HV*)NEWSV(502,0);
701 sv_upgrade((SV *)hv, SVt_PVHV);
702 xhv = (XPVHV*)SvANY(hv);
705 #ifndef NODEFAULT_SHAREKEYS
706 HvSHAREKEYS_on(hv); /* key-sharing on by default */
708 xhv->xhv_max = 7; /* start with 8 buckets */
711 (void)hv_iterinit(hv); /* so each() will start off right */
716 hv_free_ent(HV *hv, register HE *entry)
720 if (isGV(HeVAL(entry)) && GvCVu(HeVAL(entry)) && HvNAME(hv))
721 sub_generation++; /* may be deletion of method from stash */
722 SvREFCNT_dec(HeVAL(entry));
723 if (HeKLEN(entry) == HEf_SVKEY) {
724 SvREFCNT_dec(HeKEY_sv(entry));
725 Safefree(HeKEY_hek(entry));
727 else if (HvSHAREKEYS(hv))
728 unshare_hek(HeKEY_hek(entry));
730 Safefree(HeKEY_hek(entry));
735 hv_delayfree_ent(HV *hv, register HE *entry)
739 if (isGV(HeVAL(entry)) && GvCVu(HeVAL(entry)) && HvNAME(hv))
740 sub_generation++; /* may be deletion of method from stash */
741 sv_2mortal(HeVAL(entry)); /* free between statements */
742 if (HeKLEN(entry) == HEf_SVKEY) {
743 sv_2mortal(HeKEY_sv(entry));
744 Safefree(HeKEY_hek(entry));
746 else if (HvSHAREKEYS(hv))
747 unshare_hek(HeKEY_hek(entry));
749 Safefree(HeKEY_hek(entry));
759 xhv = (XPVHV*)SvANY(hv);
764 (void)memzero(xhv->xhv_array, (xhv->xhv_max + 1) * sizeof(HE*));
775 register HE *oentry = Null(HE*);
791 entry = HeNEXT(entry);
792 hv_free_ent(hv, oentry);
797 entry = array[riter];
800 (void)hv_iterinit(hv);
809 xhv = (XPVHV*)SvANY(hv);
811 Safefree(xhv->xhv_array);
813 Safefree(HvNAME(hv));
817 xhv->xhv_max = 7; /* it's a normal hash */
833 xhv = (XPVHV*)SvANY(hv);
834 entry = xhv->xhv_eiter;
835 #ifdef DYNAMIC_ENV_FETCH /* set up %ENV for iteration */
836 if (HvNAME(hv) && strEQ(HvNAME(hv), ENV_HV_NAME))
839 if (entry && HvLAZYDEL(hv)) { /* was deleted earlier? */
841 hv_free_ent(hv, entry);
844 xhv->xhv_eiter = Null(HE*);
845 return xhv->xhv_fill; /* should be xhv->xhv_keys? May change later */
858 xhv = (XPVHV*)SvANY(hv);
859 oldentry = entry = xhv->xhv_eiter;
861 if (SvRMAGICAL(hv) && (mg = mg_find((SV*)hv,'P'))) {
862 SV *key = sv_newmortal();
864 sv_setsv(key, HeSVKEY_force(entry));
865 SvREFCNT_dec(HeSVKEY(entry)); /* get rid of previous key */
871 xhv->xhv_eiter = entry = new_he(); /* one HE per MAGICAL hash */
873 Newz(54, k, HEK_BASESIZE + sizeof(SV*), char);
875 HeKEY_hek(entry) = hek;
876 HeKLEN(entry) = HEf_SVKEY;
878 magic_nextpack((SV*) hv,mg,key);
880 dTHR; /* just for SvREFCNT_inc */
881 /* force key to stay around until next time */
882 HeSVKEY_set(entry, SvREFCNT_inc(key));
883 return entry; /* beware, hent_val is not set */
886 SvREFCNT_dec(HeVAL(entry));
887 Safefree(HeKEY_hek(entry));
889 xhv->xhv_eiter = Null(HE*);
894 Newz(506,xhv->xhv_array, sizeof(HE*) * (xhv->xhv_max + 1), char);
896 entry = HeNEXT(entry);
899 if (xhv->xhv_riter > xhv->xhv_max) {
903 entry = ((HE**)xhv->xhv_array)[xhv->xhv_riter];
906 if (oldentry && HvLAZYDEL(hv)) { /* was deleted earlier? */
908 hv_free_ent(hv, oldentry);
911 xhv->xhv_eiter = entry;
916 hv_iterkey(register HE *entry, I32 *retlen)
918 if (HeKLEN(entry) == HEf_SVKEY) {
920 char *p = SvPV(HeKEY_sv(entry), len);
925 *retlen = HeKLEN(entry);
930 /* unlike hv_iterval(), this always returns a mortal copy of the key */
932 hv_iterkeysv(register HE *entry)
934 if (HeKLEN(entry) == HEf_SVKEY)
935 return sv_mortalcopy(HeKEY_sv(entry));
937 return sv_2mortal(newSVpv((HeKLEN(entry) ? HeKEY(entry) : ""),
942 hv_iterval(HV *hv, register HE *entry)
944 if (SvRMAGICAL(hv)) {
945 if (mg_find((SV*)hv,'P')) {
946 SV* sv = sv_newmortal();
947 if (HeKLEN(entry) == HEf_SVKEY)
948 mg_copy((SV*)hv, sv, (char*)HeKEY_sv(entry), HEf_SVKEY);
949 else mg_copy((SV*)hv, sv, HeKEY(entry), HeKLEN(entry));
957 hv_iternextsv(HV *hv, char **key, I32 *retlen)
960 if ( (he = hv_iternext(hv)) == NULL)
962 *key = hv_iterkey(he, retlen);
963 return hv_iterval(hv, he);
967 hv_magic(HV *hv, GV *gv, int how)
969 sv_magic((SV*)hv, (SV*)gv, how, Nullch, 0);
973 sharepvn(char *sv, I32 len, U32 hash)
975 return HEK_KEY(share_hek(sv, len, hash));
978 /* possibly free a shared string if no one has access to it
979 * len and hash must both be valid for str.
982 unsharepvn(char *str, I32 len, U32 hash)
986 register HE **oentry;
990 /* what follows is the moral equivalent of:
991 if ((Svp = hv_fetch(strtab, tmpsv, FALSE, hash))) {
992 if (--*Svp == Nullsv)
993 hv_delete(strtab, str, len, G_DISCARD, hash);
995 xhv = (XPVHV*)SvANY(strtab);
996 /* assert(xhv_array != 0) */
997 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
998 for (entry = *oentry; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
999 if (HeHASH(entry) != hash) /* strings can't be equal */
1001 if (HeKLEN(entry) != len)
1003 if (memNE(HeKEY(entry),str,len)) /* is this it? */
1006 if (--HeVAL(entry) == Nullsv) {
1007 *oentry = HeNEXT(entry);
1010 Safefree(HeKEY_hek(entry));
1018 warn("Attempt to free non-existent shared string");
1021 /* get a (constant) string ptr from the global string table
1022 * string will get added if it is not already there.
1023 * len and hash must both be valid for str.
1026 share_hek(char *str, I32 len, register U32 hash)
1028 register XPVHV* xhv;
1030 register HE **oentry;
1034 /* what follows is the moral equivalent of:
1036 if (!(Svp = hv_fetch(strtab, str, len, FALSE)))
1037 hv_store(strtab, str, len, Nullsv, hash);
1039 xhv = (XPVHV*)SvANY(strtab);
1040 /* assert(xhv_array != 0) */
1041 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
1042 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
1043 if (HeHASH(entry) != hash) /* strings can't be equal */
1045 if (HeKLEN(entry) != len)
1047 if (memNE(HeKEY(entry),str,len)) /* is this it? */
1054 HeKEY_hek(entry) = save_hek(str, len, hash);
1055 HeVAL(entry) = Nullsv;
1056 HeNEXT(entry) = *oentry;
1059 if (i) { /* initial entry? */
1061 if (xhv->xhv_keys > xhv->xhv_max)
1066 ++HeVAL(entry); /* use value slot as REFCNT */
1067 return HeKEY_hek(entry);