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