This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
utf8 keys now work for tied hashes via hv_fetch, hv_store, hv_delete
[perl5.git] / hv.c
CommitLineData
a0d0e21e 1/* hv.c
79072805 2 *
4bb101f2
JH
3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, by Larry Wall and others
79072805
LW
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
a0d0e21e
LW
9 */
10
11/*
12 * "I sit beside the fire and think of all that I have seen." --Bilbo
79072805
LW
13 */
14
d5afce77
RB
15/*
16=head1 Hash Manipulation Functions
17*/
18
79072805 19#include "EXTERN.h"
864dbfa3 20#define PERL_IN_HV_C
3d78eb94 21#define PERL_HASH_INTERNAL_ACCESS
79072805
LW
22#include "perl.h"
23
d8012aaf 24#define HV_MAX_LENGTH_BEFORE_SPLIT 14
fdcd69b6 25
76e3520e 26STATIC HE*
cea2e8a9 27S_new_he(pTHX)
4633a7c4
LW
28{
29 HE* he;
333f433b
DG
30 LOCK_SV_MUTEX;
31 if (!PL_he_root)
8aacddc1 32 more_he();
333f433b
DG
33 he = PL_he_root;
34 PL_he_root = HeNEXT(he);
35 UNLOCK_SV_MUTEX;
36 return he;
4633a7c4
LW
37}
38
76e3520e 39STATIC void
cea2e8a9 40S_del_he(pTHX_ HE *p)
4633a7c4 41{
333f433b 42 LOCK_SV_MUTEX;
3280af22
NIS
43 HeNEXT(p) = (HE*)PL_he_root;
44 PL_he_root = p;
333f433b 45 UNLOCK_SV_MUTEX;
4633a7c4
LW
46}
47
333f433b 48STATIC void
cea2e8a9 49S_more_he(pTHX)
4633a7c4
LW
50{
51 register HE* he;
52 register HE* heend;
612f20c3
GS
53 XPV *ptr;
54 New(54, ptr, 1008/sizeof(XPV), XPV);
55 ptr->xpv_pv = (char*)PL_he_arenaroot;
56 PL_he_arenaroot = ptr;
57
58 he = (HE*)ptr;
4633a7c4 59 heend = &he[1008 / sizeof(HE) - 1];
612f20c3 60 PL_he_root = ++he;
4633a7c4 61 while (he < heend) {
8aacddc1
NIS
62 HeNEXT(he) = (HE*)(he + 1);
63 he++;
4633a7c4 64 }
fde52b5c 65 HeNEXT(he) = 0;
4633a7c4
LW
66}
67
d33b2eba
GS
68#ifdef PURIFY
69
70#define new_HE() (HE*)safemalloc(sizeof(HE))
71#define del_HE(p) safefree((char*)p)
72
73#else
74
75#define new_HE() new_he()
76#define del_HE(p) del_he(p)
77
78#endif
79
76e3520e 80STATIC HEK *
19692e8d 81S_save_hek_flags(pTHX_ const char *str, I32 len, U32 hash, int flags)
bbce6d69 82{
83 char *k;
84 register HEK *hek;
1c846c1f 85
e05949c7 86 New(54, k, HEK_BASESIZE + len + 2, char);
bbce6d69 87 hek = (HEK*)k;
ff68c719 88 Copy(str, HEK_KEY(hek), len, char);
e05949c7 89 HEK_KEY(hek)[len] = 0;
ff68c719 90 HEK_LEN(hek) = len;
91 HEK_HASH(hek) = hash;
19692e8d 92 HEK_FLAGS(hek) = (unsigned char)flags;
bbce6d69 93 return hek;
94}
95
dd28f7bb
DM
96/* free the pool of temporary HE/HEK pairs retunrned by hv_fetch_ent
97 * for tied hashes */
98
99void
100Perl_free_tied_hv_pool(pTHX)
101{
102 HE *ohe;
103 HE *he = PL_hv_fetch_ent_mh;
104 while (he) {
105 Safefree(HeKEY_hek(he));
106 ohe = he;
107 he = HeNEXT(he);
108 del_HE(ohe);
109 }
bf9cdc68 110 PL_hv_fetch_ent_mh = Nullhe;
dd28f7bb
DM
111}
112
d18c6117
GS
113#if defined(USE_ITHREADS)
114HE *
a8fc9800 115Perl_he_dup(pTHX_ HE *e, bool shared, CLONE_PARAMS* param)
d18c6117
GS
116{
117 HE *ret;
118
119 if (!e)
120 return Nullhe;
7766f137
GS
121 /* look for it in the table first */
122 ret = (HE*)ptr_table_fetch(PL_ptr_table, e);
123 if (ret)
124 return ret;
125
126 /* create anew and remember what it is */
d33b2eba 127 ret = new_HE();
7766f137
GS
128 ptr_table_store(PL_ptr_table, e, ret);
129
d2d73c3e 130 HeNEXT(ret) = he_dup(HeNEXT(e),shared, param);
dd28f7bb
DM
131 if (HeKLEN(e) == HEf_SVKEY) {
132 char *k;
133 New(54, k, HEK_BASESIZE + sizeof(SV*), char);
134 HeKEY_hek(ret) = (HEK*)k;
d2d73c3e 135 HeKEY_sv(ret) = SvREFCNT_inc(sv_dup(HeKEY_sv(e), param));
dd28f7bb 136 }
d18c6117 137 else if (shared)
19692e8d
NC
138 HeKEY_hek(ret) = share_hek_flags(HeKEY(e), HeKLEN(e), HeHASH(e),
139 HeKFLAGS(e));
d18c6117 140 else
19692e8d
NC
141 HeKEY_hek(ret) = save_hek_flags(HeKEY(e), HeKLEN(e), HeHASH(e),
142 HeKFLAGS(e));
d2d73c3e 143 HeVAL(ret) = SvREFCNT_inc(sv_dup(HeVAL(e), param));
d18c6117
GS
144 return ret;
145}
146#endif /* USE_ITHREADS */
147
1b1f1335 148static void
2393f1b9
JH
149S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen,
150 const char *msg)
1b1f1335 151{
2393f1b9 152 SV *sv = sv_newmortal(), *esv = sv_newmortal();
19692e8d 153 if (!(flags & HVhek_FREEKEY)) {
1b1f1335
NIS
154 sv_setpvn(sv, key, klen);
155 }
156 else {
157 /* Need to free saved eventually assign to mortal SV */
34c3c4e3 158 /* XXX is this line an error ???: SV *sv = sv_newmortal(); */
1b1f1335
NIS
159 sv_usepvn(sv, (char *) key, klen);
160 }
19692e8d 161 if (flags & HVhek_UTF8) {
1b1f1335
NIS
162 SvUTF8_on(sv);
163 }
2393f1b9
JH
164 Perl_sv_setpvf(aTHX_ esv, "Attempt to %s a restricted hash", msg);
165 Perl_croak(aTHX_ SvPVX(esv), sv);
1b1f1335
NIS
166}
167
fde52b5c 168/* (klen == HEf_SVKEY) is special for MAGICAL hv entries, meaning key slot
169 * contains an SV* */
170
954c1994
GS
171/*
172=for apidoc hv_fetch
173
174Returns the SV which corresponds to the specified key in the hash. The
175C<klen> is the length of the key. If C<lval> is set then the fetch will be
176part of a store. Check that the return value is non-null before
d1be9408 177dereferencing it to an C<SV*>.
954c1994 178
96f1132b 179See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
954c1994
GS
180information on how to use this function on tied hashes.
181
182=cut
183*/
184
19692e8d 185
79072805 186SV**
da58a35d 187Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen, I32 lval)
79072805 188{
da58a35d 189 bool is_utf8 = FALSE;
f9a63242 190 const char *keysave = key;
19692e8d 191 int flags = 0;
463ee0b2 192
da58a35d
JH
193 if (klen < 0) {
194 klen = -klen;
195 is_utf8 = TRUE;
196 }
197
19692e8d
NC
198 if (is_utf8) {
199 STRLEN tmplen = klen;
200 /* Just casting the &klen to (STRLEN) won't work well
201 * if STRLEN and I32 are of different widths. --jhi */
202 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
203 klen = tmplen;
204 /* If we were able to downgrade here, then than means that we were
205 passed in a key which only had chars 0-255, but was utf8 encoded. */
206 if (is_utf8)
207 flags = HVhek_UTF8;
208 /* If we found we were able to downgrade the string to bytes, then
209 we should flag that it needs upgrading on keys or each. */
210 if (key != keysave)
211 flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
212 }
213
214 return hv_fetch_flags (hv, key, klen, lval, flags);
215}
216
df132699 217STATIC SV**
19692e8d
NC
218S_hv_fetch_flags(pTHX_ HV *hv, const char *key, I32 klen, I32 lval, int flags)
219{
220 register XPVHV* xhv;
221 register U32 hash;
222 register HE *entry;
223 SV *sv;
224
225 if (!hv)
226 return 0;
227
8990e307 228 if (SvRMAGICAL(hv)) {
14befaf4 229 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
8990e307 230 sv = sv_newmortal();
dd28f7bb 231 sv_upgrade(sv, SVt_PVLV);
b60cf05a
NC
232 if (flags & HVhek_UTF8) {
233 /* This hack based on the code in hv_exists_ent seems to be
234 the easiest way to pass the utf8 flag through and fix
235 the bug in hv_exists for tied hashes with utf8 keys. */
236 SV *keysv = sv_2mortal(newSVpvn(key, klen));
237 SvUTF8_on(keysv);
238 mg_copy((SV*)hv, sv, (char *)keysv, HEf_SVKEY);
239 } else {
240 mg_copy((SV*)hv, sv, key, klen);
241 }
19692e8d
NC
242 if (flags & HVhek_FREEKEY)
243 Safefree(key);
dd28f7bb
DM
244 LvTYPE(sv) = 't';
245 LvTARG(sv) = sv; /* fake (SV**) */
246 return &(LvTARG(sv));
463ee0b2 247 }
902173a3 248#ifdef ENV_IS_CASELESS
14befaf4 249 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
eb160463 250 I32 i;
e7152ba2
GS
251 for (i = 0; i < klen; ++i)
252 if (isLOWER(key[i])) {
79cb57f6 253 char *nkey = strupr(SvPVX(sv_2mortal(newSVpvn(key,klen))));
e7152ba2 254 SV **ret = hv_fetch(hv, nkey, klen, 0);
19692e8d
NC
255 if (!ret && lval) {
256 ret = hv_store_flags(hv, key, klen, NEWSV(61,0), 0,
257 flags);
258 } else if (flags & HVhek_FREEKEY)
259 Safefree(key);
e7152ba2
GS
260 return ret;
261 }
902173a3
GS
262 }
263#endif
463ee0b2
LW
264 }
265
cbec9347
JH
266 /* We use xhv->xhv_foo fields directly instead of HvFOO(hv) to
267 avoid unnecessary pointer dereferencing. */
268 xhv = (XPVHV*)SvANY(hv);
269 if (!xhv->xhv_array /* !HvARRAY(hv) */) {
1c846c1f 270 if (lval
a0d0e21e 271#ifdef DYNAMIC_ENV_FETCH /* if it's an %ENV lookup, we may get it on the fly */
8aacddc1 272 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
a0d0e21e 273#endif
8aacddc1 274 )
cbec9347
JH
275 Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
276 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
277 char);
19692e8d
NC
278 else {
279 if (flags & HVhek_FREEKEY)
280 Safefree(key);
79072805 281 return 0;
19692e8d 282 }
75a54232 283 }
f9a63242 284
4b5190b5
NC
285 if (HvREHASH(hv)) {
286 PERL_HASH_INTERNAL(hash, key, klen);
fdcd69b6
NC
287 /* Yes, you do need this even though you are not "storing" because
288 you can flip the flags below if doing an lval lookup. (And that
289 was put in to give the semantics Andreas was expecting.) */
290 flags |= HVhek_REHASH;
4b5190b5
NC
291 } else {
292 PERL_HASH(hash, key, klen);
293 }
79072805 294
cbec9347
JH
295 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
296 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 297 for (; entry; entry = HeNEXT(entry)) {
e27ad1f2
AV
298 if (!HeKEY_hek(entry))
299 continue;
fde52b5c 300 if (HeHASH(entry) != hash) /* strings can't be equal */
79072805 301 continue;
eb160463 302 if (HeKLEN(entry) != (I32)klen)
79072805 303 continue;
1c846c1f 304 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
79072805 305 continue;
19692e8d
NC
306 /* flags is 0 if not utf8. need HeKFLAGS(entry) also 0.
307 flags is 1 if utf8. need HeKFLAGS(entry) also 1.
308 xor is true if bits differ, in which case this isn't a match. */
309 if ((HeKFLAGS(entry) ^ flags) & HVhek_UTF8)
c3654f1a 310 continue;
19692e8d
NC
311 if (lval && HeKFLAGS(entry) != flags) {
312 /* We match if HVhek_UTF8 bit in our flags and hash key's match.
313 But if entry was set previously with HVhek_WASUTF8 and key now
314 doesn't (or vice versa) then we should change the key's flag,
315 as this is assignment. */
316 if (HvSHAREKEYS(hv)) {
317 /* Need to swap the key we have for a key with the flags we
318 need. As keys are shared we can't just write to the flag,
319 so we share the new one, unshare the old one. */
320 int flags_nofree = flags & ~HVhek_FREEKEY;
321 HEK *new_hek = share_hek_flags(key, klen, hash, flags_nofree);
322 unshare_hek (HeKEY_hek(entry));
323 HeKEY_hek(entry) = new_hek;
324 }
325 else
326 HeKFLAGS(entry) = flags;
fdcd69b6 327 if (flags & HVhek_ENABLEHVKFLAGS)
27a3632d 328 HvHASKFLAGS_on(hv);
19692e8d
NC
329 }
330 if (flags & HVhek_FREEKEY)
331 Safefree(key);
8aacddc1 332 /* if we find a placeholder, we pretend we haven't found anything */
7996736c 333 if (HeVAL(entry) == &PL_sv_placeholder)
8aacddc1 334 break;
fde52b5c 335 return &HeVAL(entry);
8aacddc1 336
79072805 337 }
a0d0e21e 338#ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
cbec9347 339 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
a6c40364
GS
340 unsigned long len;
341 char *env = PerlEnv_ENVgetenv_len(key,&len);
342 if (env) {
343 sv = newSVpvn(env,len);
344 SvTAINTED_on(sv);
525c8498 345 if (flags & HVhek_FREEKEY)
f9a63242 346 Safefree(key);
a6c40364
GS
347 return hv_store(hv,key,klen,sv,hash);
348 }
a0d0e21e
LW
349 }
350#endif
8aacddc1 351 if (!entry && SvREADONLY(hv)) {
2393f1b9
JH
352 S_hv_notallowed(aTHX_ flags, key, klen,
353 "access disallowed key '%"SVf"' in"
354 );
1b1f1335 355 }
79072805
LW
356 if (lval) { /* gonna assign to this, so it better be there */
357 sv = NEWSV(61,0);
19692e8d 358 return hv_store_flags(hv,key,klen,sv,hash,flags);
79072805 359 }
19692e8d
NC
360 if (flags & HVhek_FREEKEY)
361 Safefree(key);
79072805
LW
362 return 0;
363}
364
d1be9408 365/* returns an HE * structure with the all fields set */
fde52b5c 366/* note that hent_val will be a mortal sv for MAGICAL hashes */
954c1994
GS
367/*
368=for apidoc hv_fetch_ent
369
370Returns the hash entry which corresponds to the specified key in the hash.
371C<hash> must be a valid precomputed hash number for the given C<key>, or 0
372if you want the function to compute it. IF C<lval> is set then the fetch
373will be part of a store. Make sure the return value is non-null before
374accessing it. The return value when C<tb> is a tied hash is a pointer to a
375static location, so be sure to make a copy of the structure if you need to
1c846c1f 376store it somewhere.
954c1994 377
96f1132b 378See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
954c1994
GS
379information on how to use this function on tied hashes.
380
381=cut
382*/
383
fde52b5c 384HE *
864dbfa3 385Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash)
fde52b5c 386{
cbec9347 387 register XPVHV* xhv;
fde52b5c 388 register char *key;
389 STRLEN klen;
390 register HE *entry;
391 SV *sv;
da58a35d 392 bool is_utf8;
19692e8d 393 int flags = 0;
f9a63242 394 char *keysave;
fde52b5c 395
396 if (!hv)
397 return 0;
398
902173a3 399 if (SvRMAGICAL(hv)) {
14befaf4 400 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
902173a3 401 sv = sv_newmortal();
dd28f7bb 402 keysv = newSVsv(keysv);
902173a3 403 mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
dd28f7bb
DM
404 /* grab a fake HE/HEK pair from the pool or make a new one */
405 entry = PL_hv_fetch_ent_mh;
406 if (entry)
407 PL_hv_fetch_ent_mh = HeNEXT(entry);
408 else {
902173a3 409 char *k;
dd28f7bb 410 entry = new_HE();
902173a3 411 New(54, k, HEK_BASESIZE + sizeof(SV*), char);
dd28f7bb 412 HeKEY_hek(entry) = (HEK*)k;
902173a3 413 }
dd28f7bb
DM
414 HeNEXT(entry) = Nullhe;
415 HeSVKEY_set(entry, keysv);
416 HeVAL(entry) = sv;
417 sv_upgrade(sv, SVt_PVLV);
418 LvTYPE(sv) = 'T';
419 LvTARG(sv) = (SV*)entry; /* so we can free entry when freeing sv */
420 return entry;
421 }
902173a3 422#ifdef ENV_IS_CASELESS
14befaf4 423 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
e7152ba2 424 U32 i;
902173a3 425 key = SvPV(keysv, klen);
e7152ba2
GS
426 for (i = 0; i < klen; ++i)
427 if (isLOWER(key[i])) {
79cb57f6 428 SV *nkeysv = sv_2mortal(newSVpvn(key,klen));
e7152ba2
GS
429 (void)strupr(SvPVX(nkeysv));
430 entry = hv_fetch_ent(hv, nkeysv, 0, 0);
431 if (!entry && lval)
432 entry = hv_store_ent(hv, keysv, NEWSV(61,0), hash);
433 return entry;
434 }
902173a3
GS
435 }
436#endif
fde52b5c 437 }
438
34b888b7 439 keysave = key = SvPV(keysv, klen);
cbec9347
JH
440 xhv = (XPVHV*)SvANY(hv);
441 if (!xhv->xhv_array /* !HvARRAY(hv) */) {
1c846c1f 442 if (lval
fde52b5c 443#ifdef DYNAMIC_ENV_FETCH /* if it's an %ENV lookup, we may get it on the fly */
8aacddc1 444 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
fde52b5c 445#endif
8aacddc1 446 )
cbec9347
JH
447 Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
448 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
449 char);
fde52b5c 450 else
451 return 0;
452 }
453
da58a35d 454 is_utf8 = (SvUTF8(keysv)!=0);
1c846c1f 455
19692e8d 456 if (is_utf8) {
f9a63242 457 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
19692e8d
NC
458 if (is_utf8)
459 flags = HVhek_UTF8;
460 if (key != keysave)
461 flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
462 }
f9a63242 463
4b5190b5
NC
464 if (HvREHASH(hv)) {
465 PERL_HASH_INTERNAL(hash, key, klen);
fdcd69b6
NC
466 /* Yes, you do need this even though you are not "storing" because
467 you can flip the flags below if doing an lval lookup. (And that
468 was put in to give the semantics Andreas was expecting.) */
469 flags |= HVhek_REHASH;
4b5190b5 470 } else if (!hash) {
46187eeb
NC
471 if SvIsCOW_shared_hash(keysv) {
472 hash = SvUVX(keysv);
473 } else {
474 PERL_HASH(hash, key, klen);
475 }
476 }
effa1e2d 477
cbec9347
JH
478 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
479 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 480 for (; entry; entry = HeNEXT(entry)) {
481 if (HeHASH(entry) != hash) /* strings can't be equal */
482 continue;
eb160463 483 if (HeKLEN(entry) != (I32)klen)
fde52b5c 484 continue;
1c846c1f 485 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
fde52b5c 486 continue;
19692e8d 487 if ((HeKFLAGS(entry) ^ flags) & HVhek_UTF8)
c3654f1a 488 continue;
19692e8d
NC
489 if (lval && HeKFLAGS(entry) != flags) {
490 /* We match if HVhek_UTF8 bit in our flags and hash key's match.
491 But if entry was set previously with HVhek_WASUTF8 and key now
492 doesn't (or vice versa) then we should change the key's flag,
493 as this is assignment. */
494 if (HvSHAREKEYS(hv)) {
495 /* Need to swap the key we have for a key with the flags we
496 need. As keys are shared we can't just write to the flag,
497 so we share the new one, unshare the old one. */
498 int flags_nofree = flags & ~HVhek_FREEKEY;
499 HEK *new_hek = share_hek_flags(key, klen, hash, flags_nofree);
500 unshare_hek (HeKEY_hek(entry));
501 HeKEY_hek(entry) = new_hek;
502 }
503 else
504 HeKFLAGS(entry) = flags;
fdcd69b6 505 if (flags & HVhek_ENABLEHVKFLAGS)
27a3632d 506 HvHASKFLAGS_on(hv);
19692e8d 507 }
f9a63242
JH
508 if (key != keysave)
509 Safefree(key);
8aacddc1 510 /* if we find a placeholder, we pretend we haven't found anything */
7996736c 511 if (HeVAL(entry) == &PL_sv_placeholder)
8aacddc1 512 break;
fde52b5c 513 return entry;
514 }
515#ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
cbec9347 516 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
a6c40364
GS
517 unsigned long len;
518 char *env = PerlEnv_ENVgetenv_len(key,&len);
519 if (env) {
520 sv = newSVpvn(env,len);
521 SvTAINTED_on(sv);
522 return hv_store_ent(hv,keysv,sv,hash);
523 }
fde52b5c 524 }
525#endif
8aacddc1 526 if (!entry && SvREADONLY(hv)) {
2393f1b9
JH
527 S_hv_notallowed(aTHX_ flags, key, klen,
528 "access disallowed key '%"SVf"' in"
529 );
1b1f1335 530 }
19692e8d 531 if (flags & HVhek_FREEKEY)
f9a63242 532 Safefree(key);
fde52b5c 533 if (lval) { /* gonna assign to this, so it better be there */
534 sv = NEWSV(61,0);
e7152ba2 535 return hv_store_ent(hv,keysv,sv,hash);
fde52b5c 536 }
537 return 0;
538}
539
864dbfa3 540STATIC void
cea2e8a9 541S_hv_magic_check(pTHX_ HV *hv, bool *needs_copy, bool *needs_store)
d0066dc7
OT
542{
543 MAGIC *mg = SvMAGIC(hv);
544 *needs_copy = FALSE;
545 *needs_store = TRUE;
546 while (mg) {
547 if (isUPPER(mg->mg_type)) {
548 *needs_copy = TRUE;
549 switch (mg->mg_type) {
14befaf4
DM
550 case PERL_MAGIC_tied:
551 case PERL_MAGIC_sig:
d0066dc7 552 *needs_store = FALSE;
d0066dc7
OT
553 }
554 }
555 mg = mg->mg_moremagic;
556 }
557}
558
954c1994
GS
559/*
560=for apidoc hv_store
561
562Stores an SV in a hash. The hash key is specified as C<key> and C<klen> is
563the length of the key. The C<hash> parameter is the precomputed hash
564value; if it is zero then Perl will compute it. The return value will be
565NULL if the operation failed or if the value did not need to be actually
566stored within the hash (as in the case of tied hashes). Otherwise it can
567be dereferenced to get the original C<SV*>. Note that the caller is
568responsible for suitably incrementing the reference count of C<val> before
4f646c4b
NC
569the call, and decrementing it if the function returned NULL. Effectively
570a successful hv_store takes ownership of one reference to C<val>. This is
571usually what you want; a newly created SV has a reference count of one, so
572if all your code does is create SVs then store them in a hash, hv_store
573will own the only reference to the new SV, and your code doesn't need to do
574anything further to tidy up. hv_store is not implemented as a call to
575hv_store_ent, and does not create a temporary SV for the key, so if your
576key data is not already in SV form then use hv_store in preference to
577hv_store_ent.
954c1994 578
96f1132b 579See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
954c1994
GS
580information on how to use this function on tied hashes.
581
582=cut
583*/
584
79072805 585SV**
19692e8d
NC
586Perl_hv_store(pTHX_ HV *hv, const char *key, I32 klen, SV *val, U32 hash)
587{
588 bool is_utf8 = FALSE;
589 const char *keysave = key;
590 int flags = 0;
591
e16e2ff8
NC
592 if (klen < 0) {
593 klen = -klen;
594 is_utf8 = TRUE;
595 }
596
19692e8d
NC
597 if (is_utf8) {
598 STRLEN tmplen = klen;
599 /* Just casting the &klen to (STRLEN) won't work well
600 * if STRLEN and I32 are of different widths. --jhi */
601 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
602 klen = tmplen;
603 /* If we were able to downgrade here, then than means that we were
604 passed in a key which only had chars 0-255, but was utf8 encoded. */
605 if (is_utf8)
606 flags = HVhek_UTF8;
607 /* If we found we were able to downgrade the string to bytes, then
608 we should flag that it needs upgrading on keys or each. */
609 if (key != keysave)
610 flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
611 }
612
613 return hv_store_flags (hv, key, klen, val, hash, flags);
614}
615
616SV**
e16e2ff8 617Perl_hv_store_flags(pTHX_ HV *hv, const char *key, I32 klen, SV *val,
19692e8d 618 register U32 hash, int flags)
79072805 619{
cbec9347 620 register XPVHV* xhv;
fdcd69b6 621 register U32 n_links;
79072805
LW
622 register HE *entry;
623 register HE **oentry;
79072805
LW
624
625 if (!hv)
626 return 0;
627
cbec9347 628 xhv = (XPVHV*)SvANY(hv);
463ee0b2 629 if (SvMAGICAL(hv)) {
d0066dc7
OT
630 bool needs_copy;
631 bool needs_store;
632 hv_magic_check (hv, &needs_copy, &needs_store);
633 if (needs_copy) {
b60cf05a
NC
634 if (flags & HVhek_UTF8) {
635 /* This hack based on the code in hv_exists_ent seems to be
636 the easiest way to pass the utf8 flag through and fix
637 the bug in hv_exists for tied hashes with utf8 keys. */
638 SV *keysv = sv_2mortal(newSVpvn(key, klen));
639 SvUTF8_on(keysv);
640 mg_copy((SV*)hv, val, (char *)keysv, HEf_SVKEY);
641 } else {
642 mg_copy((SV*)hv, val, key, klen);
643 }
19692e8d
NC
644 if (!xhv->xhv_array /* !HvARRAY */ && !needs_store) {
645 if (flags & HVhek_FREEKEY)
646 Safefree(key);
d0066dc7 647 return 0;
19692e8d 648 }
902173a3 649#ifdef ENV_IS_CASELESS
14befaf4 650 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
8aacddc1 651 key = savepvn(key,klen);
25716404 652 key = (const char*)strupr((char*)key);
902173a3
GS
653 hash = 0;
654 }
655#endif
d0066dc7 656 }
463ee0b2 657 }
574c8022 658
19692e8d
NC
659 if (flags)
660 HvHASKFLAGS_on((SV*)hv);
f9a63242 661
4b5190b5
NC
662 if (HvREHASH(hv)) {
663 /* We don't have a pointer to the hv, so we have to replicate the
664 flag into every HEK, so that hv_iterkeysv can see it. */
665 flags |= HVhek_REHASH;
666 PERL_HASH_INTERNAL(hash, key, klen);
667 } else if (!hash)
5afd6d42 668 PERL_HASH(hash, key, klen);
fde52b5c 669
cbec9347
JH
670 if (!xhv->xhv_array /* !HvARRAY(hv) */)
671 Newz(505, xhv->xhv_array /* HvARRAY(hv) */,
672 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
673 char);
fde52b5c 674
cbec9347
JH
675 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
676 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 677
fdcd69b6
NC
678 n_links = 0;
679
680 for (entry = *oentry; entry; ++n_links, entry = HeNEXT(entry)) {
fde52b5c 681 if (HeHASH(entry) != hash) /* strings can't be equal */
682 continue;
eb160463 683 if (HeKLEN(entry) != (I32)klen)
fde52b5c 684 continue;
1c846c1f 685 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
fde52b5c 686 continue;
19692e8d 687 if ((HeKFLAGS(entry) ^ flags) & HVhek_UTF8)
c3654f1a 688 continue;
7996736c 689 if (HeVAL(entry) == &PL_sv_placeholder)
8aacddc1
NIS
690 xhv->xhv_placeholders--; /* yes, can store into placeholder slot */
691 else
692 SvREFCNT_dec(HeVAL(entry));
e16e2ff8
NC
693 if (flags & HVhek_PLACEHOLD) {
694 /* We have been requested to insert a placeholder. Currently
695 only Storable is allowed to do this. */
696 xhv->xhv_placeholders++;
7996736c 697 HeVAL(entry) = &PL_sv_placeholder;
e16e2ff8
NC
698 } else
699 HeVAL(entry) = val;
19692e8d
NC
700
701 if (HeKFLAGS(entry) != flags) {
702 /* We match if HVhek_UTF8 bit in our flags and hash key's match.
703 But if entry was set previously with HVhek_WASUTF8 and key now
704 doesn't (or vice versa) then we should change the key's flag,
705 as this is assignment. */
706 if (HvSHAREKEYS(hv)) {
707 /* Need to swap the key we have for a key with the flags we
708 need. As keys are shared we can't just write to the flag,
709 so we share the new one, unshare the old one. */
710 int flags_nofree = flags & ~HVhek_FREEKEY;
711 HEK *new_hek = share_hek_flags(key, klen, hash, flags_nofree);
712 unshare_hek (HeKEY_hek(entry));
713 HeKEY_hek(entry) = new_hek;
714 }
715 else
716 HeKFLAGS(entry) = flags;
717 }
718 if (flags & HVhek_FREEKEY)
719 Safefree(key);
fde52b5c 720 return &HeVAL(entry);
721 }
722
1b1f1335 723 if (SvREADONLY(hv)) {
2393f1b9
JH
724 S_hv_notallowed(aTHX_ flags, key, klen,
725 "access disallowed key '%"SVf"' to"
726 );
1b1f1335
NIS
727 }
728
d33b2eba 729 entry = new_HE();
19692e8d
NC
730 /* share_hek_flags will do the free for us. This might be considered
731 bad API design. */
fde52b5c 732 if (HvSHAREKEYS(hv))
19692e8d 733 HeKEY_hek(entry) = share_hek_flags(key, klen, hash, flags);
fde52b5c 734 else /* gotta do the real thing */
19692e8d 735 HeKEY_hek(entry) = save_hek_flags(key, klen, hash, flags);
e16e2ff8
NC
736 if (flags & HVhek_PLACEHOLD) {
737 /* We have been requested to insert a placeholder. Currently
738 only Storable is allowed to do this. */
739 xhv->xhv_placeholders++;
7996736c 740 HeVAL(entry) = &PL_sv_placeholder;
e16e2ff8
NC
741 } else
742 HeVAL(entry) = val;
fde52b5c 743 HeNEXT(entry) = *oentry;
744 *oentry = entry;
745
cbec9347 746 xhv->xhv_keys++; /* HvKEYS(hv)++ */
fdcd69b6 747 if (!n_links) { /* initial entry? */
cbec9347 748 xhv->xhv_fill++; /* HvFILL(hv)++ */
fdcd69b6
NC
749 } else if ((xhv->xhv_keys > (IV)xhv->xhv_max)
750 || ((n_links > HV_MAX_LENGTH_BEFORE_SPLIT) && !HvREHASH(hv))) {
751 /* Use the old HvKEYS(hv) > HvMAX(hv) condition to limit bucket
752 splits on a rehashed hash, as we're not going to split it again,
753 and if someone is lucky (evil) enough to get all the keys in one
754 list they could exhaust our memory as we repeatedly double the
755 number of buckets on every entry. Linear search feels a less worse
756 thing to do. */
462d8b02 757 hsplit(hv);
79072805
LW
758 }
759
fde52b5c 760 return &HeVAL(entry);
761}
762
954c1994
GS
763/*
764=for apidoc hv_store_ent
765
766Stores C<val> in a hash. The hash key is specified as C<key>. The C<hash>
767parameter is the precomputed hash value; if it is zero then Perl will
768compute it. The return value is the new hash entry so created. It will be
769NULL if the operation failed or if the value did not need to be actually
770stored within the hash (as in the case of tied hashes). Otherwise the
87324b0f 771contents of the return value can be accessed using the C<He?> macros
954c1994
GS
772described here. Note that the caller is responsible for suitably
773incrementing the reference count of C<val> before the call, and
4f646c4b
NC
774decrementing it if the function returned NULL. Effectively a successful
775hv_store_ent takes ownership of one reference to C<val>. This is
776usually what you want; a newly created SV has a reference count of one, so
777if all your code does is create SVs then store them in a hash, hv_store
778will own the only reference to the new SV, and your code doesn't need to do
779anything further to tidy up. Note that hv_store_ent only reads the C<key>;
780unlike C<val> it does not take ownership of it, so maintaining the correct
781reference count on C<key> is entirely the caller's responsibility. hv_store
782is not implemented as a call to hv_store_ent, and does not create a temporary
783SV for the key, so if your key data is not already in SV form then use
784hv_store in preference to hv_store_ent.
954c1994 785
96f1132b 786See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
954c1994
GS
787information on how to use this function on tied hashes.
788
789=cut
790*/
791
fde52b5c 792HE *
19692e8d 793Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, U32 hash)
fde52b5c 794{
19692e8d
NC
795 XPVHV* xhv;
796 char *key;
fde52b5c 797 STRLEN klen;
fdcd69b6 798 U32 n_links;
19692e8d
NC
799 HE *entry;
800 HE **oentry;
da58a35d 801 bool is_utf8;
19692e8d 802 int flags = 0;
f9a63242 803 char *keysave;
fde52b5c 804
805 if (!hv)
806 return 0;
807
cbec9347 808 xhv = (XPVHV*)SvANY(hv);
fde52b5c 809 if (SvMAGICAL(hv)) {
8aacddc1
NIS
810 bool needs_copy;
811 bool needs_store;
812 hv_magic_check (hv, &needs_copy, &needs_store);
813 if (needs_copy) {
814 bool save_taint = PL_tainted;
815 if (PL_tainting)
816 PL_tainted = SvTAINTED(keysv);
817 keysv = sv_2mortal(newSVsv(keysv));
818 mg_copy((SV*)hv, val, (char*)keysv, HEf_SVKEY);
819 TAINT_IF(save_taint);
820 if (!xhv->xhv_array /* !HvARRAY(hv) */ && !needs_store)
821 return Nullhe;
902173a3 822#ifdef ENV_IS_CASELESS
14befaf4 823 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
902173a3 824 key = SvPV(keysv, klen);
79cb57f6 825 keysv = sv_2mortal(newSVpvn(key,klen));
902173a3
GS
826 (void)strupr(SvPVX(keysv));
827 hash = 0;
828 }
829#endif
830 }
fde52b5c 831 }
832
f9a63242 833 keysave = key = SvPV(keysv, klen);
da58a35d 834 is_utf8 = (SvUTF8(keysv) != 0);
902173a3 835
574c8022 836 if (is_utf8) {
f9a63242 837 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
19692e8d
NC
838 if (is_utf8)
839 flags = HVhek_UTF8;
840 if (key != keysave)
841 flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
842 HvHASKFLAGS_on((SV*)hv);
574c8022 843 }
f9a63242 844
4b5190b5
NC
845 if (HvREHASH(hv)) {
846 /* We don't have a pointer to the hv, so we have to replicate the
847 flag into every HEK, so that hv_iterkeysv can see it. */
848 flags |= HVhek_REHASH;
849 PERL_HASH_INTERNAL(hash, key, klen);
850 } else if (!hash) {
46187eeb
NC
851 if SvIsCOW_shared_hash(keysv) {
852 hash = SvUVX(keysv);
853 } else {
854 PERL_HASH(hash, key, klen);
855 }
856 }
fde52b5c 857
cbec9347
JH
858 if (!xhv->xhv_array /* !HvARRAY(hv) */)
859 Newz(505, xhv->xhv_array /* HvARRAY(hv) */,
860 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
861 char);
79072805 862
cbec9347
JH
863 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
864 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fdcd69b6 865 n_links = 0;
19692e8d 866 entry = *oentry;
fdcd69b6 867 for (; entry; ++n_links, entry = HeNEXT(entry)) {
fde52b5c 868 if (HeHASH(entry) != hash) /* strings can't be equal */
79072805 869 continue;
eb160463 870 if (HeKLEN(entry) != (I32)klen)
79072805 871 continue;
1c846c1f 872 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
79072805 873 continue;
19692e8d 874 if ((HeKFLAGS(entry) ^ flags) & HVhek_UTF8)
c3654f1a 875 continue;
7996736c 876 if (HeVAL(entry) == &PL_sv_placeholder)
8aacddc1
NIS
877 xhv->xhv_placeholders--; /* yes, can store into placeholder slot */
878 else
879 SvREFCNT_dec(HeVAL(entry));
fde52b5c 880 HeVAL(entry) = val;
19692e8d
NC
881 if (HeKFLAGS(entry) != flags) {
882 /* We match if HVhek_UTF8 bit in our flags and hash key's match.
883 But if entry was set previously with HVhek_WASUTF8 and key now
884 doesn't (or vice versa) then we should change the key's flag,
885 as this is assignment. */
886 if (HvSHAREKEYS(hv)) {
887 /* Need to swap the key we have for a key with the flags we
888 need. As keys are shared we can't just write to the flag,
889 so we share the new one, unshare the old one. */
890 int flags_nofree = flags & ~HVhek_FREEKEY;
891 HEK *new_hek = share_hek_flags(key, klen, hash, flags_nofree);
892 unshare_hek (HeKEY_hek(entry));
893 HeKEY_hek(entry) = new_hek;
894 }
895 else
896 HeKFLAGS(entry) = flags;
897 }
898 if (flags & HVhek_FREEKEY)
f9a63242 899 Safefree(key);
fde52b5c 900 return entry;
79072805 901 }
79072805 902
1b1f1335 903 if (SvREADONLY(hv)) {
2393f1b9
JH
904 S_hv_notallowed(aTHX_ flags, key, klen,
905 "access disallowed key '%"SVf"' to"
906 );
1b1f1335
NIS
907 }
908
d33b2eba 909 entry = new_HE();
19692e8d
NC
910 /* share_hek_flags will do the free for us. This might be considered
911 bad API design. */
fde52b5c 912 if (HvSHAREKEYS(hv))
19692e8d 913 HeKEY_hek(entry) = share_hek_flags(key, klen, hash, flags);
fde52b5c 914 else /* gotta do the real thing */
19692e8d 915 HeKEY_hek(entry) = save_hek_flags(key, klen, hash, flags);
fde52b5c 916 HeVAL(entry) = val;
fde52b5c 917 HeNEXT(entry) = *oentry;
79072805
LW
918 *oentry = entry;
919
cbec9347 920 xhv->xhv_keys++; /* HvKEYS(hv)++ */
fdcd69b6 921 if (!n_links) { /* initial entry? */
cbec9347 922 xhv->xhv_fill++; /* HvFILL(hv)++ */
fdcd69b6
NC
923 } else if ((xhv->xhv_keys > (IV)xhv->xhv_max)
924 || ((n_links > HV_MAX_LENGTH_BEFORE_SPLIT) && !HvREHASH(hv))) {
925 /* Use only the old HvKEYS(hv) > HvMAX(hv) condition to limit bucket
926 splits on a rehashed hash, as we're not going to split it again,
927 and if someone is lucky (evil) enough to get all the keys in one
928 list they could exhaust our memory as we repeatedly double the
929 number of buckets on every entry. Linear search feels a less worse
930 thing to do. */
931 hsplit(hv);
79072805 932 }
79072805 933
fde52b5c 934 return entry;
79072805
LW
935}
936
954c1994
GS
937/*
938=for apidoc hv_delete
939
940Deletes a key/value pair in the hash. The value SV is removed from the
1c846c1f 941hash and returned to the caller. The C<klen> is the length of the key.
954c1994
GS
942The C<flags> value will normally be zero; if set to G_DISCARD then NULL
943will be returned.
944
945=cut
946*/
947
79072805 948SV *
da58a35d 949Perl_hv_delete(pTHX_ HV *hv, const char *key, I32 klen, I32 flags)
79072805 950{
cbec9347 951 register XPVHV* xhv;
79072805 952 register I32 i;
fde52b5c 953 register U32 hash;
79072805
LW
954 register HE *entry;
955 register HE **oentry;
67a38de0 956 SV **svp;
79072805 957 SV *sv;
da58a35d 958 bool is_utf8 = FALSE;
19692e8d 959 int k_flags = 0;
f9a63242 960 const char *keysave = key;
79072805
LW
961
962 if (!hv)
963 return Nullsv;
da58a35d 964 if (klen < 0) {
f08cf8c7
CB
965 klen = -klen;
966 is_utf8 = TRUE;
da58a35d 967 }
8990e307 968 if (SvRMAGICAL(hv)) {
0a0bb7c7
OT
969 bool needs_copy;
970 bool needs_store;
971 hv_magic_check (hv, &needs_copy, &needs_store);
972
b60cf05a
NC
973// XXX PerlIO_printf(PerlIO_stderr(), "%d %d\n", is_utf8, klen);
974 if (needs_copy
975 && (svp = hv_fetch(hv, key, is_utf8 ? -klen : klen, TRUE))) {
67a38de0 976 sv = *svp;
f08cf8c7
CB
977 if (SvMAGICAL(sv)) {
978 mg_clear(sv);
979 }
0a0bb7c7 980 if (!needs_store) {
14befaf4
DM
981 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
982 /* No longer an element */
983 sv_unmagic(sv, PERL_MAGIC_tiedelem);
0a0bb7c7
OT
984 return sv;
985 }
986 return Nullsv; /* element cannot be deleted */
987 }
902173a3 988#ifdef ENV_IS_CASELESS
14befaf4 989 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
79cb57f6 990 sv = sv_2mortal(newSVpvn(key,klen));
2fd1c6b8
GS
991 key = strupr(SvPVX(sv));
992 }
902173a3 993#endif
8aacddc1 994 }
463ee0b2 995 }
cbec9347
JH
996 xhv = (XPVHV*)SvANY(hv);
997 if (!xhv->xhv_array /* !HvARRAY(hv) */)
79072805 998 return Nullsv;
fde52b5c 999
77caf834 1000 if (is_utf8) {
75a54232
JH
1001 STRLEN tmplen = klen;
1002 /* See the note in hv_fetch(). --jhi */
1003 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
1004 klen = tmplen;
19692e8d
NC
1005 if (is_utf8)
1006 k_flags = HVhek_UTF8;
1007 if (key != keysave)
1008 k_flags |= HVhek_FREEKEY;
75a54232 1009 }
f9a63242 1010
4b5190b5
NC
1011 if (HvREHASH(hv)) {
1012 PERL_HASH_INTERNAL(hash, key, klen);
1013 } else {
1014 PERL_HASH(hash, key, klen);
1015 }
79072805 1016
cbec9347
JH
1017 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1018 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
79072805
LW
1019 entry = *oentry;
1020 i = 1;
fde52b5c 1021 for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
1022 if (HeHASH(entry) != hash) /* strings can't be equal */
79072805 1023 continue;
eb160463 1024 if (HeKLEN(entry) != (I32)klen)
79072805 1025 continue;
1c846c1f 1026 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
79072805 1027 continue;
19692e8d 1028 if ((HeKFLAGS(entry) ^ k_flags) & HVhek_UTF8)
c3654f1a 1029 continue;
19692e8d 1030 if (k_flags & HVhek_FREEKEY)
f9a63242 1031 Safefree(key);
8aacddc1 1032 /* if placeholder is here, it's already been deleted.... */
7996736c 1033 if (HeVAL(entry) == &PL_sv_placeholder)
8aacddc1
NIS
1034 {
1035 if (SvREADONLY(hv))
1036 return Nullsv; /* if still SvREADONLY, leave it deleted. */
1037 else {
1038 /* okay, really delete the placeholder... */
1039 *oentry = HeNEXT(entry);
1040 if (i && !*oentry)
1041 xhv->xhv_fill--; /* HvFILL(hv)-- */
1042 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
1043 HvLAZYDEL_on(hv);
1044 else
1045 hv_free_ent(hv, entry);
1046 xhv->xhv_keys--; /* HvKEYS(hv)-- */
574c8022 1047 if (xhv->xhv_keys == 0)
19692e8d 1048 HvHASKFLAGS_off(hv);
8aacddc1
NIS
1049 xhv->xhv_placeholders--;
1050 return Nullsv;
1051 }
1052 }
1053 else if (SvREADONLY(hv) && HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
2393f1b9
JH
1054 S_hv_notallowed(aTHX_ k_flags, key, klen,
1055 "delete readonly key '%"SVf"' from"
1056 );
8aacddc1
NIS
1057 }
1058
748a9306
LW
1059 if (flags & G_DISCARD)
1060 sv = Nullsv;
94f7643d 1061 else {
79d01fbf 1062 sv = sv_2mortal(HeVAL(entry));
7996736c 1063 HeVAL(entry) = &PL_sv_placeholder;
94f7643d 1064 }
8aacddc1
NIS
1065
1066 /*
1067 * If a restricted hash, rather than really deleting the entry, put
1068 * a placeholder there. This marks the key as being "approved", so
1069 * we can still access via not-really-existing key without raising
1070 * an error.
1071 */
1072 if (SvREADONLY(hv)) {
7996736c 1073 HeVAL(entry) = &PL_sv_placeholder;
8aacddc1
NIS
1074 /* We'll be saving this slot, so the number of allocated keys
1075 * doesn't go down, but the number placeholders goes up */
1076 xhv->xhv_placeholders++; /* HvPLACEHOLDERS(hv)++ */
1077 } else {
a26e96df
NIS
1078 *oentry = HeNEXT(entry);
1079 if (i && !*oentry)
1080 xhv->xhv_fill--; /* HvFILL(hv)-- */
8aacddc1
NIS
1081 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
1082 HvLAZYDEL_on(hv);
1083 else
1084 hv_free_ent(hv, entry);
1085 xhv->xhv_keys--; /* HvKEYS(hv)-- */
574c8022 1086 if (xhv->xhv_keys == 0)
19692e8d 1087 HvHASKFLAGS_off(hv);
8aacddc1 1088 }
fde52b5c 1089 return sv;
1090 }
8aacddc1 1091 if (SvREADONLY(hv)) {
2393f1b9
JH
1092 S_hv_notallowed(aTHX_ k_flags, key, klen,
1093 "access disallowed key '%"SVf"' from"
1094 );
8aacddc1
NIS
1095 }
1096
19692e8d 1097 if (k_flags & HVhek_FREEKEY)
f9a63242 1098 Safefree(key);
fde52b5c 1099 return Nullsv;
1100}
1101
954c1994
GS
1102/*
1103=for apidoc hv_delete_ent
1104
1105Deletes a key/value pair in the hash. The value SV is removed from the
1106hash and returned to the caller. The C<flags> value will normally be zero;
1107if set to G_DISCARD then NULL will be returned. C<hash> can be a valid
1108precomputed hash value, or 0 to ask for it to be computed.
1109
1110=cut
1111*/
1112
fde52b5c 1113SV *
864dbfa3 1114Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
fde52b5c 1115{
cbec9347 1116 register XPVHV* xhv;
fde52b5c 1117 register I32 i;
1118 register char *key;
1119 STRLEN klen;
1120 register HE *entry;
1121 register HE **oentry;
1122 SV *sv;
da58a35d 1123 bool is_utf8;
19692e8d 1124 int k_flags = 0;
f9a63242 1125 char *keysave;
1c846c1f 1126
fde52b5c 1127 if (!hv)
1128 return Nullsv;
1129 if (SvRMAGICAL(hv)) {
0a0bb7c7
OT
1130 bool needs_copy;
1131 bool needs_store;
1132 hv_magic_check (hv, &needs_copy, &needs_store);
1133
67a38de0 1134 if (needs_copy && (entry = hv_fetch_ent(hv, keysv, TRUE, hash))) {
0a0bb7c7 1135 sv = HeVAL(entry);
f08cf8c7
CB
1136 if (SvMAGICAL(sv)) {
1137 mg_clear(sv);
1138 }
0a0bb7c7 1139 if (!needs_store) {
14befaf4
DM
1140 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
1141 /* No longer an element */
1142 sv_unmagic(sv, PERL_MAGIC_tiedelem);
0a0bb7c7
OT
1143 return sv;
1144 }
1145 return Nullsv; /* element cannot be deleted */
1146 }
902173a3 1147#ifdef ENV_IS_CASELESS
14befaf4 1148 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
2fd1c6b8 1149 key = SvPV(keysv, klen);
79cb57f6 1150 keysv = sv_2mortal(newSVpvn(key,klen));
2fd1c6b8 1151 (void)strupr(SvPVX(keysv));
1c846c1f 1152 hash = 0;
2fd1c6b8 1153 }
902173a3 1154#endif
2fd1c6b8 1155 }
fde52b5c 1156 }
cbec9347
JH
1157 xhv = (XPVHV*)SvANY(hv);
1158 if (!xhv->xhv_array /* !HvARRAY(hv) */)
fde52b5c 1159 return Nullsv;
1160
f9a63242 1161 keysave = key = SvPV(keysv, klen);
da58a35d 1162 is_utf8 = (SvUTF8(keysv) != 0);
1c846c1f 1163
19692e8d 1164 if (is_utf8) {
f9a63242 1165 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
19692e8d
NC
1166 if (is_utf8)
1167 k_flags = HVhek_UTF8;
1168 if (key != keysave)
1169 k_flags |= HVhek_FREEKEY;
1170 }
f9a63242 1171
4b5190b5
NC
1172 if (HvREHASH(hv)) {
1173 PERL_HASH_INTERNAL(hash, key, klen);
1174 } else if (!hash) {
5afd6d42 1175 PERL_HASH(hash, key, klen);
4b5190b5 1176 }
fde52b5c 1177
cbec9347
JH
1178 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1179 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 1180 entry = *oentry;
1181 i = 1;
1182 for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
1183 if (HeHASH(entry) != hash) /* strings can't be equal */
1184 continue;
eb160463 1185 if (HeKLEN(entry) != (I32)klen)
fde52b5c 1186 continue;
1c846c1f 1187 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
fde52b5c 1188 continue;
19692e8d 1189 if ((HeKFLAGS(entry) ^ k_flags) & HVhek_UTF8)
c3654f1a 1190 continue;
19692e8d
NC
1191 if (k_flags & HVhek_FREEKEY)
1192 Safefree(key);
8aacddc1
NIS
1193
1194 /* if placeholder is here, it's already been deleted.... */
7996736c 1195 if (HeVAL(entry) == &PL_sv_placeholder)
8aacddc1
NIS
1196 {
1197 if (SvREADONLY(hv))
1198 return Nullsv; /* if still SvREADONLY, leave it deleted. */
03fed38d
MB
1199
1200 /* okay, really delete the placeholder. */
1201 *oentry = HeNEXT(entry);
1202 if (i && !*oentry)
1203 xhv->xhv_fill--; /* HvFILL(hv)-- */
1204 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
1205 HvLAZYDEL_on(hv);
1206 else
1207 hv_free_ent(hv, entry);
1208 xhv->xhv_keys--; /* HvKEYS(hv)-- */
574c8022 1209 if (xhv->xhv_keys == 0)
19692e8d 1210 HvHASKFLAGS_off(hv);
03fed38d
MB
1211 xhv->xhv_placeholders--;
1212 return Nullsv;
8aacddc1
NIS
1213 }
1214 else if (SvREADONLY(hv) && HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
2393f1b9
JH
1215 S_hv_notallowed(aTHX_ k_flags, key, klen,
1216 "delete readonly key '%"SVf"' from"
1217 );
8aacddc1
NIS
1218 }
1219
fde52b5c 1220 if (flags & G_DISCARD)
1221 sv = Nullsv;
94f7643d 1222 else {
79d01fbf 1223 sv = sv_2mortal(HeVAL(entry));
7996736c 1224 HeVAL(entry) = &PL_sv_placeholder;
94f7643d 1225 }
8aacddc1
NIS
1226
1227 /*
1228 * If a restricted hash, rather than really deleting the entry, put
1229 * a placeholder there. This marks the key as being "approved", so
1230 * we can still access via not-really-existing key without raising
1231 * an error.
1232 */
1233 if (SvREADONLY(hv)) {
7996736c 1234 HeVAL(entry) = &PL_sv_placeholder;
8aacddc1
NIS
1235 /* We'll be saving this slot, so the number of allocated keys
1236 * doesn't go down, but the number placeholders goes up */
1237 xhv->xhv_placeholders++; /* HvPLACEHOLDERS(hv)++ */
1238 } else {
a26e96df
NIS
1239 *oentry = HeNEXT(entry);
1240 if (i && !*oentry)
1241 xhv->xhv_fill--; /* HvFILL(hv)-- */
8aacddc1
NIS
1242 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
1243 HvLAZYDEL_on(hv);
1244 else
1245 hv_free_ent(hv, entry);
1246 xhv->xhv_keys--; /* HvKEYS(hv)-- */
574c8022 1247 if (xhv->xhv_keys == 0)
19692e8d 1248 HvHASKFLAGS_off(hv);
8aacddc1 1249 }
79072805
LW
1250 return sv;
1251 }
8aacddc1 1252 if (SvREADONLY(hv)) {
2393f1b9
JH
1253 S_hv_notallowed(aTHX_ k_flags, key, klen,
1254 "delete disallowed key '%"SVf"' from"
1255 );
8aacddc1
NIS
1256 }
1257
19692e8d 1258 if (k_flags & HVhek_FREEKEY)
f9a63242 1259 Safefree(key);
79072805 1260 return Nullsv;
79072805
LW
1261}
1262
954c1994
GS
1263/*
1264=for apidoc hv_exists
1265
1266Returns a boolean indicating whether the specified hash key exists. The
1267C<klen> is the length of the key.
1268
1269=cut
1270*/
1271
a0d0e21e 1272bool
da58a35d 1273Perl_hv_exists(pTHX_ HV *hv, const char *key, I32 klen)
a0d0e21e 1274{
cbec9347 1275 register XPVHV* xhv;
fde52b5c 1276 register U32 hash;
a0d0e21e
LW
1277 register HE *entry;
1278 SV *sv;
da58a35d 1279 bool is_utf8 = FALSE;
f9a63242 1280 const char *keysave = key;
19692e8d 1281 int k_flags = 0;
a0d0e21e
LW
1282
1283 if (!hv)
1284 return 0;
1285
da58a35d
JH
1286 if (klen < 0) {
1287 klen = -klen;
1288 is_utf8 = TRUE;
1289 }
1290
a0d0e21e 1291 if (SvRMAGICAL(hv)) {
14befaf4 1292 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
a0d0e21e 1293 sv = sv_newmortal();
0314122a
NC
1294 if (is_utf8) {
1295 /* This hack based on the code in hv_exists_ent seems to be
1296 the easiest way to pass the utf8 flag through and fix
1297 the bug in hv_exists for tied hashes with utf8 keys. */
1298 SV *keysv = sv_2mortal(newSVpvn(key, klen));
1299 SvUTF8_on(keysv);
1300 key = (char *)keysv;
1301 klen = HEf_SVKEY;
1302 }
1c846c1f 1303 mg_copy((SV*)hv, sv, key, klen);
14befaf4 1304 magic_existspack(sv, mg_find(sv, PERL_MAGIC_tiedelem));
8a31060d 1305 return (bool)SvTRUE(sv);
a0d0e21e 1306 }
902173a3 1307#ifdef ENV_IS_CASELESS
14befaf4 1308 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
79cb57f6 1309 sv = sv_2mortal(newSVpvn(key,klen));
902173a3
GS
1310 key = strupr(SvPVX(sv));
1311 }
1312#endif
a0d0e21e
LW
1313 }
1314
cbec9347 1315 xhv = (XPVHV*)SvANY(hv);
f675dbe5 1316#ifndef DYNAMIC_ENV_FETCH
cbec9347 1317 if (!xhv->xhv_array /* !HvARRAY(hv) */)
1c846c1f 1318 return 0;
f675dbe5 1319#endif
a0d0e21e 1320
77caf834 1321 if (is_utf8) {
75a54232
JH
1322 STRLEN tmplen = klen;
1323 /* See the note in hv_fetch(). --jhi */
1324 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
1325 klen = tmplen;
19692e8d
NC
1326 if (is_utf8)
1327 k_flags = HVhek_UTF8;
1328 if (key != keysave)
1329 k_flags |= HVhek_FREEKEY;
75a54232 1330 }
f9a63242 1331
4b5190b5
NC
1332 if (HvREHASH(hv)) {
1333 PERL_HASH_INTERNAL(hash, key, klen);
1334 } else {
1335 PERL_HASH(hash, key, klen);
1336 }
a0d0e21e 1337
f675dbe5 1338#ifdef DYNAMIC_ENV_FETCH
cbec9347 1339 if (!xhv->xhv_array /* !HvARRAY(hv) */) entry = Null(HE*);
f675dbe5
CB
1340 else
1341#endif
cbec9347
JH
1342 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1343 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 1344 for (; entry; entry = HeNEXT(entry)) {
1345 if (HeHASH(entry) != hash) /* strings can't be equal */
a0d0e21e 1346 continue;
fde52b5c 1347 if (HeKLEN(entry) != klen)
a0d0e21e 1348 continue;
1c846c1f 1349 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
fde52b5c 1350 continue;
19692e8d 1351 if ((HeKFLAGS(entry) ^ k_flags) & HVhek_UTF8)
c3654f1a 1352 continue;
19692e8d 1353 if (k_flags & HVhek_FREEKEY)
f9a63242 1354 Safefree(key);
8aacddc1 1355 /* If we find the key, but the value is a placeholder, return false. */
7996736c 1356 if (HeVAL(entry) == &PL_sv_placeholder)
8aacddc1
NIS
1357 return FALSE;
1358
fde52b5c 1359 return TRUE;
1360 }
f675dbe5 1361#ifdef DYNAMIC_ENV_FETCH /* is it out there? */
cbec9347 1362 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
a6c40364
GS
1363 unsigned long len;
1364 char *env = PerlEnv_ENVgetenv_len(key,&len);
1365 if (env) {
1366 sv = newSVpvn(env,len);
1367 SvTAINTED_on(sv);
1368 (void)hv_store(hv,key,klen,sv,hash);
19692e8d
NC
1369 if (k_flags & HVhek_FREEKEY)
1370 Safefree(key);
a6c40364
GS
1371 return TRUE;
1372 }
f675dbe5
CB
1373 }
1374#endif
19692e8d
NC
1375 if (k_flags & HVhek_FREEKEY)
1376 Safefree(key);
fde52b5c 1377 return FALSE;
1378}
1379
1380
954c1994
GS
1381/*
1382=for apidoc hv_exists_ent
1383
1384Returns a boolean indicating whether the specified hash key exists. C<hash>
1385can be a valid precomputed hash value, or 0 to ask for it to be
1386computed.
1387
1388=cut
1389*/
1390
fde52b5c 1391bool
864dbfa3 1392Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
fde52b5c 1393{
cbec9347 1394 register XPVHV* xhv;
fde52b5c 1395 register char *key;
1396 STRLEN klen;
1397 register HE *entry;
1398 SV *sv;
c3654f1a 1399 bool is_utf8;
f9a63242 1400 char *keysave;
19692e8d 1401 int k_flags = 0;
fde52b5c 1402
1403 if (!hv)
1404 return 0;
1405
1406 if (SvRMAGICAL(hv)) {
14befaf4 1407 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
8aacddc1 1408 SV* svret = sv_newmortal();
fde52b5c 1409 sv = sv_newmortal();
effa1e2d 1410 keysv = sv_2mortal(newSVsv(keysv));
1c846c1f 1411 mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
8aacddc1 1412 magic_existspack(svret, mg_find(sv, PERL_MAGIC_tiedelem));
8a31060d 1413 return (bool)SvTRUE(svret);
fde52b5c 1414 }
902173a3 1415#ifdef ENV_IS_CASELESS
14befaf4 1416 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
902173a3 1417 key = SvPV(keysv, klen);
79cb57f6 1418 keysv = sv_2mortal(newSVpvn(key,klen));
902173a3 1419 (void)strupr(SvPVX(keysv));
1c846c1f 1420 hash = 0;
902173a3
GS
1421 }
1422#endif
fde52b5c 1423 }
1424
cbec9347 1425 xhv = (XPVHV*)SvANY(hv);
f675dbe5 1426#ifndef DYNAMIC_ENV_FETCH
cbec9347 1427 if (!xhv->xhv_array /* !HvARRAY(hv) */)
1c846c1f 1428 return 0;
f675dbe5 1429#endif
fde52b5c 1430
f9a63242 1431 keysave = key = SvPV(keysv, klen);
c3654f1a 1432 is_utf8 = (SvUTF8(keysv) != 0);
19692e8d 1433 if (is_utf8) {
f9a63242 1434 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
19692e8d
NC
1435 if (is_utf8)
1436 k_flags = HVhek_UTF8;
1437 if (key != keysave)
1438 k_flags |= HVhek_FREEKEY;
1439 }
4b5190b5
NC
1440 if (HvREHASH(hv)) {
1441 PERL_HASH_INTERNAL(hash, key, klen);
1442 } else if (!hash)
5afd6d42 1443 PERL_HASH(hash, key, klen);
fde52b5c 1444
f675dbe5 1445#ifdef DYNAMIC_ENV_FETCH
cbec9347 1446 if (!xhv->xhv_array /* !HvARRAY(hv) */) entry = Null(HE*);
f675dbe5
CB
1447 else
1448#endif
cbec9347
JH
1449 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1450 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 1451 for (; entry; entry = HeNEXT(entry)) {
1452 if (HeHASH(entry) != hash) /* strings can't be equal */
1453 continue;
eb160463 1454 if (HeKLEN(entry) != (I32)klen)
fde52b5c 1455 continue;
1c846c1f 1456 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
a0d0e21e 1457 continue;
19692e8d 1458 if ((HeKFLAGS(entry) ^ k_flags) & HVhek_UTF8)
c3654f1a 1459 continue;
19692e8d 1460 if (k_flags & HVhek_FREEKEY)
f9a63242 1461 Safefree(key);
8aacddc1 1462 /* If we find the key, but the value is a placeholder, return false. */
7996736c 1463 if (HeVAL(entry) == &PL_sv_placeholder)
8aacddc1 1464 return FALSE;
a0d0e21e
LW
1465 return TRUE;
1466 }
f675dbe5 1467#ifdef DYNAMIC_ENV_FETCH /* is it out there? */
cbec9347 1468 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
a6c40364
GS
1469 unsigned long len;
1470 char *env = PerlEnv_ENVgetenv_len(key,&len);
1471 if (env) {
1472 sv = newSVpvn(env,len);
1473 SvTAINTED_on(sv);
1474 (void)hv_store_ent(hv,keysv,sv,hash);
19692e8d
NC
1475 if (k_flags & HVhek_FREEKEY)
1476 Safefree(key);
a6c40364
GS
1477 return TRUE;
1478 }
f675dbe5
CB
1479 }
1480#endif
19692e8d
NC
1481 if (k_flags & HVhek_FREEKEY)
1482 Safefree(key);
a0d0e21e
LW
1483 return FALSE;
1484}
1485
76e3520e 1486STATIC void
cea2e8a9 1487S_hsplit(pTHX_ HV *hv)
79072805 1488{
cbec9347
JH
1489 register XPVHV* xhv = (XPVHV*)SvANY(hv);
1490 I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
79072805
LW
1491 register I32 newsize = oldsize * 2;
1492 register I32 i;
cbec9347 1493 register char *a = xhv->xhv_array; /* HvARRAY(hv) */
72311751
GS
1494 register HE **aep;
1495 register HE **bep;
79072805
LW
1496 register HE *entry;
1497 register HE **oentry;
4b5190b5
NC
1498 int longest_chain = 0;
1499 int was_shared;
79072805 1500
3280af22 1501 PL_nomemok = TRUE;
8d6dde3e 1502#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
d18c6117 1503 Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
422a93e5 1504 if (!a) {
4a33f861 1505 PL_nomemok = FALSE;
422a93e5
GA
1506 return;
1507 }
4633a7c4 1508#else
d18c6117 1509 New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
422a93e5 1510 if (!a) {
3280af22 1511 PL_nomemok = FALSE;
422a93e5
GA
1512 return;
1513 }
cbec9347 1514 Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
fba3b22e 1515 if (oldsize >= 64) {
cbec9347
JH
1516 offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
1517 PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
4633a7c4
LW
1518 }
1519 else
cbec9347 1520 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
4633a7c4
LW
1521#endif
1522
3280af22 1523 PL_nomemok = FALSE;
72311751 1524 Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
cbec9347
JH
1525 xhv->xhv_max = --newsize; /* HvMAX(hv) = --newsize */
1526 xhv->xhv_array = a; /* HvARRAY(hv) = a */
72311751 1527 aep = (HE**)a;
79072805 1528
72311751 1529 for (i=0; i<oldsize; i++,aep++) {
4b5190b5
NC
1530 int left_length = 0;
1531 int right_length = 0;
1532
72311751 1533 if (!*aep) /* non-existent */
79072805 1534 continue;
72311751
GS
1535 bep = aep+oldsize;
1536 for (oentry = aep, entry = *aep; entry; entry = *oentry) {
eb160463 1537 if ((HeHASH(entry) & newsize) != (U32)i) {
fde52b5c 1538 *oentry = HeNEXT(entry);
72311751
GS
1539 HeNEXT(entry) = *bep;
1540 if (!*bep)
cbec9347 1541 xhv->xhv_fill++; /* HvFILL(hv)++ */
72311751 1542 *bep = entry;
4b5190b5 1543 right_length++;
79072805
LW
1544 continue;
1545 }
4b5190b5 1546 else {
fde52b5c 1547 oentry = &HeNEXT(entry);
4b5190b5
NC
1548 left_length++;
1549 }
79072805 1550 }
72311751 1551 if (!*aep) /* everything moved */
cbec9347 1552 xhv->xhv_fill--; /* HvFILL(hv)-- */
4b5190b5
NC
1553 /* I think we don't actually need to keep track of the longest length,
1554 merely flag if anything is too long. But for the moment while
1555 developing this code I'll track it. */
1556 if (left_length > longest_chain)
1557 longest_chain = left_length;
1558 if (right_length > longest_chain)
1559 longest_chain = right_length;
1560 }
1561
1562
1563 /* Pick your policy for "hashing isn't working" here: */
fdcd69b6 1564 if (longest_chain <= HV_MAX_LENGTH_BEFORE_SPLIT /* split worked? */
4b5190b5
NC
1565 || HvREHASH(hv)) {
1566 return;
79072805 1567 }
4b5190b5
NC
1568
1569 if (hv == PL_strtab) {
1570 /* Urg. Someone is doing something nasty to the string table.
1571 Can't win. */
1572 return;
1573 }
1574
1575 /* Awooga. Awooga. Pathological data. */
fdcd69b6 1576 /*PerlIO_printf(PerlIO_stderr(), "%p %d of %d with %d/%d buckets\n", hv,
4b5190b5
NC
1577 longest_chain, HvTOTALKEYS(hv), HvFILL(hv), 1+HvMAX(hv));*/
1578
1579 ++newsize;
1580 Newz(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1581 was_shared = HvSHAREKEYS(hv);
1582
1583 xhv->xhv_fill = 0;
1584 HvSHAREKEYS_off(hv);
1585 HvREHASH_on(hv);
1586
1587 aep = (HE **) xhv->xhv_array;
1588
1589 for (i=0; i<newsize; i++,aep++) {
1590 entry = *aep;
1591 while (entry) {
1592 /* We're going to trash this HE's next pointer when we chain it
1593 into the new hash below, so store where we go next. */
1594 HE *next = HeNEXT(entry);
1595 UV hash;
1596
1597 /* Rehash it */
1598 PERL_HASH_INTERNAL(hash, HeKEY(entry), HeKLEN(entry));
1599
1600 if (was_shared) {
1601 /* Unshare it. */
1602 HEK *new_hek
1603 = save_hek_flags(HeKEY(entry), HeKLEN(entry),
1604 hash, HeKFLAGS(entry));
1605 unshare_hek (HeKEY_hek(entry));
1606 HeKEY_hek(entry) = new_hek;
1607 } else {
1608 /* Not shared, so simply write the new hash in. */
1609 HeHASH(entry) = hash;
1610 }
1611 /*PerlIO_printf(PerlIO_stderr(), "%d ", HeKFLAGS(entry));*/
1612 HEK_REHASH_on(HeKEY_hek(entry));
1613 /*PerlIO_printf(PerlIO_stderr(), "%d\n", HeKFLAGS(entry));*/
1614
1615 /* Copy oentry to the correct new chain. */
1616 bep = ((HE**)a) + (hash & (I32) xhv->xhv_max);
1617 if (!*bep)
1618 xhv->xhv_fill++; /* HvFILL(hv)++ */
1619 HeNEXT(entry) = *bep;
1620 *bep = entry;
1621
1622 entry = next;
1623 }
1624 }
1625 Safefree (xhv->xhv_array);
1626 xhv->xhv_array = a; /* HvARRAY(hv) = a */
79072805
LW
1627}
1628
72940dca 1629void
864dbfa3 1630Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
72940dca 1631{
cbec9347
JH
1632 register XPVHV* xhv = (XPVHV*)SvANY(hv);
1633 I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
72940dca 1634 register I32 newsize;
1635 register I32 i;
1636 register I32 j;
72311751
GS
1637 register char *a;
1638 register HE **aep;
72940dca 1639 register HE *entry;
1640 register HE **oentry;
1641
1642 newsize = (I32) newmax; /* possible truncation here */
1643 if (newsize != newmax || newmax <= oldsize)
1644 return;
1645 while ((newsize & (1 + ~newsize)) != newsize) {
1646 newsize &= ~(newsize & (1 + ~newsize)); /* get proper power of 2 */
1647 }
1648 if (newsize < newmax)
1649 newsize *= 2;
1650 if (newsize < newmax)
1651 return; /* overflow detection */
1652
cbec9347 1653 a = xhv->xhv_array; /* HvARRAY(hv) */
72940dca 1654 if (a) {
3280af22 1655 PL_nomemok = TRUE;
8d6dde3e 1656#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
d18c6117 1657 Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
8aacddc1 1658 if (!a) {
4a33f861 1659 PL_nomemok = FALSE;
422a93e5
GA
1660 return;
1661 }
72940dca 1662#else
d18c6117 1663 New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
8aacddc1 1664 if (!a) {
3280af22 1665 PL_nomemok = FALSE;
422a93e5
GA
1666 return;
1667 }
cbec9347 1668 Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
fba3b22e 1669 if (oldsize >= 64) {
cbec9347
JH
1670 offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
1671 PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
72940dca 1672 }
1673 else
cbec9347 1674 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
72940dca 1675#endif
3280af22 1676 PL_nomemok = FALSE;
72311751 1677 Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
72940dca 1678 }
1679 else {
d18c6117 1680 Newz(0, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
72940dca 1681 }
cbec9347
JH
1682 xhv->xhv_max = --newsize; /* HvMAX(hv) = --newsize */
1683 xhv->xhv_array = a; /* HvARRAY(hv) = a */
1684 if (!xhv->xhv_fill /* !HvFILL(hv) */) /* skip rest if no entries */
72940dca 1685 return;
1686
72311751
GS
1687 aep = (HE**)a;
1688 for (i=0; i<oldsize; i++,aep++) {
1689 if (!*aep) /* non-existent */
72940dca 1690 continue;
72311751 1691 for (oentry = aep, entry = *aep; entry; entry = *oentry) {
72940dca 1692 if ((j = (HeHASH(entry) & newsize)) != i) {
1693 j -= i;
1694 *oentry = HeNEXT(entry);
72311751 1695 if (!(HeNEXT(entry) = aep[j]))
cbec9347 1696 xhv->xhv_fill++; /* HvFILL(hv)++ */
72311751 1697 aep[j] = entry;
72940dca 1698 continue;
1699 }
1700 else
1701 oentry = &HeNEXT(entry);
1702 }
72311751 1703 if (!*aep) /* everything moved */
cbec9347 1704 xhv->xhv_fill--; /* HvFILL(hv)-- */
72940dca 1705 }
1706}
1707
954c1994
GS
1708/*
1709=for apidoc newHV
1710
1711Creates a new HV. The reference count is set to 1.
1712
1713=cut
1714*/
1715
79072805 1716HV *
864dbfa3 1717Perl_newHV(pTHX)
79072805
LW
1718{
1719 register HV *hv;
cbec9347 1720 register XPVHV* xhv;
79072805 1721
a0d0e21e
LW
1722 hv = (HV*)NEWSV(502,0);
1723 sv_upgrade((SV *)hv, SVt_PVHV);
cbec9347 1724 xhv = (XPVHV*)SvANY(hv);
79072805
LW
1725 SvPOK_off(hv);
1726 SvNOK_off(hv);
1c846c1f 1727#ifndef NODEFAULT_SHAREKEYS
fde52b5c 1728 HvSHAREKEYS_on(hv); /* key-sharing on by default */
1c846c1f 1729#endif
4b5190b5 1730
cbec9347
JH
1731 xhv->xhv_max = 7; /* HvMAX(hv) = 7 (start with 8 buckets) */
1732 xhv->xhv_fill = 0; /* HvFILL(hv) = 0 */
1733 xhv->xhv_pmroot = 0; /* HvPMROOT(hv) = 0 */
79072805
LW
1734 (void)hv_iterinit(hv); /* so each() will start off right */
1735 return hv;
1736}
1737
b3ac6de7 1738HV *
864dbfa3 1739Perl_newHVhv(pTHX_ HV *ohv)
b3ac6de7 1740{
b56ba0bf 1741 HV *hv = newHV();
4beac62f 1742 STRLEN hv_max, hv_fill;
4beac62f
AMS
1743
1744 if (!ohv || (hv_fill = HvFILL(ohv)) == 0)
1745 return hv;
4beac62f 1746 hv_max = HvMAX(ohv);
b3ac6de7 1747
b56ba0bf
AMS
1748 if (!SvMAGICAL((SV *)ohv)) {
1749 /* It's an ordinary hash, so copy it fast. AMS 20010804 */
eb160463
GS
1750 STRLEN i;
1751 bool shared = !!HvSHAREKEYS(ohv);
b56ba0bf 1752 HE **ents, **oents = (HE **)HvARRAY(ohv);
ff875642
JH
1753 char *a;
1754 New(0, a, PERL_HV_ARRAY_ALLOC_BYTES(hv_max+1), char);
1755 ents = (HE**)a;
b56ba0bf
AMS
1756
1757 /* In each bucket... */
1758 for (i = 0; i <= hv_max; i++) {
1759 HE *prev = NULL, *ent = NULL, *oent = oents[i];
1760
1761 if (!oent) {
1762 ents[i] = NULL;
1763 continue;
1764 }
1765
1766 /* Copy the linked list of entries. */
1767 for (oent = oents[i]; oent; oent = HeNEXT(oent)) {
1768 U32 hash = HeHASH(oent);
1769 char *key = HeKEY(oent);
19692e8d
NC
1770 STRLEN len = HeKLEN(oent);
1771 int flags = HeKFLAGS(oent);
b56ba0bf
AMS
1772
1773 ent = new_HE();
45dea987 1774 HeVAL(ent) = newSVsv(HeVAL(oent));
19692e8d
NC
1775 HeKEY_hek(ent)
1776 = shared ? share_hek_flags(key, len, hash, flags)
1777 : save_hek_flags(key, len, hash, flags);
b56ba0bf
AMS
1778 if (prev)
1779 HeNEXT(prev) = ent;
1780 else
1781 ents[i] = ent;
1782 prev = ent;
1783 HeNEXT(ent) = NULL;
1784 }
1785 }
1786
1787 HvMAX(hv) = hv_max;
1788 HvFILL(hv) = hv_fill;
8aacddc1 1789 HvTOTALKEYS(hv) = HvTOTALKEYS(ohv);
b56ba0bf 1790 HvARRAY(hv) = ents;
1c846c1f 1791 }
b56ba0bf
AMS
1792 else {
1793 /* Iterate over ohv, copying keys and values one at a time. */
b3ac6de7 1794 HE *entry;
b56ba0bf
AMS
1795 I32 riter = HvRITER(ohv);
1796 HE *eiter = HvEITER(ohv);
1797
1798 /* Can we use fewer buckets? (hv_max is always 2^n-1) */
1799 while (hv_max && hv_max + 1 >= hv_fill * 2)
1800 hv_max = hv_max / 2;
1801 HvMAX(hv) = hv_max;
1802
4a76a316 1803 hv_iterinit(ohv);
e16e2ff8 1804 while ((entry = hv_iternext_flags(ohv, 0))) {
19692e8d
NC
1805 hv_store_flags(hv, HeKEY(entry), HeKLEN(entry),
1806 newSVsv(HeVAL(entry)), HeHASH(entry),
1807 HeKFLAGS(entry));
b3ac6de7 1808 }
b56ba0bf
AMS
1809 HvRITER(ohv) = riter;
1810 HvEITER(ohv) = eiter;
b3ac6de7 1811 }
1c846c1f 1812
b3ac6de7
IZ
1813 return hv;
1814}
1815
79072805 1816void
864dbfa3 1817Perl_hv_free_ent(pTHX_ HV *hv, register HE *entry)
79072805 1818{
16bdeea2
GS
1819 SV *val;
1820
68dc0745 1821 if (!entry)
79072805 1822 return;
16bdeea2 1823 val = HeVAL(entry);
257c9e5b 1824 if (val && isGV(val) && GvCVu(val) && HvNAME(hv))
3280af22 1825 PL_sub_generation++; /* may be deletion of method from stash */
16bdeea2 1826 SvREFCNT_dec(val);
68dc0745 1827 if (HeKLEN(entry) == HEf_SVKEY) {
1828 SvREFCNT_dec(HeKEY_sv(entry));
8aacddc1 1829 Safefree(HeKEY_hek(entry));
44a8e56a 1830 }
1831 else if (HvSHAREKEYS(hv))
68dc0745 1832 unshare_hek(HeKEY_hek(entry));
fde52b5c 1833 else
68dc0745 1834 Safefree(HeKEY_hek(entry));
d33b2eba 1835 del_HE(entry);
79072805
LW
1836}
1837
1838void
864dbfa3 1839Perl_hv_delayfree_ent(pTHX_ HV *hv, register HE *entry)
79072805 1840{
68dc0745 1841 if (!entry)
79072805 1842 return;
68dc0745 1843 if (isGV(HeVAL(entry)) && GvCVu(HeVAL(entry)) && HvNAME(hv))
3280af22 1844 PL_sub_generation++; /* may be deletion of method from stash */
68dc0745 1845 sv_2mortal(HeVAL(entry)); /* free between statements */
1846 if (HeKLEN(entry) == HEf_SVKEY) {
1847 sv_2mortal(HeKEY_sv(entry));
1848 Safefree(HeKEY_hek(entry));
44a8e56a 1849 }
1850 else if (HvSHAREKEYS(hv))
68dc0745 1851 unshare_hek(HeKEY_hek(entry));
fde52b5c 1852 else
68dc0745 1853 Safefree(HeKEY_hek(entry));
d33b2eba 1854 del_HE(entry);
79072805
LW
1855}
1856
954c1994
GS
1857/*
1858=for apidoc hv_clear
1859
1860Clears a hash, making it empty.
1861
1862=cut
1863*/
1864
79072805 1865void
864dbfa3 1866Perl_hv_clear(pTHX_ HV *hv)
79072805 1867{
cbec9347 1868 register XPVHV* xhv;
79072805
LW
1869 if (!hv)
1870 return;
49293501 1871
ecae49c0
NC
1872 DEBUG_A(Perl_hv_assert(aTHX_ hv));
1873
34c3c4e3
DM
1874 xhv = (XPVHV*)SvANY(hv);
1875
871661ef 1876 if (SvREADONLY(hv)) {
34c3c4e3 1877 /* restricted hash: convert all keys to placeholders */
3a676441
JH
1878 I32 i;
1879 HE* entry;
1880 for (i = 0; i <= (I32) xhv->xhv_max; i++) {
1881 entry = ((HE**)xhv->xhv_array)[i];
1882 for (; entry; entry = HeNEXT(entry)) {
1883 /* not already placeholder */
7996736c 1884 if (HeVAL(entry) != &PL_sv_placeholder) {
3a676441
JH
1885 if (HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
1886 SV* keysv = hv_iterkeysv(entry);
1887 Perl_croak(aTHX_
1888 "Attempt to delete readonly key '%"SVf"' from a restricted hash",
1889 keysv);
1890 }
1891 SvREFCNT_dec(HeVAL(entry));
7996736c 1892 HeVAL(entry) = &PL_sv_placeholder;
3a676441
JH
1893 xhv->xhv_placeholders++; /* HvPLACEHOLDERS(hv)++ */
1894 }
34c3c4e3
DM
1895 }
1896 }
1897 return;
49293501
MS
1898 }
1899
463ee0b2 1900 hfreeentries(hv);
8aacddc1 1901 xhv->xhv_placeholders = 0; /* HvPLACEHOLDERS(hv) = 0 */
cbec9347
JH
1902 if (xhv->xhv_array /* HvARRAY(hv) */)
1903 (void)memzero(xhv->xhv_array /* HvARRAY(hv) */,
1904 (xhv->xhv_max+1 /* HvMAX(hv)+1 */) * sizeof(HE*));
a0d0e21e
LW
1905
1906 if (SvRMAGICAL(hv))
1c846c1f 1907 mg_clear((SV*)hv);
574c8022 1908
19692e8d 1909 HvHASKFLAGS_off(hv);
bb443f97 1910 HvREHASH_off(hv);
79072805
LW
1911}
1912
76e3520e 1913STATIC void
cea2e8a9 1914S_hfreeentries(pTHX_ HV *hv)
79072805 1915{
a0d0e21e 1916 register HE **array;
68dc0745 1917 register HE *entry;
1918 register HE *oentry = Null(HE*);
a0d0e21e
LW
1919 I32 riter;
1920 I32 max;
79072805
LW
1921
1922 if (!hv)
1923 return;
a0d0e21e 1924 if (!HvARRAY(hv))
79072805 1925 return;
a0d0e21e
LW
1926
1927 riter = 0;
1928 max = HvMAX(hv);
1929 array = HvARRAY(hv);
2f86008e
DM
1930 /* make everyone else think the array is empty, so that the destructors
1931 * called for freed entries can't recusively mess with us */
1932 HvARRAY(hv) = Null(HE**);
1933 HvFILL(hv) = 0;
1934 ((XPVHV*) SvANY(hv))->xhv_keys = 0;
1935
68dc0745 1936 entry = array[0];
a0d0e21e 1937 for (;;) {
68dc0745 1938 if (entry) {
1939 oentry = entry;
1940 entry = HeNEXT(entry);
1941 hv_free_ent(hv, oentry);
a0d0e21e 1942 }
68dc0745 1943 if (!entry) {
a0d0e21e
LW
1944 if (++riter > max)
1945 break;
68dc0745 1946 entry = array[riter];
1c846c1f 1947 }
79072805 1948 }
2f86008e 1949 HvARRAY(hv) = array;
a0d0e21e 1950 (void)hv_iterinit(hv);
79072805
LW
1951}
1952
954c1994
GS
1953/*
1954=for apidoc hv_undef
1955
1956Undefines the hash.
1957
1958=cut
1959*/
1960
79072805 1961void
864dbfa3 1962Perl_hv_undef(pTHX_ HV *hv)
79072805 1963{
cbec9347 1964 register XPVHV* xhv;
79072805
LW
1965 if (!hv)
1966 return;
ecae49c0 1967 DEBUG_A(Perl_hv_assert(aTHX_ hv));
cbec9347 1968 xhv = (XPVHV*)SvANY(hv);
463ee0b2 1969 hfreeentries(hv);
cbec9347 1970 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
85e6fe83 1971 if (HvNAME(hv)) {
7e8961ec
AB
1972 if(PL_stashcache)
1973 hv_delete(PL_stashcache, HvNAME(hv), strlen(HvNAME(hv)), G_DISCARD);
85e6fe83
LW
1974 Safefree(HvNAME(hv));
1975 HvNAME(hv) = 0;
1976 }
cbec9347
JH
1977 xhv->xhv_max = 7; /* HvMAX(hv) = 7 (it's a normal hash) */
1978 xhv->xhv_array = 0; /* HvARRAY(hv) = 0 */
8aacddc1 1979 xhv->xhv_placeholders = 0; /* HvPLACEHOLDERS(hv) = 0 */
a0d0e21e
LW
1980
1981 if (SvRMAGICAL(hv))
1c846c1f 1982 mg_clear((SV*)hv);
79072805
LW
1983}
1984
954c1994
GS
1985/*
1986=for apidoc hv_iterinit
1987
1988Prepares a starting point to traverse a hash table. Returns the number of
1989keys in the hash (i.e. the same as C<HvKEYS(tb)>). The return value is
1c846c1f 1990currently only meaningful for hashes without tie magic.
954c1994
GS
1991
1992NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
1993hash buckets that happen to be in use. If you still need that esoteric
1994value, you can get it through the macro C<HvFILL(tb)>.
1995
e16e2ff8 1996
954c1994
GS
1997=cut
1998*/
1999
79072805 2000I32
864dbfa3 2001Perl_hv_iterinit(pTHX_ HV *hv)
79072805 2002{
cbec9347 2003 register XPVHV* xhv;
aa689395 2004 HE *entry;
2005
2006 if (!hv)
cea2e8a9 2007 Perl_croak(aTHX_ "Bad hash");
cbec9347
JH
2008 xhv = (XPVHV*)SvANY(hv);
2009 entry = xhv->xhv_eiter; /* HvEITER(hv) */
72940dca 2010 if (entry && HvLAZYDEL(hv)) { /* was deleted earlier? */
2011 HvLAZYDEL_off(hv);
68dc0745 2012 hv_free_ent(hv, entry);
72940dca 2013 }
cbec9347
JH
2014 xhv->xhv_riter = -1; /* HvRITER(hv) = -1 */
2015 xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
2016 /* used to be xhv->xhv_fill before 5.004_65 */
8aacddc1 2017 return XHvTOTALKEYS(xhv);
79072805 2018}
954c1994
GS
2019/*
2020=for apidoc hv_iternext
2021
2022Returns entries from a hash iterator. See C<hv_iterinit>.
2023
fe7bca90
NC
2024You may call C<hv_delete> or C<hv_delete_ent> on the hash entry that the
2025iterator currently points to, without losing your place or invalidating your
2026iterator. Note that in this case the current entry is deleted from the hash
2027with your iterator holding the last reference to it. Your iterator is flagged
2028to free the entry on the next call to C<hv_iternext>, so you must not discard
2029your iterator immediately else the entry will leak - call C<hv_iternext> to
2030trigger the resource deallocation.
2031
954c1994
GS
2032=cut
2033*/
2034
79072805 2035HE *
864dbfa3 2036Perl_hv_iternext(pTHX_ HV *hv)
79072805 2037{
e16e2ff8
NC
2038 return hv_iternext_flags(hv, 0);
2039}
2040
2041/*
fe7bca90
NC
2042=for apidoc hv_iternext_flags
2043
2044Returns entries from a hash iterator. See C<hv_iterinit> and C<hv_iternext>.
2045The C<flags> value will normally be zero; if HV_ITERNEXT_WANTPLACEHOLDERS is
2046set the placeholders keys (for restricted hashes) will be returned in addition
2047to normal keys. By default placeholders are automatically skipped over.
7996736c
MHM
2048Currently a placeholder is implemented with a value that is
2049C<&Perl_sv_placeholder>. Note that the implementation of placeholders and
fe7bca90
NC
2050restricted hashes may change, and the implementation currently is
2051insufficiently abstracted for any change to be tidy.
e16e2ff8 2052
fe7bca90 2053=cut
e16e2ff8
NC
2054*/
2055
2056HE *
2057Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags)
2058{
cbec9347 2059 register XPVHV* xhv;
79072805 2060 register HE *entry;
a0d0e21e 2061 HE *oldentry;
463ee0b2 2062 MAGIC* mg;
79072805
LW
2063
2064 if (!hv)
cea2e8a9 2065 Perl_croak(aTHX_ "Bad hash");
cbec9347
JH
2066 xhv = (XPVHV*)SvANY(hv);
2067 oldentry = entry = xhv->xhv_eiter; /* HvEITER(hv) */
463ee0b2 2068
14befaf4 2069 if ((mg = SvTIED_mg((SV*)hv, PERL_MAGIC_tied))) {
8990e307 2070 SV *key = sv_newmortal();
cd1469e6 2071 if (entry) {
fde52b5c 2072 sv_setsv(key, HeSVKEY_force(entry));
cd1469e6 2073 SvREFCNT_dec(HeSVKEY(entry)); /* get rid of previous key */
2074 }
a0d0e21e 2075 else {
ff68c719 2076 char *k;
bbce6d69 2077 HEK *hek;
ff68c719 2078
cbec9347
JH
2079 /* one HE per MAGICAL hash */
2080 xhv->xhv_eiter = entry = new_HE(); /* HvEITER(hv) = new_HE() */
4633a7c4 2081 Zero(entry, 1, HE);
ff68c719 2082 Newz(54, k, HEK_BASESIZE + sizeof(SV*), char);
2083 hek = (HEK*)k;
2084 HeKEY_hek(entry) = hek;
fde52b5c 2085 HeKLEN(entry) = HEf_SVKEY;
a0d0e21e
LW
2086 }
2087 magic_nextpack((SV*) hv,mg,key);
8aacddc1 2088 if (SvOK(key)) {
cd1469e6 2089 /* force key to stay around until next time */
bbce6d69 2090 HeSVKEY_set(entry, SvREFCNT_inc(key));
2091 return entry; /* beware, hent_val is not set */
8aacddc1 2092 }
fde52b5c 2093 if (HeVAL(entry))
2094 SvREFCNT_dec(HeVAL(entry));
ff68c719 2095 Safefree(HeKEY_hek(entry));
d33b2eba 2096 del_HE(entry);
cbec9347 2097 xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
463ee0b2 2098 return Null(HE*);
79072805 2099 }
f675dbe5 2100#ifdef DYNAMIC_ENV_FETCH /* set up %ENV for iteration */
cbec9347 2101 if (!entry && SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
f675dbe5
CB
2102 prime_env_iter();
2103#endif
463ee0b2 2104
cbec9347
JH
2105 if (!xhv->xhv_array /* !HvARRAY(hv) */)
2106 Newz(506, xhv->xhv_array /* HvARRAY(hv) */,
2107 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
2108 char);
015a5f36 2109 /* At start of hash, entry is NULL. */
fde52b5c 2110 if (entry)
8aacddc1 2111 {
fde52b5c 2112 entry = HeNEXT(entry);
e16e2ff8
NC
2113 if (!(flags & HV_ITERNEXT_WANTPLACEHOLDERS)) {
2114 /*
2115 * Skip past any placeholders -- don't want to include them in
2116 * any iteration.
2117 */
7996736c 2118 while (entry && HeVAL(entry) == &PL_sv_placeholder) {
e16e2ff8
NC
2119 entry = HeNEXT(entry);
2120 }
8aacddc1
NIS
2121 }
2122 }
fde52b5c 2123 while (!entry) {
015a5f36
NC
2124 /* OK. Come to the end of the current list. Grab the next one. */
2125
cbec9347 2126 xhv->xhv_riter++; /* HvRITER(hv)++ */
eb160463 2127 if (xhv->xhv_riter > (I32)xhv->xhv_max /* HvRITER(hv) > HvMAX(hv) */) {
015a5f36 2128 /* There is no next one. End of the hash. */
cbec9347 2129 xhv->xhv_riter = -1; /* HvRITER(hv) = -1 */
fde52b5c 2130 break;
79072805 2131 }
cbec9347
JH
2132 /* entry = (HvARRAY(hv))[HvRITER(hv)]; */
2133 entry = ((HE**)xhv->xhv_array)[xhv->xhv_riter];
8aacddc1 2134
e16e2ff8 2135 if (!(flags & HV_ITERNEXT_WANTPLACEHOLDERS)) {
015a5f36
NC
2136 /* If we have an entry, but it's a placeholder, don't count it.
2137 Try the next. */
7996736c 2138 while (entry && HeVAL(entry) == &PL_sv_placeholder)
015a5f36
NC
2139 entry = HeNEXT(entry);
2140 }
2141 /* Will loop again if this linked list starts NULL
2142 (for HV_ITERNEXT_WANTPLACEHOLDERS)
2143 or if we run through it and find only placeholders. */
fde52b5c 2144 }
79072805 2145
72940dca 2146 if (oldentry && HvLAZYDEL(hv)) { /* was deleted earlier? */
2147 HvLAZYDEL_off(hv);
68dc0745 2148 hv_free_ent(hv, oldentry);
72940dca 2149 }
a0d0e21e 2150
fdcd69b6
NC
2151 /*if (HvREHASH(hv) && entry && !HeKREHASH(entry))
2152 PerlIO_printf(PerlIO_stderr(), "Awooga %p %p\n", hv, entry);*/
2153
cbec9347 2154 xhv->xhv_eiter = entry; /* HvEITER(hv) = entry */
79072805
LW
2155 return entry;
2156}
2157
954c1994
GS
2158/*
2159=for apidoc hv_iterkey
2160
2161Returns the key from the current position of the hash iterator. See
2162C<hv_iterinit>.
2163
2164=cut
2165*/
2166
79072805 2167char *
864dbfa3 2168Perl_hv_iterkey(pTHX_ register HE *entry, I32 *retlen)
79072805 2169{
fde52b5c 2170 if (HeKLEN(entry) == HEf_SVKEY) {
fb73857a 2171 STRLEN len;
2172 char *p = SvPV(HeKEY_sv(entry), len);
2173 *retlen = len;
2174 return p;
fde52b5c 2175 }
2176 else {
2177 *retlen = HeKLEN(entry);
2178 return HeKEY(entry);
2179 }
2180}
2181
2182/* unlike hv_iterval(), this always returns a mortal copy of the key */
954c1994
GS
2183/*
2184=for apidoc hv_iterkeysv
2185
2186Returns the key as an C<SV*> from the current position of the hash
2187iterator. The return value will always be a mortal copy of the key. Also
2188see C<hv_iterinit>.
2189
2190=cut
2191*/
2192
fde52b5c 2193SV *
864dbfa3 2194Perl_hv_iterkeysv(pTHX_ register HE *entry)
fde52b5c 2195{
19692e8d
NC
2196 if (HeKLEN(entry) != HEf_SVKEY) {
2197 HEK *hek = HeKEY_hek(entry);
2198 int flags = HEK_FLAGS(hek);
2199 SV *sv;
2200
2201 if (flags & HVhek_WASUTF8) {
2202 /* Trouble :-)
2203 Andreas would like keys he put in as utf8 to come back as utf8
2204 */
2205 STRLEN utf8_len = HEK_LEN(hek);
2e5dfef7 2206 U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
19692e8d 2207
2e5dfef7 2208 sv = newSVpvn ((char*)as_utf8, utf8_len);
19692e8d 2209 SvUTF8_on (sv);
c193270f 2210 Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
4b5190b5
NC
2211 } else if (flags & HVhek_REHASH) {
2212 /* We don't have a pointer to the hv, so we have to replicate the
2213 flag into every HEK. This hv is using custom a hasing
2214 algorithm. Hence we can't return a shared string scalar, as
2215 that would contain the (wrong) hash value, and might get passed
2216 into an hv routine with a regular hash */
2217
2218 sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
2219 if (HEK_UTF8(hek))
2220 SvUTF8_on (sv);
2221 } else {
19692e8d
NC
2222 sv = newSVpvn_share(HEK_KEY(hek),
2223 (HEK_UTF8(hek) ? -HEK_LEN(hek) : HEK_LEN(hek)),
2224 HEK_HASH(hek));
2225 }
2226 return sv_2mortal(sv);
2227 }
2228 return sv_mortalcopy(HeKEY_sv(entry));
79072805
LW
2229}
2230
954c1994
GS
2231/*
2232=for apidoc hv_iterval
2233
2234Returns the value from the current position of the hash iterator. See
2235C<hv_iterkey>.
2236
2237=cut
2238*/
2239
79072805 2240SV *
864dbfa3 2241Perl_hv_iterval(pTHX_ HV *hv, register HE *entry)
79072805 2242{
8990e307 2243 if (SvRMAGICAL(hv)) {
14befaf4 2244 if (mg_find((SV*)hv, PERL_MAGIC_tied)) {
8990e307 2245 SV* sv = sv_newmortal();
bbce6d69 2246 if (HeKLEN(entry) == HEf_SVKEY)
2247 mg_copy((SV*)hv, sv, (char*)HeKEY_sv(entry), HEf_SVKEY);
2248 else mg_copy((SV*)hv, sv, HeKEY(entry), HeKLEN(entry));
463ee0b2
LW
2249 return sv;
2250 }
79072805 2251 }
fde52b5c 2252 return HeVAL(entry);
79072805
LW
2253}
2254
954c1994
GS
2255/*
2256=for apidoc hv_iternextsv
2257
2258Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
2259operation.
2260
2261=cut
2262*/
2263
a0d0e21e 2264SV *
864dbfa3 2265Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
a0d0e21e
LW
2266{
2267 HE *he;
e16e2ff8 2268 if ( (he = hv_iternext_flags(hv, 0)) == NULL)
a0d0e21e
LW
2269 return NULL;
2270 *key = hv_iterkey(he, retlen);
2271 return hv_iterval(hv, he);
2272}
2273
954c1994
GS
2274/*
2275=for apidoc hv_magic
2276
2277Adds magic to a hash. See C<sv_magic>.
2278
2279=cut
2280*/
2281
79072805 2282void
864dbfa3 2283Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how)
79072805 2284{
a0d0e21e 2285 sv_magic((SV*)hv, (SV*)gv, how, Nullch, 0);
79072805 2286}
fde52b5c 2287
37d85e3a
JH
2288#if 0 /* use the macro from hv.h instead */
2289
bbce6d69 2290char*
864dbfa3 2291Perl_sharepvn(pTHX_ const char *sv, I32 len, U32 hash)
bbce6d69 2292{
ff68c719 2293 return HEK_KEY(share_hek(sv, len, hash));
bbce6d69 2294}
2295
37d85e3a
JH
2296#endif
2297
bbce6d69 2298/* possibly free a shared string if no one has access to it
fde52b5c 2299 * len and hash must both be valid for str.
2300 */
bbce6d69 2301void
864dbfa3 2302Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
fde52b5c 2303{
19692e8d
NC
2304 unshare_hek_or_pvn (NULL, str, len, hash);
2305}
2306
2307
2308void
2309Perl_unshare_hek(pTHX_ HEK *hek)
2310{
2311 unshare_hek_or_pvn(hek, NULL, 0, 0);
2312}
2313
2314/* possibly free a shared string if no one has access to it
2315 hek if non-NULL takes priority over the other 3, else str, len and hash
2316 are used. If so, len and hash must both be valid for str.
2317 */
df132699 2318STATIC void
19692e8d
NC
2319S_unshare_hek_or_pvn(pTHX_ HEK *hek, const char *str, I32 len, U32 hash)
2320{
cbec9347 2321 register XPVHV* xhv;
fde52b5c 2322 register HE *entry;
2323 register HE **oentry;
2324 register I32 i = 1;
2325 I32 found = 0;
c3654f1a 2326 bool is_utf8 = FALSE;
19692e8d 2327 int k_flags = 0;
f9a63242 2328 const char *save = str;
c3654f1a 2329
19692e8d
NC
2330 if (hek) {
2331 hash = HEK_HASH(hek);
2332 } else if (len < 0) {
2333 STRLEN tmplen = -len;
2334 is_utf8 = TRUE;
2335 /* See the note in hv_fetch(). --jhi */
2336 str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
2337 len = tmplen;
2338 if (is_utf8)
2339 k_flags = HVhek_UTF8;
2340 if (str != save)
2341 k_flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
c3654f1a 2342 }
1c846c1f 2343
fde52b5c 2344 /* what follows is the moral equivalent of:
6b88bc9c 2345 if ((Svp = hv_fetch(PL_strtab, tmpsv, FALSE, hash))) {
bbce6d69 2346 if (--*Svp == Nullsv)
6b88bc9c 2347 hv_delete(PL_strtab, str, len, G_DISCARD, hash);
bbce6d69 2348 } */
cbec9347 2349 xhv = (XPVHV*)SvANY(PL_strtab);
fde52b5c 2350 /* assert(xhv_array != 0) */
5f08fbcd 2351 LOCK_STRTAB_MUTEX;
cbec9347
JH
2352 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
2353 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
19692e8d
NC
2354 if (hek) {
2355 for (entry = *oentry; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
2356 if (HeKEY_hek(entry) != hek)
2357 continue;
2358 found = 1;
2359 break;
2360 }
2361 } else {
2362 int flags_masked = k_flags & HVhek_MASK;
2363 for (entry = *oentry; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
2364 if (HeHASH(entry) != hash) /* strings can't be equal */
2365 continue;
2366 if (HeKLEN(entry) != len)
2367 continue;
2368 if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
2369 continue;
2370 if (HeKFLAGS(entry) != flags_masked)
2371 continue;
2372 found = 1;
2373 break;
2374 }
2375 }
2376
2377 if (found) {
2378 if (--HeVAL(entry) == Nullsv) {
2379 *oentry = HeNEXT(entry);
2380 if (i && !*oentry)
2381 xhv->xhv_fill--; /* HvFILL(hv)-- */
2382 Safefree(HeKEY_hek(entry));
2383 del_HE(entry);
2384 xhv->xhv_keys--; /* HvKEYS(hv)-- */
2385 }
fde52b5c 2386 }
19692e8d 2387
333f433b 2388 UNLOCK_STRTAB_MUTEX;
411caa50 2389 if (!found && ckWARN_d(WARN_INTERNAL))
19692e8d
NC
2390 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
2391 "Attempt to free non-existent shared string '%s'%s",
2392 hek ? HEK_KEY(hek) : str,
2393 (k_flags & HVhek_UTF8) ? " (utf8)" : "");
2394 if (k_flags & HVhek_FREEKEY)
2395 Safefree(str);
fde52b5c 2396}
2397
bbce6d69 2398/* get a (constant) string ptr from the global string table
2399 * string will get added if it is not already there.
fde52b5c 2400 * len and hash must both be valid for str.
2401 */
bbce6d69 2402HEK *
864dbfa3 2403Perl_share_hek(pTHX_ const char *str, I32 len, register U32 hash)
fde52b5c 2404{
da58a35d 2405 bool is_utf8 = FALSE;
19692e8d 2406 int flags = 0;
f9a63242 2407 const char *save = str;
da58a35d
JH
2408
2409 if (len < 0) {
77caf834 2410 STRLEN tmplen = -len;
da58a35d 2411 is_utf8 = TRUE;
77caf834
JH
2412 /* See the note in hv_fetch(). --jhi */
2413 str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
2414 len = tmplen;
19692e8d
NC
2415 /* If we were able to downgrade here, then than means that we were passed
2416 in a key which only had chars 0-255, but was utf8 encoded. */
2417 if (is_utf8)
2418 flags = HVhek_UTF8;
2419 /* If we found we were able to downgrade the string to bytes, then
2420 we should flag that it needs upgrading on keys or each. Also flag
2421 that we need share_hek_flags to free the string. */
2422 if (str != save)
2423 flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
2424 }
2425
2426 return share_hek_flags (str, len, hash, flags);
2427}
2428
df132699 2429STATIC HEK *
19692e8d
NC
2430S_share_hek_flags(pTHX_ const char *str, I32 len, register U32 hash, int flags)
2431{
2432 register XPVHV* xhv;
2433 register HE *entry;
2434 register HE **oentry;
2435 register I32 i = 1;
2436 I32 found = 0;
2437 int flags_masked = flags & HVhek_MASK;
bbce6d69 2438
fde52b5c 2439 /* what follows is the moral equivalent of:
1c846c1f 2440
6b88bc9c 2441 if (!(Svp = hv_fetch(PL_strtab, str, len, FALSE)))
8aacddc1 2442 hv_store(PL_strtab, str, len, Nullsv, hash);
fdcd69b6
NC
2443
2444 Can't rehash the shared string table, so not sure if it's worth
2445 counting the number of entries in the linked list
bbce6d69 2446 */
cbec9347 2447 xhv = (XPVHV*)SvANY(PL_strtab);
fde52b5c 2448 /* assert(xhv_array != 0) */
5f08fbcd 2449 LOCK_STRTAB_MUTEX;
cbec9347
JH
2450 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
2451 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
bbce6d69 2452 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
fde52b5c 2453 if (HeHASH(entry) != hash) /* strings can't be equal */
2454 continue;
2455 if (HeKLEN(entry) != len)
2456 continue;
1c846c1f 2457 if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
fde52b5c 2458 continue;
19692e8d 2459 if (HeKFLAGS(entry) != flags_masked)
c3654f1a 2460 continue;
fde52b5c 2461 found = 1;
fde52b5c 2462 break;
2463 }
bbce6d69 2464 if (!found) {
d33b2eba 2465 entry = new_HE();
19692e8d 2466 HeKEY_hek(entry) = save_hek_flags(str, len, hash, flags);
bbce6d69 2467 HeVAL(entry) = Nullsv;
2468 HeNEXT(entry) = *oentry;
2469 *oentry = entry;
cbec9347 2470 xhv->xhv_keys++; /* HvKEYS(hv)++ */
bbce6d69 2471 if (i) { /* initial entry? */
cbec9347 2472 xhv->xhv_fill++; /* HvFILL(hv)++ */
4c9cc595 2473 } else if (xhv->xhv_keys > (IV)xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */) {
cbec9347 2474 hsplit(PL_strtab);
bbce6d69 2475 }
2476 }
2477
2478 ++HeVAL(entry); /* use value slot as REFCNT */
5f08fbcd 2479 UNLOCK_STRTAB_MUTEX;
19692e8d
NC
2480
2481 if (flags & HVhek_FREEKEY)
f9a63242 2482 Safefree(str);
19692e8d 2483
ff68c719 2484 return HeKEY_hek(entry);
fde52b5c 2485}
ecae49c0
NC
2486
2487
2488/*
2489=for apidoc hv_assert
2490
2491Check that a hash is in an internally consistent state.
2492
2493=cut
2494*/
2495
2496void
2497Perl_hv_assert(pTHX_ HV *hv)
2498{
2499 HE* entry;
2500 int withflags = 0;
2501 int placeholders = 0;
2502 int real = 0;
2503 int bad = 0;
2504 I32 riter = HvRITER(hv);
2505 HE *eiter = HvEITER(hv);
2506
2507 (void)hv_iterinit(hv);
2508
2509 while ((entry = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))) {
2510 /* sanity check the values */
2511 if (HeVAL(entry) == &PL_sv_placeholder) {
2512 placeholders++;
2513 } else {
2514 real++;
2515 }
2516 /* sanity check the keys */
2517 if (HeSVKEY(entry)) {
2518 /* Don't know what to check on SV keys. */
2519 } else if (HeKUTF8(entry)) {
2520 withflags++;
2521 if (HeKWASUTF8(entry)) {
2522 PerlIO_printf(Perl_debug_log,
2523 "hash key has both WASUFT8 and UTF8: '%.*s'\n",
2524 (int) HeKLEN(entry), HeKEY(entry));
2525 bad = 1;
2526 }
2527 } else if (HeKWASUTF8(entry)) {
2528 withflags++;
2529 }
2530 }
2531 if (!SvTIED_mg((SV*)hv, PERL_MAGIC_tied)) {
2532 if (HvUSEDKEYS(hv) != real) {
2533 PerlIO_printf(Perl_debug_log, "Count %d key(s), but hash reports %d\n",
2534 (int) real, (int) HvUSEDKEYS(hv));
2535 bad = 1;
2536 }
2537 if (HvPLACEHOLDERS(hv) != placeholders) {
2538 PerlIO_printf(Perl_debug_log,
2539 "Count %d placeholder(s), but hash reports %d\n",
2540 (int) placeholders, (int) HvPLACEHOLDERS(hv));
2541 bad = 1;
2542 }
2543 }
2544 if (withflags && ! HvHASKFLAGS(hv)) {
2545 PerlIO_printf(Perl_debug_log,
2546 "Hash has HASKFLAGS off but I count %d key(s) with flags\n",
2547 withflags);
2548 bad = 1;
2549 }
2550 if (bad) {
2551 sv_dump((SV *)hv);
2552 }
2553 HvRITER(hv) = riter; /* Restore hash iterator state */
2554 HvEITER(hv) = eiter;
2555}