xref: /openbsd-src/gnu/usr.bin/perl/hv.c (revision db3296cf5c1dd9058ceecc3a29fe4aaa0bd26000)
1 /*    hv.c
2  *
3  *    Copyright (c) 1991-2002, Larry Wall
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  *
8  */
9 
10 /*
11  * "I sit beside the fire and think of all that I have seen."  --Bilbo
12  */
13 
14 /*
15 =head1 Hash Manipulation Functions
16 */
17 
18 #include "EXTERN.h"
19 #define PERL_IN_HV_C
20 #include "perl.h"
21 
22 STATIC HE*
23 S_new_he(pTHX)
24 {
25     HE* he;
26     LOCK_SV_MUTEX;
27     if (!PL_he_root)
28 	more_he();
29     he = PL_he_root;
30     PL_he_root = HeNEXT(he);
31     UNLOCK_SV_MUTEX;
32     return he;
33 }
34 
35 STATIC void
36 S_del_he(pTHX_ HE *p)
37 {
38     LOCK_SV_MUTEX;
39     HeNEXT(p) = (HE*)PL_he_root;
40     PL_he_root = p;
41     UNLOCK_SV_MUTEX;
42 }
43 
44 STATIC void
45 S_more_he(pTHX)
46 {
47     register HE* he;
48     register HE* heend;
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;
55     heend = &he[1008 / sizeof(HE) - 1];
56     PL_he_root = ++he;
57     while (he < heend) {
58 	HeNEXT(he) = (HE*)(he + 1);
59 	he++;
60     }
61     HeNEXT(he) = 0;
62 }
63 
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 
76 STATIC HEK *
77 S_save_hek_flags(pTHX_ const char *str, I32 len, U32 hash, int flags)
78 {
79     char *k;
80     register HEK *hek;
81 
82     New(54, k, HEK_BASESIZE + len + 2, char);
83     hek = (HEK*)k;
84     Copy(str, HEK_KEY(hek), len, char);
85     HEK_KEY(hek)[len] = 0;
86     HEK_LEN(hek) = len;
87     HEK_HASH(hek) = hash;
88     HEK_FLAGS(hek) = (unsigned char)flags;
89     return hek;
90 }
91 
92 #if defined(USE_ITHREADS)
93 HE *
94 Perl_he_dup(pTHX_ HE *e, bool shared, CLONE_PARAMS* param)
95 {
96     HE *ret;
97 
98     if (!e)
99 	return Nullhe;
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 */
106     ret = new_HE();
107     ptr_table_store(PL_ptr_table, e, ret);
108 
109     HeNEXT(ret) = he_dup(HeNEXT(e),shared, param);
110     if (HeKLEN(e) == HEf_SVKEY)
111 	HeKEY_sv(ret) = SvREFCNT_inc(sv_dup(HeKEY_sv(e), param));
112     else if (shared)
113 	HeKEY_hek(ret) = share_hek_flags(HeKEY(e), HeKLEN(e), HeHASH(e),
114                                          HeKFLAGS(e));
115     else
116 	HeKEY_hek(ret) = save_hek_flags(HeKEY(e), HeKLEN(e), HeHASH(e),
117                                         HeKFLAGS(e));
118     HeVAL(ret) = SvREFCNT_inc(sv_dup(HeVAL(e), param));
119     return ret;
120 }
121 #endif	/* USE_ITHREADS */
122 
123 static void
124 S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen,
125 		const char *msg)
126 {
127     SV *sv = sv_newmortal(), *esv = sv_newmortal();
128     if (!(flags & HVhek_FREEKEY)) {
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     }
136     if (flags & HVhek_UTF8) {
137 	SvUTF8_on(sv);
138     }
139     Perl_sv_setpvf(aTHX_ esv, "Attempt to %s a restricted hash", msg);
140     Perl_croak(aTHX_ SvPVX(esv), sv);
141 }
142 
143 /* (klen == HEf_SVKEY) is special for MAGICAL hv entries, meaning key slot
144  * contains an SV* */
145 
146 /*
147 =for apidoc hv_fetch
148 
149 Returns the SV which corresponds to the specified key in the hash.  The
150 C<klen> is the length of the key.  If C<lval> is set then the fetch will be
151 part of a store.  Check that the return value is non-null before
152 dereferencing it to an C<SV*>.
153 
154 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
155 information on how to use this function on tied hashes.
156 
157 =cut
158 */
159 
160 
161 SV**
162 Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen, I32 lval)
163 {
164     bool is_utf8 = FALSE;
165     const char *keysave = key;
166     int flags = 0;
167 
168     if (klen < 0) {
169       klen = -klen;
170       is_utf8 = TRUE;
171     }
172 
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 
192 STATIC SV**
193 S_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 
203     if (SvRMAGICAL(hv)) {
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         */
209 	if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
210 	    sv = sv_newmortal();
211 	    mg_copy((SV*)hv, sv, key, klen);
212             if (flags & HVhek_FREEKEY)
213                 Safefree(key);
214 	    PL_hv_fetch_sv = sv;
215 	    return &PL_hv_fetch_sv;
216 	}
217 #ifdef ENV_IS_CASELESS
218 	else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
219 	    I32 i;
220 	    for (i = 0; i < klen; ++i)
221 		if (isLOWER(key[i])) {
222 		    char *nkey = strupr(SvPVX(sv_2mortal(newSVpvn(key,klen))));
223 		    SV **ret = hv_fetch(hv, nkey, klen, 0);
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);
229 		    return ret;
230 		}
231 	}
232 #endif
233     }
234 
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) */) {
239 	if (lval
240 #ifdef DYNAMIC_ENV_FETCH  /* if it's an %ENV lookup, we may get it on the fly */
241 		 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
242 #endif
243 								  )
244 	    Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
245 		 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
246 		 char);
247 	else {
248             if (flags & HVhek_FREEKEY)
249                 Safefree(key);
250 	    return 0;
251         }
252     }
253 
254     PERL_HASH(hash, key, klen);
255 
256     /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
257     entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
258     for (; entry; entry = HeNEXT(entry)) {
259 	if (HeHASH(entry) != hash)		/* strings can't be equal */
260 	    continue;
261 	if (HeKLEN(entry) != (I32)klen)
262 	    continue;
263 	if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))	/* is this it? */
264 	    continue;
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)
269 	    continue;
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);
289 	/* if we find a placeholder, we pretend we haven't found anything */
290 	if (HeVAL(entry) == &PL_sv_undef)
291 	    break;
292 	return &HeVAL(entry);
293 
294     }
295 #ifdef DYNAMIC_ENV_FETCH  /* %ENV lookup?  If so, try to fetch the value now */
296     if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
297 	unsigned long len;
298 	char *env = PerlEnv_ENVgetenv_len(key,&len);
299 	if (env) {
300 	    sv = newSVpvn(env,len);
301 	    SvTAINTED_on(sv);
302 	    if (flags & HVhek_FREEKEY)
303 		Safefree(key);
304 	    return hv_store(hv,key,klen,sv,hash);
305 	}
306     }
307 #endif
308     if (!entry && SvREADONLY(hv)) {
309 	S_hv_notallowed(aTHX_ flags, key, klen,
310 			"access disallowed key '%"SVf"' in"
311 			);
312     }
313     if (lval) {		/* gonna assign to this, so it better be there */
314 	sv = NEWSV(61,0);
315         return hv_store_flags(hv,key,klen,sv,hash,flags);
316     }
317     if (flags & HVhek_FREEKEY)
318         Safefree(key);
319     return 0;
320 }
321 
322 /* returns an HE * structure with the all fields set */
323 /* note that hent_val will be a mortal sv for MAGICAL hashes */
324 /*
325 =for apidoc hv_fetch_ent
326 
327 Returns the hash entry which corresponds to the specified key in the hash.
328 C<hash> must be a valid precomputed hash number for the given C<key>, or 0
329 if you want the function to compute it.  IF C<lval> is set then the fetch
330 will be part of a store.  Make sure the return value is non-null before
331 accessing it.  The return value when C<tb> is a tied hash is a pointer to a
332 static location, so be sure to make a copy of the structure if you need to
333 store it somewhere.
334 
335 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
336 information on how to use this function on tied hashes.
337 
338 =cut
339 */
340 
341 HE *
342 Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash)
343 {
344     register XPVHV* xhv;
345     register char *key;
346     STRLEN klen;
347     register HE *entry;
348     SV *sv;
349     bool is_utf8;
350     int flags = 0;
351     char *keysave;
352 
353     if (!hv)
354 	return 0;
355 
356     if (SvRMAGICAL(hv)) {
357 	if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
358 	    sv = sv_newmortal();
359 	    keysv = sv_2mortal(newSVsv(keysv));
360 	    mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
361 	    if (!HeKEY_hek(&PL_hv_fetch_ent_mh)) {
362 		char *k;
363 		New(54, k, HEK_BASESIZE + sizeof(SV*), char);
364 		HeKEY_hek(&PL_hv_fetch_ent_mh) = (HEK*)k;
365 	    }
366 	    HeSVKEY_set(&PL_hv_fetch_ent_mh, keysv);
367 	    HeVAL(&PL_hv_fetch_ent_mh) = sv;
368 	    return &PL_hv_fetch_ent_mh;
369 	}
370 #ifdef ENV_IS_CASELESS
371 	else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
372 	    U32 i;
373 	    key = SvPV(keysv, klen);
374 	    for (i = 0; i < klen; ++i)
375 		if (isLOWER(key[i])) {
376 		    SV *nkeysv = sv_2mortal(newSVpvn(key,klen));
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 		}
383 	}
384 #endif
385     }
386 
387     xhv = (XPVHV*)SvANY(hv);
388     if (!xhv->xhv_array /* !HvARRAY(hv) */) {
389 	if (lval
390 #ifdef DYNAMIC_ENV_FETCH  /* if it's an %ENV lookup, we may get it on the fly */
391 		 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
392 #endif
393 								  )
394 	    Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
395 		 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
396 		 char);
397 	else
398 	    return 0;
399     }
400 
401     keysave = key = SvPV(keysv, klen);
402     is_utf8 = (SvUTF8(keysv)!=0);
403 
404     if (is_utf8) {
405 	key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
406         if (is_utf8)
407             flags = HVhek_UTF8;
408         if (key != keysave)
409             flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
410     }
411 
412     if (!hash)
413 	PERL_HASH(hash, key, klen);
414 
415     /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
416     entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
417     for (; entry; entry = HeNEXT(entry)) {
418 	if (HeHASH(entry) != hash)		/* strings can't be equal */
419 	    continue;
420 	if (HeKLEN(entry) != (I32)klen)
421 	    continue;
422 	if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))	/* is this it? */
423 	    continue;
424 	if ((HeKFLAGS(entry) ^ flags) & HVhek_UTF8)
425 	    continue;
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         }
443 	if (key != keysave)
444 	    Safefree(key);
445 	/* if we find a placeholder, we pretend we haven't found anything */
446 	if (HeVAL(entry) == &PL_sv_undef)
447 	    break;
448 	return entry;
449     }
450 #ifdef DYNAMIC_ENV_FETCH  /* %ENV lookup?  If so, try to fetch the value now */
451     if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
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 	}
459     }
460 #endif
461     if (!entry && SvREADONLY(hv)) {
462 	S_hv_notallowed(aTHX_ flags, key, klen,
463 			"access disallowed key '%"SVf"' in"
464 			);
465     }
466     if (flags & HVhek_FREEKEY)
467 	Safefree(key);
468     if (lval) {		/* gonna assign to this, so it better be there */
469 	sv = NEWSV(61,0);
470 	return hv_store_ent(hv,keysv,sv,hash);
471     }
472     return 0;
473 }
474 
475 STATIC void
476 S_hv_magic_check(pTHX_ HV *hv, bool *needs_copy, bool *needs_store)
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) {
485 	    case PERL_MAGIC_tied:
486 	    case PERL_MAGIC_sig:
487 		*needs_store = FALSE;
488 	    }
489 	}
490 	mg = mg->mg_moremagic;
491     }
492 }
493 
494 /*
495 =for apidoc hv_store
496 
497 Stores an SV in a hash.  The hash key is specified as C<key> and C<klen> is
498 the length of the key.  The C<hash> parameter is the precomputed hash
499 value; if it is zero then Perl will compute it.  The return value will be
500 NULL if the operation failed or if the value did not need to be actually
501 stored within the hash (as in the case of tied hashes).  Otherwise it can
502 be dereferenced to get the original C<SV*>.  Note that the caller is
503 responsible for suitably incrementing the reference count of C<val> before
504 the call, and decrementing it if the function returned NULL.
505 
506 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
507 information on how to use this function on tied hashes.
508 
509 =cut
510 */
511 
512 SV**
513 Perl_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 
519     if (klen < 0) {
520       klen = -klen;
521       is_utf8 = TRUE;
522     }
523 
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 
543 SV**
544 Perl_hv_store_flags(pTHX_ HV *hv, const char *key, I32 klen, SV *val,
545                  register U32 hash, int flags)
546 {
547     register XPVHV* xhv;
548     register I32 i;
549     register HE *entry;
550     register HE **oentry;
551 
552     if (!hv)
553 	return 0;
554 
555     xhv = (XPVHV*)SvANY(hv);
556     if (SvMAGICAL(hv)) {
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);
562 	    if (!xhv->xhv_array /* !HvARRAY */ && !needs_store) {
563                 if (flags & HVhek_FREEKEY)
564                     Safefree(key);
565 		return 0;
566             }
567 #ifdef ENV_IS_CASELESS
568 	    else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
569 		key = savepvn(key,klen);
570 		key = (const char*)strupr((char*)key);
571 		hash = 0;
572 	    }
573 #endif
574 	}
575     }
576 
577     if (flags)
578         HvHASKFLAGS_on((SV*)hv);
579 
580     if (!hash)
581 	PERL_HASH(hash, key, klen);
582 
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);
587 
588     /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
589     oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
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;
595 	if (HeKLEN(entry) != (I32)klen)
596 	    continue;
597 	if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))	/* is this it? */
598 	    continue;
599 	if ((HeKFLAGS(entry) ^ flags) & HVhek_UTF8)
600 	    continue;
601 	if (HeVAL(entry) == &PL_sv_undef)
602 	    xhv->xhv_placeholders--; /* yes, can store into placeholder slot */
603 	else
604 	    SvREFCNT_dec(HeVAL(entry));
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;
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);
632 	return &HeVAL(entry);
633     }
634 
635     if (SvREADONLY(hv)) {
636 	S_hv_notallowed(aTHX_ flags, key, klen,
637 			"access disallowed key '%"SVf"' to"
638 			);
639     }
640 
641     entry = new_HE();
642     /* share_hek_flags will do the free for us.  This might be considered
643        bad API design.  */
644     if (HvSHAREKEYS(hv))
645 	HeKEY_hek(entry) = share_hek_flags(key, klen, hash, flags);
646     else                                       /* gotta do the real thing */
647 	HeKEY_hek(entry) = save_hek_flags(key, klen, hash, flags);
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;
655     HeNEXT(entry) = *oentry;
656     *oentry = entry;
657 
658     xhv->xhv_keys++; /* HvKEYS(hv)++ */
659     if (i) {				/* initial entry? */
660 	xhv->xhv_fill++; /* HvFILL(hv)++ */
661 	if (xhv->xhv_keys > (IV)xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */)
662 	    hsplit(hv);
663     }
664 
665     return &HeVAL(entry);
666 }
667 
668 /*
669 =for apidoc hv_store_ent
670 
671 Stores C<val> in a hash.  The hash key is specified as C<key>.  The C<hash>
672 parameter is the precomputed hash value; if it is zero then Perl will
673 compute it.  The return value is the new hash entry so created.  It will be
674 NULL if the operation failed or if the value did not need to be actually
675 stored within the hash (as in the case of tied hashes).  Otherwise the
676 contents of the return value can be accessed using the C<He?> macros
677 described here.  Note that the caller is responsible for suitably
678 incrementing the reference count of C<val> before the call, and
679 decrementing it if the function returned NULL.
680 
681 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
682 information on how to use this function on tied hashes.
683 
684 =cut
685 */
686 
687 HE *
688 Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, U32 hash)
689 {
690     XPVHV* xhv;
691     char *key;
692     STRLEN klen;
693     I32 i;
694     HE *entry;
695     HE **oentry;
696     bool is_utf8;
697     int flags = 0;
698     char *keysave;
699 
700     if (!hv)
701 	return 0;
702 
703     xhv = (XPVHV*)SvANY(hv);
704     if (SvMAGICAL(hv)) {
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;
717 #ifdef ENV_IS_CASELESS
718 	    else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
719 		key = SvPV(keysv, klen);
720 		keysv = sv_2mortal(newSVpvn(key,klen));
721 		(void)strupr(SvPVX(keysv));
722 		hash = 0;
723 	    }
724 #endif
725 	}
726     }
727 
728     keysave = key = SvPV(keysv, klen);
729     is_utf8 = (SvUTF8(keysv) != 0);
730 
731     if (is_utf8) {
732 	key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
733         if (is_utf8)
734             flags = HVhek_UTF8;
735         if (key != keysave)
736             flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
737         HvHASKFLAGS_on((SV*)hv);
738     }
739 
740     if (!hash)
741 	PERL_HASH(hash, key, klen);
742 
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);
747 
748     /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
749     oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
750     i = 1;
751     entry = *oentry;
752     for (; entry; i=0, entry = HeNEXT(entry)) {
753 	if (HeHASH(entry) != hash)		/* strings can't be equal */
754 	    continue;
755 	if (HeKLEN(entry) != (I32)klen)
756 	    continue;
757 	if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))	/* is this it? */
758 	    continue;
759 	if ((HeKFLAGS(entry) ^ flags) & HVhek_UTF8)
760 	    continue;
761 	if (HeVAL(entry) == &PL_sv_undef)
762 	    xhv->xhv_placeholders--; /* yes, can store into placeholder slot */
763 	else
764 	    SvREFCNT_dec(HeVAL(entry));
765 	HeVAL(entry) = val;
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)
784 	    Safefree(key);
785 	return entry;
786     }
787 
788     if (SvREADONLY(hv)) {
789 	S_hv_notallowed(aTHX_ flags, key, klen,
790 			"access disallowed key '%"SVf"' to"
791 			);
792     }
793 
794     entry = new_HE();
795     /* share_hek_flags will do the free for us.  This might be considered
796        bad API design.  */
797     if (HvSHAREKEYS(hv))
798 	HeKEY_hek(entry) = share_hek_flags(key, klen, hash, flags);
799     else                                       /* gotta do the real thing */
800 	HeKEY_hek(entry) = save_hek_flags(key, klen, hash, flags);
801     HeVAL(entry) = val;
802     HeNEXT(entry) = *oentry;
803     *oentry = entry;
804 
805     xhv->xhv_keys++; /* HvKEYS(hv)++ */
806     if (i) {				/* initial entry? */
807 	xhv->xhv_fill++; /* HvFILL(hv)++ */
808 	if (xhv->xhv_keys > (IV)xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */)
809 	    hsplit(hv);
810     }
811 
812     return entry;
813 }
814 
815 /*
816 =for apidoc hv_delete
817 
818 Deletes a key/value pair in the hash.  The value SV is removed from the
819 hash and returned to the caller.  The C<klen> is the length of the key.
820 The C<flags> value will normally be zero; if set to G_DISCARD then NULL
821 will be returned.
822 
823 =cut
824 */
825 
826 SV *
827 Perl_hv_delete(pTHX_ HV *hv, const char *key, I32 klen, I32 flags)
828 {
829     register XPVHV* xhv;
830     register I32 i;
831     register U32 hash;
832     register HE *entry;
833     register HE **oentry;
834     SV **svp;
835     SV *sv;
836     bool is_utf8 = FALSE;
837     int k_flags = 0;
838     const char *keysave = key;
839 
840     if (!hv)
841 	return Nullsv;
842     if (klen < 0) {
843       klen = -klen;
844       is_utf8 = TRUE;
845     }
846     if (SvRMAGICAL(hv)) {
847 	bool needs_copy;
848 	bool needs_store;
849 	hv_magic_check (hv, &needs_copy, &needs_store);
850 
851 	if (needs_copy && (svp = hv_fetch(hv, key, klen, TRUE))) {
852 	    sv = *svp;
853 	    mg_clear(sv);
854 	    if (!needs_store) {
855 		if (mg_find(sv, PERL_MAGIC_tiedelem)) {
856 		    /* No longer an element */
857 		    sv_unmagic(sv, PERL_MAGIC_tiedelem);
858 		    return sv;
859 		}
860 		return Nullsv;          /* element cannot be deleted */
861 	    }
862 #ifdef ENV_IS_CASELESS
863 	    else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
864 		sv = sv_2mortal(newSVpvn(key,klen));
865 		key = strupr(SvPVX(sv));
866 	    }
867 #endif
868 	}
869     }
870     xhv = (XPVHV*)SvANY(hv);
871     if (!xhv->xhv_array /* !HvARRAY(hv) */)
872 	return Nullsv;
873 
874     if (is_utf8) {
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;
879         if (is_utf8)
880             k_flags = HVhek_UTF8;
881         if (key != keysave)
882             k_flags |= HVhek_FREEKEY;
883     }
884 
885     PERL_HASH(hash, key, klen);
886 
887     /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
888     oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
889     entry = *oentry;
890     i = 1;
891     for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
892 	if (HeHASH(entry) != hash)		/* strings can't be equal */
893 	    continue;
894 	if (HeKLEN(entry) != (I32)klen)
895 	    continue;
896 	if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))	/* is this it? */
897 	    continue;
898 	if ((HeKFLAGS(entry) ^ k_flags) & HVhek_UTF8)
899 	    continue;
900 	if (k_flags & HVhek_FREEKEY)
901 	    Safefree(key);
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)-- */
917 		if (xhv->xhv_keys == 0)
918 		    HvHASKFLAGS_off(hv);
919 		xhv->xhv_placeholders--;
920 		return Nullsv;
921 	    }
922 	}
923 	else if (SvREADONLY(hv) && HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
924 	    S_hv_notallowed(aTHX_ k_flags, key, klen,
925 			    "delete readonly key '%"SVf"' from"
926 			    );
927 	}
928 
929 	if (flags & G_DISCARD)
930 	    sv = Nullsv;
931 	else {
932 	    sv = sv_2mortal(HeVAL(entry));
933 	    HeVAL(entry) = &PL_sv_undef;
934 	}
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 {
948 	    *oentry = HeNEXT(entry);
949 	    if (i && !*oentry)
950 		xhv->xhv_fill--; /* HvFILL(hv)-- */
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)-- */
956 	    if (xhv->xhv_keys == 0)
957 	        HvHASKFLAGS_off(hv);
958 	}
959 	return sv;
960     }
961     if (SvREADONLY(hv)) {
962 	S_hv_notallowed(aTHX_ k_flags, key, klen,
963 			"access disallowed key '%"SVf"' from"
964 			);
965     }
966 
967     if (k_flags & HVhek_FREEKEY)
968 	Safefree(key);
969     return Nullsv;
970 }
971 
972 /*
973 =for apidoc hv_delete_ent
974 
975 Deletes a key/value pair in the hash.  The value SV is removed from the
976 hash and returned to the caller.  The C<flags> value will normally be zero;
977 if set to G_DISCARD then NULL will be returned.  C<hash> can be a valid
978 precomputed hash value, or 0 to ask for it to be computed.
979 
980 =cut
981 */
982 
983 SV *
984 Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
985 {
986     register XPVHV* xhv;
987     register I32 i;
988     register char *key;
989     STRLEN klen;
990     register HE *entry;
991     register HE **oentry;
992     SV *sv;
993     bool is_utf8;
994     int k_flags = 0;
995     char *keysave;
996 
997     if (!hv)
998 	return Nullsv;
999     if (SvRMAGICAL(hv)) {
1000 	bool needs_copy;
1001 	bool needs_store;
1002 	hv_magic_check (hv, &needs_copy, &needs_store);
1003 
1004 	if (needs_copy && (entry = hv_fetch_ent(hv, keysv, TRUE, hash))) {
1005 	    sv = HeVAL(entry);
1006 	    mg_clear(sv);
1007 	    if (!needs_store) {
1008 		if (mg_find(sv, PERL_MAGIC_tiedelem)) {
1009 		    /* No longer an element */
1010 		    sv_unmagic(sv, PERL_MAGIC_tiedelem);
1011 		    return sv;
1012 		}
1013 		return Nullsv;		/* element cannot be deleted */
1014 	    }
1015 #ifdef ENV_IS_CASELESS
1016 	    else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
1017 		key = SvPV(keysv, klen);
1018 		keysv = sv_2mortal(newSVpvn(key,klen));
1019 		(void)strupr(SvPVX(keysv));
1020 		hash = 0;
1021 	    }
1022 #endif
1023 	}
1024     }
1025     xhv = (XPVHV*)SvANY(hv);
1026     if (!xhv->xhv_array /* !HvARRAY(hv) */)
1027 	return Nullsv;
1028 
1029     keysave = key = SvPV(keysv, klen);
1030     is_utf8 = (SvUTF8(keysv) != 0);
1031 
1032     if (is_utf8) {
1033 	key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
1034         if (is_utf8)
1035             k_flags = HVhek_UTF8;
1036         if (key != keysave)
1037             k_flags |= HVhek_FREEKEY;
1038     }
1039 
1040     if (!hash)
1041 	PERL_HASH(hash, key, klen);
1042 
1043     /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1044     oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
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;
1050 	if (HeKLEN(entry) != (I32)klen)
1051 	    continue;
1052 	if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))	/* is this it? */
1053 	    continue;
1054 	if ((HeKFLAGS(entry) ^ k_flags) & HVhek_UTF8)
1055 	    continue;
1056         if (k_flags & HVhek_FREEKEY)
1057             Safefree(key);
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. */
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)-- */
1074 	   if (xhv->xhv_keys == 0)
1075                HvHASKFLAGS_off(hv);
1076            xhv->xhv_placeholders--;
1077            return Nullsv;
1078 	}
1079 	else if (SvREADONLY(hv) && HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
1080 	    S_hv_notallowed(aTHX_ k_flags, key, klen,
1081 			    "delete readonly key '%"SVf"' from"
1082 			    );
1083 	}
1084 
1085 	if (flags & G_DISCARD)
1086 	    sv = Nullsv;
1087 	else {
1088 	    sv = sv_2mortal(HeVAL(entry));
1089 	    HeVAL(entry) = &PL_sv_undef;
1090 	}
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 {
1104 	    *oentry = HeNEXT(entry);
1105 	    if (i && !*oentry)
1106 		xhv->xhv_fill--; /* HvFILL(hv)-- */
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)-- */
1112 	    if (xhv->xhv_keys == 0)
1113 	        HvHASKFLAGS_off(hv);
1114 	}
1115 	return sv;
1116     }
1117     if (SvREADONLY(hv)) {
1118         S_hv_notallowed(aTHX_ k_flags, key, klen,
1119 			"delete disallowed key '%"SVf"' from"
1120 			);
1121     }
1122 
1123     if (k_flags & HVhek_FREEKEY)
1124 	Safefree(key);
1125     return Nullsv;
1126 }
1127 
1128 /*
1129 =for apidoc hv_exists
1130 
1131 Returns a boolean indicating whether the specified hash key exists.  The
1132 C<klen> is the length of the key.
1133 
1134 =cut
1135 */
1136 
1137 bool
1138 Perl_hv_exists(pTHX_ HV *hv, const char *key, I32 klen)
1139 {
1140     register XPVHV* xhv;
1141     register U32 hash;
1142     register HE *entry;
1143     SV *sv;
1144     bool is_utf8 = FALSE;
1145     const char *keysave = key;
1146     int k_flags = 0;
1147 
1148     if (!hv)
1149 	return 0;
1150 
1151     if (klen < 0) {
1152       klen = -klen;
1153       is_utf8 = TRUE;
1154     }
1155 
1156     if (SvRMAGICAL(hv)) {
1157 	if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
1158 	    sv = sv_newmortal();
1159 	    mg_copy((SV*)hv, sv, key, klen);
1160 	    magic_existspack(sv, mg_find(sv, PERL_MAGIC_tiedelem));
1161 	    return (bool)SvTRUE(sv);
1162 	}
1163 #ifdef ENV_IS_CASELESS
1164 	else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
1165 	    sv = sv_2mortal(newSVpvn(key,klen));
1166 	    key = strupr(SvPVX(sv));
1167 	}
1168 #endif
1169     }
1170 
1171     xhv = (XPVHV*)SvANY(hv);
1172 #ifndef DYNAMIC_ENV_FETCH
1173     if (!xhv->xhv_array /* !HvARRAY(hv) */)
1174 	return 0;
1175 #endif
1176 
1177     if (is_utf8) {
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;
1182         if (is_utf8)
1183             k_flags = HVhek_UTF8;
1184         if (key != keysave)
1185             k_flags |= HVhek_FREEKEY;
1186     }
1187 
1188     PERL_HASH(hash, key, klen);
1189 
1190 #ifdef DYNAMIC_ENV_FETCH
1191     if (!xhv->xhv_array /* !HvARRAY(hv) */) entry = Null(HE*);
1192     else
1193 #endif
1194     /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1195     entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
1196     for (; entry; entry = HeNEXT(entry)) {
1197 	if (HeHASH(entry) != hash)		/* strings can't be equal */
1198 	    continue;
1199 	if (HeKLEN(entry) != klen)
1200 	    continue;
1201 	if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))	/* is this it? */
1202 	    continue;
1203 	if ((HeKFLAGS(entry) ^ k_flags) & HVhek_UTF8)
1204 	    continue;
1205 	if (k_flags & HVhek_FREEKEY)
1206 	    Safefree(key);
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 
1211 	return TRUE;
1212     }
1213 #ifdef DYNAMIC_ENV_FETCH  /* is it out there? */
1214     if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
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);
1221             if (k_flags & HVhek_FREEKEY)
1222                 Safefree(key);
1223 	    return TRUE;
1224 	}
1225     }
1226 #endif
1227     if (k_flags & HVhek_FREEKEY)
1228         Safefree(key);
1229     return FALSE;
1230 }
1231 
1232 
1233 /*
1234 =for apidoc hv_exists_ent
1235 
1236 Returns a boolean indicating whether the specified hash key exists. C<hash>
1237 can be a valid precomputed hash value, or 0 to ask for it to be
1238 computed.
1239 
1240 =cut
1241 */
1242 
1243 bool
1244 Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
1245 {
1246     register XPVHV* xhv;
1247     register char *key;
1248     STRLEN klen;
1249     register HE *entry;
1250     SV *sv;
1251     bool is_utf8;
1252     char *keysave;
1253     int k_flags = 0;
1254 
1255     if (!hv)
1256 	return 0;
1257 
1258     if (SvRMAGICAL(hv)) {
1259 	if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
1260 	   SV* svret = sv_newmortal();
1261 	    sv = sv_newmortal();
1262 	    keysv = sv_2mortal(newSVsv(keysv));
1263 	    mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
1264 	   magic_existspack(svret, mg_find(sv, PERL_MAGIC_tiedelem));
1265 	   return (bool)SvTRUE(svret);
1266 	}
1267 #ifdef ENV_IS_CASELESS
1268 	else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
1269 	    key = SvPV(keysv, klen);
1270 	    keysv = sv_2mortal(newSVpvn(key,klen));
1271 	    (void)strupr(SvPVX(keysv));
1272 	    hash = 0;
1273 	}
1274 #endif
1275     }
1276 
1277     xhv = (XPVHV*)SvANY(hv);
1278 #ifndef DYNAMIC_ENV_FETCH
1279     if (!xhv->xhv_array /* !HvARRAY(hv) */)
1280 	return 0;
1281 #endif
1282 
1283     keysave = key = SvPV(keysv, klen);
1284     is_utf8 = (SvUTF8(keysv) != 0);
1285     if (is_utf8) {
1286 	key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
1287         if (is_utf8)
1288             k_flags = HVhek_UTF8;
1289         if (key != keysave)
1290             k_flags |= HVhek_FREEKEY;
1291     }
1292     if (!hash)
1293 	PERL_HASH(hash, key, klen);
1294 
1295 #ifdef DYNAMIC_ENV_FETCH
1296     if (!xhv->xhv_array /* !HvARRAY(hv) */) entry = Null(HE*);
1297     else
1298 #endif
1299     /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1300     entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
1301     for (; entry; entry = HeNEXT(entry)) {
1302 	if (HeHASH(entry) != hash)		/* strings can't be equal */
1303 	    continue;
1304 	if (HeKLEN(entry) != (I32)klen)
1305 	    continue;
1306 	if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))	/* is this it? */
1307 	    continue;
1308 	if ((HeKFLAGS(entry) ^ k_flags) & HVhek_UTF8)
1309 	    continue;
1310 	if (k_flags & HVhek_FREEKEY)
1311 	    Safefree(key);
1312 	/* If we find the key, but the value is a placeholder, return false. */
1313 	if (HeVAL(entry) == &PL_sv_undef)
1314 	    return FALSE;
1315 	return TRUE;
1316     }
1317 #ifdef DYNAMIC_ENV_FETCH  /* is it out there? */
1318     if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
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);
1325             if (k_flags & HVhek_FREEKEY)
1326                 Safefree(key);
1327 	    return TRUE;
1328 	}
1329     }
1330 #endif
1331     if (k_flags & HVhek_FREEKEY)
1332         Safefree(key);
1333     return FALSE;
1334 }
1335 
1336 STATIC void
1337 S_hsplit(pTHX_ HV *hv)
1338 {
1339     register XPVHV* xhv = (XPVHV*)SvANY(hv);
1340     I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
1341     register I32 newsize = oldsize * 2;
1342     register I32 i;
1343     register char *a = xhv->xhv_array; /* HvARRAY(hv) */
1344     register HE **aep;
1345     register HE **bep;
1346     register HE *entry;
1347     register HE **oentry;
1348 
1349     PL_nomemok = TRUE;
1350 #if defined(STRANGE_MALLOC) || defined(MYMALLOC)
1351     Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1352     if (!a) {
1353       PL_nomemok = FALSE;
1354       return;
1355     }
1356 #else
1357     New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1358     if (!a) {
1359       PL_nomemok = FALSE;
1360       return;
1361     }
1362     Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
1363     if (oldsize >= 64) {
1364 	offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
1365 			PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
1366     }
1367     else
1368 	Safefree(xhv->xhv_array /* HvARRAY(hv) */);
1369 #endif
1370 
1371     PL_nomemok = FALSE;
1372     Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char);	/* zero 2nd half*/
1373     xhv->xhv_max = --newsize;	/* HvMAX(hv) = --newsize */
1374     xhv->xhv_array = a;		/* HvARRAY(hv) = a */
1375     aep = (HE**)a;
1376 
1377     for (i=0; i<oldsize; i++,aep++) {
1378 	if (!*aep)				/* non-existent */
1379 	    continue;
1380 	bep = aep+oldsize;
1381 	for (oentry = aep, entry = *aep; entry; entry = *oentry) {
1382 	    if ((HeHASH(entry) & newsize) != (U32)i) {
1383 		*oentry = HeNEXT(entry);
1384 		HeNEXT(entry) = *bep;
1385 		if (!*bep)
1386 		    xhv->xhv_fill++; /* HvFILL(hv)++ */
1387 		*bep = entry;
1388 		continue;
1389 	    }
1390 	    else
1391 		oentry = &HeNEXT(entry);
1392 	}
1393 	if (!*aep)				/* everything moved */
1394 	    xhv->xhv_fill--; /* HvFILL(hv)-- */
1395     }
1396 }
1397 
1398 void
1399 Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
1400 {
1401     register XPVHV* xhv = (XPVHV*)SvANY(hv);
1402     I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
1403     register I32 newsize;
1404     register I32 i;
1405     register I32 j;
1406     register char *a;
1407     register HE **aep;
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 
1422     a = xhv->xhv_array; /* HvARRAY(hv) */
1423     if (a) {
1424 	PL_nomemok = TRUE;
1425 #if defined(STRANGE_MALLOC) || defined(MYMALLOC)
1426 	Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1427 	if (!a) {
1428 	  PL_nomemok = FALSE;
1429 	  return;
1430 	}
1431 #else
1432 	New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1433 	if (!a) {
1434 	  PL_nomemok = FALSE;
1435 	  return;
1436 	}
1437 	Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
1438 	if (oldsize >= 64) {
1439 	    offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
1440 			    PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
1441 	}
1442 	else
1443 	    Safefree(xhv->xhv_array /* HvARRAY(hv) */);
1444 #endif
1445 	PL_nomemok = FALSE;
1446 	Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
1447     }
1448     else {
1449 	Newz(0, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1450     }
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 */
1454 	return;
1455 
1456     aep = (HE**)a;
1457     for (i=0; i<oldsize; i++,aep++) {
1458 	if (!*aep)				/* non-existent */
1459 	    continue;
1460 	for (oentry = aep, entry = *aep; entry; entry = *oentry) {
1461 	    if ((j = (HeHASH(entry) & newsize)) != i) {
1462 		j -= i;
1463 		*oentry = HeNEXT(entry);
1464 		if (!(HeNEXT(entry) = aep[j]))
1465 		    xhv->xhv_fill++; /* HvFILL(hv)++ */
1466 		aep[j] = entry;
1467 		continue;
1468 	    }
1469 	    else
1470 		oentry = &HeNEXT(entry);
1471 	}
1472 	if (!*aep)				/* everything moved */
1473 	    xhv->xhv_fill--; /* HvFILL(hv)-- */
1474     }
1475 }
1476 
1477 /*
1478 =for apidoc newHV
1479 
1480 Creates a new HV.  The reference count is set to 1.
1481 
1482 =cut
1483 */
1484 
1485 HV *
1486 Perl_newHV(pTHX)
1487 {
1488     register HV *hv;
1489     register XPVHV* xhv;
1490 
1491     hv = (HV*)NEWSV(502,0);
1492     sv_upgrade((SV *)hv, SVt_PVHV);
1493     xhv = (XPVHV*)SvANY(hv);
1494     SvPOK_off(hv);
1495     SvNOK_off(hv);
1496 #ifndef NODEFAULT_SHAREKEYS
1497     HvSHAREKEYS_on(hv);         /* key-sharing on by default */
1498 #endif
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 */
1502     (void)hv_iterinit(hv);	/* so each() will start off right */
1503     return hv;
1504 }
1505 
1506 HV *
1507 Perl_newHVhv(pTHX_ HV *ohv)
1508 {
1509     HV *hv = newHV();
1510     STRLEN hv_max, hv_fill;
1511 
1512     if (!ohv || (hv_fill = HvFILL(ohv)) == 0)
1513 	return hv;
1514     hv_max = HvMAX(ohv);
1515 
1516     if (!SvMAGICAL((SV *)ohv)) {
1517 	/* It's an ordinary hash, so copy it fast. AMS 20010804 */
1518 	STRLEN i;
1519 	bool shared = !!HvSHAREKEYS(ohv);
1520 	HE **ents, **oents = (HE **)HvARRAY(ohv);
1521 	char *a;
1522 	New(0, a, PERL_HV_ARRAY_ALLOC_BYTES(hv_max+1), char);
1523 	ents = (HE**)a;
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);
1538 		STRLEN len = HeKLEN(oent);
1539                 int flags  = HeKFLAGS(oent);
1540 
1541 		ent = new_HE();
1542 		HeVAL(ent)     = newSVsv(HeVAL(oent));
1543 		HeKEY_hek(ent)
1544                     = shared ? share_hek_flags(key, len, hash, flags)
1545                              :  save_hek_flags(key, len, hash, flags);
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;
1557 	HvTOTALKEYS(hv)  = HvTOTALKEYS(ohv);
1558 	HvARRAY(hv) = ents;
1559     }
1560     else {
1561 	/* Iterate over ohv, copying keys and values one at a time. */
1562 	HE *entry;
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 
1571 	hv_iterinit(ohv);
1572 	while ((entry = hv_iternext_flags(ohv, 0))) {
1573 	    hv_store_flags(hv, HeKEY(entry), HeKLEN(entry),
1574                            newSVsv(HeVAL(entry)), HeHASH(entry),
1575                            HeKFLAGS(entry));
1576 	}
1577 	HvRITER(ohv) = riter;
1578 	HvEITER(ohv) = eiter;
1579     }
1580 
1581     return hv;
1582 }
1583 
1584 void
1585 Perl_hv_free_ent(pTHX_ HV *hv, register HE *entry)
1586 {
1587     SV *val;
1588 
1589     if (!entry)
1590 	return;
1591     val = HeVAL(entry);
1592     if (val && isGV(val) && GvCVu(val) && HvNAME(hv))
1593 	PL_sub_generation++;	/* may be deletion of method from stash */
1594     SvREFCNT_dec(val);
1595     if (HeKLEN(entry) == HEf_SVKEY) {
1596 	SvREFCNT_dec(HeKEY_sv(entry));
1597 	Safefree(HeKEY_hek(entry));
1598     }
1599     else if (HvSHAREKEYS(hv))
1600 	unshare_hek(HeKEY_hek(entry));
1601     else
1602 	Safefree(HeKEY_hek(entry));
1603     del_HE(entry);
1604 }
1605 
1606 void
1607 Perl_hv_delayfree_ent(pTHX_ HV *hv, register HE *entry)
1608 {
1609     if (!entry)
1610 	return;
1611     if (isGV(HeVAL(entry)) && GvCVu(HeVAL(entry)) && HvNAME(hv))
1612 	PL_sub_generation++;	/* may be deletion of method from stash */
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));
1617     }
1618     else if (HvSHAREKEYS(hv))
1619 	unshare_hek(HeKEY_hek(entry));
1620     else
1621 	Safefree(HeKEY_hek(entry));
1622     del_HE(entry);
1623 }
1624 
1625 /*
1626 =for apidoc hv_clear
1627 
1628 Clears a hash, making it empty.
1629 
1630 =cut
1631 */
1632 
1633 void
1634 Perl_hv_clear(pTHX_ HV *hv)
1635 {
1636     register XPVHV* xhv;
1637     if (!hv)
1638 	return;
1639 
1640     if(SvREADONLY(hv)) {
1641         Perl_croak(aTHX_ "Attempt to clear a restricted hash");
1642     }
1643 
1644     xhv = (XPVHV*)SvANY(hv);
1645     hfreeentries(hv);
1646     xhv->xhv_fill = 0; /* HvFILL(hv) = 0 */
1647     xhv->xhv_keys = 0; /* HvKEYS(hv) = 0 */
1648     xhv->xhv_placeholders = 0; /* HvPLACEHOLDERS(hv) = 0 */
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*));
1652 
1653     if (SvRMAGICAL(hv))
1654 	mg_clear((SV*)hv);
1655 
1656     HvHASKFLAGS_off(hv);
1657 }
1658 
1659 STATIC void
1660 S_hfreeentries(pTHX_ HV *hv)
1661 {
1662     register HE **array;
1663     register HE *entry;
1664     register HE *oentry = Null(HE*);
1665     I32 riter;
1666     I32 max;
1667 
1668     if (!hv)
1669 	return;
1670     if (!HvARRAY(hv))
1671 	return;
1672 
1673     riter = 0;
1674     max = HvMAX(hv);
1675     array = HvARRAY(hv);
1676     entry = array[0];
1677     for (;;) {
1678 	if (entry) {
1679 	    oentry = entry;
1680 	    entry = HeNEXT(entry);
1681 	    hv_free_ent(hv, oentry);
1682 	}
1683 	if (!entry) {
1684 	    if (++riter > max)
1685 		break;
1686 	    entry = array[riter];
1687 	}
1688     }
1689     (void)hv_iterinit(hv);
1690 }
1691 
1692 /*
1693 =for apidoc hv_undef
1694 
1695 Undefines the hash.
1696 
1697 =cut
1698 */
1699 
1700 void
1701 Perl_hv_undef(pTHX_ HV *hv)
1702 {
1703     register XPVHV* xhv;
1704     if (!hv)
1705 	return;
1706     xhv = (XPVHV*)SvANY(hv);
1707     hfreeentries(hv);
1708     Safefree(xhv->xhv_array /* HvARRAY(hv) */);
1709     if (HvNAME(hv)) {
1710 	Safefree(HvNAME(hv));
1711 	HvNAME(hv) = 0;
1712     }
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 */
1717     xhv->xhv_placeholders = 0; /* HvPLACEHOLDERS(hv) = 0 */
1718 
1719     if (SvRMAGICAL(hv))
1720 	mg_clear((SV*)hv);
1721 }
1722 
1723 /*
1724 =for apidoc hv_iterinit
1725 
1726 Prepares a starting point to traverse a hash table.  Returns the number of
1727 keys in the hash (i.e. the same as C<HvKEYS(tb)>).  The return value is
1728 currently only meaningful for hashes without tie magic.
1729 
1730 NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
1731 hash buckets that happen to be in use.  If you still need that esoteric
1732 value, you can get it through the macro C<HvFILL(tb)>.
1733 
1734 
1735 =cut
1736 */
1737 
1738 I32
1739 Perl_hv_iterinit(pTHX_ HV *hv)
1740 {
1741     register XPVHV* xhv;
1742     HE *entry;
1743 
1744     if (!hv)
1745 	Perl_croak(aTHX_ "Bad hash");
1746     xhv = (XPVHV*)SvANY(hv);
1747     entry = xhv->xhv_eiter; /* HvEITER(hv) */
1748     if (entry && HvLAZYDEL(hv)) {	/* was deleted earlier? */
1749 	HvLAZYDEL_off(hv);
1750 	hv_free_ent(hv, entry);
1751     }
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 */
1755     return XHvTOTALKEYS(xhv);
1756 }
1757 /*
1758 =for apidoc hv_iternext
1759 
1760 Returns entries from a hash iterator.  See C<hv_iterinit>.
1761 
1762 You may call C<hv_delete> or C<hv_delete_ent> on the hash entry that the
1763 iterator currently points to, without losing your place or invalidating your
1764 iterator.  Note that in this case the current entry is deleted from the hash
1765 with your iterator holding the last reference to it.  Your iterator is flagged
1766 to free the entry on the next call to C<hv_iternext>, so you must not discard
1767 your iterator immediately else the entry will leak - call C<hv_iternext> to
1768 trigger the resource deallocation.
1769 
1770 =cut
1771 */
1772 
1773 HE *
1774 Perl_hv_iternext(pTHX_ HV *hv)
1775 {
1776     return hv_iternext_flags(hv, 0);
1777 }
1778 
1779 /*
1780 =for apidoc hv_iternext_flags
1781 
1782 Returns entries from a hash iterator.  See C<hv_iterinit> and C<hv_iternext>.
1783 The C<flags> value will normally be zero; if HV_ITERNEXT_WANTPLACEHOLDERS is
1784 set the placeholders keys (for restricted hashes) will be returned in addition
1785 to normal keys. By default placeholders are automatically skipped over.
1786 Currently 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
1788 C<!SvOK> is false). Note that the implementation of placeholders and
1789 restricted hashes may change, and the implementation currently is
1790 insufficiently abstracted for any change to be tidy.
1791 
1792 =cut
1793 */
1794 
1795 HE *
1796 Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags)
1797 {
1798     register XPVHV* xhv;
1799     register HE *entry;
1800     HE *oldentry;
1801     MAGIC* mg;
1802 
1803     if (!hv)
1804 	Perl_croak(aTHX_ "Bad hash");
1805     xhv = (XPVHV*)SvANY(hv);
1806     oldentry = entry = xhv->xhv_eiter; /* HvEITER(hv) */
1807 
1808     if ((mg = SvTIED_mg((SV*)hv, PERL_MAGIC_tied))) {
1809 	SV *key = sv_newmortal();
1810 	if (entry) {
1811 	    sv_setsv(key, HeSVKEY_force(entry));
1812 	    SvREFCNT_dec(HeSVKEY(entry));	/* get rid of previous key */
1813 	}
1814 	else {
1815 	    char *k;
1816 	    HEK *hek;
1817 
1818 	    /* one HE per MAGICAL hash */
1819 	    xhv->xhv_eiter = entry = new_HE(); /* HvEITER(hv) = new_HE() */
1820 	    Zero(entry, 1, HE);
1821 	    Newz(54, k, HEK_BASESIZE + sizeof(SV*), char);
1822 	    hek = (HEK*)k;
1823 	    HeKEY_hek(entry) = hek;
1824 	    HeKLEN(entry) = HEf_SVKEY;
1825 	}
1826 	magic_nextpack((SV*) hv,mg,key);
1827 	if (SvOK(key)) {
1828 	    /* force key to stay around until next time */
1829 	    HeSVKEY_set(entry, SvREFCNT_inc(key));
1830 	    return entry;		/* beware, hent_val is not set */
1831 	}
1832 	if (HeVAL(entry))
1833 	    SvREFCNT_dec(HeVAL(entry));
1834 	Safefree(HeKEY_hek(entry));
1835 	del_HE(entry);
1836 	xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
1837 	return Null(HE*);
1838     }
1839 #ifdef DYNAMIC_ENV_FETCH  /* set up %ENV for iteration */
1840     if (!entry && SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
1841 	prime_env_iter();
1842 #endif
1843 
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);
1848     if (entry)
1849     {
1850 	entry = HeNEXT(entry);
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             }
1859 	}
1860     }
1861     while (!entry) {
1862 	xhv->xhv_riter++; /* HvRITER(hv)++ */
1863 	if (xhv->xhv_riter > (I32)xhv->xhv_max /* HvRITER(hv) > HvMAX(hv) */) {
1864 	    xhv->xhv_riter = -1; /* HvRITER(hv) = -1 */
1865 	    break;
1866 	}
1867 	/* entry = (HvARRAY(hv))[HvRITER(hv)]; */
1868 	entry = ((HE**)xhv->xhv_array)[xhv->xhv_riter];
1869 
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         }
1875     }
1876 
1877     if (oldentry && HvLAZYDEL(hv)) {		/* was deleted earlier? */
1878 	HvLAZYDEL_off(hv);
1879 	hv_free_ent(hv, oldentry);
1880     }
1881 
1882     xhv->xhv_eiter = entry; /* HvEITER(hv) = entry */
1883     return entry;
1884 }
1885 
1886 /*
1887 =for apidoc hv_iterkey
1888 
1889 Returns the key from the current position of the hash iterator.  See
1890 C<hv_iterinit>.
1891 
1892 =cut
1893 */
1894 
1895 char *
1896 Perl_hv_iterkey(pTHX_ register HE *entry, I32 *retlen)
1897 {
1898     if (HeKLEN(entry) == HEf_SVKEY) {
1899 	STRLEN len;
1900 	char *p = SvPV(HeKEY_sv(entry), len);
1901 	*retlen = len;
1902 	return p;
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 */
1911 /*
1912 =for apidoc hv_iterkeysv
1913 
1914 Returns the key as an C<SV*> from the current position of the hash
1915 iterator.  The return value will always be a mortal copy of the key.  Also
1916 see C<hv_iterinit>.
1917 
1918 =cut
1919 */
1920 
1921 SV *
1922 Perl_hv_iterkeysv(pTHX_ register HE *entry)
1923 {
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);
1934             U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
1935 
1936             sv = newSVpvn ((char*)as_utf8, utf8_len);
1937             SvUTF8_on (sv);
1938 	    Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
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));
1947 }
1948 
1949 /*
1950 =for apidoc hv_iterval
1951 
1952 Returns the value from the current position of the hash iterator.  See
1953 C<hv_iterkey>.
1954 
1955 =cut
1956 */
1957 
1958 SV *
1959 Perl_hv_iterval(pTHX_ HV *hv, register HE *entry)
1960 {
1961     if (SvRMAGICAL(hv)) {
1962 	if (mg_find((SV*)hv, PERL_MAGIC_tied)) {
1963 	    SV* sv = sv_newmortal();
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));
1967 	    return sv;
1968 	}
1969     }
1970     return HeVAL(entry);
1971 }
1972 
1973 /*
1974 =for apidoc hv_iternextsv
1975 
1976 Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
1977 operation.
1978 
1979 =cut
1980 */
1981 
1982 SV *
1983 Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
1984 {
1985     HE *he;
1986     if ( (he = hv_iternext_flags(hv, 0)) == NULL)
1987 	return NULL;
1988     *key = hv_iterkey(he, retlen);
1989     return hv_iterval(hv, he);
1990 }
1991 
1992 /*
1993 =for apidoc hv_magic
1994 
1995 Adds magic to a hash.  See C<sv_magic>.
1996 
1997 =cut
1998 */
1999 
2000 void
2001 Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how)
2002 {
2003     sv_magic((SV*)hv, (SV*)gv, how, Nullch, 0);
2004 }
2005 
2006 #if 0 /* use the macro from hv.h instead */
2007 
2008 char*
2009 Perl_sharepvn(pTHX_ const char *sv, I32 len, U32 hash)
2010 {
2011     return HEK_KEY(share_hek(sv, len, hash));
2012 }
2013 
2014 #endif
2015 
2016 /* possibly free a shared string if no one has access to it
2017  * len and hash must both be valid for str.
2018  */
2019 void
2020 Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
2021 {
2022     unshare_hek_or_pvn (NULL, str, len, hash);
2023 }
2024 
2025 
2026 void
2027 Perl_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  */
2036 STATIC void
2037 S_unshare_hek_or_pvn(pTHX_ HEK *hek, const char *str, I32 len, U32 hash)
2038 {
2039     register XPVHV* xhv;
2040     register HE *entry;
2041     register HE **oentry;
2042     register I32 i = 1;
2043     I32 found = 0;
2044     bool is_utf8 = FALSE;
2045     int k_flags = 0;
2046     const char *save = str;
2047 
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;
2060     }
2061 
2062     /* what follows is the moral equivalent of:
2063     if ((Svp = hv_fetch(PL_strtab, tmpsv, FALSE, hash))) {
2064 	if (--*Svp == Nullsv)
2065 	    hv_delete(PL_strtab, str, len, G_DISCARD, hash);
2066     } */
2067     xhv = (XPVHV*)SvANY(PL_strtab);
2068     /* assert(xhv_array != 0) */
2069     LOCK_STRTAB_MUTEX;
2070     /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
2071     oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
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         }
2104     }
2105 
2106     UNLOCK_STRTAB_MUTEX;
2107     if (!found && ckWARN_d(WARN_INTERNAL))
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);
2114 }
2115 
2116 /* get a (constant) string ptr from the global string table
2117  * string will get added if it is not already there.
2118  * len and hash must both be valid for str.
2119  */
2120 HEK *
2121 Perl_share_hek(pTHX_ const char *str, I32 len, register U32 hash)
2122 {
2123     bool is_utf8 = FALSE;
2124     int flags = 0;
2125     const char *save = str;
2126 
2127     if (len < 0) {
2128       STRLEN tmplen = -len;
2129       is_utf8 = TRUE;
2130       /* See the note in hv_fetch(). --jhi */
2131       str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
2132       len = tmplen;
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 
2147 STATIC HEK *
2148 S_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;
2156 
2157     /* what follows is the moral equivalent of:
2158 
2159     if (!(Svp = hv_fetch(PL_strtab, str, len, FALSE)))
2160 	hv_store(PL_strtab, str, len, Nullsv, hash);
2161     */
2162     xhv = (XPVHV*)SvANY(PL_strtab);
2163     /* assert(xhv_array != 0) */
2164     LOCK_STRTAB_MUTEX;
2165     /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
2166     oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
2167     for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
2168 	if (HeHASH(entry) != hash)		/* strings can't be equal */
2169 	    continue;
2170 	if (HeKLEN(entry) != len)
2171 	    continue;
2172 	if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len))	/* is this it? */
2173 	    continue;
2174 	if (HeKFLAGS(entry) != flags_masked)
2175 	    continue;
2176 	found = 1;
2177 	break;
2178     }
2179     if (!found) {
2180 	entry = new_HE();
2181 	HeKEY_hek(entry) = save_hek_flags(str, len, hash, flags);
2182 	HeVAL(entry) = Nullsv;
2183 	HeNEXT(entry) = *oentry;
2184 	*oentry = entry;
2185 	xhv->xhv_keys++; /* HvKEYS(hv)++ */
2186 	if (i) {				/* initial entry? */
2187 	    xhv->xhv_fill++; /* HvFILL(hv)++ */
2188 	    if (xhv->xhv_keys > (IV)xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */)
2189 		hsplit(PL_strtab);
2190 	}
2191     }
2192 
2193     ++HeVAL(entry);				/* use value slot as REFCNT */
2194     UNLOCK_STRTAB_MUTEX;
2195 
2196     if (flags & HVhek_FREEKEY)
2197 	Safefree(str);
2198 
2199     return HeKEY_hek(entry);
2200 }
2201