xref: /openbsd-src/gnu/usr.bin/perl/hv.c (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1 /*    hv.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4  *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10 
11 /*
12  *      I sit beside the fire and think
13  *          of all that I have seen.
14  *                         --Bilbo
15  *
16  *     [p.278 of _The Lord of the Rings_, II/iii: "The Ring Goes South"]
17  */
18 
19 /*
20 =head1 Hash Manipulation Functions
21 
22 A HV structure represents a Perl hash.  It consists mainly of an array
23 of pointers, each of which points to a linked list of HE structures.  The
24 array is indexed by the hash function of the key, so each linked list
25 represents all the hash entries with the same hash value.  Each HE contains
26 a pointer to the actual value, plus a pointer to a HEK structure which
27 holds the key and hash value.
28 
29 =cut
30 
31 */
32 
33 #include "EXTERN.h"
34 #define PERL_IN_HV_C
35 #define PERL_HASH_INTERNAL_ACCESS
36 #include "perl.h"
37 
38 #define DO_HSPLIT(xhv) ((xhv)->xhv_keys > (xhv)->xhv_max) /* HvTOTALKEYS(hv) > HvMAX(hv) */
39 #define HV_FILL_THRESHOLD 31
40 
41 static const char S_strtab_error[]
42     = "Cannot modify shared string table in hv_%s";
43 
44 #ifdef PURIFY
45 
46 #define new_HE() (HE*)safemalloc(sizeof(HE))
47 #define del_HE(p) safefree((char*)p)
48 
49 #else
50 
51 STATIC HE*
52 S_new_he(pTHX)
53 {
54     dVAR;
55     HE* he;
56     void ** const root = &PL_body_roots[HE_SVSLOT];
57 
58     if (!*root)
59 	Perl_more_bodies(aTHX_ HE_SVSLOT, sizeof(HE), PERL_ARENA_SIZE);
60     he = (HE*) *root;
61     assert(he);
62     *root = HeNEXT(he);
63     return he;
64 }
65 
66 #define new_HE() new_he()
67 #define del_HE(p) \
68     STMT_START { \
69 	HeNEXT(p) = (HE*)(PL_body_roots[HE_SVSLOT]);	\
70 	PL_body_roots[HE_SVSLOT] = p; \
71     } STMT_END
72 
73 
74 
75 #endif
76 
77 STATIC HEK *
78 S_save_hek_flags(const char *str, I32 len, U32 hash, int flags)
79 {
80     const int flags_masked = flags & HVhek_MASK;
81     char *k;
82     HEK *hek;
83 
84     PERL_ARGS_ASSERT_SAVE_HEK_FLAGS;
85 
86     Newx(k, HEK_BASESIZE + len + 2, char);
87     hek = (HEK*)k;
88     Copy(str, HEK_KEY(hek), len, char);
89     HEK_KEY(hek)[len] = 0;
90     HEK_LEN(hek) = len;
91     HEK_HASH(hek) = hash;
92     HEK_FLAGS(hek) = (unsigned char)flags_masked | HVhek_UNSHARED;
93 
94     if (flags & HVhek_FREEKEY)
95 	Safefree(str);
96     return hek;
97 }
98 
99 /* free the pool of temporary HE/HEK pairs returned by hv_fetch_ent
100  * for tied hashes */
101 
102 void
103 Perl_free_tied_hv_pool(pTHX)
104 {
105     dVAR;
106     HE *he = PL_hv_fetch_ent_mh;
107     while (he) {
108 	HE * const ohe = he;
109 	Safefree(HeKEY_hek(he));
110 	he = HeNEXT(he);
111 	del_HE(ohe);
112     }
113     PL_hv_fetch_ent_mh = NULL;
114 }
115 
116 #if defined(USE_ITHREADS)
117 HEK *
118 Perl_hek_dup(pTHX_ HEK *source, CLONE_PARAMS* param)
119 {
120     HEK *shared;
121 
122     PERL_ARGS_ASSERT_HEK_DUP;
123     PERL_UNUSED_ARG(param);
124 
125     if (!source)
126 	return NULL;
127 
128     shared = (HEK*)ptr_table_fetch(PL_ptr_table, source);
129     if (shared) {
130 	/* We already shared this hash key.  */
131 	(void)share_hek_hek(shared);
132     }
133     else {
134 	shared
135 	    = share_hek_flags(HEK_KEY(source), HEK_LEN(source),
136 			      HEK_HASH(source), HEK_FLAGS(source));
137 	ptr_table_store(PL_ptr_table, source, shared);
138     }
139     return shared;
140 }
141 
142 HE *
143 Perl_he_dup(pTHX_ const HE *e, bool shared, CLONE_PARAMS* param)
144 {
145     HE *ret;
146 
147     PERL_ARGS_ASSERT_HE_DUP;
148 
149     if (!e)
150 	return NULL;
151     /* look for it in the table first */
152     ret = (HE*)ptr_table_fetch(PL_ptr_table, e);
153     if (ret)
154 	return ret;
155 
156     /* create anew and remember what it is */
157     ret = new_HE();
158     ptr_table_store(PL_ptr_table, e, ret);
159 
160     HeNEXT(ret) = he_dup(HeNEXT(e),shared, param);
161     if (HeKLEN(e) == HEf_SVKEY) {
162 	char *k;
163 	Newx(k, HEK_BASESIZE + sizeof(const SV *), char);
164 	HeKEY_hek(ret) = (HEK*)k;
165 	HeKEY_sv(ret) = sv_dup_inc(HeKEY_sv(e), param);
166     }
167     else if (shared) {
168 	/* This is hek_dup inlined, which seems to be important for speed
169 	   reasons.  */
170 	HEK * const source = HeKEY_hek(e);
171 	HEK *shared = (HEK*)ptr_table_fetch(PL_ptr_table, source);
172 
173 	if (shared) {
174 	    /* We already shared this hash key.  */
175 	    (void)share_hek_hek(shared);
176 	}
177 	else {
178 	    shared
179 		= share_hek_flags(HEK_KEY(source), HEK_LEN(source),
180 				  HEK_HASH(source), HEK_FLAGS(source));
181 	    ptr_table_store(PL_ptr_table, source, shared);
182 	}
183 	HeKEY_hek(ret) = shared;
184     }
185     else
186 	HeKEY_hek(ret) = save_hek_flags(HeKEY(e), HeKLEN(e), HeHASH(e),
187                                         HeKFLAGS(e));
188     HeVAL(ret) = sv_dup_inc(HeVAL(e), param);
189     return ret;
190 }
191 #endif	/* USE_ITHREADS */
192 
193 static void
194 S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen,
195 		const char *msg)
196 {
197     SV * const sv = sv_newmortal();
198 
199     PERL_ARGS_ASSERT_HV_NOTALLOWED;
200 
201     if (!(flags & HVhek_FREEKEY)) {
202 	sv_setpvn(sv, key, klen);
203     }
204     else {
205 	/* Need to free saved eventually assign to mortal SV */
206 	/* XXX is this line an error ???:  SV *sv = sv_newmortal(); */
207 	sv_usepvn(sv, (char *) key, klen);
208     }
209     if (flags & HVhek_UTF8) {
210 	SvUTF8_on(sv);
211     }
212     Perl_croak(aTHX_ msg, SVfARG(sv));
213 }
214 
215 /* (klen == HEf_SVKEY) is special for MAGICAL hv entries, meaning key slot
216  * contains an SV* */
217 
218 /*
219 =for apidoc hv_store
220 
221 Stores an SV in a hash.  The hash key is specified as C<key> and the
222 absolute value of C<klen> is the length of the key.  If C<klen> is
223 negative the key is assumed to be in UTF-8-encoded Unicode.  The
224 C<hash> parameter is the precomputed hash value; if it is zero then
225 Perl will compute it.
226 
227 The return value will be
228 NULL if the operation failed or if the value did not need to be actually
229 stored within the hash (as in the case of tied hashes).  Otherwise it can
230 be dereferenced to get the original C<SV*>.  Note that the caller is
231 responsible for suitably incrementing the reference count of C<val> before
232 the call, and decrementing it if the function returned NULL.  Effectively
233 a successful hv_store takes ownership of one reference to C<val>.  This is
234 usually what you want; a newly created SV has a reference count of one, so
235 if all your code does is create SVs then store them in a hash, hv_store
236 will own the only reference to the new SV, and your code doesn't need to do
237 anything further to tidy up.  hv_store is not implemented as a call to
238 hv_store_ent, and does not create a temporary SV for the key, so if your
239 key data is not already in SV form then use hv_store in preference to
240 hv_store_ent.
241 
242 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
243 information on how to use this function on tied hashes.
244 
245 =for apidoc hv_store_ent
246 
247 Stores C<val> in a hash.  The hash key is specified as C<key>.  The C<hash>
248 parameter is the precomputed hash value; if it is zero then Perl will
249 compute it.  The return value is the new hash entry so created.  It will be
250 NULL if the operation failed or if the value did not need to be actually
251 stored within the hash (as in the case of tied hashes).  Otherwise the
252 contents of the return value can be accessed using the C<He?> macros
253 described here.  Note that the caller is responsible for suitably
254 incrementing the reference count of C<val> before the call, and
255 decrementing it if the function returned NULL.  Effectively a successful
256 hv_store_ent takes ownership of one reference to C<val>.  This is
257 usually what you want; a newly created SV has a reference count of one, so
258 if all your code does is create SVs then store them in a hash, hv_store
259 will own the only reference to the new SV, and your code doesn't need to do
260 anything further to tidy up.  Note that hv_store_ent only reads the C<key>;
261 unlike C<val> it does not take ownership of it, so maintaining the correct
262 reference count on C<key> is entirely the caller's responsibility.  hv_store
263 is not implemented as a call to hv_store_ent, and does not create a temporary
264 SV for the key, so if your key data is not already in SV form then use
265 hv_store in preference to hv_store_ent.
266 
267 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
268 information on how to use this function on tied hashes.
269 
270 =for apidoc hv_exists
271 
272 Returns a boolean indicating whether the specified hash key exists.  The
273 absolute value of C<klen> is the length of the key.  If C<klen> is
274 negative the key is assumed to be in UTF-8-encoded Unicode.
275 
276 =for apidoc hv_fetch
277 
278 Returns the SV which corresponds to the specified key in the hash.
279 The absolute value of C<klen> is the length of the key.  If C<klen> is
280 negative the key is assumed to be in UTF-8-encoded Unicode.  If
281 C<lval> is set then the fetch will be part of a store.  This means that if
282 there is no value in the hash associated with the given key, then one is
283 created and a pointer to it is returned.  The C<SV*> it points to can be
284 assigned to.  But always check that the
285 return value is non-null before dereferencing it to an C<SV*>.
286 
287 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
288 information on how to use this function on tied hashes.
289 
290 =for apidoc hv_exists_ent
291 
292 Returns a boolean indicating whether
293 the specified hash key exists.  C<hash>
294 can be a valid precomputed hash value, or 0 to ask for it to be
295 computed.
296 
297 =cut
298 */
299 
300 /* returns an HE * structure with the all fields set */
301 /* note that hent_val will be a mortal sv for MAGICAL hashes */
302 /*
303 =for apidoc hv_fetch_ent
304 
305 Returns the hash entry which corresponds to the specified key in the hash.
306 C<hash> must be a valid precomputed hash number for the given C<key>, or 0
307 if you want the function to compute it.  IF C<lval> is set then the fetch
308 will be part of a store.  Make sure the return value is non-null before
309 accessing it.  The return value when C<hv> is a tied hash is a pointer to a
310 static location, so be sure to make a copy of the structure if you need to
311 store it somewhere.
312 
313 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
314 information on how to use this function on tied hashes.
315 
316 =cut
317 */
318 
319 /* Common code for hv_delete()/hv_exists()/hv_fetch()/hv_store()  */
320 void *
321 Perl_hv_common_key_len(pTHX_ HV *hv, const char *key, I32 klen_i32,
322 		       const int action, SV *val, const U32 hash)
323 {
324     STRLEN klen;
325     int flags;
326 
327     PERL_ARGS_ASSERT_HV_COMMON_KEY_LEN;
328 
329     if (klen_i32 < 0) {
330 	klen = -klen_i32;
331 	flags = HVhek_UTF8;
332     } else {
333 	klen = klen_i32;
334 	flags = 0;
335     }
336     return hv_common(hv, NULL, key, klen, flags, action, val, hash);
337 }
338 
339 void *
340 Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
341 	       int flags, int action, SV *val, U32 hash)
342 {
343     dVAR;
344     XPVHV* xhv;
345     HE *entry;
346     HE **oentry;
347     SV *sv;
348     bool is_utf8;
349     int masked_flags;
350     const int return_svp = action & HV_FETCH_JUST_SV;
351 
352     if (!hv)
353 	return NULL;
354     if (SvTYPE(hv) == (svtype)SVTYPEMASK)
355 	return NULL;
356 
357     assert(SvTYPE(hv) == SVt_PVHV);
358 
359     if (SvSMAGICAL(hv) && SvGMAGICAL(hv) && !(action & HV_DISABLE_UVAR_XKEY)) {
360 	MAGIC* mg;
361 	if ((mg = mg_find((const SV *)hv, PERL_MAGIC_uvar))) {
362 	    struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
363 	    if (uf->uf_set == NULL) {
364 		SV* obj = mg->mg_obj;
365 
366 		if (!keysv) {
367 		    keysv = newSVpvn_flags(key, klen, SVs_TEMP |
368 					   ((flags & HVhek_UTF8)
369 					    ? SVf_UTF8 : 0));
370 		}
371 
372 		mg->mg_obj = keysv;         /* pass key */
373 		uf->uf_index = action;      /* pass action */
374 		magic_getuvar(MUTABLE_SV(hv), mg);
375 		keysv = mg->mg_obj;         /* may have changed */
376 		mg->mg_obj = obj;
377 
378 		/* If the key may have changed, then we need to invalidate
379 		   any passed-in computed hash value.  */
380 		hash = 0;
381 	    }
382 	}
383     }
384     if (keysv) {
385 	if (flags & HVhek_FREEKEY)
386 	    Safefree(key);
387 	key = SvPV_const(keysv, klen);
388 	is_utf8 = (SvUTF8(keysv) != 0);
389 	if (SvIsCOW_shared_hash(keysv)) {
390 	    flags = HVhek_KEYCANONICAL | (is_utf8 ? HVhek_UTF8 : 0);
391 	} else {
392 	    flags = is_utf8 ? HVhek_UTF8 : 0;
393 	}
394     } else {
395 	is_utf8 = ((flags & HVhek_UTF8) ? TRUE : FALSE);
396     }
397 
398     if (action & HV_DELETE) {
399 	return (void *) hv_delete_common(hv, keysv, key, klen,
400 					 flags, action, hash);
401     }
402 
403     xhv = (XPVHV*)SvANY(hv);
404     if (SvMAGICAL(hv)) {
405 	if (SvRMAGICAL(hv) && !(action & (HV_FETCH_ISSTORE|HV_FETCH_ISEXISTS))) {
406 	    if (mg_find((const SV *)hv, PERL_MAGIC_tied)
407 		|| SvGMAGICAL((const SV *)hv))
408 	    {
409 		/* FIXME should be able to skimp on the HE/HEK here when
410 		   HV_FETCH_JUST_SV is true.  */
411 		if (!keysv) {
412 		    keysv = newSVpvn_utf8(key, klen, is_utf8);
413   		} else {
414 		    keysv = newSVsv(keysv);
415 		}
416                 sv = sv_newmortal();
417                 mg_copy(MUTABLE_SV(hv), sv, (char *)keysv, HEf_SVKEY);
418 
419 		/* grab a fake HE/HEK pair from the pool or make a new one */
420 		entry = PL_hv_fetch_ent_mh;
421 		if (entry)
422 		    PL_hv_fetch_ent_mh = HeNEXT(entry);
423 		else {
424 		    char *k;
425 		    entry = new_HE();
426 		    Newx(k, HEK_BASESIZE + sizeof(const SV *), char);
427 		    HeKEY_hek(entry) = (HEK*)k;
428 		}
429 		HeNEXT(entry) = NULL;
430 		HeSVKEY_set(entry, keysv);
431 		HeVAL(entry) = sv;
432 		sv_upgrade(sv, SVt_PVLV);
433 		LvTYPE(sv) = 'T';
434 		 /* so we can free entry when freeing sv */
435 		LvTARG(sv) = MUTABLE_SV(entry);
436 
437 		/* XXX remove at some point? */
438 		if (flags & HVhek_FREEKEY)
439 		    Safefree(key);
440 
441 		if (return_svp) {
442 		    return entry ? (void *) &HeVAL(entry) : NULL;
443 		}
444 		return (void *) entry;
445 	    }
446 #ifdef ENV_IS_CASELESS
447 	    else if (mg_find((const SV *)hv, PERL_MAGIC_env)) {
448 		U32 i;
449 		for (i = 0; i < klen; ++i)
450 		    if (isLOWER(key[i])) {
451 			/* Would be nice if we had a routine to do the
452 			   copy and upercase in a single pass through.  */
453 			const char * const nkey = strupr(savepvn(key,klen));
454 			/* Note that this fetch is for nkey (the uppercased
455 			   key) whereas the store is for key (the original)  */
456 			void *result = hv_common(hv, NULL, nkey, klen,
457 						 HVhek_FREEKEY, /* free nkey */
458 						 0 /* non-LVAL fetch */
459 						 | HV_DISABLE_UVAR_XKEY
460 						 | return_svp,
461 						 NULL /* no value */,
462 						 0 /* compute hash */);
463 			if (!result && (action & HV_FETCH_LVALUE)) {
464 			    /* This call will free key if necessary.
465 			       Do it this way to encourage compiler to tail
466 			       call optimise.  */
467 			    result = hv_common(hv, keysv, key, klen, flags,
468 					       HV_FETCH_ISSTORE
469 					       | HV_DISABLE_UVAR_XKEY
470 					       | return_svp,
471 					       newSV(0), hash);
472 			} else {
473 			    if (flags & HVhek_FREEKEY)
474 				Safefree(key);
475 			}
476 			return result;
477 		    }
478 	    }
479 #endif
480 	} /* ISFETCH */
481 	else if (SvRMAGICAL(hv) && (action & HV_FETCH_ISEXISTS)) {
482 	    if (mg_find((const SV *)hv, PERL_MAGIC_tied)
483 		|| SvGMAGICAL((const SV *)hv)) {
484 		/* I don't understand why hv_exists_ent has svret and sv,
485 		   whereas hv_exists only had one.  */
486 		SV * const svret = sv_newmortal();
487 		sv = sv_newmortal();
488 
489 		if (keysv || is_utf8) {
490 		    if (!keysv) {
491 			keysv = newSVpvn_utf8(key, klen, TRUE);
492 		    } else {
493 			keysv = newSVsv(keysv);
494 		    }
495 		    mg_copy(MUTABLE_SV(hv), sv, (char *)sv_2mortal(keysv), HEf_SVKEY);
496 		} else {
497 		    mg_copy(MUTABLE_SV(hv), sv, key, klen);
498 		}
499 		if (flags & HVhek_FREEKEY)
500 		    Safefree(key);
501 		magic_existspack(svret, mg_find(sv, PERL_MAGIC_tiedelem));
502 		/* This cast somewhat evil, but I'm merely using NULL/
503 		   not NULL to return the boolean exists.
504 		   And I know hv is not NULL.  */
505 		return SvTRUE(svret) ? (void *)hv : NULL;
506 		}
507 #ifdef ENV_IS_CASELESS
508 	    else if (mg_find((const SV *)hv, PERL_MAGIC_env)) {
509 		/* XXX This code isn't UTF8 clean.  */
510 		char * const keysave = (char * const)key;
511 		/* Will need to free this, so set FREEKEY flag.  */
512 		key = savepvn(key,klen);
513 		key = (const char*)strupr((char*)key);
514 		is_utf8 = FALSE;
515 		hash = 0;
516 		keysv = 0;
517 
518 		if (flags & HVhek_FREEKEY) {
519 		    Safefree(keysave);
520 		}
521 		flags |= HVhek_FREEKEY;
522 	    }
523 #endif
524 	} /* ISEXISTS */
525 	else if (action & HV_FETCH_ISSTORE) {
526 	    bool needs_copy;
527 	    bool needs_store;
528 	    hv_magic_check (hv, &needs_copy, &needs_store);
529 	    if (needs_copy) {
530 		const bool save_taint = TAINT_get;
531 		if (keysv || is_utf8) {
532 		    if (!keysv) {
533 			keysv = newSVpvn_utf8(key, klen, TRUE);
534 		    }
535 		    if (TAINTING_get)
536 			TAINT_set(SvTAINTED(keysv));
537 		    keysv = sv_2mortal(newSVsv(keysv));
538 		    mg_copy(MUTABLE_SV(hv), val, (char*)keysv, HEf_SVKEY);
539 		} else {
540 		    mg_copy(MUTABLE_SV(hv), val, key, klen);
541 		}
542 
543 		TAINT_IF(save_taint);
544 #ifdef NO_TAINT_SUPPORT
545                 PERL_UNUSED_VAR(save_taint);
546 #endif
547 		if (!needs_store) {
548 		    if (flags & HVhek_FREEKEY)
549 			Safefree(key);
550 		    return NULL;
551 		}
552 #ifdef ENV_IS_CASELESS
553 		else if (mg_find((const SV *)hv, PERL_MAGIC_env)) {
554 		    /* XXX This code isn't UTF8 clean.  */
555 		    const char *keysave = key;
556 		    /* Will need to free this, so set FREEKEY flag.  */
557 		    key = savepvn(key,klen);
558 		    key = (const char*)strupr((char*)key);
559 		    is_utf8 = FALSE;
560 		    hash = 0;
561 		    keysv = 0;
562 
563 		    if (flags & HVhek_FREEKEY) {
564 			Safefree(keysave);
565 		    }
566 		    flags |= HVhek_FREEKEY;
567 		}
568 #endif
569 	    }
570 	} /* ISSTORE */
571     } /* SvMAGICAL */
572 
573     if (!HvARRAY(hv)) {
574 	if ((action & (HV_FETCH_LVALUE | HV_FETCH_ISSTORE))
575 #ifdef DYNAMIC_ENV_FETCH  /* if it's an %ENV lookup, we may get it on the fly */
576 		 || (SvRMAGICAL((const SV *)hv)
577 		     && mg_find((const SV *)hv, PERL_MAGIC_env))
578 #endif
579 								  ) {
580 	    char *array;
581 	    Newxz(array,
582 		 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
583 		 char);
584 	    HvARRAY(hv) = (HE**)array;
585 	}
586 #ifdef DYNAMIC_ENV_FETCH
587 	else if (action & HV_FETCH_ISEXISTS) {
588 	    /* for an %ENV exists, if we do an insert it's by a recursive
589 	       store call, so avoid creating HvARRAY(hv) right now.  */
590 	}
591 #endif
592 	else {
593 	    /* XXX remove at some point? */
594             if (flags & HVhek_FREEKEY)
595                 Safefree(key);
596 
597 	    return NULL;
598 	}
599     }
600 
601     if (is_utf8 && !(flags & HVhek_KEYCANONICAL)) {
602 	char * const keysave = (char *)key;
603 	key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
604         if (is_utf8)
605 	    flags |= HVhek_UTF8;
606 	else
607 	    flags &= ~HVhek_UTF8;
608         if (key != keysave) {
609 	    if (flags & HVhek_FREEKEY)
610 		Safefree(keysave);
611             flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
612 	    /* If the caller calculated a hash, it was on the sequence of
613 	       octets that are the UTF-8 form. We've now changed the sequence
614 	       of octets stored to that of the equivalent byte representation,
615 	       so the hash we need is different.  */
616 	    hash = 0;
617 	}
618     }
619 
620     if (!hash) {
621         if (keysv && (SvIsCOW_shared_hash(keysv)))
622             hash = SvSHARED_HASH(keysv);
623         else
624             PERL_HASH(hash, key, klen);
625     }
626 
627     masked_flags = (flags & HVhek_MASK);
628 
629 #ifdef DYNAMIC_ENV_FETCH
630     if (!HvARRAY(hv)) entry = NULL;
631     else
632 #endif
633     {
634 	entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)];
635     }
636     for (; entry; entry = HeNEXT(entry)) {
637 	if (HeHASH(entry) != hash)		/* strings can't be equal */
638 	    continue;
639 	if (HeKLEN(entry) != (I32)klen)
640 	    continue;
641 	if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))	/* is this it? */
642 	    continue;
643 	if ((HeKFLAGS(entry) ^ masked_flags) & HVhek_UTF8)
644 	    continue;
645 
646         if (action & (HV_FETCH_LVALUE|HV_FETCH_ISSTORE)) {
647 	    if (HeKFLAGS(entry) != masked_flags) {
648 		/* We match if HVhek_UTF8 bit in our flags and hash key's
649 		   match.  But if entry was set previously with HVhek_WASUTF8
650 		   and key now doesn't (or vice versa) then we should change
651 		   the key's flag, as this is assignment.  */
652 		if (HvSHAREKEYS(hv)) {
653 		    /* Need to swap the key we have for a key with the flags we
654 		       need. As keys are shared we can't just write to the
655 		       flag, so we share the new one, unshare the old one.  */
656 		    HEK * const new_hek = share_hek_flags(key, klen, hash,
657 						   masked_flags);
658 		    unshare_hek (HeKEY_hek(entry));
659 		    HeKEY_hek(entry) = new_hek;
660 		}
661 		else if (hv == PL_strtab) {
662 		    /* PL_strtab is usually the only hash without HvSHAREKEYS,
663 		       so putting this test here is cheap  */
664 		    if (flags & HVhek_FREEKEY)
665 			Safefree(key);
666 		    Perl_croak(aTHX_ S_strtab_error,
667 			       action & HV_FETCH_LVALUE ? "fetch" : "store");
668 		}
669 		else
670 		    HeKFLAGS(entry) = masked_flags;
671 		if (masked_flags & HVhek_ENABLEHVKFLAGS)
672 		    HvHASKFLAGS_on(hv);
673 	    }
674 	    if (HeVAL(entry) == &PL_sv_placeholder) {
675 		/* yes, can store into placeholder slot */
676 		if (action & HV_FETCH_LVALUE) {
677 		    if (SvMAGICAL(hv)) {
678 			/* This preserves behaviour with the old hv_fetch
679 			   implementation which at this point would bail out
680 			   with a break; (at "if we find a placeholder, we
681 			   pretend we haven't found anything")
682 
683 			   That break mean that if a placeholder were found, it
684 			   caused a call into hv_store, which in turn would
685 			   check magic, and if there is no magic end up pretty
686 			   much back at this point (in hv_store's code).  */
687 			break;
688 		    }
689 		    /* LVAL fetch which actually needs a store.  */
690 		    val = newSV(0);
691 		    HvPLACEHOLDERS(hv)--;
692 		} else {
693 		    /* store */
694 		    if (val != &PL_sv_placeholder)
695 			HvPLACEHOLDERS(hv)--;
696 		}
697 		HeVAL(entry) = val;
698 	    } else if (action & HV_FETCH_ISSTORE) {
699 		SvREFCNT_dec(HeVAL(entry));
700 		HeVAL(entry) = val;
701 	    }
702 	} else if (HeVAL(entry) == &PL_sv_placeholder) {
703 	    /* if we find a placeholder, we pretend we haven't found
704 	       anything */
705 	    break;
706 	}
707 	if (flags & HVhek_FREEKEY)
708 	    Safefree(key);
709 	if (return_svp) {
710 	    return entry ? (void *) &HeVAL(entry) : NULL;
711 	}
712 	return entry;
713     }
714 #ifdef DYNAMIC_ENV_FETCH  /* %ENV lookup?  If so, try to fetch the value now */
715     if (!(action & HV_FETCH_ISSTORE)
716 	&& SvRMAGICAL((const SV *)hv)
717 	&& mg_find((const SV *)hv, PERL_MAGIC_env)) {
718 	unsigned long len;
719 	const char * const env = PerlEnv_ENVgetenv_len(key,&len);
720 	if (env) {
721 	    sv = newSVpvn(env,len);
722 	    SvTAINTED_on(sv);
723 	    return hv_common(hv, keysv, key, klen, flags,
724 			     HV_FETCH_ISSTORE|HV_DISABLE_UVAR_XKEY|return_svp,
725 			     sv, hash);
726 	}
727     }
728 #endif
729 
730     if (!entry && SvREADONLY(hv) && !(action & HV_FETCH_ISEXISTS)) {
731 	hv_notallowed(flags, key, klen,
732 			"Attempt to access disallowed key '%"SVf"' in"
733 			" a restricted hash");
734     }
735     if (!(action & (HV_FETCH_LVALUE|HV_FETCH_ISSTORE))) {
736 	/* Not doing some form of store, so return failure.  */
737 	if (flags & HVhek_FREEKEY)
738 	    Safefree(key);
739 	return NULL;
740     }
741     if (action & HV_FETCH_LVALUE) {
742 	val = action & HV_FETCH_EMPTY_HE ? NULL : newSV(0);
743 	if (SvMAGICAL(hv)) {
744 	    /* At this point the old hv_fetch code would call to hv_store,
745 	       which in turn might do some tied magic. So we need to make that
746 	       magic check happen.  */
747 	    /* gonna assign to this, so it better be there */
748 	    /* If a fetch-as-store fails on the fetch, then the action is to
749 	       recurse once into "hv_store". If we didn't do this, then that
750 	       recursive call would call the key conversion routine again.
751 	       However, as we replace the original key with the converted
752 	       key, this would result in a double conversion, which would show
753 	       up as a bug if the conversion routine is not idempotent.
754 	       Hence the use of HV_DISABLE_UVAR_XKEY.  */
755 	    return hv_common(hv, keysv, key, klen, flags,
756 			     HV_FETCH_ISSTORE|HV_DISABLE_UVAR_XKEY|return_svp,
757 			     val, hash);
758 	    /* XXX Surely that could leak if the fetch-was-store fails?
759 	       Just like the hv_fetch.  */
760 	}
761     }
762 
763     /* Welcome to hv_store...  */
764 
765     if (!HvARRAY(hv)) {
766 	/* Not sure if we can get here.  I think the only case of oentry being
767 	   NULL is for %ENV with dynamic env fetch.  But that should disappear
768 	   with magic in the previous code.  */
769 	char *array;
770 	Newxz(array,
771 	     PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
772 	     char);
773 	HvARRAY(hv) = (HE**)array;
774     }
775 
776     oentry = &(HvARRAY(hv))[hash & (I32) xhv->xhv_max];
777 
778     entry = new_HE();
779     /* share_hek_flags will do the free for us.  This might be considered
780        bad API design.  */
781     if (HvSHAREKEYS(hv))
782 	HeKEY_hek(entry) = share_hek_flags(key, klen, hash, flags);
783     else if (hv == PL_strtab) {
784 	/* PL_strtab is usually the only hash without HvSHAREKEYS, so putting
785 	   this test here is cheap  */
786 	if (flags & HVhek_FREEKEY)
787 	    Safefree(key);
788 	Perl_croak(aTHX_ S_strtab_error,
789 		   action & HV_FETCH_LVALUE ? "fetch" : "store");
790     }
791     else                                       /* gotta do the real thing */
792 	HeKEY_hek(entry) = save_hek_flags(key, klen, hash, flags);
793     HeVAL(entry) = val;
794 
795     if (!*oentry && SvOOK(hv)) {
796         /* initial entry, and aux struct present.  */
797         struct xpvhv_aux *const aux = HvAUX(hv);
798         if (aux->xhv_fill_lazy)
799             ++aux->xhv_fill_lazy;
800     }
801 
802 #ifdef PERL_HASH_RANDOMIZE_KEYS
803     /* This logic semi-randomizes the insert order in a bucket.
804      * Either we insert into the top, or the slot below the top,
805      * making it harder to see if there is a collision. We also
806      * reset the iterator randomizer if there is one.
807      */
808     if ( *oentry && PL_HASH_RAND_BITS_ENABLED) {
809         PL_hash_rand_bits++;
810         PL_hash_rand_bits= ROTL_UV(PL_hash_rand_bits,1);
811         if ( PL_hash_rand_bits & 1 ) {
812             HeNEXT(entry) = HeNEXT(*oentry);
813             HeNEXT(*oentry) = entry;
814         } else {
815             HeNEXT(entry) = *oentry;
816             *oentry = entry;
817         }
818     } else
819 #endif
820     {
821         HeNEXT(entry) = *oentry;
822         *oentry = entry;
823     }
824 #ifdef PERL_HASH_RANDOMIZE_KEYS
825     if (SvOOK(hv)) {
826         /* Currently this makes various tests warn in annoying ways.
827          * So Silenced for now. - Yves | bogus end of comment =>* /
828         if (HvAUX(hv)->xhv_riter != -1) {
829             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
830                              "[TESTING] Inserting into a hash during each() traversal results in undefined behavior"
831                              pTHX__FORMAT
832                              pTHX__VALUE);
833         }
834         */
835         if (PL_HASH_RAND_BITS_ENABLED) {
836             if (PL_HASH_RAND_BITS_ENABLED == 1)
837                 PL_hash_rand_bits += (PTRV)entry + 1;  /* we don't bother to use ptr_hash here */
838             PL_hash_rand_bits= ROTL_UV(PL_hash_rand_bits,1);
839         }
840         HvAUX(hv)->xhv_rand= (U32)PL_hash_rand_bits;
841     }
842 #endif
843 
844     if (val == &PL_sv_placeholder)
845 	HvPLACEHOLDERS(hv)++;
846     if (masked_flags & HVhek_ENABLEHVKFLAGS)
847 	HvHASKFLAGS_on(hv);
848 
849     xhv->xhv_keys++; /* HvTOTALKEYS(hv)++ */
850     if ( DO_HSPLIT(xhv) ) {
851         const STRLEN oldsize = xhv->xhv_max + 1;
852         const U32 items = (U32)HvPLACEHOLDERS_get(hv);
853 
854         if (items /* hash has placeholders  */
855             && !SvREADONLY(hv) /* but is not a restricted hash */) {
856             /* If this hash previously was a "restricted hash" and had
857                placeholders, but the "restricted" flag has been turned off,
858                then the placeholders no longer serve any useful purpose.
859                However, they have the downsides of taking up RAM, and adding
860                extra steps when finding used values. It's safe to clear them
861                at this point, even though Storable rebuilds restricted hashes by
862                putting in all the placeholders (first) before turning on the
863                readonly flag, because Storable always pre-splits the hash.
864                If we're lucky, then we may clear sufficient placeholders to
865                avoid needing to split the hash at all.  */
866             clear_placeholders(hv, items);
867             if (DO_HSPLIT(xhv))
868                 hsplit(hv, oldsize, oldsize * 2);
869         } else
870             hsplit(hv, oldsize, oldsize * 2);
871     }
872 
873     if (return_svp) {
874 	return entry ? (void *) &HeVAL(entry) : NULL;
875     }
876     return (void *) entry;
877 }
878 
879 STATIC void
880 S_hv_magic_check(HV *hv, bool *needs_copy, bool *needs_store)
881 {
882     const MAGIC *mg = SvMAGIC(hv);
883 
884     PERL_ARGS_ASSERT_HV_MAGIC_CHECK;
885 
886     *needs_copy = FALSE;
887     *needs_store = TRUE;
888     while (mg) {
889 	if (isUPPER(mg->mg_type)) {
890 	    *needs_copy = TRUE;
891 	    if (mg->mg_type == PERL_MAGIC_tied) {
892 		*needs_store = FALSE;
893 		return; /* We've set all there is to set. */
894 	    }
895 	}
896 	mg = mg->mg_moremagic;
897     }
898 }
899 
900 /*
901 =for apidoc hv_scalar
902 
903 Evaluates the hash in scalar context and returns the result.  Handles magic
904 when the hash is tied.
905 
906 =cut
907 */
908 
909 SV *
910 Perl_hv_scalar(pTHX_ HV *hv)
911 {
912     SV *sv;
913 
914     PERL_ARGS_ASSERT_HV_SCALAR;
915 
916     if (SvRMAGICAL(hv)) {
917 	MAGIC * const mg = mg_find((const SV *)hv, PERL_MAGIC_tied);
918 	if (mg)
919 	    return magic_scalarpack(hv, mg);
920     }
921 
922     sv = sv_newmortal();
923     if (HvTOTALKEYS((const HV *)hv))
924         Perl_sv_setpvf(aTHX_ sv, "%ld/%ld",
925                 (long)HvFILL(hv), (long)HvMAX(hv) + 1);
926     else
927         sv_setiv(sv, 0);
928 
929     return sv;
930 }
931 
932 /*
933 =for apidoc hv_delete
934 
935 Deletes a key/value pair in the hash.  The value's SV is removed from
936 the hash, made mortal, and returned to the caller.  The absolute
937 value of C<klen> is the length of the key.  If C<klen> is negative the
938 key is assumed to be in UTF-8-encoded Unicode.  The C<flags> value
939 will normally be zero; if set to G_DISCARD then NULL will be returned.
940 NULL will also be returned if the key is not found.
941 
942 =for apidoc hv_delete_ent
943 
944 Deletes a key/value pair in the hash.  The value SV is removed from the hash,
945 made mortal, and returned to the caller.  The C<flags> value will normally be
946 zero; if set to G_DISCARD then NULL will be returned.  NULL will also be
947 returned if the key is not found.  C<hash> can be a valid precomputed hash
948 value, or 0 to ask for it to be computed.
949 
950 =cut
951 */
952 
953 STATIC SV *
954 S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
955 		   int k_flags, I32 d_flags, U32 hash)
956 {
957     dVAR;
958     XPVHV* xhv;
959     HE *entry;
960     HE **oentry;
961     HE *const *first_entry;
962     bool is_utf8 = (k_flags & HVhek_UTF8) ? TRUE : FALSE;
963     int masked_flags;
964 
965     if (SvRMAGICAL(hv)) {
966 	bool needs_copy;
967 	bool needs_store;
968 	hv_magic_check (hv, &needs_copy, &needs_store);
969 
970 	if (needs_copy) {
971 	    SV *sv;
972 	    entry = (HE *) hv_common(hv, keysv, key, klen,
973 				     k_flags & ~HVhek_FREEKEY,
974 				     HV_FETCH_LVALUE|HV_DISABLE_UVAR_XKEY,
975 				     NULL, hash);
976 	    sv = entry ? HeVAL(entry) : NULL;
977 	    if (sv) {
978 		if (SvMAGICAL(sv)) {
979 		    mg_clear(sv);
980 		}
981 		if (!needs_store) {
982 		    if (mg_find(sv, PERL_MAGIC_tiedelem)) {
983 			/* No longer an element */
984 			sv_unmagic(sv, PERL_MAGIC_tiedelem);
985 			return sv;
986 		    }
987 		    return NULL;		/* element cannot be deleted */
988 		}
989 #ifdef ENV_IS_CASELESS
990 		else if (mg_find((const SV *)hv, PERL_MAGIC_env)) {
991 		    /* XXX This code isn't UTF8 clean.  */
992 		    keysv = newSVpvn_flags(key, klen, SVs_TEMP);
993 		    if (k_flags & HVhek_FREEKEY) {
994 			Safefree(key);
995 		    }
996 		    key = strupr(SvPVX(keysv));
997 		    is_utf8 = 0;
998 		    k_flags = 0;
999 		    hash = 0;
1000 		}
1001 #endif
1002 	    }
1003 	}
1004     }
1005     xhv = (XPVHV*)SvANY(hv);
1006     if (!HvARRAY(hv))
1007 	return NULL;
1008 
1009     if (is_utf8 && !(k_flags & HVhek_KEYCANONICAL)) {
1010 	const char * const keysave = key;
1011 	key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
1012 
1013         if (is_utf8)
1014             k_flags |= HVhek_UTF8;
1015 	else
1016             k_flags &= ~HVhek_UTF8;
1017         if (key != keysave) {
1018 	    if (k_flags & HVhek_FREEKEY) {
1019 		/* This shouldn't happen if our caller does what we expect,
1020 		   but strictly the API allows it.  */
1021 		Safefree(keysave);
1022 	    }
1023 	    k_flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
1024 	}
1025         HvHASKFLAGS_on(MUTABLE_SV(hv));
1026     }
1027 
1028     if (!hash) {
1029         if (keysv && (SvIsCOW_shared_hash(keysv)))
1030             hash = SvSHARED_HASH(keysv);
1031         else
1032             PERL_HASH(hash, key, klen);
1033     }
1034 
1035     masked_flags = (k_flags & HVhek_MASK);
1036 
1037     first_entry = oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)];
1038     entry = *oentry;
1039     for (; entry; oentry = &HeNEXT(entry), entry = *oentry) {
1040 	SV *sv;
1041 	U8 mro_changes = 0; /* 1 = isa; 2 = package moved */
1042 	GV *gv = NULL;
1043 	HV *stash = NULL;
1044 
1045 	if (HeHASH(entry) != hash)		/* strings can't be equal */
1046 	    continue;
1047 	if (HeKLEN(entry) != (I32)klen)
1048 	    continue;
1049 	if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))	/* is this it? */
1050 	    continue;
1051 	if ((HeKFLAGS(entry) ^ masked_flags) & HVhek_UTF8)
1052 	    continue;
1053 
1054 	if (hv == PL_strtab) {
1055 	    if (k_flags & HVhek_FREEKEY)
1056 		Safefree(key);
1057 	    Perl_croak(aTHX_ S_strtab_error, "delete");
1058 	}
1059 
1060 	/* if placeholder is here, it's already been deleted.... */
1061 	if (HeVAL(entry) == &PL_sv_placeholder) {
1062 	    if (k_flags & HVhek_FREEKEY)
1063 		Safefree(key);
1064 	    return NULL;
1065 	}
1066 	if (SvREADONLY(hv) && HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
1067 	    hv_notallowed(k_flags, key, klen,
1068 			    "Attempt to delete readonly key '%"SVf"' from"
1069 			    " a restricted hash");
1070 	}
1071         if (k_flags & HVhek_FREEKEY)
1072             Safefree(key);
1073 
1074 	/* If this is a stash and the key ends with ::, then someone is
1075 	 * deleting a package.
1076 	 */
1077 	if (HeVAL(entry) && HvENAME_get(hv)) {
1078 		gv = (GV *)HeVAL(entry);
1079 		if (keysv) key = SvPV(keysv, klen);
1080 		if ((
1081 		     (klen > 1 && key[klen-2] == ':' && key[klen-1] == ':')
1082 		      ||
1083 		     (klen == 1 && key[0] == ':')
1084 		    )
1085 		 && (klen != 6 || hv!=PL_defstash || memNE(key,"main::",6))
1086 		 && SvTYPE(gv) == SVt_PVGV && (stash = GvHV((GV *)gv))
1087 		 && HvENAME_get(stash)) {
1088 			/* A previous version of this code checked that the
1089 			 * GV was still in the symbol table by fetching the
1090 			 * GV with its name. That is not necessary (and
1091 			 * sometimes incorrect), as HvENAME cannot be set
1092 			 * on hv if it is not in the symtab. */
1093 			mro_changes = 2;
1094 			/* Hang on to it for a bit. */
1095 			SvREFCNT_inc_simple_void_NN(
1096 			 sv_2mortal((SV *)gv)
1097 			);
1098 		}
1099 		else if (klen == 3 && strnEQ(key, "ISA", 3))
1100 		    mro_changes = 1;
1101 	}
1102 
1103 	sv = d_flags & G_DISCARD ? HeVAL(entry) : sv_2mortal(HeVAL(entry));
1104 	HeVAL(entry) = &PL_sv_placeholder;
1105 	if (sv) {
1106 	    /* deletion of method from stash */
1107 	    if (isGV(sv) && isGV_with_GP(sv) && GvCVu(sv)
1108 	     && HvENAME_get(hv))
1109 		mro_method_changed_in(hv);
1110 	}
1111 
1112 	/*
1113 	 * If a restricted hash, rather than really deleting the entry, put
1114 	 * a placeholder there. This marks the key as being "approved", so
1115 	 * we can still access via not-really-existing key without raising
1116 	 * an error.
1117 	 */
1118 	if (SvREADONLY(hv))
1119 	    /* We'll be saving this slot, so the number of allocated keys
1120 	     * doesn't go down, but the number placeholders goes up */
1121 	    HvPLACEHOLDERS(hv)++;
1122 	else {
1123 	    *oentry = HeNEXT(entry);
1124             if(!*first_entry && SvOOK(hv)) {
1125                 /* removed last entry, and aux struct present.  */
1126                 struct xpvhv_aux *const aux = HvAUX(hv);
1127                 if (aux->xhv_fill_lazy)
1128                     --aux->xhv_fill_lazy;
1129             }
1130 	    if (SvOOK(hv) && entry == HvAUX(hv)->xhv_eiter /* HvEITER(hv) */)
1131 		HvLAZYDEL_on(hv);
1132 	    else {
1133 		if (SvOOK(hv) && HvLAZYDEL(hv) &&
1134 		    entry == HeNEXT(HvAUX(hv)->xhv_eiter))
1135 		    HeNEXT(HvAUX(hv)->xhv_eiter) = HeNEXT(entry);
1136 		hv_free_ent(hv, entry);
1137 	    }
1138 	    xhv->xhv_keys--; /* HvTOTALKEYS(hv)-- */
1139 	    if (xhv->xhv_keys == 0)
1140 	        HvHASKFLAGS_off(hv);
1141 	}
1142 
1143 	if (d_flags & G_DISCARD) {
1144 	    SvREFCNT_dec(sv);
1145 	    sv = NULL;
1146 	}
1147 
1148 	if (mro_changes == 1) mro_isa_changed_in(hv);
1149 	else if (mro_changes == 2)
1150 	    mro_package_moved(NULL, stash, gv, 1);
1151 
1152 	return sv;
1153     }
1154     if (SvREADONLY(hv)) {
1155 	hv_notallowed(k_flags, key, klen,
1156 			"Attempt to delete disallowed key '%"SVf"' from"
1157 			" a restricted hash");
1158     }
1159 
1160     if (k_flags & HVhek_FREEKEY)
1161 	Safefree(key);
1162     return NULL;
1163 }
1164 
1165 
1166 STATIC void
1167 S_hsplit(pTHX_ HV *hv, STRLEN const oldsize, STRLEN newsize)
1168 {
1169     dVAR;
1170     STRLEN i = 0;
1171     char *a = (char*) HvARRAY(hv);
1172     HE **aep;
1173 
1174     bool do_aux= (
1175         /* already have an HvAUX(hv) so we have to move it */
1176         SvOOK(hv) ||
1177         /* no HvAUX() but array we are going to allocate is large enough
1178          * there is no point in saving the space for the iterator, and
1179          * speeds up later traversals. */
1180         ( ( hv != PL_strtab ) && ( newsize >= PERL_HV_ALLOC_AUX_SIZE ) )
1181     );
1182 
1183     PERL_ARGS_ASSERT_HSPLIT;
1184 
1185     PL_nomemok = TRUE;
1186     Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize)
1187           + (do_aux ? sizeof(struct xpvhv_aux) : 0), char);
1188     PL_nomemok = FALSE;
1189     if (!a) {
1190       return;
1191     }
1192 
1193 #ifdef PERL_HASH_RANDOMIZE_KEYS
1194     /* the idea of this is that we create a "random" value by hashing the address of
1195      * the array, we then use the low bit to decide if we insert at the top, or insert
1196      * second from top. After each such insert we rotate the hashed value. So we can
1197      * use the same hashed value over and over, and in normal build environments use
1198      * very few ops to do so. ROTL32() should produce a single machine operation. */
1199     if (PL_HASH_RAND_BITS_ENABLED) {
1200         if (PL_HASH_RAND_BITS_ENABLED == 1)
1201             PL_hash_rand_bits += ptr_hash((PTRV)a);
1202         PL_hash_rand_bits = ROTL_UV(PL_hash_rand_bits,1);
1203     }
1204 #endif
1205     HvARRAY(hv) = (HE**) a;
1206     HvMAX(hv) = newsize - 1;
1207     /* before we zero the newly added memory, we
1208      * need to deal with the aux struct that may be there
1209      * or have been allocated by us*/
1210     if (do_aux) {
1211         struct xpvhv_aux *const dest
1212             = (struct xpvhv_aux*) &a[newsize * sizeof(HE*)];
1213         if (SvOOK(hv)) {
1214             /* alread have an aux, copy the old one in place. */
1215             Move(&a[oldsize * sizeof(HE*)], dest, 1, struct xpvhv_aux);
1216             /* we reset the iterator's xhv_rand as well, so they get a totally new ordering */
1217 #ifdef PERL_HASH_RANDOMIZE_KEYS
1218             dest->xhv_rand = (U32)PL_hash_rand_bits;
1219 #endif
1220             /* For now, just reset the lazy fill counter.
1221                It would be possible to update the counter in the code below
1222                instead.  */
1223             dest->xhv_fill_lazy = 0;
1224         } else {
1225             /* no existing aux structure, but we allocated space for one
1226              * so intialize it properly. This unrolls hv_auxinit() a bit,
1227              * since we have to do the realloc anyway. */
1228             /* first we set the iterator's xhv_rand so it can be copied into lastrand below */
1229 #ifdef PERL_HASH_RANDOMIZE_KEYS
1230             dest->xhv_rand = (U32)PL_hash_rand_bits;
1231 #endif
1232             /* this is the "non realloc" part of the hv_auxinit() */
1233             (void)hv_auxinit_internal(dest);
1234             /* Turn on the OOK flag */
1235             SvOOK_on(hv);
1236         }
1237     }
1238     /* now we can safely clear the second half */
1239     Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char);	/* zero 2nd half*/
1240 
1241     if (!HvTOTALKEYS(hv))       /* skip rest if no entries */
1242         return;
1243 
1244     newsize--;
1245     aep = (HE**)a;
1246     do {
1247 	HE **oentry = aep + i;
1248 	HE *entry = aep[i];
1249 
1250 	if (!entry)				/* non-existent */
1251 	    continue;
1252 	do {
1253             U32 j = (HeHASH(entry) & newsize);
1254 	    if (j != (U32)i) {
1255 		*oentry = HeNEXT(entry);
1256 #ifdef PERL_HASH_RANDOMIZE_KEYS
1257                 /* if the target cell is empty or PL_HASH_RAND_BITS_ENABLED is false
1258                  * insert to top, otherwise rotate the bucket rand 1 bit,
1259                  * and use the new low bit to decide if we insert at top,
1260                  * or next from top. IOW, we only rotate on a collision.*/
1261                 if (aep[j] && PL_HASH_RAND_BITS_ENABLED) {
1262                     PL_hash_rand_bits+= ROTL_UV(HeHASH(entry), 17);
1263                     PL_hash_rand_bits= ROTL_UV(PL_hash_rand_bits,1);
1264                     if (PL_hash_rand_bits & 1) {
1265                         HeNEXT(entry)= HeNEXT(aep[j]);
1266                         HeNEXT(aep[j])= entry;
1267                     } else {
1268                         /* Note, this is structured in such a way as the optimizer
1269                         * should eliminate the duplicated code here and below without
1270                         * us needing to explicitly use a goto. */
1271                         HeNEXT(entry) = aep[j];
1272                         aep[j] = entry;
1273                     }
1274                 } else
1275 #endif
1276                 {
1277                     /* see comment above about duplicated code */
1278                     HeNEXT(entry) = aep[j];
1279                     aep[j] = entry;
1280                 }
1281 	    }
1282 	    else {
1283 		oentry = &HeNEXT(entry);
1284 	    }
1285 	    entry = *oentry;
1286 	} while (entry);
1287     } while (i++ < oldsize);
1288 }
1289 
1290 void
1291 Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
1292 {
1293     dVAR;
1294     XPVHV* xhv = (XPVHV*)SvANY(hv);
1295     const I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
1296     I32 newsize;
1297     char *a;
1298 
1299     PERL_ARGS_ASSERT_HV_KSPLIT;
1300 
1301     newsize = (I32) newmax;			/* possible truncation here */
1302     if (newsize != newmax || newmax <= oldsize)
1303 	return;
1304     while ((newsize & (1 + ~newsize)) != newsize) {
1305 	newsize &= ~(newsize & (1 + ~newsize));	/* get proper power of 2 */
1306     }
1307     if (newsize < newmax)
1308 	newsize *= 2;
1309     if (newsize < newmax)
1310 	return;					/* overflow detection */
1311 
1312     a = (char *) HvARRAY(hv);
1313     if (a) {
1314         hsplit(hv, oldsize, newsize);
1315     } else {
1316         Newxz(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1317         xhv->xhv_max = --newsize;
1318         HvARRAY(hv) = (HE **) a;
1319     }
1320 }
1321 
1322 /* IMO this should also handle cases where hv_max is smaller than hv_keys
1323  * as tied hashes could play silly buggers and mess us around. We will
1324  * do the right thing during hv_store() afterwards, but still - Yves */
1325 #define HV_SET_MAX_ADJUSTED_FOR_KEYS(hv,hv_max,hv_keys) STMT_START {\
1326     /* Can we use fewer buckets? (hv_max is always 2^n-1) */        \
1327     if (hv_max < PERL_HASH_DEFAULT_HvMAX) {                         \
1328         hv_max = PERL_HASH_DEFAULT_HvMAX;                           \
1329     } else {                                                        \
1330         while (hv_max > PERL_HASH_DEFAULT_HvMAX && hv_max + 1 >= hv_keys * 2) \
1331             hv_max = hv_max / 2;                                    \
1332     }                                                               \
1333     HvMAX(hv) = hv_max;                                             \
1334 } STMT_END
1335 
1336 
1337 HV *
1338 Perl_newHVhv(pTHX_ HV *ohv)
1339 {
1340     dVAR;
1341     HV * const hv = newHV();
1342     STRLEN hv_max;
1343 
1344     if (!ohv || (!HvTOTALKEYS(ohv) && !SvMAGICAL((const SV *)ohv)))
1345 	return hv;
1346     hv_max = HvMAX(ohv);
1347 
1348     if (!SvMAGICAL((const SV *)ohv)) {
1349 	/* It's an ordinary hash, so copy it fast. AMS 20010804 */
1350 	STRLEN i;
1351 	const bool shared = !!HvSHAREKEYS(ohv);
1352 	HE **ents, ** const oents = (HE **)HvARRAY(ohv);
1353 	char *a;
1354 	Newx(a, PERL_HV_ARRAY_ALLOC_BYTES(hv_max+1), char);
1355 	ents = (HE**)a;
1356 
1357 	/* In each bucket... */
1358 	for (i = 0; i <= hv_max; i++) {
1359 	    HE *prev = NULL;
1360 	    HE *oent = oents[i];
1361 
1362 	    if (!oent) {
1363 		ents[i] = NULL;
1364 		continue;
1365 	    }
1366 
1367 	    /* Copy the linked list of entries. */
1368 	    for (; oent; oent = HeNEXT(oent)) {
1369 		const U32 hash   = HeHASH(oent);
1370 		const char * const key = HeKEY(oent);
1371 		const STRLEN len = HeKLEN(oent);
1372 		const int flags  = HeKFLAGS(oent);
1373 		HE * const ent   = new_HE();
1374 		SV *const val    = HeVAL(oent);
1375 
1376 		HeVAL(ent) = SvIMMORTAL(val) ? val : newSVsv(val);
1377 		HeKEY_hek(ent)
1378                     = shared ? share_hek_flags(key, len, hash, flags)
1379                              :  save_hek_flags(key, len, hash, flags);
1380 		if (prev)
1381 		    HeNEXT(prev) = ent;
1382 		else
1383 		    ents[i] = ent;
1384 		prev = ent;
1385 		HeNEXT(ent) = NULL;
1386 	    }
1387 	}
1388 
1389 	HvMAX(hv)   = hv_max;
1390 	HvTOTALKEYS(hv)  = HvTOTALKEYS(ohv);
1391 	HvARRAY(hv) = ents;
1392     } /* not magical */
1393     else {
1394 	/* Iterate over ohv, copying keys and values one at a time. */
1395 	HE *entry;
1396 	const I32 riter = HvRITER_get(ohv);
1397 	HE * const eiter = HvEITER_get(ohv);
1398         STRLEN hv_keys = HvTOTALKEYS(ohv);
1399 
1400         HV_SET_MAX_ADJUSTED_FOR_KEYS(hv,hv_max,hv_keys);
1401 
1402 	hv_iterinit(ohv);
1403 	while ((entry = hv_iternext_flags(ohv, 0))) {
1404 	    SV *val = hv_iterval(ohv,entry);
1405 	    SV * const keysv = HeSVKEY(entry);
1406 	    val = SvIMMORTAL(val) ? val : newSVsv(val);
1407 	    if (keysv)
1408 		(void)hv_store_ent(hv, keysv, val, 0);
1409 	    else
1410 	        (void)hv_store_flags(hv, HeKEY(entry), HeKLEN(entry), val,
1411 				 HeHASH(entry), HeKFLAGS(entry));
1412 	}
1413 	HvRITER_set(ohv, riter);
1414 	HvEITER_set(ohv, eiter);
1415     }
1416 
1417     return hv;
1418 }
1419 
1420 /*
1421 =for apidoc Am|HV *|hv_copy_hints_hv|HV *ohv
1422 
1423 A specialised version of L</newHVhv> for copying C<%^H>.  I<ohv> must be
1424 a pointer to a hash (which may have C<%^H> magic, but should be generally
1425 non-magical), or C<NULL> (interpreted as an empty hash).  The content
1426 of I<ohv> is copied to a new hash, which has the C<%^H>-specific magic
1427 added to it.  A pointer to the new hash is returned.
1428 
1429 =cut
1430 */
1431 
1432 HV *
1433 Perl_hv_copy_hints_hv(pTHX_ HV *const ohv)
1434 {
1435     HV * const hv = newHV();
1436 
1437     if (ohv) {
1438 	STRLEN hv_max = HvMAX(ohv);
1439         STRLEN hv_keys = HvTOTALKEYS(ohv);
1440 	HE *entry;
1441 	const I32 riter = HvRITER_get(ohv);
1442 	HE * const eiter = HvEITER_get(ohv);
1443 
1444 	ENTER;
1445 	SAVEFREESV(hv);
1446 
1447         HV_SET_MAX_ADJUSTED_FOR_KEYS(hv,hv_max,hv_keys);
1448 
1449 	hv_iterinit(ohv);
1450 	while ((entry = hv_iternext_flags(ohv, 0))) {
1451 	    SV *const sv = newSVsv(hv_iterval(ohv,entry));
1452 	    SV *heksv = HeSVKEY(entry);
1453 	    if (!heksv && sv) heksv = newSVhek(HeKEY_hek(entry));
1454 	    if (sv) sv_magic(sv, NULL, PERL_MAGIC_hintselem,
1455 		     (char *)heksv, HEf_SVKEY);
1456 	    if (heksv == HeSVKEY(entry))
1457 		(void)hv_store_ent(hv, heksv, sv, 0);
1458 	    else {
1459 		(void)hv_common(hv, heksv, HeKEY(entry), HeKLEN(entry),
1460 				 HeKFLAGS(entry), HV_FETCH_ISSTORE|HV_FETCH_JUST_SV, sv, HeHASH(entry));
1461 		SvREFCNT_dec_NN(heksv);
1462 	    }
1463 	}
1464 	HvRITER_set(ohv, riter);
1465 	HvEITER_set(ohv, eiter);
1466 
1467 	SvREFCNT_inc_simple_void_NN(hv);
1468 	LEAVE;
1469     }
1470     hv_magic(hv, NULL, PERL_MAGIC_hints);
1471     return hv;
1472 }
1473 #undef HV_SET_MAX_ADJUSTED_FOR_KEYS
1474 
1475 /* like hv_free_ent, but returns the SV rather than freeing it */
1476 STATIC SV*
1477 S_hv_free_ent_ret(pTHX_ HV *hv, HE *entry)
1478 {
1479     dVAR;
1480     SV *val;
1481 
1482     PERL_ARGS_ASSERT_HV_FREE_ENT_RET;
1483 
1484     val = HeVAL(entry);
1485     if (HeKLEN(entry) == HEf_SVKEY) {
1486 	SvREFCNT_dec(HeKEY_sv(entry));
1487 	Safefree(HeKEY_hek(entry));
1488     }
1489     else if (HvSHAREKEYS(hv))
1490 	unshare_hek(HeKEY_hek(entry));
1491     else
1492 	Safefree(HeKEY_hek(entry));
1493     del_HE(entry);
1494     return val;
1495 }
1496 
1497 
1498 void
1499 Perl_hv_free_ent(pTHX_ HV *hv, HE *entry)
1500 {
1501     dVAR;
1502     SV *val;
1503 
1504     PERL_ARGS_ASSERT_HV_FREE_ENT;
1505 
1506     if (!entry)
1507 	return;
1508     val = hv_free_ent_ret(hv, entry);
1509     SvREFCNT_dec(val);
1510 }
1511 
1512 
1513 void
1514 Perl_hv_delayfree_ent(pTHX_ HV *hv, HE *entry)
1515 {
1516     dVAR;
1517 
1518     PERL_ARGS_ASSERT_HV_DELAYFREE_ENT;
1519 
1520     if (!entry)
1521 	return;
1522     /* SvREFCNT_inc to counter the SvREFCNT_dec in hv_free_ent  */
1523     sv_2mortal(SvREFCNT_inc(HeVAL(entry)));	/* free between statements */
1524     if (HeKLEN(entry) == HEf_SVKEY) {
1525 	sv_2mortal(SvREFCNT_inc(HeKEY_sv(entry)));
1526     }
1527     hv_free_ent(hv, entry);
1528 }
1529 
1530 /*
1531 =for apidoc hv_clear
1532 
1533 Frees the all the elements of a hash, leaving it empty.
1534 The XS equivalent of C<%hash = ()>.  See also L</hv_undef>.
1535 
1536 If any destructors are triggered as a result, the hv itself may
1537 be freed.
1538 
1539 =cut
1540 */
1541 
1542 void
1543 Perl_hv_clear(pTHX_ HV *hv)
1544 {
1545     dVAR;
1546     XPVHV* xhv;
1547     if (!hv)
1548 	return;
1549 
1550     DEBUG_A(Perl_hv_assert(aTHX_ hv));
1551 
1552     xhv = (XPVHV*)SvANY(hv);
1553 
1554     ENTER;
1555     SAVEFREESV(SvREFCNT_inc_simple_NN(hv));
1556     if (SvREADONLY(hv) && HvARRAY(hv) != NULL) {
1557 	/* restricted hash: convert all keys to placeholders */
1558 	STRLEN i;
1559 	for (i = 0; i <= xhv->xhv_max; i++) {
1560 	    HE *entry = (HvARRAY(hv))[i];
1561 	    for (; entry; entry = HeNEXT(entry)) {
1562 		/* not already placeholder */
1563 		if (HeVAL(entry) != &PL_sv_placeholder) {
1564 		    if (HeVAL(entry)) {
1565 			if (SvREADONLY(HeVAL(entry))) {
1566 			    SV* const keysv = hv_iterkeysv(entry);
1567 			    Perl_croak_nocontext(
1568 				"Attempt to delete readonly key '%"SVf"' from a restricted hash",
1569 				(void*)keysv);
1570 			}
1571 			SvREFCNT_dec_NN(HeVAL(entry));
1572 		    }
1573 		    HeVAL(entry) = &PL_sv_placeholder;
1574 		    HvPLACEHOLDERS(hv)++;
1575 		}
1576 	    }
1577 	}
1578     }
1579     else {
1580 	hfreeentries(hv);
1581 	HvPLACEHOLDERS_set(hv, 0);
1582 
1583 	if (SvRMAGICAL(hv))
1584 	    mg_clear(MUTABLE_SV(hv));
1585 
1586 	HvHASKFLAGS_off(hv);
1587     }
1588     if (SvOOK(hv)) {
1589         if(HvENAME_get(hv))
1590             mro_isa_changed_in(hv);
1591 	HvEITER_set(hv, NULL);
1592     }
1593     LEAVE;
1594 }
1595 
1596 /*
1597 =for apidoc hv_clear_placeholders
1598 
1599 Clears any placeholders from a hash.  If a restricted hash has any of its keys
1600 marked as readonly and the key is subsequently deleted, the key is not actually
1601 deleted but is marked by assigning it a value of &PL_sv_placeholder.  This tags
1602 it so it will be ignored by future operations such as iterating over the hash,
1603 but will still allow the hash to have a value reassigned to the key at some
1604 future point.  This function clears any such placeholder keys from the hash.
1605 See Hash::Util::lock_keys() for an example of its use.
1606 
1607 =cut
1608 */
1609 
1610 void
1611 Perl_hv_clear_placeholders(pTHX_ HV *hv)
1612 {
1613     dVAR;
1614     const U32 items = (U32)HvPLACEHOLDERS_get(hv);
1615 
1616     PERL_ARGS_ASSERT_HV_CLEAR_PLACEHOLDERS;
1617 
1618     if (items)
1619 	clear_placeholders(hv, items);
1620 }
1621 
1622 static void
1623 S_clear_placeholders(pTHX_ HV *hv, U32 items)
1624 {
1625     dVAR;
1626     I32 i;
1627 
1628     PERL_ARGS_ASSERT_CLEAR_PLACEHOLDERS;
1629 
1630     if (items == 0)
1631 	return;
1632 
1633     i = HvMAX(hv);
1634     do {
1635 	/* Loop down the linked list heads  */
1636 	HE **oentry = &(HvARRAY(hv))[i];
1637 	HE *entry;
1638 
1639 	while ((entry = *oentry)) {
1640 	    if (HeVAL(entry) == &PL_sv_placeholder) {
1641 		*oentry = HeNEXT(entry);
1642 		if (entry == HvEITER_get(hv))
1643 		    HvLAZYDEL_on(hv);
1644 		else {
1645 		    if (SvOOK(hv) && HvLAZYDEL(hv) &&
1646 			entry == HeNEXT(HvAUX(hv)->xhv_eiter))
1647 			HeNEXT(HvAUX(hv)->xhv_eiter) = HeNEXT(entry);
1648 		    hv_free_ent(hv, entry);
1649 		}
1650 
1651 		if (--items == 0) {
1652 		    /* Finished.  */
1653 		    I32 placeholders = HvPLACEHOLDERS_get(hv);
1654 		    HvTOTALKEYS(hv) -= (IV)placeholders;
1655 		    /* HvUSEDKEYS expanded */
1656 		    if ((HvTOTALKEYS(hv) - placeholders) == 0)
1657 			HvHASKFLAGS_off(hv);
1658 		    HvPLACEHOLDERS_set(hv, 0);
1659 		    return;
1660 		}
1661 	    } else {
1662 		oentry = &HeNEXT(entry);
1663 	    }
1664 	}
1665     } while (--i >= 0);
1666     /* You can't get here, hence assertion should always fail.  */
1667     assert (items == 0);
1668     NOT_REACHED;
1669 }
1670 
1671 STATIC void
1672 S_hfreeentries(pTHX_ HV *hv)
1673 {
1674     STRLEN index = 0;
1675     XPVHV * const xhv = (XPVHV*)SvANY(hv);
1676     SV *sv;
1677 
1678     PERL_ARGS_ASSERT_HFREEENTRIES;
1679 
1680     while ((sv = Perl_hfree_next_entry(aTHX_ hv, &index))||xhv->xhv_keys) {
1681 	SvREFCNT_dec(sv);
1682     }
1683 }
1684 
1685 
1686 /* hfree_next_entry()
1687  * For use only by S_hfreeentries() and sv_clear().
1688  * Delete the next available HE from hv and return the associated SV.
1689  * Returns null on empty hash. Nevertheless null is not a reliable
1690  * indicator that the hash is empty, as the deleted entry may have a
1691  * null value.
1692  * indexp is a pointer to the current index into HvARRAY. The index should
1693  * initially be set to 0. hfree_next_entry() may update it.  */
1694 
1695 SV*
1696 Perl_hfree_next_entry(pTHX_ HV *hv, STRLEN *indexp)
1697 {
1698     struct xpvhv_aux *iter;
1699     HE *entry;
1700     HE ** array;
1701 #ifdef DEBUGGING
1702     STRLEN orig_index = *indexp;
1703 #endif
1704 
1705     PERL_ARGS_ASSERT_HFREE_NEXT_ENTRY;
1706 
1707     if (SvOOK(hv) && ((iter = HvAUX(hv)))) {
1708 	if ((entry = iter->xhv_eiter)) {
1709             /* the iterator may get resurrected after each
1710              * destructor call, so check each time */
1711             if (entry && HvLAZYDEL(hv)) {	/* was deleted earlier? */
1712                 HvLAZYDEL_off(hv);
1713                 hv_free_ent(hv, entry);
1714                 /* warning: at this point HvARRAY may have been
1715                  * re-allocated, HvMAX changed etc */
1716             }
1717             iter = HvAUX(hv); /* may have been realloced */
1718             iter->xhv_riter = -1; 	/* HvRITER(hv) = -1 */
1719             iter->xhv_eiter = NULL;	/* HvEITER(hv) = NULL */
1720 #ifdef PERL_HASH_RANDOMIZE_KEYS
1721             iter->xhv_last_rand = iter->xhv_rand;
1722 #endif
1723         }
1724         /* Reset any cached HvFILL() to "unknown".  It's unlikely that anyone
1725            will actually call HvFILL() on a hash under destruction, so it
1726            seems pointless attempting to track the number of keys remaining.
1727            But if they do, we want to reset it again.  */
1728         if (iter->xhv_fill_lazy)
1729             iter->xhv_fill_lazy = 0;
1730     }
1731 
1732     if (!((XPVHV*)SvANY(hv))->xhv_keys)
1733 	return NULL;
1734 
1735     array = HvARRAY(hv);
1736     assert(array);
1737     while ( ! ((entry = array[*indexp])) ) {
1738 	if ((*indexp)++ >= HvMAX(hv))
1739 	    *indexp = 0;
1740 	assert(*indexp != orig_index);
1741     }
1742     array[*indexp] = HeNEXT(entry);
1743     ((XPVHV*) SvANY(hv))->xhv_keys--;
1744 
1745     if (   PL_phase != PERL_PHASE_DESTRUCT && HvENAME(hv)
1746 	&& HeVAL(entry) && isGV(HeVAL(entry))
1747 	&& GvHV(HeVAL(entry)) && HvENAME(GvHV(HeVAL(entry)))
1748     ) {
1749 	STRLEN klen;
1750 	const char * const key = HePV(entry,klen);
1751 	if ((klen > 1 && key[klen-1]==':' && key[klen-2]==':')
1752 	 || (klen == 1 && key[0] == ':')) {
1753 	    mro_package_moved(
1754 	     NULL, GvHV(HeVAL(entry)),
1755 	     (GV *)HeVAL(entry), 0
1756 	    );
1757 	}
1758     }
1759     return hv_free_ent_ret(hv, entry);
1760 }
1761 
1762 
1763 /*
1764 =for apidoc hv_undef
1765 
1766 Undefines the hash.  The XS equivalent of C<undef(%hash)>.
1767 
1768 As well as freeing all the elements of the hash (like hv_clear()), this
1769 also frees any auxiliary data and storage associated with the hash.
1770 
1771 If any destructors are triggered as a result, the hv itself may
1772 be freed.
1773 
1774 See also L</hv_clear>.
1775 
1776 =cut
1777 */
1778 
1779 void
1780 Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags)
1781 {
1782     dVAR;
1783     XPVHV* xhv;
1784     bool save;
1785 
1786     if (!hv)
1787 	return;
1788     save = !!SvREFCNT(hv);
1789     DEBUG_A(Perl_hv_assert(aTHX_ hv));
1790     xhv = (XPVHV*)SvANY(hv);
1791 
1792     /* The name must be deleted before the call to hfreeeeentries so that
1793        CVs are anonymised properly. But the effective name must be pre-
1794        served until after that call (and only deleted afterwards if the
1795        call originated from sv_clear). For stashes with one name that is
1796        both the canonical name and the effective name, hv_name_set has to
1797        allocate an array for storing the effective name. We can skip that
1798        during global destruction, as it does not matter where the CVs point
1799        if they will be freed anyway. */
1800     /* note that the code following prior to hfreeentries is duplicated
1801      * in sv_clear(), and changes here should be done there too */
1802     if (PL_phase != PERL_PHASE_DESTRUCT && HvNAME(hv)) {
1803         if (PL_stashcache) {
1804             DEBUG_o(Perl_deb(aTHX_ "hv_undef_flags clearing PL_stashcache for '%"
1805                              HEKf"'\n", HvNAME_HEK(hv)));
1806 	    (void)hv_deletehek(PL_stashcache, HvNAME_HEK(hv), G_DISCARD);
1807         }
1808 	hv_name_set(hv, NULL, 0, 0);
1809     }
1810     if (save) {
1811 	ENTER;
1812 	SAVEFREESV(SvREFCNT_inc_simple_NN(hv));
1813     }
1814     hfreeentries(hv);
1815     if (SvOOK(hv)) {
1816       struct mro_meta *meta;
1817       const char *name;
1818 
1819       if (HvENAME_get(hv)) {
1820 	if (PL_phase != PERL_PHASE_DESTRUCT)
1821 	    mro_isa_changed_in(hv);
1822         if (PL_stashcache) {
1823             DEBUG_o(Perl_deb(aTHX_ "hv_undef_flags clearing PL_stashcache for effective name '%"
1824                              HEKf"'\n", HvENAME_HEK(hv)));
1825 	    (void)hv_deletehek(PL_stashcache, HvENAME_HEK(hv), G_DISCARD);
1826         }
1827       }
1828 
1829       /* If this call originated from sv_clear, then we must check for
1830        * effective names that need freeing, as well as the usual name. */
1831       name = HvNAME(hv);
1832       if (flags & HV_NAME_SETALL ? !!HvAUX(hv)->xhv_name_u.xhvnameu_name : !!name) {
1833         if (name && PL_stashcache) {
1834             DEBUG_o(Perl_deb(aTHX_ "hv_undef_flags clearing PL_stashcache for name '%"
1835                              HEKf"'\n", HvNAME_HEK(hv)));
1836 	    (void)hv_deletehek(PL_stashcache, HvNAME_HEK(hv), G_DISCARD);
1837         }
1838 	hv_name_set(hv, NULL, 0, flags);
1839       }
1840       if((meta = HvAUX(hv)->xhv_mro_meta)) {
1841 	if (meta->mro_linear_all) {
1842 	    SvREFCNT_dec_NN(meta->mro_linear_all);
1843 	    /* mro_linear_current is just acting as a shortcut pointer,
1844 	       hence the else.  */
1845 	}
1846 	else
1847 	    /* Only the current MRO is stored, so this owns the data.
1848 	     */
1849 	    SvREFCNT_dec(meta->mro_linear_current);
1850 	SvREFCNT_dec(meta->mro_nextmethod);
1851 	SvREFCNT_dec(meta->isa);
1852 	SvREFCNT_dec(meta->super);
1853 	Safefree(meta);
1854 	HvAUX(hv)->xhv_mro_meta = NULL;
1855       }
1856       if (!HvAUX(hv)->xhv_name_u.xhvnameu_name && ! HvAUX(hv)->xhv_backreferences)
1857 	SvFLAGS(hv) &= ~SVf_OOK;
1858     }
1859     if (!SvOOK(hv)) {
1860 	Safefree(HvARRAY(hv));
1861         xhv->xhv_max = PERL_HASH_DEFAULT_HvMAX;        /* HvMAX(hv) = 7 (it's a normal hash) */
1862 	HvARRAY(hv) = 0;
1863     }
1864     /* if we're freeing the HV, the SvMAGIC field has been reused for
1865      * other purposes, and so there can't be any placeholder magic */
1866     if (SvREFCNT(hv))
1867 	HvPLACEHOLDERS_set(hv, 0);
1868 
1869     if (SvRMAGICAL(hv))
1870 	mg_clear(MUTABLE_SV(hv));
1871     if (save) LEAVE;
1872 }
1873 
1874 /*
1875 =for apidoc hv_fill
1876 
1877 Returns the number of hash buckets that
1878 happen to be in use.  This function is
1879 wrapped by the macro C<HvFILL>.
1880 
1881 Previously this value was always stored in the HV structure, which created an
1882 overhead on every hash (and pretty much every object) for something that was
1883 rarely used.  Now we calculate it on demand the first
1884 time that it is needed, and cache it if that calculation
1885 is going to be costly to repeat.  The cached
1886 value is updated by insertions and deletions, but (currently) discarded if
1887 the hash is split.
1888 
1889 =cut
1890 */
1891 
1892 STRLEN
1893 Perl_hv_fill(pTHX_ HV *const hv)
1894 {
1895     STRLEN count = 0;
1896     HE **ents = HvARRAY(hv);
1897     struct xpvhv_aux *aux = SvOOK(hv) ? HvAUX(hv) : NULL;
1898 
1899     PERL_ARGS_ASSERT_HV_FILL;
1900 
1901     /* No keys implies no buckets used.
1902        One key can only possibly mean one bucket used.  */
1903     if (HvTOTALKEYS(hv) < 2)
1904         return HvTOTALKEYS(hv);
1905 
1906 #ifndef DEBUGGING
1907     if (aux && aux->xhv_fill_lazy)
1908         return aux->xhv_fill_lazy;
1909 #endif
1910 
1911     if (ents) {
1912 	HE *const *const last = ents + HvMAX(hv);
1913 	count = last + 1 - ents;
1914 
1915 	do {
1916 	    if (!*ents)
1917 		--count;
1918 	} while (++ents <= last);
1919     }
1920     if (aux) {
1921 #ifdef DEBUGGING
1922         if (aux->xhv_fill_lazy)
1923             assert(aux->xhv_fill_lazy == count);
1924 #endif
1925         aux->xhv_fill_lazy = count;
1926     } else if (HvMAX(hv) >= HV_FILL_THRESHOLD) {
1927         aux = hv_auxinit(hv);
1928         aux->xhv_fill_lazy = count;
1929     }
1930     return count;
1931 }
1932 
1933 /* hash a pointer to a U32 - Used in the hash traversal randomization
1934  * and bucket order randomization code
1935  *
1936  * this code was derived from Sereal, which was derived from autobox.
1937  */
1938 
1939 PERL_STATIC_INLINE U32 S_ptr_hash(PTRV u) {
1940 #if PTRSIZE == 8
1941     /*
1942      * This is one of Thomas Wang's hash functions for 64-bit integers from:
1943      * http://www.concentric.net/~Ttwang/tech/inthash.htm
1944      */
1945     u = (~u) + (u << 18);
1946     u = u ^ (u >> 31);
1947     u = u * 21;
1948     u = u ^ (u >> 11);
1949     u = u + (u << 6);
1950     u = u ^ (u >> 22);
1951 #else
1952     /*
1953      * This is one of Bob Jenkins' hash functions for 32-bit integers
1954      * from: http://burtleburtle.net/bob/hash/integer.html
1955      */
1956     u = (u + 0x7ed55d16) + (u << 12);
1957     u = (u ^ 0xc761c23c) ^ (u >> 19);
1958     u = (u + 0x165667b1) + (u << 5);
1959     u = (u + 0xd3a2646c) ^ (u << 9);
1960     u = (u + 0xfd7046c5) + (u << 3);
1961     u = (u ^ 0xb55a4f09) ^ (u >> 16);
1962 #endif
1963     return (U32)u;
1964 }
1965 
1966 static struct xpvhv_aux*
1967 S_hv_auxinit_internal(struct xpvhv_aux *iter) {
1968     PERL_ARGS_ASSERT_HV_AUXINIT_INTERNAL;
1969     iter->xhv_riter = -1; 	/* HvRITER(hv) = -1 */
1970     iter->xhv_eiter = NULL;	/* HvEITER(hv) = NULL */
1971 #ifdef PERL_HASH_RANDOMIZE_KEYS
1972     iter->xhv_last_rand = iter->xhv_rand;
1973 #endif
1974     iter->xhv_fill_lazy = 0;
1975     iter->xhv_name_u.xhvnameu_name = 0;
1976     iter->xhv_name_count = 0;
1977     iter->xhv_backreferences = 0;
1978     iter->xhv_mro_meta = NULL;
1979     iter->xhv_aux_flags = 0;
1980     return iter;
1981 }
1982 
1983 
1984 static struct xpvhv_aux*
1985 S_hv_auxinit(pTHX_ HV *hv) {
1986     struct xpvhv_aux *iter;
1987     char *array;
1988 
1989     PERL_ARGS_ASSERT_HV_AUXINIT;
1990 
1991     if (!SvOOK(hv)) {
1992         if (!HvARRAY(hv)) {
1993             Newxz(array, PERL_HV_ARRAY_ALLOC_BYTES(HvMAX(hv) + 1)
1994                 + sizeof(struct xpvhv_aux), char);
1995         } else {
1996             array = (char *) HvARRAY(hv);
1997             Renew(array, PERL_HV_ARRAY_ALLOC_BYTES(HvMAX(hv) + 1)
1998                   + sizeof(struct xpvhv_aux), char);
1999         }
2000         HvARRAY(hv) = (HE**)array;
2001         SvOOK_on(hv);
2002         iter = HvAUX(hv);
2003 #ifdef PERL_HASH_RANDOMIZE_KEYS
2004         if (PL_HASH_RAND_BITS_ENABLED) {
2005             /* mix in some new state to PL_hash_rand_bits to "randomize" the traversal order*/
2006             if (PL_HASH_RAND_BITS_ENABLED == 1)
2007                 PL_hash_rand_bits += ptr_hash((PTRV)array);
2008             PL_hash_rand_bits = ROTL_UV(PL_hash_rand_bits,1);
2009         }
2010         iter->xhv_rand = (U32)PL_hash_rand_bits;
2011 #endif
2012     } else {
2013         iter = HvAUX(hv);
2014     }
2015 
2016     return hv_auxinit_internal(iter);
2017 }
2018 
2019 /*
2020 =for apidoc hv_iterinit
2021 
2022 Prepares a starting point to traverse a hash table.  Returns the number of
2023 keys in the hash (i.e. the same as C<HvUSEDKEYS(hv)>).  The return value is
2024 currently only meaningful for hashes without tie magic.
2025 
2026 NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
2027 hash buckets that happen to be in use.  If you still need that esoteric
2028 value, you can get it through the macro C<HvFILL(hv)>.
2029 
2030 
2031 =cut
2032 */
2033 
2034 I32
2035 Perl_hv_iterinit(pTHX_ HV *hv)
2036 {
2037     PERL_ARGS_ASSERT_HV_ITERINIT;
2038 
2039     /* FIXME: Are we not NULL, or do we croak? Place bets now! */
2040 
2041     if (!hv)
2042 	Perl_croak(aTHX_ "Bad hash");
2043 
2044     if (SvOOK(hv)) {
2045 	struct xpvhv_aux * iter = HvAUX(hv);
2046 	HE * const entry = iter->xhv_eiter; /* HvEITER(hv) */
2047 	if (entry && HvLAZYDEL(hv)) {	/* was deleted earlier? */
2048 	    HvLAZYDEL_off(hv);
2049 	    hv_free_ent(hv, entry);
2050 	}
2051 	iter = HvAUX(hv); /* may have been reallocated */
2052 	iter->xhv_riter = -1; 	/* HvRITER(hv) = -1 */
2053 	iter->xhv_eiter = NULL; /* HvEITER(hv) = NULL */
2054 #ifdef PERL_HASH_RANDOMIZE_KEYS
2055         iter->xhv_last_rand = iter->xhv_rand;
2056 #endif
2057     } else {
2058 	hv_auxinit(hv);
2059     }
2060 
2061     /* used to be xhv->xhv_fill before 5.004_65 */
2062     return HvTOTALKEYS(hv);
2063 }
2064 
2065 I32 *
2066 Perl_hv_riter_p(pTHX_ HV *hv) {
2067     struct xpvhv_aux *iter;
2068 
2069     PERL_ARGS_ASSERT_HV_RITER_P;
2070 
2071     if (!hv)
2072 	Perl_croak(aTHX_ "Bad hash");
2073 
2074     iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
2075     return &(iter->xhv_riter);
2076 }
2077 
2078 HE **
2079 Perl_hv_eiter_p(pTHX_ HV *hv) {
2080     struct xpvhv_aux *iter;
2081 
2082     PERL_ARGS_ASSERT_HV_EITER_P;
2083 
2084     if (!hv)
2085 	Perl_croak(aTHX_ "Bad hash");
2086 
2087     iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
2088     return &(iter->xhv_eiter);
2089 }
2090 
2091 void
2092 Perl_hv_riter_set(pTHX_ HV *hv, I32 riter) {
2093     struct xpvhv_aux *iter;
2094 
2095     PERL_ARGS_ASSERT_HV_RITER_SET;
2096 
2097     if (!hv)
2098 	Perl_croak(aTHX_ "Bad hash");
2099 
2100     if (SvOOK(hv)) {
2101 	iter = HvAUX(hv);
2102     } else {
2103 	if (riter == -1)
2104 	    return;
2105 
2106 	iter = hv_auxinit(hv);
2107     }
2108     iter->xhv_riter = riter;
2109 }
2110 
2111 void
2112 Perl_hv_rand_set(pTHX_ HV *hv, U32 new_xhv_rand) {
2113     struct xpvhv_aux *iter;
2114 
2115     PERL_ARGS_ASSERT_HV_RAND_SET;
2116 
2117 #ifdef PERL_HASH_RANDOMIZE_KEYS
2118     if (!hv)
2119         Perl_croak(aTHX_ "Bad hash");
2120 
2121     if (SvOOK(hv)) {
2122         iter = HvAUX(hv);
2123     } else {
2124         iter = hv_auxinit(hv);
2125     }
2126     iter->xhv_rand = new_xhv_rand;
2127 #else
2128     Perl_croak(aTHX_ "This Perl has not been built with support for randomized hash key traversal but something called Perl_hv_rand_set().");
2129 #endif
2130 }
2131 
2132 void
2133 Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter) {
2134     struct xpvhv_aux *iter;
2135 
2136     PERL_ARGS_ASSERT_HV_EITER_SET;
2137 
2138     if (!hv)
2139 	Perl_croak(aTHX_ "Bad hash");
2140 
2141     if (SvOOK(hv)) {
2142 	iter = HvAUX(hv);
2143     } else {
2144 	/* 0 is the default so don't go malloc()ing a new structure just to
2145 	   hold 0.  */
2146 	if (!eiter)
2147 	    return;
2148 
2149 	iter = hv_auxinit(hv);
2150     }
2151     iter->xhv_eiter = eiter;
2152 }
2153 
2154 void
2155 Perl_hv_name_set(pTHX_ HV *hv, const char *name, U32 len, U32 flags)
2156 {
2157     dVAR;
2158     struct xpvhv_aux *iter;
2159     U32 hash;
2160     HEK **spot;
2161 
2162     PERL_ARGS_ASSERT_HV_NAME_SET;
2163 
2164     if (len > I32_MAX)
2165 	Perl_croak(aTHX_ "panic: hv name too long (%"UVuf")", (UV) len);
2166 
2167     if (SvOOK(hv)) {
2168 	iter = HvAUX(hv);
2169 	if (iter->xhv_name_u.xhvnameu_name) {
2170 	    if(iter->xhv_name_count) {
2171 	      if(flags & HV_NAME_SETALL) {
2172 		HEK ** const name = HvAUX(hv)->xhv_name_u.xhvnameu_names;
2173 		HEK **hekp = name + (
2174 		    iter->xhv_name_count < 0
2175 		     ? -iter->xhv_name_count
2176 		     :  iter->xhv_name_count
2177 		   );
2178 		while(hekp-- > name+1)
2179 		    unshare_hek_or_pvn(*hekp, 0, 0, 0);
2180 		/* The first elem may be null. */
2181 		if(*name) unshare_hek_or_pvn(*name, 0, 0, 0);
2182 		Safefree(name);
2183                 iter = HvAUX(hv); /* may been realloced */
2184 		spot = &iter->xhv_name_u.xhvnameu_name;
2185 		iter->xhv_name_count = 0;
2186 	      }
2187 	      else {
2188 		if(iter->xhv_name_count > 0) {
2189 		    /* shift some things over */
2190 		    Renew(
2191 		     iter->xhv_name_u.xhvnameu_names, iter->xhv_name_count + 1, HEK *
2192 		    );
2193 		    spot = iter->xhv_name_u.xhvnameu_names;
2194 		    spot[iter->xhv_name_count] = spot[1];
2195 		    spot[1] = spot[0];
2196 		    iter->xhv_name_count = -(iter->xhv_name_count + 1);
2197 		}
2198 		else if(*(spot = iter->xhv_name_u.xhvnameu_names)) {
2199 		    unshare_hek_or_pvn(*spot, 0, 0, 0);
2200 		}
2201 	      }
2202 	    }
2203 	    else if (flags & HV_NAME_SETALL) {
2204 		unshare_hek_or_pvn(iter->xhv_name_u.xhvnameu_name, 0, 0, 0);
2205                 iter = HvAUX(hv); /* may been realloced */
2206 		spot = &iter->xhv_name_u.xhvnameu_name;
2207 	    }
2208 	    else {
2209 		HEK * const existing_name = iter->xhv_name_u.xhvnameu_name;
2210 		Newx(iter->xhv_name_u.xhvnameu_names, 2, HEK *);
2211 		iter->xhv_name_count = -2;
2212 		spot = iter->xhv_name_u.xhvnameu_names;
2213 		spot[1] = existing_name;
2214 	    }
2215 	}
2216 	else { spot = &iter->xhv_name_u.xhvnameu_name; iter->xhv_name_count = 0; }
2217     } else {
2218 	if (name == 0)
2219 	    return;
2220 
2221 	iter = hv_auxinit(hv);
2222 	spot = &iter->xhv_name_u.xhvnameu_name;
2223     }
2224     PERL_HASH(hash, name, len);
2225     *spot = name ? share_hek(name, flags & SVf_UTF8 ? -(I32)len : (I32)len, hash) : NULL;
2226 }
2227 
2228 /*
2229 This is basically sv_eq_flags() in sv.c, but we avoid the magic
2230 and bytes checking.
2231 */
2232 
2233 STATIC I32
2234 hek_eq_pvn_flags(pTHX_ const HEK *hek, const char* pv, const I32 pvlen, const U32 flags) {
2235     if ( (HEK_UTF8(hek) ? 1 : 0) != (flags & SVf_UTF8 ? 1 : 0) ) {
2236         if (flags & SVf_UTF8)
2237             return (bytes_cmp_utf8(
2238                         (const U8*)HEK_KEY(hek), HEK_LEN(hek),
2239 		        (const U8*)pv, pvlen) == 0);
2240         else
2241             return (bytes_cmp_utf8(
2242                         (const U8*)pv, pvlen,
2243 		        (const U8*)HEK_KEY(hek), HEK_LEN(hek)) == 0);
2244     }
2245     else
2246         return HEK_LEN(hek) == pvlen && ((HEK_KEY(hek) == pv)
2247                     || memEQ(HEK_KEY(hek), pv, pvlen));
2248 }
2249 
2250 /*
2251 =for apidoc hv_ename_add
2252 
2253 Adds a name to a stash's internal list of effective names.  See
2254 C<hv_ename_delete>.
2255 
2256 This is called when a stash is assigned to a new location in the symbol
2257 table.
2258 
2259 =cut
2260 */
2261 
2262 void
2263 Perl_hv_ename_add(pTHX_ HV *hv, const char *name, U32 len, U32 flags)
2264 {
2265     dVAR;
2266     struct xpvhv_aux *aux = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
2267     U32 hash;
2268 
2269     PERL_ARGS_ASSERT_HV_ENAME_ADD;
2270 
2271     if (len > I32_MAX)
2272 	Perl_croak(aTHX_ "panic: hv name too long (%"UVuf")", (UV) len);
2273 
2274     PERL_HASH(hash, name, len);
2275 
2276     if (aux->xhv_name_count) {
2277 	HEK ** const xhv_name = aux->xhv_name_u.xhvnameu_names;
2278 	I32 count = aux->xhv_name_count;
2279 	HEK **hekp = xhv_name + (count < 0 ? -count : count);
2280 	while (hekp-- > xhv_name)
2281 	    if (
2282                  (HEK_UTF8(*hekp) || (flags & SVf_UTF8))
2283                     ? hek_eq_pvn_flags(aTHX_ *hekp, name, (I32)len, flags)
2284 	            : (HEK_LEN(*hekp) == (I32)len && memEQ(HEK_KEY(*hekp), name, len))
2285                ) {
2286 		if (hekp == xhv_name && count < 0)
2287 		    aux->xhv_name_count = -count;
2288 		return;
2289 	    }
2290 	if (count < 0) aux->xhv_name_count--, count = -count;
2291 	else aux->xhv_name_count++;
2292 	Renew(aux->xhv_name_u.xhvnameu_names, count + 1, HEK *);
2293 	(aux->xhv_name_u.xhvnameu_names)[count] = share_hek(name, (flags & SVf_UTF8 ? -(I32)len : (I32)len), hash);
2294     }
2295     else {
2296 	HEK *existing_name = aux->xhv_name_u.xhvnameu_name;
2297 	if (
2298 	    existing_name && (
2299              (HEK_UTF8(existing_name) || (flags & SVf_UTF8))
2300                 ? hek_eq_pvn_flags(aTHX_ existing_name, name, (I32)len, flags)
2301 	        : (HEK_LEN(existing_name) == (I32)len && memEQ(HEK_KEY(existing_name), name, len))
2302 	    )
2303 	) return;
2304 	Newx(aux->xhv_name_u.xhvnameu_names, 2, HEK *);
2305 	aux->xhv_name_count = existing_name ? 2 : -2;
2306 	*aux->xhv_name_u.xhvnameu_names = existing_name;
2307 	(aux->xhv_name_u.xhvnameu_names)[1] = share_hek(name, (flags & SVf_UTF8 ? -(I32)len : (I32)len), hash);
2308     }
2309 }
2310 
2311 /*
2312 =for apidoc hv_ename_delete
2313 
2314 Removes a name from a stash's internal list of effective names.  If this is
2315 the name returned by C<HvENAME>, then another name in the list will take
2316 its place (C<HvENAME> will use it).
2317 
2318 This is called when a stash is deleted from the symbol table.
2319 
2320 =cut
2321 */
2322 
2323 void
2324 Perl_hv_ename_delete(pTHX_ HV *hv, const char *name, U32 len, U32 flags)
2325 {
2326     dVAR;
2327     struct xpvhv_aux *aux;
2328 
2329     PERL_ARGS_ASSERT_HV_ENAME_DELETE;
2330 
2331     if (len > I32_MAX)
2332 	Perl_croak(aTHX_ "panic: hv name too long (%"UVuf")", (UV) len);
2333 
2334     if (!SvOOK(hv)) return;
2335 
2336     aux = HvAUX(hv);
2337     if (!aux->xhv_name_u.xhvnameu_name) return;
2338 
2339     if (aux->xhv_name_count) {
2340 	HEK ** const namep = aux->xhv_name_u.xhvnameu_names;
2341 	I32 const count = aux->xhv_name_count;
2342 	HEK **victim = namep + (count < 0 ? -count : count);
2343 	while (victim-- > namep + 1)
2344 	    if (
2345              (HEK_UTF8(*victim) || (flags & SVf_UTF8))
2346                 ? hek_eq_pvn_flags(aTHX_ *victim, name, (I32)len, flags)
2347 	        : (HEK_LEN(*victim) == (I32)len && memEQ(HEK_KEY(*victim), name, len))
2348 	    ) {
2349 		unshare_hek_or_pvn(*victim, 0, 0, 0);
2350                 aux = HvAUX(hv); /* may been realloced */
2351 		if (count < 0) ++aux->xhv_name_count;
2352 		else --aux->xhv_name_count;
2353 		if (
2354 		    (aux->xhv_name_count == 1 || aux->xhv_name_count == -1)
2355 		 && !*namep
2356 		) {  /* if there are none left */
2357 		    Safefree(namep);
2358 		    aux->xhv_name_u.xhvnameu_names = NULL;
2359 		    aux->xhv_name_count = 0;
2360 		}
2361 		else {
2362 		    /* Move the last one back to fill the empty slot. It
2363 		       does not matter what order they are in. */
2364 		    *victim = *(namep + (count < 0 ? -count : count) - 1);
2365 		}
2366 		return;
2367 	    }
2368 	if (
2369 	    count > 0 && (HEK_UTF8(*namep) || (flags & SVf_UTF8))
2370                 ? hek_eq_pvn_flags(aTHX_ *namep, name, (I32)len, flags)
2371 	        : (HEK_LEN(*namep) == (I32)len && memEQ(HEK_KEY(*namep), name, len))
2372 	) {
2373 	    aux->xhv_name_count = -count;
2374 	}
2375     }
2376     else if(
2377         (HEK_UTF8(aux->xhv_name_u.xhvnameu_name) || (flags & SVf_UTF8))
2378                 ? hek_eq_pvn_flags(aTHX_ aux->xhv_name_u.xhvnameu_name, name, (I32)len, flags)
2379 	        : (HEK_LEN(aux->xhv_name_u.xhvnameu_name) == (I32)len &&
2380                             memEQ(HEK_KEY(aux->xhv_name_u.xhvnameu_name), name, len))
2381     ) {
2382 	HEK * const namehek = aux->xhv_name_u.xhvnameu_name;
2383 	Newx(aux->xhv_name_u.xhvnameu_names, 1, HEK *);
2384 	*aux->xhv_name_u.xhvnameu_names = namehek;
2385 	aux->xhv_name_count = -1;
2386     }
2387 }
2388 
2389 AV **
2390 Perl_hv_backreferences_p(pTHX_ HV *hv) {
2391     struct xpvhv_aux * const iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
2392 
2393     PERL_ARGS_ASSERT_HV_BACKREFERENCES_P;
2394     PERL_UNUSED_CONTEXT;
2395 
2396     return &(iter->xhv_backreferences);
2397 }
2398 
2399 void
2400 Perl_hv_kill_backrefs(pTHX_ HV *hv) {
2401     AV *av;
2402 
2403     PERL_ARGS_ASSERT_HV_KILL_BACKREFS;
2404 
2405     if (!SvOOK(hv))
2406 	return;
2407 
2408     av = HvAUX(hv)->xhv_backreferences;
2409 
2410     if (av) {
2411 	HvAUX(hv)->xhv_backreferences = 0;
2412 	Perl_sv_kill_backrefs(aTHX_ MUTABLE_SV(hv), av);
2413 	if (SvTYPE(av) == SVt_PVAV)
2414 	    SvREFCNT_dec_NN(av);
2415     }
2416 }
2417 
2418 /*
2419 hv_iternext is implemented as a macro in hv.h
2420 
2421 =for apidoc hv_iternext
2422 
2423 Returns entries from a hash iterator.  See C<hv_iterinit>.
2424 
2425 You may call C<hv_delete> or C<hv_delete_ent> on the hash entry that the
2426 iterator currently points to, without losing your place or invalidating your
2427 iterator.  Note that in this case the current entry is deleted from the hash
2428 with your iterator holding the last reference to it.  Your iterator is flagged
2429 to free the entry on the next call to C<hv_iternext>, so you must not discard
2430 your iterator immediately else the entry will leak - call C<hv_iternext> to
2431 trigger the resource deallocation.
2432 
2433 =for apidoc hv_iternext_flags
2434 
2435 Returns entries from a hash iterator.  See C<hv_iterinit> and C<hv_iternext>.
2436 The C<flags> value will normally be zero; if HV_ITERNEXT_WANTPLACEHOLDERS is
2437 set the placeholders keys (for restricted hashes) will be returned in addition
2438 to normal keys.  By default placeholders are automatically skipped over.
2439 Currently a placeholder is implemented with a value that is
2440 C<&PL_sv_placeholder>.  Note that the implementation of placeholders and
2441 restricted hashes may change, and the implementation currently is
2442 insufficiently abstracted for any change to be tidy.
2443 
2444 =cut
2445 */
2446 
2447 HE *
2448 Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags)
2449 {
2450     dVAR;
2451     XPVHV* xhv;
2452     HE *entry;
2453     HE *oldentry;
2454     MAGIC* mg;
2455     struct xpvhv_aux *iter;
2456 
2457     PERL_ARGS_ASSERT_HV_ITERNEXT_FLAGS;
2458 
2459     if (!hv)
2460 	Perl_croak(aTHX_ "Bad hash");
2461 
2462     xhv = (XPVHV*)SvANY(hv);
2463 
2464     if (!SvOOK(hv)) {
2465 	/* Too many things (well, pp_each at least) merrily assume that you can
2466 	   call hv_iternext without calling hv_iterinit, so we'll have to deal
2467 	   with it.  */
2468 	hv_iterinit(hv);
2469     }
2470     iter = HvAUX(hv);
2471 
2472     oldentry = entry = iter->xhv_eiter; /* HvEITER(hv) */
2473     if (SvMAGICAL(hv) && SvRMAGICAL(hv)) {
2474 	if ( ( mg = mg_find((const SV *)hv, PERL_MAGIC_tied) ) ) {
2475             SV * const key = sv_newmortal();
2476             if (entry) {
2477                 sv_setsv(key, HeSVKEY_force(entry));
2478                 SvREFCNT_dec(HeSVKEY(entry));       /* get rid of previous key */
2479 		HeSVKEY_set(entry, NULL);
2480             }
2481             else {
2482                 char *k;
2483                 HEK *hek;
2484 
2485                 /* one HE per MAGICAL hash */
2486                 iter->xhv_eiter = entry = new_HE(); /* HvEITER(hv) = new_HE() */
2487 		HvLAZYDEL_on(hv); /* make sure entry gets freed */
2488                 Zero(entry, 1, HE);
2489                 Newxz(k, HEK_BASESIZE + sizeof(const SV *), char);
2490                 hek = (HEK*)k;
2491                 HeKEY_hek(entry) = hek;
2492                 HeKLEN(entry) = HEf_SVKEY;
2493             }
2494             magic_nextpack(MUTABLE_SV(hv),mg,key);
2495             if (SvOK(key)) {
2496                 /* force key to stay around until next time */
2497                 HeSVKEY_set(entry, SvREFCNT_inc_simple_NN(key));
2498                 return entry;               /* beware, hent_val is not set */
2499             }
2500             SvREFCNT_dec(HeVAL(entry));
2501             Safefree(HeKEY_hek(entry));
2502             del_HE(entry);
2503             iter = HvAUX(hv); /* may been realloced */
2504             iter->xhv_eiter = NULL; /* HvEITER(hv) = NULL */
2505 	    HvLAZYDEL_off(hv);
2506             return NULL;
2507         }
2508     }
2509 #if defined(DYNAMIC_ENV_FETCH) && !defined(__riscos__)  /* set up %ENV for iteration */
2510     if (!entry && SvRMAGICAL((const SV *)hv)
2511 	&& mg_find((const SV *)hv, PERL_MAGIC_env)) {
2512 	prime_env_iter();
2513 #ifdef VMS
2514 	/* The prime_env_iter() on VMS just loaded up new hash values
2515 	 * so the iteration count needs to be reset back to the beginning
2516 	 */
2517 	hv_iterinit(hv);
2518 	iter = HvAUX(hv);
2519 	oldentry = entry = iter->xhv_eiter; /* HvEITER(hv) */
2520 #endif
2521     }
2522 #endif
2523 
2524     /* hv_iterinit now ensures this.  */
2525     assert (HvARRAY(hv));
2526 
2527     /* At start of hash, entry is NULL.  */
2528     if (entry)
2529     {
2530 	entry = HeNEXT(entry);
2531         if (!(flags & HV_ITERNEXT_WANTPLACEHOLDERS)) {
2532             /*
2533              * Skip past any placeholders -- don't want to include them in
2534              * any iteration.
2535              */
2536             while (entry && HeVAL(entry) == &PL_sv_placeholder) {
2537                 entry = HeNEXT(entry);
2538             }
2539 	}
2540     }
2541 
2542 #ifdef PERL_HASH_RANDOMIZE_KEYS
2543     if (iter->xhv_last_rand != iter->xhv_rand) {
2544         if (iter->xhv_riter != -1) {
2545             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
2546                              "Use of each() on hash after insertion without resetting hash iterator results in undefined behavior"
2547                              pTHX__FORMAT
2548                              pTHX__VALUE);
2549         }
2550         iter = HvAUX(hv); /* may been realloced */
2551         iter->xhv_last_rand = iter->xhv_rand;
2552     }
2553 #endif
2554 
2555     /* Skip the entire loop if the hash is empty.   */
2556     if ((flags & HV_ITERNEXT_WANTPLACEHOLDERS)
2557 	? HvTOTALKEYS(hv) : HvUSEDKEYS(hv)) {
2558 	while (!entry) {
2559 	    /* OK. Come to the end of the current list.  Grab the next one.  */
2560 
2561 	    iter->xhv_riter++; /* HvRITER(hv)++ */
2562 	    if (iter->xhv_riter > (I32)xhv->xhv_max /* HvRITER(hv) > HvMAX(hv) */) {
2563 		/* There is no next one.  End of the hash.  */
2564 		iter->xhv_riter = -1; /* HvRITER(hv) = -1 */
2565 #ifdef PERL_HASH_RANDOMIZE_KEYS
2566                 iter->xhv_last_rand = iter->xhv_rand; /* reset xhv_last_rand so we can detect inserts during traversal */
2567 #endif
2568 		break;
2569 	    }
2570             entry = (HvARRAY(hv))[ PERL_HASH_ITER_BUCKET(iter) & xhv->xhv_max ];
2571 
2572 	    if (!(flags & HV_ITERNEXT_WANTPLACEHOLDERS)) {
2573 		/* If we have an entry, but it's a placeholder, don't count it.
2574 		   Try the next.  */
2575 		while (entry && HeVAL(entry) == &PL_sv_placeholder)
2576 		    entry = HeNEXT(entry);
2577 	    }
2578 	    /* Will loop again if this linked list starts NULL
2579 	       (for HV_ITERNEXT_WANTPLACEHOLDERS)
2580 	       or if we run through it and find only placeholders.  */
2581 	}
2582     }
2583     else {
2584         iter->xhv_riter = -1;
2585 #ifdef PERL_HASH_RANDOMIZE_KEYS
2586         iter->xhv_last_rand = iter->xhv_rand;
2587 #endif
2588     }
2589 
2590     if (oldentry && HvLAZYDEL(hv)) {		/* was deleted earlier? */
2591 	HvLAZYDEL_off(hv);
2592 	hv_free_ent(hv, oldentry);
2593     }
2594 
2595     iter = HvAUX(hv); /* may been realloced */
2596     iter->xhv_eiter = entry; /* HvEITER(hv) = entry */
2597     return entry;
2598 }
2599 
2600 /*
2601 =for apidoc hv_iterkey
2602 
2603 Returns the key from the current position of the hash iterator.  See
2604 C<hv_iterinit>.
2605 
2606 =cut
2607 */
2608 
2609 char *
2610 Perl_hv_iterkey(pTHX_ HE *entry, I32 *retlen)
2611 {
2612     PERL_ARGS_ASSERT_HV_ITERKEY;
2613 
2614     if (HeKLEN(entry) == HEf_SVKEY) {
2615 	STRLEN len;
2616 	char * const p = SvPV(HeKEY_sv(entry), len);
2617 	*retlen = len;
2618 	return p;
2619     }
2620     else {
2621 	*retlen = HeKLEN(entry);
2622 	return HeKEY(entry);
2623     }
2624 }
2625 
2626 /* unlike hv_iterval(), this always returns a mortal copy of the key */
2627 /*
2628 =for apidoc hv_iterkeysv
2629 
2630 Returns the key as an C<SV*> from the current position of the hash
2631 iterator.  The return value will always be a mortal copy of the key.  Also
2632 see C<hv_iterinit>.
2633 
2634 =cut
2635 */
2636 
2637 SV *
2638 Perl_hv_iterkeysv(pTHX_ HE *entry)
2639 {
2640     PERL_ARGS_ASSERT_HV_ITERKEYSV;
2641 
2642     return sv_2mortal(newSVhek(HeKEY_hek(entry)));
2643 }
2644 
2645 /*
2646 =for apidoc hv_iterval
2647 
2648 Returns the value from the current position of the hash iterator.  See
2649 C<hv_iterkey>.
2650 
2651 =cut
2652 */
2653 
2654 SV *
2655 Perl_hv_iterval(pTHX_ HV *hv, HE *entry)
2656 {
2657     PERL_ARGS_ASSERT_HV_ITERVAL;
2658 
2659     if (SvRMAGICAL(hv)) {
2660 	if (mg_find((const SV *)hv, PERL_MAGIC_tied)) {
2661 	    SV* const sv = sv_newmortal();
2662 	    if (HeKLEN(entry) == HEf_SVKEY)
2663 		mg_copy(MUTABLE_SV(hv), sv, (char*)HeKEY_sv(entry), HEf_SVKEY);
2664 	    else
2665 		mg_copy(MUTABLE_SV(hv), sv, HeKEY(entry), HeKLEN(entry));
2666 	    return sv;
2667 	}
2668     }
2669     return HeVAL(entry);
2670 }
2671 
2672 /*
2673 =for apidoc hv_iternextsv
2674 
2675 Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
2676 operation.
2677 
2678 =cut
2679 */
2680 
2681 SV *
2682 Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
2683 {
2684     HE * const he = hv_iternext_flags(hv, 0);
2685 
2686     PERL_ARGS_ASSERT_HV_ITERNEXTSV;
2687 
2688     if (!he)
2689 	return NULL;
2690     *key = hv_iterkey(he, retlen);
2691     return hv_iterval(hv, he);
2692 }
2693 
2694 /*
2695 
2696 Now a macro in hv.h
2697 
2698 =for apidoc hv_magic
2699 
2700 Adds magic to a hash.  See C<sv_magic>.
2701 
2702 =cut
2703 */
2704 
2705 /* possibly free a shared string if no one has access to it
2706  * len and hash must both be valid for str.
2707  */
2708 void
2709 Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
2710 {
2711     unshare_hek_or_pvn (NULL, str, len, hash);
2712 }
2713 
2714 
2715 void
2716 Perl_unshare_hek(pTHX_ HEK *hek)
2717 {
2718     assert(hek);
2719     unshare_hek_or_pvn(hek, NULL, 0, 0);
2720 }
2721 
2722 /* possibly free a shared string if no one has access to it
2723    hek if non-NULL takes priority over the other 3, else str, len and hash
2724    are used.  If so, len and hash must both be valid for str.
2725  */
2726 STATIC void
2727 S_unshare_hek_or_pvn(pTHX_ const HEK *hek, const char *str, I32 len, U32 hash)
2728 {
2729     dVAR;
2730     XPVHV* xhv;
2731     HE *entry;
2732     HE **oentry;
2733     bool is_utf8 = FALSE;
2734     int k_flags = 0;
2735     const char * const save = str;
2736     struct shared_he *he = NULL;
2737 
2738     if (hek) {
2739 	/* Find the shared he which is just before us in memory.  */
2740 	he = (struct shared_he *)(((char *)hek)
2741 				  - STRUCT_OFFSET(struct shared_he,
2742 						  shared_he_hek));
2743 
2744 	/* Assert that the caller passed us a genuine (or at least consistent)
2745 	   shared hek  */
2746 	assert (he->shared_he_he.hent_hek == hek);
2747 
2748 	if (he->shared_he_he.he_valu.hent_refcount - 1) {
2749 	    --he->shared_he_he.he_valu.hent_refcount;
2750 	    return;
2751 	}
2752 
2753         hash = HEK_HASH(hek);
2754     } else if (len < 0) {
2755         STRLEN tmplen = -len;
2756         is_utf8 = TRUE;
2757         /* See the note in hv_fetch(). --jhi */
2758         str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
2759         len = tmplen;
2760         if (is_utf8)
2761             k_flags = HVhek_UTF8;
2762         if (str != save)
2763             k_flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
2764     }
2765 
2766     /* what follows was the moral equivalent of:
2767     if ((Svp = hv_fetch(PL_strtab, tmpsv, FALSE, hash))) {
2768 	if (--*Svp == NULL)
2769 	    hv_delete(PL_strtab, str, len, G_DISCARD, hash);
2770     } */
2771     xhv = (XPVHV*)SvANY(PL_strtab);
2772     /* assert(xhv_array != 0) */
2773     oentry = &(HvARRAY(PL_strtab))[hash & (I32) HvMAX(PL_strtab)];
2774     if (he) {
2775 	const HE *const he_he = &(he->shared_he_he);
2776         for (entry = *oentry; entry; oentry = &HeNEXT(entry), entry = *oentry) {
2777             if (entry == he_he)
2778                 break;
2779         }
2780     } else {
2781         const int flags_masked = k_flags & HVhek_MASK;
2782         for (entry = *oentry; entry; oentry = &HeNEXT(entry), entry = *oentry) {
2783             if (HeHASH(entry) != hash)		/* strings can't be equal */
2784                 continue;
2785             if (HeKLEN(entry) != len)
2786                 continue;
2787             if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len))	/* is this it? */
2788                 continue;
2789             if (HeKFLAGS(entry) != flags_masked)
2790                 continue;
2791             break;
2792         }
2793     }
2794 
2795     if (entry) {
2796         if (--entry->he_valu.hent_refcount == 0) {
2797             *oentry = HeNEXT(entry);
2798             Safefree(entry);
2799             xhv->xhv_keys--; /* HvTOTALKEYS(hv)-- */
2800         }
2801     }
2802 
2803     if (!entry)
2804 	Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
2805 			 "Attempt to free nonexistent shared string '%s'%s"
2806 			 pTHX__FORMAT,
2807 			 hek ? HEK_KEY(hek) : str,
2808 			 ((k_flags & HVhek_UTF8) ? " (utf8)" : "") pTHX__VALUE);
2809     if (k_flags & HVhek_FREEKEY)
2810 	Safefree(str);
2811 }
2812 
2813 /* get a (constant) string ptr from the global string table
2814  * string will get added if it is not already there.
2815  * len and hash must both be valid for str.
2816  */
2817 HEK *
2818 Perl_share_hek(pTHX_ const char *str, I32 len, U32 hash)
2819 {
2820     bool is_utf8 = FALSE;
2821     int flags = 0;
2822     const char * const save = str;
2823 
2824     PERL_ARGS_ASSERT_SHARE_HEK;
2825 
2826     if (len < 0) {
2827       STRLEN tmplen = -len;
2828       is_utf8 = TRUE;
2829       /* See the note in hv_fetch(). --jhi */
2830       str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
2831       len = tmplen;
2832       /* If we were able to downgrade here, then than means that we were passed
2833          in a key which only had chars 0-255, but was utf8 encoded.  */
2834       if (is_utf8)
2835           flags = HVhek_UTF8;
2836       /* If we found we were able to downgrade the string to bytes, then
2837          we should flag that it needs upgrading on keys or each.  Also flag
2838          that we need share_hek_flags to free the string.  */
2839       if (str != save) {
2840           dVAR;
2841           PERL_HASH(hash, str, len);
2842           flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
2843       }
2844     }
2845 
2846     return share_hek_flags (str, len, hash, flags);
2847 }
2848 
2849 STATIC HEK *
2850 S_share_hek_flags(pTHX_ const char *str, I32 len, U32 hash, int flags)
2851 {
2852     dVAR;
2853     HE *entry;
2854     const int flags_masked = flags & HVhek_MASK;
2855     const U32 hindex = hash & (I32) HvMAX(PL_strtab);
2856     XPVHV * const xhv = (XPVHV*)SvANY(PL_strtab);
2857 
2858     PERL_ARGS_ASSERT_SHARE_HEK_FLAGS;
2859 
2860     /* what follows is the moral equivalent of:
2861 
2862     if (!(Svp = hv_fetch(PL_strtab, str, len, FALSE)))
2863 	hv_store(PL_strtab, str, len, NULL, hash);
2864 
2865 	Can't rehash the shared string table, so not sure if it's worth
2866 	counting the number of entries in the linked list
2867     */
2868 
2869     /* assert(xhv_array != 0) */
2870     entry = (HvARRAY(PL_strtab))[hindex];
2871     for (;entry; entry = HeNEXT(entry)) {
2872 	if (HeHASH(entry) != hash)		/* strings can't be equal */
2873 	    continue;
2874 	if (HeKLEN(entry) != len)
2875 	    continue;
2876 	if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len))	/* is this it? */
2877 	    continue;
2878 	if (HeKFLAGS(entry) != flags_masked)
2879 	    continue;
2880 	break;
2881     }
2882 
2883     if (!entry) {
2884 	/* What used to be head of the list.
2885 	   If this is NULL, then we're the first entry for this slot, which
2886 	   means we need to increate fill.  */
2887 	struct shared_he *new_entry;
2888 	HEK *hek;
2889 	char *k;
2890 	HE **const head = &HvARRAY(PL_strtab)[hindex];
2891 	HE *const next = *head;
2892 
2893 	/* We don't actually store a HE from the arena and a regular HEK.
2894 	   Instead we allocate one chunk of memory big enough for both,
2895 	   and put the HEK straight after the HE. This way we can find the
2896 	   HE directly from the HEK.
2897 	*/
2898 
2899 	Newx(k, STRUCT_OFFSET(struct shared_he,
2900 				shared_he_hek.hek_key[0]) + len + 2, char);
2901 	new_entry = (struct shared_he *)k;
2902 	entry = &(new_entry->shared_he_he);
2903 	hek = &(new_entry->shared_he_hek);
2904 
2905 	Copy(str, HEK_KEY(hek), len, char);
2906 	HEK_KEY(hek)[len] = 0;
2907 	HEK_LEN(hek) = len;
2908 	HEK_HASH(hek) = hash;
2909 	HEK_FLAGS(hek) = (unsigned char)flags_masked;
2910 
2911 	/* Still "point" to the HEK, so that other code need not know what
2912 	   we're up to.  */
2913 	HeKEY_hek(entry) = hek;
2914 	entry->he_valu.hent_refcount = 0;
2915 	HeNEXT(entry) = next;
2916 	*head = entry;
2917 
2918 	xhv->xhv_keys++; /* HvTOTALKEYS(hv)++ */
2919 	if (!next) {			/* initial entry? */
2920 	} else if ( DO_HSPLIT(xhv) ) {
2921             const STRLEN oldsize = xhv->xhv_max + 1;
2922             hsplit(PL_strtab, oldsize, oldsize * 2);
2923 	}
2924     }
2925 
2926     ++entry->he_valu.hent_refcount;
2927 
2928     if (flags & HVhek_FREEKEY)
2929 	Safefree(str);
2930 
2931     return HeKEY_hek(entry);
2932 }
2933 
2934 SSize_t *
2935 Perl_hv_placeholders_p(pTHX_ HV *hv)
2936 {
2937     dVAR;
2938     MAGIC *mg = mg_find((const SV *)hv, PERL_MAGIC_rhash);
2939 
2940     PERL_ARGS_ASSERT_HV_PLACEHOLDERS_P;
2941 
2942     if (!mg) {
2943 	mg = sv_magicext(MUTABLE_SV(hv), 0, PERL_MAGIC_rhash, 0, 0, 0);
2944 
2945 	if (!mg) {
2946 	    Perl_die(aTHX_ "panic: hv_placeholders_p");
2947 	}
2948     }
2949     return &(mg->mg_len);
2950 }
2951 
2952 
2953 I32
2954 Perl_hv_placeholders_get(pTHX_ const HV *hv)
2955 {
2956     dVAR;
2957     MAGIC * const mg = mg_find((const SV *)hv, PERL_MAGIC_rhash);
2958 
2959     PERL_ARGS_ASSERT_HV_PLACEHOLDERS_GET;
2960 
2961     return mg ? mg->mg_len : 0;
2962 }
2963 
2964 void
2965 Perl_hv_placeholders_set(pTHX_ HV *hv, I32 ph)
2966 {
2967     dVAR;
2968     MAGIC * const mg = mg_find((const SV *)hv, PERL_MAGIC_rhash);
2969 
2970     PERL_ARGS_ASSERT_HV_PLACEHOLDERS_SET;
2971 
2972     if (mg) {
2973 	mg->mg_len = ph;
2974     } else if (ph) {
2975 	if (!sv_magicext(MUTABLE_SV(hv), 0, PERL_MAGIC_rhash, 0, 0, ph))
2976 	    Perl_die(aTHX_ "panic: hv_placeholders_set");
2977     }
2978     /* else we don't need to add magic to record 0 placeholders.  */
2979 }
2980 
2981 STATIC SV *
2982 S_refcounted_he_value(pTHX_ const struct refcounted_he *he)
2983 {
2984     dVAR;
2985     SV *value;
2986 
2987     PERL_ARGS_ASSERT_REFCOUNTED_HE_VALUE;
2988 
2989     switch(he->refcounted_he_data[0] & HVrhek_typemask) {
2990     case HVrhek_undef:
2991 	value = newSV(0);
2992 	break;
2993     case HVrhek_delete:
2994 	value = &PL_sv_placeholder;
2995 	break;
2996     case HVrhek_IV:
2997 	value = newSViv(he->refcounted_he_val.refcounted_he_u_iv);
2998 	break;
2999     case HVrhek_UV:
3000 	value = newSVuv(he->refcounted_he_val.refcounted_he_u_uv);
3001 	break;
3002     case HVrhek_PV:
3003     case HVrhek_PV_UTF8:
3004 	/* Create a string SV that directly points to the bytes in our
3005 	   structure.  */
3006 	value = newSV_type(SVt_PV);
3007 	SvPV_set(value, (char *) he->refcounted_he_data + 1);
3008 	SvCUR_set(value, he->refcounted_he_val.refcounted_he_u_len);
3009 	/* This stops anything trying to free it  */
3010 	SvLEN_set(value, 0);
3011 	SvPOK_on(value);
3012 	SvREADONLY_on(value);
3013 	if ((he->refcounted_he_data[0] & HVrhek_typemask) == HVrhek_PV_UTF8)
3014 	    SvUTF8_on(value);
3015 	break;
3016     default:
3017 	Perl_croak(aTHX_ "panic: refcounted_he_value bad flags %"UVxf,
3018 		   (UV)he->refcounted_he_data[0]);
3019     }
3020     return value;
3021 }
3022 
3023 /*
3024 =for apidoc m|HV *|refcounted_he_chain_2hv|const struct refcounted_he *c|U32 flags
3025 
3026 Generates and returns a C<HV *> representing the content of a
3027 C<refcounted_he> chain.
3028 I<flags> is currently unused and must be zero.
3029 
3030 =cut
3031 */
3032 HV *
3033 Perl_refcounted_he_chain_2hv(pTHX_ const struct refcounted_he *chain, U32 flags)
3034 {
3035     dVAR;
3036     HV *hv;
3037     U32 placeholders, max;
3038 
3039     if (flags)
3040 	Perl_croak(aTHX_ "panic: refcounted_he_chain_2hv bad flags %"UVxf,
3041 	    (UV)flags);
3042 
3043     /* We could chase the chain once to get an idea of the number of keys,
3044        and call ksplit.  But for now we'll make a potentially inefficient
3045        hash with only 8 entries in its array.  */
3046     hv = newHV();
3047     max = HvMAX(hv);
3048     if (!HvARRAY(hv)) {
3049 	char *array;
3050 	Newxz(array, PERL_HV_ARRAY_ALLOC_BYTES(max + 1), char);
3051 	HvARRAY(hv) = (HE**)array;
3052     }
3053 
3054     placeholders = 0;
3055     while (chain) {
3056 #ifdef USE_ITHREADS
3057 	U32 hash = chain->refcounted_he_hash;
3058 #else
3059 	U32 hash = HEK_HASH(chain->refcounted_he_hek);
3060 #endif
3061 	HE **oentry = &((HvARRAY(hv))[hash & max]);
3062 	HE *entry = *oentry;
3063 	SV *value;
3064 
3065 	for (; entry; entry = HeNEXT(entry)) {
3066 	    if (HeHASH(entry) == hash) {
3067 		/* We might have a duplicate key here.  If so, entry is older
3068 		   than the key we've already put in the hash, so if they are
3069 		   the same, skip adding entry.  */
3070 #ifdef USE_ITHREADS
3071 		const STRLEN klen = HeKLEN(entry);
3072 		const char *const key = HeKEY(entry);
3073 		if (klen == chain->refcounted_he_keylen
3074 		    && (!!HeKUTF8(entry)
3075 			== !!(chain->refcounted_he_data[0] & HVhek_UTF8))
3076 		    && memEQ(key, REF_HE_KEY(chain), klen))
3077 		    goto next_please;
3078 #else
3079 		if (HeKEY_hek(entry) == chain->refcounted_he_hek)
3080 		    goto next_please;
3081 		if (HeKLEN(entry) == HEK_LEN(chain->refcounted_he_hek)
3082 		    && HeKUTF8(entry) == HEK_UTF8(chain->refcounted_he_hek)
3083 		    && memEQ(HeKEY(entry), HEK_KEY(chain->refcounted_he_hek),
3084 			     HeKLEN(entry)))
3085 		    goto next_please;
3086 #endif
3087 	    }
3088 	}
3089 	assert (!entry);
3090 	entry = new_HE();
3091 
3092 #ifdef USE_ITHREADS
3093 	HeKEY_hek(entry)
3094 	    = share_hek_flags(REF_HE_KEY(chain),
3095 			      chain->refcounted_he_keylen,
3096 			      chain->refcounted_he_hash,
3097 			      (chain->refcounted_he_data[0]
3098 			       & (HVhek_UTF8|HVhek_WASUTF8)));
3099 #else
3100 	HeKEY_hek(entry) = share_hek_hek(chain->refcounted_he_hek);
3101 #endif
3102 	value = refcounted_he_value(chain);
3103 	if (value == &PL_sv_placeholder)
3104 	    placeholders++;
3105 	HeVAL(entry) = value;
3106 
3107 	/* Link it into the chain.  */
3108 	HeNEXT(entry) = *oentry;
3109 	*oentry = entry;
3110 
3111 	HvTOTALKEYS(hv)++;
3112 
3113     next_please:
3114 	chain = chain->refcounted_he_next;
3115     }
3116 
3117     if (placeholders) {
3118 	clear_placeholders(hv, placeholders);
3119 	HvTOTALKEYS(hv) -= placeholders;
3120     }
3121 
3122     /* We could check in the loop to see if we encounter any keys with key
3123        flags, but it's probably not worth it, as this per-hash flag is only
3124        really meant as an optimisation for things like Storable.  */
3125     HvHASKFLAGS_on(hv);
3126     DEBUG_A(Perl_hv_assert(aTHX_ hv));
3127 
3128     return hv;
3129 }
3130 
3131 /*
3132 =for apidoc m|SV *|refcounted_he_fetch_pvn|const struct refcounted_he *chain|const char *keypv|STRLEN keylen|U32 hash|U32 flags
3133 
3134 Search along a C<refcounted_he> chain for an entry with the key specified
3135 by I<keypv> and I<keylen>.  If I<flags> has the C<REFCOUNTED_HE_KEY_UTF8>
3136 bit set, the key octets are interpreted as UTF-8, otherwise they
3137 are interpreted as Latin-1.  I<hash> is a precomputed hash of the key
3138 string, or zero if it has not been precomputed.  Returns a mortal scalar
3139 representing the value associated with the key, or C<&PL_sv_placeholder>
3140 if there is no value associated with the key.
3141 
3142 =cut
3143 */
3144 
3145 SV *
3146 Perl_refcounted_he_fetch_pvn(pTHX_ const struct refcounted_he *chain,
3147 			 const char *keypv, STRLEN keylen, U32 hash, U32 flags)
3148 {
3149     dVAR;
3150     U8 utf8_flag;
3151     PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_PVN;
3152 
3153     if (flags & ~(REFCOUNTED_HE_KEY_UTF8|REFCOUNTED_HE_EXISTS))
3154 	Perl_croak(aTHX_ "panic: refcounted_he_fetch_pvn bad flags %"UVxf,
3155 	    (UV)flags);
3156     if (!chain)
3157 	goto ret;
3158     if (flags & REFCOUNTED_HE_KEY_UTF8) {
3159 	/* For searching purposes, canonicalise to Latin-1 where possible. */
3160 	const char *keyend = keypv + keylen, *p;
3161 	STRLEN nonascii_count = 0;
3162 	for (p = keypv; p != keyend; p++) {
3163 	    if (! UTF8_IS_INVARIANT(*p)) {
3164 		if (! UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(p, keyend)) {
3165 		    goto canonicalised_key;
3166                 }
3167 		nonascii_count++;
3168                 p++;
3169 	    }
3170 	}
3171 	if (nonascii_count) {
3172 	    char *q;
3173 	    const char *p = keypv, *keyend = keypv + keylen;
3174 	    keylen -= nonascii_count;
3175 	    Newx(q, keylen, char);
3176 	    SAVEFREEPV(q);
3177 	    keypv = q;
3178 	    for (; p != keyend; p++, q++) {
3179 		U8 c = (U8)*p;
3180                 if (UTF8_IS_INVARIANT(c)) {
3181                     *q = (char) c;
3182                 }
3183                 else {
3184                     p++;
3185                     *q = (char) TWO_BYTE_UTF8_TO_NATIVE(c, *p);
3186                 }
3187 	    }
3188 	}
3189 	flags &= ~REFCOUNTED_HE_KEY_UTF8;
3190 	canonicalised_key: ;
3191     }
3192     utf8_flag = (flags & REFCOUNTED_HE_KEY_UTF8) ? HVhek_UTF8 : 0;
3193     if (!hash)
3194 	PERL_HASH(hash, keypv, keylen);
3195 
3196     for (; chain; chain = chain->refcounted_he_next) {
3197 	if (
3198 #ifdef USE_ITHREADS
3199 	    hash == chain->refcounted_he_hash &&
3200 	    keylen == chain->refcounted_he_keylen &&
3201 	    memEQ(REF_HE_KEY(chain), keypv, keylen) &&
3202 	    utf8_flag == (chain->refcounted_he_data[0] & HVhek_UTF8)
3203 #else
3204 	    hash == HEK_HASH(chain->refcounted_he_hek) &&
3205 	    keylen == (STRLEN)HEK_LEN(chain->refcounted_he_hek) &&
3206 	    memEQ(HEK_KEY(chain->refcounted_he_hek), keypv, keylen) &&
3207 	    utf8_flag == (HEK_FLAGS(chain->refcounted_he_hek) & HVhek_UTF8)
3208 #endif
3209 	) {
3210 	    if (flags & REFCOUNTED_HE_EXISTS)
3211 		return (chain->refcounted_he_data[0] & HVrhek_typemask)
3212 		    == HVrhek_delete
3213 		    ? NULL : &PL_sv_yes;
3214 	    return sv_2mortal(refcounted_he_value(chain));
3215 	}
3216     }
3217   ret:
3218     return flags & REFCOUNTED_HE_EXISTS ? NULL : &PL_sv_placeholder;
3219 }
3220 
3221 /*
3222 =for apidoc m|SV *|refcounted_he_fetch_pv|const struct refcounted_he *chain|const char *key|U32 hash|U32 flags
3223 
3224 Like L</refcounted_he_fetch_pvn>, but takes a nul-terminated string
3225 instead of a string/length pair.
3226 
3227 =cut
3228 */
3229 
3230 SV *
3231 Perl_refcounted_he_fetch_pv(pTHX_ const struct refcounted_he *chain,
3232 			 const char *key, U32 hash, U32 flags)
3233 {
3234     PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_PV;
3235     return refcounted_he_fetch_pvn(chain, key, strlen(key), hash, flags);
3236 }
3237 
3238 /*
3239 =for apidoc m|SV *|refcounted_he_fetch_sv|const struct refcounted_he *chain|SV *key|U32 hash|U32 flags
3240 
3241 Like L</refcounted_he_fetch_pvn>, but takes a Perl scalar instead of a
3242 string/length pair.
3243 
3244 =cut
3245 */
3246 
3247 SV *
3248 Perl_refcounted_he_fetch_sv(pTHX_ const struct refcounted_he *chain,
3249 			 SV *key, U32 hash, U32 flags)
3250 {
3251     const char *keypv;
3252     STRLEN keylen;
3253     PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_SV;
3254     if (flags & REFCOUNTED_HE_KEY_UTF8)
3255 	Perl_croak(aTHX_ "panic: refcounted_he_fetch_sv bad flags %"UVxf,
3256 	    (UV)flags);
3257     keypv = SvPV_const(key, keylen);
3258     if (SvUTF8(key))
3259 	flags |= REFCOUNTED_HE_KEY_UTF8;
3260     if (!hash && SvIsCOW_shared_hash(key))
3261 	hash = SvSHARED_HASH(key);
3262     return refcounted_he_fetch_pvn(chain, keypv, keylen, hash, flags);
3263 }
3264 
3265 /*
3266 =for apidoc m|struct refcounted_he *|refcounted_he_new_pvn|struct refcounted_he *parent|const char *keypv|STRLEN keylen|U32 hash|SV *value|U32 flags
3267 
3268 Creates a new C<refcounted_he>.  This consists of a single key/value
3269 pair and a reference to an existing C<refcounted_he> chain (which may
3270 be empty), and thus forms a longer chain.  When using the longer chain,
3271 the new key/value pair takes precedence over any entry for the same key
3272 further along the chain.
3273 
3274 The new key is specified by I<keypv> and I<keylen>.  If I<flags> has
3275 the C<REFCOUNTED_HE_KEY_UTF8> bit set, the key octets are interpreted
3276 as UTF-8, otherwise they are interpreted as Latin-1.  I<hash> is
3277 a precomputed hash of the key string, or zero if it has not been
3278 precomputed.
3279 
3280 I<value> is the scalar value to store for this key.  I<value> is copied
3281 by this function, which thus does not take ownership of any reference
3282 to it, and later changes to the scalar will not be reflected in the
3283 value visible in the C<refcounted_he>.  Complex types of scalar will not
3284 be stored with referential integrity, but will be coerced to strings.
3285 I<value> may be either null or C<&PL_sv_placeholder> to indicate that no
3286 value is to be associated with the key; this, as with any non-null value,
3287 takes precedence over the existence of a value for the key further along
3288 the chain.
3289 
3290 I<parent> points to the rest of the C<refcounted_he> chain to be
3291 attached to the new C<refcounted_he>.  This function takes ownership
3292 of one reference to I<parent>, and returns one reference to the new
3293 C<refcounted_he>.
3294 
3295 =cut
3296 */
3297 
3298 struct refcounted_he *
3299 Perl_refcounted_he_new_pvn(pTHX_ struct refcounted_he *parent,
3300 	const char *keypv, STRLEN keylen, U32 hash, SV *value, U32 flags)
3301 {
3302     dVAR;
3303     STRLEN value_len = 0;
3304     const char *value_p = NULL;
3305     bool is_pv;
3306     char value_type;
3307     char hekflags;
3308     STRLEN key_offset = 1;
3309     struct refcounted_he *he;
3310     PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_PVN;
3311 
3312     if (!value || value == &PL_sv_placeholder) {
3313 	value_type = HVrhek_delete;
3314     } else if (SvPOK(value)) {
3315 	value_type = HVrhek_PV;
3316     } else if (SvIOK(value)) {
3317 	value_type = SvUOK((const SV *)value) ? HVrhek_UV : HVrhek_IV;
3318     } else if (!SvOK(value)) {
3319 	value_type = HVrhek_undef;
3320     } else {
3321 	value_type = HVrhek_PV;
3322     }
3323     is_pv = value_type == HVrhek_PV;
3324     if (is_pv) {
3325 	/* Do it this way so that the SvUTF8() test is after the SvPV, in case
3326 	   the value is overloaded, and doesn't yet have the UTF-8flag set.  */
3327 	value_p = SvPV_const(value, value_len);
3328 	if (SvUTF8(value))
3329 	    value_type = HVrhek_PV_UTF8;
3330 	key_offset = value_len + 2;
3331     }
3332     hekflags = value_type;
3333 
3334     if (flags & REFCOUNTED_HE_KEY_UTF8) {
3335 	/* Canonicalise to Latin-1 where possible. */
3336 	const char *keyend = keypv + keylen, *p;
3337 	STRLEN nonascii_count = 0;
3338 	for (p = keypv; p != keyend; p++) {
3339 	    if (! UTF8_IS_INVARIANT(*p)) {
3340 		if (! UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(p, keyend)) {
3341 		    goto canonicalised_key;
3342                 }
3343 		nonascii_count++;
3344                 p++;
3345 	    }
3346 	}
3347 	if (nonascii_count) {
3348 	    char *q;
3349 	    const char *p = keypv, *keyend = keypv + keylen;
3350 	    keylen -= nonascii_count;
3351 	    Newx(q, keylen, char);
3352 	    SAVEFREEPV(q);
3353 	    keypv = q;
3354 	    for (; p != keyend; p++, q++) {
3355 		U8 c = (U8)*p;
3356                 if (UTF8_IS_INVARIANT(c)) {
3357                     *q = (char) c;
3358                 }
3359                 else {
3360                     p++;
3361                     *q = (char) TWO_BYTE_UTF8_TO_NATIVE(c, *p);
3362                 }
3363 	    }
3364 	}
3365 	flags &= ~REFCOUNTED_HE_KEY_UTF8;
3366 	canonicalised_key: ;
3367     }
3368     if (flags & REFCOUNTED_HE_KEY_UTF8)
3369 	hekflags |= HVhek_UTF8;
3370     if (!hash)
3371 	PERL_HASH(hash, keypv, keylen);
3372 
3373 #ifdef USE_ITHREADS
3374     he = (struct refcounted_he*)
3375 	PerlMemShared_malloc(sizeof(struct refcounted_he) - 1
3376 			     + keylen
3377 			     + key_offset);
3378 #else
3379     he = (struct refcounted_he*)
3380 	PerlMemShared_malloc(sizeof(struct refcounted_he) - 1
3381 			     + key_offset);
3382 #endif
3383 
3384     he->refcounted_he_next = parent;
3385 
3386     if (is_pv) {
3387 	Copy(value_p, he->refcounted_he_data + 1, value_len + 1, char);
3388 	he->refcounted_he_val.refcounted_he_u_len = value_len;
3389     } else if (value_type == HVrhek_IV) {
3390 	he->refcounted_he_val.refcounted_he_u_iv = SvIVX(value);
3391     } else if (value_type == HVrhek_UV) {
3392 	he->refcounted_he_val.refcounted_he_u_uv = SvUVX(value);
3393     }
3394 
3395 #ifdef USE_ITHREADS
3396     he->refcounted_he_hash = hash;
3397     he->refcounted_he_keylen = keylen;
3398     Copy(keypv, he->refcounted_he_data + key_offset, keylen, char);
3399 #else
3400     he->refcounted_he_hek = share_hek_flags(keypv, keylen, hash, hekflags);
3401 #endif
3402 
3403     he->refcounted_he_data[0] = hekflags;
3404     he->refcounted_he_refcnt = 1;
3405 
3406     return he;
3407 }
3408 
3409 /*
3410 =for apidoc m|struct refcounted_he *|refcounted_he_new_pv|struct refcounted_he *parent|const char *key|U32 hash|SV *value|U32 flags
3411 
3412 Like L</refcounted_he_new_pvn>, but takes a nul-terminated string instead
3413 of a string/length pair.
3414 
3415 =cut
3416 */
3417 
3418 struct refcounted_he *
3419 Perl_refcounted_he_new_pv(pTHX_ struct refcounted_he *parent,
3420 	const char *key, U32 hash, SV *value, U32 flags)
3421 {
3422     PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_PV;
3423     return refcounted_he_new_pvn(parent, key, strlen(key), hash, value, flags);
3424 }
3425 
3426 /*
3427 =for apidoc m|struct refcounted_he *|refcounted_he_new_sv|struct refcounted_he *parent|SV *key|U32 hash|SV *value|U32 flags
3428 
3429 Like L</refcounted_he_new_pvn>, but takes a Perl scalar instead of a
3430 string/length pair.
3431 
3432 =cut
3433 */
3434 
3435 struct refcounted_he *
3436 Perl_refcounted_he_new_sv(pTHX_ struct refcounted_he *parent,
3437 	SV *key, U32 hash, SV *value, U32 flags)
3438 {
3439     const char *keypv;
3440     STRLEN keylen;
3441     PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_SV;
3442     if (flags & REFCOUNTED_HE_KEY_UTF8)
3443 	Perl_croak(aTHX_ "panic: refcounted_he_new_sv bad flags %"UVxf,
3444 	    (UV)flags);
3445     keypv = SvPV_const(key, keylen);
3446     if (SvUTF8(key))
3447 	flags |= REFCOUNTED_HE_KEY_UTF8;
3448     if (!hash && SvIsCOW_shared_hash(key))
3449 	hash = SvSHARED_HASH(key);
3450     return refcounted_he_new_pvn(parent, keypv, keylen, hash, value, flags);
3451 }
3452 
3453 /*
3454 =for apidoc m|void|refcounted_he_free|struct refcounted_he *he
3455 
3456 Decrements the reference count of a C<refcounted_he> by one.  If the
3457 reference count reaches zero the structure's memory is freed, which
3458 (recursively) causes a reduction of its parent C<refcounted_he>'s
3459 reference count.  It is safe to pass a null pointer to this function:
3460 no action occurs in this case.
3461 
3462 =cut
3463 */
3464 
3465 void
3466 Perl_refcounted_he_free(pTHX_ struct refcounted_he *he) {
3467     dVAR;
3468     PERL_UNUSED_CONTEXT;
3469 
3470     while (he) {
3471 	struct refcounted_he *copy;
3472 	U32 new_count;
3473 
3474 	HINTS_REFCNT_LOCK;
3475 	new_count = --he->refcounted_he_refcnt;
3476 	HINTS_REFCNT_UNLOCK;
3477 
3478 	if (new_count) {
3479 	    return;
3480 	}
3481 
3482 #ifndef USE_ITHREADS
3483 	unshare_hek_or_pvn (he->refcounted_he_hek, 0, 0, 0);
3484 #endif
3485 	copy = he;
3486 	he = he->refcounted_he_next;
3487 	PerlMemShared_free(copy);
3488     }
3489 }
3490 
3491 /*
3492 =for apidoc m|struct refcounted_he *|refcounted_he_inc|struct refcounted_he *he
3493 
3494 Increment the reference count of a C<refcounted_he>.  The pointer to the
3495 C<refcounted_he> is also returned.  It is safe to pass a null pointer
3496 to this function: no action occurs and a null pointer is returned.
3497 
3498 =cut
3499 */
3500 
3501 struct refcounted_he *
3502 Perl_refcounted_he_inc(pTHX_ struct refcounted_he *he)
3503 {
3504     dVAR;
3505     if (he) {
3506 	HINTS_REFCNT_LOCK;
3507 	he->refcounted_he_refcnt++;
3508 	HINTS_REFCNT_UNLOCK;
3509     }
3510     return he;
3511 }
3512 
3513 /*
3514 =for apidoc cop_fetch_label
3515 
3516 Returns the label attached to a cop.
3517 The flags pointer may be set to C<SVf_UTF8> or 0.
3518 
3519 =cut
3520 */
3521 
3522 /* pp_entereval is aware that labels are stored with a key ':' at the top of
3523    the linked list.  */
3524 const char *
3525 Perl_cop_fetch_label(pTHX_ COP *const cop, STRLEN *len, U32 *flags) {
3526     struct refcounted_he *const chain = cop->cop_hints_hash;
3527 
3528     PERL_ARGS_ASSERT_COP_FETCH_LABEL;
3529 
3530     if (!chain)
3531 	return NULL;
3532 #ifdef USE_ITHREADS
3533     if (chain->refcounted_he_keylen != 1)
3534 	return NULL;
3535     if (*REF_HE_KEY(chain) != ':')
3536 	return NULL;
3537 #else
3538     if ((STRLEN)HEK_LEN(chain->refcounted_he_hek) != 1)
3539 	return NULL;
3540     if (*HEK_KEY(chain->refcounted_he_hek) != ':')
3541 	return NULL;
3542 #endif
3543     /* Stop anyone trying to really mess us up by adding their own value for
3544        ':' into %^H  */
3545     if ((chain->refcounted_he_data[0] & HVrhek_typemask) != HVrhek_PV
3546 	&& (chain->refcounted_he_data[0] & HVrhek_typemask) != HVrhek_PV_UTF8)
3547 	return NULL;
3548 
3549     if (len)
3550 	*len = chain->refcounted_he_val.refcounted_he_u_len;
3551     if (flags) {
3552 	*flags = ((chain->refcounted_he_data[0] & HVrhek_typemask)
3553 		  == HVrhek_PV_UTF8) ? SVf_UTF8 : 0;
3554     }
3555     return chain->refcounted_he_data + 1;
3556 }
3557 
3558 /*
3559 =for apidoc cop_store_label
3560 
3561 Save a label into a C<cop_hints_hash>.
3562 You need to set flags to C<SVf_UTF8>
3563 for a utf-8 label.
3564 
3565 =cut
3566 */
3567 
3568 void
3569 Perl_cop_store_label(pTHX_ COP *const cop, const char *label, STRLEN len,
3570 		     U32 flags)
3571 {
3572     SV *labelsv;
3573     PERL_ARGS_ASSERT_COP_STORE_LABEL;
3574 
3575     if (flags & ~(SVf_UTF8))
3576 	Perl_croak(aTHX_ "panic: cop_store_label illegal flag bits 0x%" UVxf,
3577 		   (UV)flags);
3578     labelsv = newSVpvn_flags(label, len, SVs_TEMP);
3579     if (flags & SVf_UTF8)
3580 	SvUTF8_on(labelsv);
3581     cop->cop_hints_hash
3582 	= refcounted_he_new_pvs(cop->cop_hints_hash, ":", labelsv, 0);
3583 }
3584 
3585 /*
3586 =for apidoc hv_assert
3587 
3588 Check that a hash is in an internally consistent state.
3589 
3590 =cut
3591 */
3592 
3593 #ifdef DEBUGGING
3594 
3595 void
3596 Perl_hv_assert(pTHX_ HV *hv)
3597 {
3598     dVAR;
3599     HE* entry;
3600     int withflags = 0;
3601     int placeholders = 0;
3602     int real = 0;
3603     int bad = 0;
3604     const I32 riter = HvRITER_get(hv);
3605     HE *eiter = HvEITER_get(hv);
3606 
3607     PERL_ARGS_ASSERT_HV_ASSERT;
3608 
3609     (void)hv_iterinit(hv);
3610 
3611     while ((entry = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))) {
3612 	/* sanity check the values */
3613 	if (HeVAL(entry) == &PL_sv_placeholder)
3614 	    placeholders++;
3615 	else
3616 	    real++;
3617 	/* sanity check the keys */
3618 	if (HeSVKEY(entry)) {
3619 	    NOOP;   /* Don't know what to check on SV keys.  */
3620 	} else if (HeKUTF8(entry)) {
3621 	    withflags++;
3622 	    if (HeKWASUTF8(entry)) {
3623 		PerlIO_printf(Perl_debug_log,
3624 			    "hash key has both WASUTF8 and UTF8: '%.*s'\n",
3625 			    (int) HeKLEN(entry),  HeKEY(entry));
3626 		bad = 1;
3627 	    }
3628 	} else if (HeKWASUTF8(entry))
3629 	    withflags++;
3630     }
3631     if (!SvTIED_mg((const SV *)hv, PERL_MAGIC_tied)) {
3632 	static const char bad_count[] = "Count %d %s(s), but hash reports %d\n";
3633 	const int nhashkeys = HvUSEDKEYS(hv);
3634 	const int nhashplaceholders = HvPLACEHOLDERS_get(hv);
3635 
3636 	if (nhashkeys != real) {
3637 	    PerlIO_printf(Perl_debug_log, bad_count, real, "keys", nhashkeys );
3638 	    bad = 1;
3639 	}
3640 	if (nhashplaceholders != placeholders) {
3641 	    PerlIO_printf(Perl_debug_log, bad_count, placeholders, "placeholder", nhashplaceholders );
3642 	    bad = 1;
3643 	}
3644     }
3645     if (withflags && ! HvHASKFLAGS(hv)) {
3646 	PerlIO_printf(Perl_debug_log,
3647 		    "Hash has HASKFLAGS off but I count %d key(s) with flags\n",
3648 		    withflags);
3649 	bad = 1;
3650     }
3651     if (bad) {
3652 	sv_dump(MUTABLE_SV(hv));
3653     }
3654     HvRITER_set(hv, riter);		/* Restore hash iterator state */
3655     HvEITER_set(hv, eiter);
3656 }
3657 
3658 #endif
3659 
3660 /*
3661  * Local variables:
3662  * c-indentation-style: bsd
3663  * c-basic-offset: 4
3664  * indent-tabs-mode: nil
3665  * End:
3666  *
3667  * ex: set ts=8 sts=4 sw=4 et:
3668  */
3669