xref: /openbsd-src/gnu/usr.bin/perl/hv.c (revision a28daedfc357b214be5c701aa8ba8adb29a7f1c2)
1 /*    hv.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 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 of all that I have seen."  --Bilbo
13  */
14 
15 /*
16 =head1 Hash Manipulation Functions
17 
18 A HV structure represents a Perl hash. It consists mainly of an array
19 of pointers, each of which points to a linked list of HE structures. The
20 array is indexed by the hash function of the key, so each linked list
21 represents all the hash entries with the same hash value. Each HE contains
22 a pointer to the actual value, plus a pointer to a HEK structure which
23 holds the key and hash value.
24 
25 =cut
26 
27 */
28 
29 #include "EXTERN.h"
30 #define PERL_IN_HV_C
31 #define PERL_HASH_INTERNAL_ACCESS
32 #include "perl.h"
33 
34 #define HV_MAX_LENGTH_BEFORE_SPLIT 14
35 
36 static const char S_strtab_error[]
37     = "Cannot modify shared string table in hv_%s";
38 
39 STATIC void
40 S_more_he(pTHX)
41 {
42     dVAR;
43     HE* he = (HE*) Perl_get_arena(aTHX_ PERL_ARENA_SIZE, HE_SVSLOT);
44     HE * const heend = &he[PERL_ARENA_SIZE / sizeof(HE) - 1];
45 
46     PL_body_roots[HE_SVSLOT] = he;
47     while (he < heend) {
48 	HeNEXT(he) = (HE*)(he + 1);
49 	he++;
50     }
51     HeNEXT(he) = 0;
52 }
53 
54 #ifdef PURIFY
55 
56 #define new_HE() (HE*)safemalloc(sizeof(HE))
57 #define del_HE(p) safefree((char*)p)
58 
59 #else
60 
61 STATIC HE*
62 S_new_he(pTHX)
63 {
64     dVAR;
65     HE* he;
66     void ** const root = &PL_body_roots[HE_SVSLOT];
67 
68     if (!*root)
69 	S_more_he(aTHX);
70     he = (HE*) *root;
71     assert(he);
72     *root = HeNEXT(he);
73     return he;
74 }
75 
76 #define new_HE() new_he()
77 #define del_HE(p) \
78     STMT_START { \
79 	HeNEXT(p) = (HE*)(PL_body_roots[HE_SVSLOT]);	\
80 	PL_body_roots[HE_SVSLOT] = p; \
81     } STMT_END
82 
83 
84 
85 #endif
86 
87 STATIC HEK *
88 S_save_hek_flags(const char *str, I32 len, U32 hash, int flags)
89 {
90     const int flags_masked = flags & HVhek_MASK;
91     char *k;
92     register HEK *hek;
93 
94     Newx(k, HEK_BASESIZE + len + 2, char);
95     hek = (HEK*)k;
96     Copy(str, HEK_KEY(hek), len, char);
97     HEK_KEY(hek)[len] = 0;
98     HEK_LEN(hek) = len;
99     HEK_HASH(hek) = hash;
100     HEK_FLAGS(hek) = (unsigned char)flags_masked | HVhek_UNSHARED;
101 
102     if (flags & HVhek_FREEKEY)
103 	Safefree(str);
104     return hek;
105 }
106 
107 /* free the pool of temporary HE/HEK pairs returned by hv_fetch_ent
108  * for tied hashes */
109 
110 void
111 Perl_free_tied_hv_pool(pTHX)
112 {
113     dVAR;
114     HE *he = PL_hv_fetch_ent_mh;
115     while (he) {
116 	HE * const ohe = he;
117 	Safefree(HeKEY_hek(he));
118 	he = HeNEXT(he);
119 	del_HE(ohe);
120     }
121     PL_hv_fetch_ent_mh = NULL;
122 }
123 
124 #if defined(USE_ITHREADS)
125 HEK *
126 Perl_hek_dup(pTHX_ HEK *source, CLONE_PARAMS* param)
127 {
128     HEK *shared = (HEK*)ptr_table_fetch(PL_ptr_table, source);
129 
130     PERL_UNUSED_ARG(param);
131 
132     if (shared) {
133 	/* We already shared this hash key.  */
134 	(void)share_hek_hek(shared);
135     }
136     else {
137 	shared
138 	    = share_hek_flags(HEK_KEY(source), HEK_LEN(source),
139 			      HEK_HASH(source), HEK_FLAGS(source));
140 	ptr_table_store(PL_ptr_table, source, shared);
141     }
142     return shared;
143 }
144 
145 HE *
146 Perl_he_dup(pTHX_ const HE *e, bool shared, CLONE_PARAMS* param)
147 {
148     HE *ret;
149 
150     if (!e)
151 	return NULL;
152     /* look for it in the table first */
153     ret = (HE*)ptr_table_fetch(PL_ptr_table, e);
154     if (ret)
155 	return ret;
156 
157     /* create anew and remember what it is */
158     ret = new_HE();
159     ptr_table_store(PL_ptr_table, e, ret);
160 
161     HeNEXT(ret) = he_dup(HeNEXT(e),shared, param);
162     if (HeKLEN(e) == HEf_SVKEY) {
163 	char *k;
164 	Newx(k, HEK_BASESIZE + sizeof(SV*), char);
165 	HeKEY_hek(ret) = (HEK*)k;
166 	HeKEY_sv(ret) = SvREFCNT_inc(sv_dup(HeKEY_sv(e), param));
167     }
168     else if (shared) {
169 	/* This is hek_dup inlined, which seems to be important for speed
170 	   reasons.  */
171 	HEK * const source = HeKEY_hek(e);
172 	HEK *shared = (HEK*)ptr_table_fetch(PL_ptr_table, source);
173 
174 	if (shared) {
175 	    /* We already shared this hash key.  */
176 	    (void)share_hek_hek(shared);
177 	}
178 	else {
179 	    shared
180 		= share_hek_flags(HEK_KEY(source), HEK_LEN(source),
181 				  HEK_HASH(source), HEK_FLAGS(source));
182 	    ptr_table_store(PL_ptr_table, source, shared);
183 	}
184 	HeKEY_hek(ret) = shared;
185     }
186     else
187 	HeKEY_hek(ret) = save_hek_flags(HeKEY(e), HeKLEN(e), HeHASH(e),
188                                         HeKFLAGS(e));
189     HeVAL(ret) = SvREFCNT_inc(sv_dup(HeVAL(e), param));
190     return ret;
191 }
192 #endif	/* USE_ITHREADS */
193 
194 static void
195 S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen,
196 		const char *msg)
197 {
198     SV * const sv = sv_newmortal();
199     if (!(flags & HVhek_FREEKEY)) {
200 	sv_setpvn(sv, key, klen);
201     }
202     else {
203 	/* Need to free saved eventually assign to mortal SV */
204 	/* XXX is this line an error ???:  SV *sv = sv_newmortal(); */
205 	sv_usepvn(sv, (char *) key, klen);
206     }
207     if (flags & HVhek_UTF8) {
208 	SvUTF8_on(sv);
209     }
210     Perl_croak(aTHX_ msg, SVfARG(sv));
211 }
212 
213 /* (klen == HEf_SVKEY) is special for MAGICAL hv entries, meaning key slot
214  * contains an SV* */
215 
216 /*
217 =for apidoc hv_store
218 
219 Stores an SV in a hash.  The hash key is specified as C<key> and C<klen> is
220 the length of the key.  The C<hash> parameter is the precomputed hash
221 value; if it is zero then Perl will compute it.  The return value will be
222 NULL if the operation failed or if the value did not need to be actually
223 stored within the hash (as in the case of tied hashes).  Otherwise it can
224 be dereferenced to get the original C<SV*>.  Note that the caller is
225 responsible for suitably incrementing the reference count of C<val> before
226 the call, and decrementing it if the function returned NULL.  Effectively
227 a successful hv_store takes ownership of one reference to C<val>.  This is
228 usually what you want; a newly created SV has a reference count of one, so
229 if all your code does is create SVs then store them in a hash, hv_store
230 will own the only reference to the new SV, and your code doesn't need to do
231 anything further to tidy up.  hv_store is not implemented as a call to
232 hv_store_ent, and does not create a temporary SV for the key, so if your
233 key data is not already in SV form then use hv_store in preference to
234 hv_store_ent.
235 
236 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
237 information on how to use this function on tied hashes.
238 
239 =for apidoc hv_store_ent
240 
241 Stores C<val> in a hash.  The hash key is specified as C<key>.  The C<hash>
242 parameter is the precomputed hash value; if it is zero then Perl will
243 compute it.  The return value is the new hash entry so created.  It will be
244 NULL if the operation failed or if the value did not need to be actually
245 stored within the hash (as in the case of tied hashes).  Otherwise the
246 contents of the return value can be accessed using the C<He?> macros
247 described here.  Note that the caller is responsible for suitably
248 incrementing the reference count of C<val> before the call, and
249 decrementing it if the function returned NULL.  Effectively a successful
250 hv_store_ent takes ownership of one reference to C<val>.  This is
251 usually what you want; a newly created SV has a reference count of one, so
252 if all your code does is create SVs then store them in a hash, hv_store
253 will own the only reference to the new SV, and your code doesn't need to do
254 anything further to tidy up.  Note that hv_store_ent only reads the C<key>;
255 unlike C<val> it does not take ownership of it, so maintaining the correct
256 reference count on C<key> is entirely the caller's responsibility.  hv_store
257 is not implemented as a call to hv_store_ent, and does not create a temporary
258 SV for the key, so if your key data is not already in SV form then use
259 hv_store in preference to hv_store_ent.
260 
261 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
262 information on how to use this function on tied hashes.
263 
264 =for apidoc hv_exists
265 
266 Returns a boolean indicating whether the specified hash key exists.  The
267 C<klen> is the length of the key.
268 
269 =for apidoc hv_fetch
270 
271 Returns the SV which corresponds to the specified key in the hash.  The
272 C<klen> is the length of the key.  If C<lval> is set then the fetch will be
273 part of a store.  Check that the return value is non-null before
274 dereferencing it to an C<SV*>.
275 
276 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
277 information on how to use this function on tied hashes.
278 
279 =for apidoc hv_exists_ent
280 
281 Returns a boolean indicating whether the specified hash key exists. C<hash>
282 can be a valid precomputed hash value, or 0 to ask for it to be
283 computed.
284 
285 =cut
286 */
287 
288 /* returns an HE * structure with the all fields set */
289 /* note that hent_val will be a mortal sv for MAGICAL hashes */
290 /*
291 =for apidoc hv_fetch_ent
292 
293 Returns the hash entry which corresponds to the specified key in the hash.
294 C<hash> must be a valid precomputed hash number for the given C<key>, or 0
295 if you want the function to compute it.  IF C<lval> is set then the fetch
296 will be part of a store.  Make sure the return value is non-null before
297 accessing it.  The return value when C<tb> is a tied hash is a pointer to a
298 static location, so be sure to make a copy of the structure if you need to
299 store it somewhere.
300 
301 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
302 information on how to use this function on tied hashes.
303 
304 =cut
305 */
306 
307 /* Common code for hv_delete()/hv_exists()/hv_fetch()/hv_store()  */
308 void *
309 Perl_hv_common_key_len(pTHX_ HV *hv, const char *key, I32 klen_i32,
310 		       const int action, SV *val, const U32 hash)
311 {
312     STRLEN klen;
313     int flags;
314 
315     if (klen_i32 < 0) {
316 	klen = -klen_i32;
317 	flags = HVhek_UTF8;
318     } else {
319 	klen = klen_i32;
320 	flags = 0;
321     }
322     return hv_common(hv, NULL, key, klen, flags, action, val, hash);
323 }
324 
325 void *
326 Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
327 	       int flags, int action, SV *val, register U32 hash)
328 {
329     dVAR;
330     XPVHV* xhv;
331     HE *entry;
332     HE **oentry;
333     SV *sv;
334     bool is_utf8;
335     int masked_flags;
336     const int return_svp = action & HV_FETCH_JUST_SV;
337 
338     if (!hv)
339 	return NULL;
340     if (SvTYPE(hv) == SVTYPEMASK)
341 	return NULL;
342 
343     assert(SvTYPE(hv) == SVt_PVHV);
344 
345     if (SvSMAGICAL(hv) && SvGMAGICAL(hv) && !(action & HV_DISABLE_UVAR_XKEY)) {
346 	MAGIC* mg;
347 	if ((mg = mg_find((SV*)hv, PERL_MAGIC_uvar))) {
348 	    struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
349 	    if (uf->uf_set == NULL) {
350 		SV* obj = mg->mg_obj;
351 
352 		if (!keysv) {
353 		    keysv = sv_2mortal(newSVpvn(key, klen));
354 		    if (flags & HVhek_UTF8)
355 			SvUTF8_on(keysv);
356 		}
357 
358 		mg->mg_obj = keysv;         /* pass key */
359 		uf->uf_index = action;      /* pass action */
360 		magic_getuvar((SV*)hv, mg);
361 		keysv = mg->mg_obj;         /* may have changed */
362 		mg->mg_obj = obj;
363 
364 		/* If the key may have changed, then we need to invalidate
365 		   any passed-in computed hash value.  */
366 		hash = 0;
367 	    }
368 	}
369     }
370     if (keysv) {
371 	if (flags & HVhek_FREEKEY)
372 	    Safefree(key);
373 	key = SvPV_const(keysv, klen);
374 	flags = 0;
375 	is_utf8 = (SvUTF8(keysv) != 0);
376     } else {
377 	is_utf8 = ((flags & HVhek_UTF8) ? TRUE : FALSE);
378     }
379 
380     if (action & HV_DELETE) {
381 	return (void *) hv_delete_common(hv, keysv, key, klen,
382 					 flags | (is_utf8 ? HVhek_UTF8 : 0),
383 					 action, hash);
384     }
385 
386     xhv = (XPVHV*)SvANY(hv);
387     if (SvMAGICAL(hv)) {
388 	if (SvRMAGICAL(hv) && !(action & (HV_FETCH_ISSTORE|HV_FETCH_ISEXISTS))) {
389 	    if ( mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv))
390 	    {
391 		/* FIXME should be able to skimp on the HE/HEK here when
392 		   HV_FETCH_JUST_SV is true.  */
393 		if (!keysv) {
394 		    keysv = newSVpvn(key, klen);
395 		    if (is_utf8) {
396 			SvUTF8_on(keysv);
397 		    }
398 		} else {
399 		    keysv = newSVsv(keysv);
400 		}
401                 sv = sv_newmortal();
402                 mg_copy((SV*)hv, sv, (char *)keysv, HEf_SVKEY);
403 
404 		/* grab a fake HE/HEK pair from the pool or make a new one */
405 		entry = PL_hv_fetch_ent_mh;
406 		if (entry)
407 		    PL_hv_fetch_ent_mh = HeNEXT(entry);
408 		else {
409 		    char *k;
410 		    entry = new_HE();
411 		    Newx(k, HEK_BASESIZE + sizeof(SV*), char);
412 		    HeKEY_hek(entry) = (HEK*)k;
413 		}
414 		HeNEXT(entry) = NULL;
415 		HeSVKEY_set(entry, keysv);
416 		HeVAL(entry) = sv;
417 		sv_upgrade(sv, SVt_PVLV);
418 		LvTYPE(sv) = 'T';
419 		 /* so we can free entry when freeing sv */
420 		LvTARG(sv) = (SV*)entry;
421 
422 		/* XXX remove at some point? */
423 		if (flags & HVhek_FREEKEY)
424 		    Safefree(key);
425 
426 		if (return_svp) {
427 		    return entry ? (void *) &HeVAL(entry) : NULL;
428 		}
429 		return (void *) entry;
430 	    }
431 #ifdef ENV_IS_CASELESS
432 	    else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
433 		U32 i;
434 		for (i = 0; i < klen; ++i)
435 		    if (isLOWER(key[i])) {
436 			/* Would be nice if we had a routine to do the
437 			   copy and upercase in a single pass through.  */
438 			const char * const nkey = strupr(savepvn(key,klen));
439 			/* Note that this fetch is for nkey (the uppercased
440 			   key) whereas the store is for key (the original)  */
441 			void *result = hv_common(hv, NULL, nkey, klen,
442 						 HVhek_FREEKEY, /* free nkey */
443 						 0 /* non-LVAL fetch */
444 						 | HV_DISABLE_UVAR_XKEY
445 						 | return_svp,
446 						 NULL /* no value */,
447 						 0 /* compute hash */);
448 			if (!result && (action & HV_FETCH_LVALUE)) {
449 			    /* This call will free key if necessary.
450 			       Do it this way to encourage compiler to tail
451 			       call optimise.  */
452 			    result = hv_common(hv, keysv, key, klen, flags,
453 					       HV_FETCH_ISSTORE
454 					       | HV_DISABLE_UVAR_XKEY
455 					       | return_svp,
456 					       newSV(0), hash);
457 			} else {
458 			    if (flags & HVhek_FREEKEY)
459 				Safefree(key);
460 			}
461 			return result;
462 		    }
463 	    }
464 #endif
465 	} /* ISFETCH */
466 	else if (SvRMAGICAL(hv) && (action & HV_FETCH_ISEXISTS)) {
467 	    if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
468 		/* I don't understand why hv_exists_ent has svret and sv,
469 		   whereas hv_exists only had one.  */
470 		SV * const svret = sv_newmortal();
471 		sv = sv_newmortal();
472 
473 		if (keysv || is_utf8) {
474 		    if (!keysv) {
475 			keysv = newSVpvn(key, klen);
476 			SvUTF8_on(keysv);
477 		    } else {
478 			keysv = newSVsv(keysv);
479 		    }
480 		    mg_copy((SV*)hv, sv, (char *)sv_2mortal(keysv), HEf_SVKEY);
481 		} else {
482 		    mg_copy((SV*)hv, sv, key, klen);
483 		}
484 		if (flags & HVhek_FREEKEY)
485 		    Safefree(key);
486 		magic_existspack(svret, mg_find(sv, PERL_MAGIC_tiedelem));
487 		/* This cast somewhat evil, but I'm merely using NULL/
488 		   not NULL to return the boolean exists.
489 		   And I know hv is not NULL.  */
490 		return SvTRUE(svret) ? (void *)hv : NULL;
491 		}
492 #ifdef ENV_IS_CASELESS
493 	    else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
494 		/* XXX This code isn't UTF8 clean.  */
495 		char * const keysave = (char * const)key;
496 		/* Will need to free this, so set FREEKEY flag.  */
497 		key = savepvn(key,klen);
498 		key = (const char*)strupr((char*)key);
499 		is_utf8 = FALSE;
500 		hash = 0;
501 		keysv = 0;
502 
503 		if (flags & HVhek_FREEKEY) {
504 		    Safefree(keysave);
505 		}
506 		flags |= HVhek_FREEKEY;
507 	    }
508 #endif
509 	} /* ISEXISTS */
510 	else if (action & HV_FETCH_ISSTORE) {
511 	    bool needs_copy;
512 	    bool needs_store;
513 	    hv_magic_check (hv, &needs_copy, &needs_store);
514 	    if (needs_copy) {
515 		const bool save_taint = PL_tainted;
516 		if (keysv || is_utf8) {
517 		    if (!keysv) {
518 			keysv = newSVpvn(key, klen);
519 			SvUTF8_on(keysv);
520 		    }
521 		    if (PL_tainting)
522 			PL_tainted = SvTAINTED(keysv);
523 		    keysv = sv_2mortal(newSVsv(keysv));
524 		    mg_copy((SV*)hv, val, (char*)keysv, HEf_SVKEY);
525 		} else {
526 		    mg_copy((SV*)hv, val, key, klen);
527 		}
528 
529 		TAINT_IF(save_taint);
530 		if (!needs_store) {
531 		    if (flags & HVhek_FREEKEY)
532 			Safefree(key);
533 		    return NULL;
534 		}
535 #ifdef ENV_IS_CASELESS
536 		else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
537 		    /* XXX This code isn't UTF8 clean.  */
538 		    const char *keysave = key;
539 		    /* Will need to free this, so set FREEKEY flag.  */
540 		    key = savepvn(key,klen);
541 		    key = (const char*)strupr((char*)key);
542 		    is_utf8 = FALSE;
543 		    hash = 0;
544 		    keysv = 0;
545 
546 		    if (flags & HVhek_FREEKEY) {
547 			Safefree(keysave);
548 		    }
549 		    flags |= HVhek_FREEKEY;
550 		}
551 #endif
552 	    }
553 	} /* ISSTORE */
554     } /* SvMAGICAL */
555 
556     if (!HvARRAY(hv)) {
557 	if ((action & (HV_FETCH_LVALUE | HV_FETCH_ISSTORE))
558 #ifdef DYNAMIC_ENV_FETCH  /* if it's an %ENV lookup, we may get it on the fly */
559 		 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
560 #endif
561 								  ) {
562 	    char *array;
563 	    Newxz(array,
564 		 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
565 		 char);
566 	    HvARRAY(hv) = (HE**)array;
567 	}
568 #ifdef DYNAMIC_ENV_FETCH
569 	else if (action & HV_FETCH_ISEXISTS) {
570 	    /* for an %ENV exists, if we do an insert it's by a recursive
571 	       store call, so avoid creating HvARRAY(hv) right now.  */
572 	}
573 #endif
574 	else {
575 	    /* XXX remove at some point? */
576             if (flags & HVhek_FREEKEY)
577                 Safefree(key);
578 
579 	    return NULL;
580 	}
581     }
582 
583     if (is_utf8) {
584 	char * const keysave = (char *)key;
585 	key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
586         if (is_utf8)
587 	    flags |= HVhek_UTF8;
588 	else
589 	    flags &= ~HVhek_UTF8;
590         if (key != keysave) {
591 	    if (flags & HVhek_FREEKEY)
592 		Safefree(keysave);
593             flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
594 	}
595     }
596 
597     if (HvREHASH(hv)) {
598 	PERL_HASH_INTERNAL(hash, key, klen);
599 	/* We don't have a pointer to the hv, so we have to replicate the
600 	   flag into every HEK, so that hv_iterkeysv can see it.  */
601 	/* And yes, you do need this even though you are not "storing" because
602 	   you can flip the flags below if doing an lval lookup.  (And that
603 	   was put in to give the semantics Andreas was expecting.)  */
604 	flags |= HVhek_REHASH;
605     } else if (!hash) {
606         if (keysv && (SvIsCOW_shared_hash(keysv))) {
607             hash = SvSHARED_HASH(keysv);
608         } else {
609             PERL_HASH(hash, key, klen);
610         }
611     }
612 
613     masked_flags = (flags & HVhek_MASK);
614 
615 #ifdef DYNAMIC_ENV_FETCH
616     if (!HvARRAY(hv)) entry = NULL;
617     else
618 #endif
619     {
620 	entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)];
621     }
622     for (; entry; entry = HeNEXT(entry)) {
623 	if (HeHASH(entry) != hash)		/* strings can't be equal */
624 	    continue;
625 	if (HeKLEN(entry) != (I32)klen)
626 	    continue;
627 	if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))	/* is this it? */
628 	    continue;
629 	if ((HeKFLAGS(entry) ^ masked_flags) & HVhek_UTF8)
630 	    continue;
631 
632         if (action & (HV_FETCH_LVALUE|HV_FETCH_ISSTORE)) {
633 	    if (HeKFLAGS(entry) != masked_flags) {
634 		/* We match if HVhek_UTF8 bit in our flags and hash key's
635 		   match.  But if entry was set previously with HVhek_WASUTF8
636 		   and key now doesn't (or vice versa) then we should change
637 		   the key's flag, as this is assignment.  */
638 		if (HvSHAREKEYS(hv)) {
639 		    /* Need to swap the key we have for a key with the flags we
640 		       need. As keys are shared we can't just write to the
641 		       flag, so we share the new one, unshare the old one.  */
642 		    HEK * const new_hek = share_hek_flags(key, klen, hash,
643 						   masked_flags);
644 		    unshare_hek (HeKEY_hek(entry));
645 		    HeKEY_hek(entry) = new_hek;
646 		}
647 		else if (hv == PL_strtab) {
648 		    /* PL_strtab is usually the only hash without HvSHAREKEYS,
649 		       so putting this test here is cheap  */
650 		    if (flags & HVhek_FREEKEY)
651 			Safefree(key);
652 		    Perl_croak(aTHX_ S_strtab_error,
653 			       action & HV_FETCH_LVALUE ? "fetch" : "store");
654 		}
655 		else
656 		    HeKFLAGS(entry) = masked_flags;
657 		if (masked_flags & HVhek_ENABLEHVKFLAGS)
658 		    HvHASKFLAGS_on(hv);
659 	    }
660 	    if (HeVAL(entry) == &PL_sv_placeholder) {
661 		/* yes, can store into placeholder slot */
662 		if (action & HV_FETCH_LVALUE) {
663 		    if (SvMAGICAL(hv)) {
664 			/* This preserves behaviour with the old hv_fetch
665 			   implementation which at this point would bail out
666 			   with a break; (at "if we find a placeholder, we
667 			   pretend we haven't found anything")
668 
669 			   That break mean that if a placeholder were found, it
670 			   caused a call into hv_store, which in turn would
671 			   check magic, and if there is no magic end up pretty
672 			   much back at this point (in hv_store's code).  */
673 			break;
674 		    }
675 		    /* LVAL fetch which actaully needs a store.  */
676 		    val = newSV(0);
677 		    HvPLACEHOLDERS(hv)--;
678 		} else {
679 		    /* store */
680 		    if (val != &PL_sv_placeholder)
681 			HvPLACEHOLDERS(hv)--;
682 		}
683 		HeVAL(entry) = val;
684 	    } else if (action & HV_FETCH_ISSTORE) {
685 		SvREFCNT_dec(HeVAL(entry));
686 		HeVAL(entry) = val;
687 	    }
688 	} else if (HeVAL(entry) == &PL_sv_placeholder) {
689 	    /* if we find a placeholder, we pretend we haven't found
690 	       anything */
691 	    break;
692 	}
693 	if (flags & HVhek_FREEKEY)
694 	    Safefree(key);
695 	if (return_svp) {
696 	    return entry ? (void *) &HeVAL(entry) : NULL;
697 	}
698 	return entry;
699     }
700 #ifdef DYNAMIC_ENV_FETCH  /* %ENV lookup?  If so, try to fetch the value now */
701     if (!(action & HV_FETCH_ISSTORE)
702 	&& SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
703 	unsigned long len;
704 	const char * const env = PerlEnv_ENVgetenv_len(key,&len);
705 	if (env) {
706 	    sv = newSVpvn(env,len);
707 	    SvTAINTED_on(sv);
708 	    return hv_common(hv, keysv, key, klen, flags,
709 			     HV_FETCH_ISSTORE|HV_DISABLE_UVAR_XKEY|return_svp,
710 			     sv, hash);
711 	}
712     }
713 #endif
714 
715     if (!entry && SvREADONLY(hv) && !(action & HV_FETCH_ISEXISTS)) {
716 	hv_notallowed(flags, key, klen,
717 			"Attempt to access disallowed key '%"SVf"' in"
718 			" a restricted hash");
719     }
720     if (!(action & (HV_FETCH_LVALUE|HV_FETCH_ISSTORE))) {
721 	/* Not doing some form of store, so return failure.  */
722 	if (flags & HVhek_FREEKEY)
723 	    Safefree(key);
724 	return NULL;
725     }
726     if (action & HV_FETCH_LVALUE) {
727 	val = newSV(0);
728 	if (SvMAGICAL(hv)) {
729 	    /* At this point the old hv_fetch code would call to hv_store,
730 	       which in turn might do some tied magic. So we need to make that
731 	       magic check happen.  */
732 	    /* gonna assign to this, so it better be there */
733 	    /* If a fetch-as-store fails on the fetch, then the action is to
734 	       recurse once into "hv_store". If we didn't do this, then that
735 	       recursive call would call the key conversion routine again.
736 	       However, as we replace the original key with the converted
737 	       key, this would result in a double conversion, which would show
738 	       up as a bug if the conversion routine is not idempotent.  */
739 	    return hv_common(hv, keysv, key, klen, flags,
740 			     HV_FETCH_ISSTORE|HV_DISABLE_UVAR_XKEY|return_svp,
741 			     val, hash);
742 	    /* XXX Surely that could leak if the fetch-was-store fails?
743 	       Just like the hv_fetch.  */
744 	}
745     }
746 
747     /* Welcome to hv_store...  */
748 
749     if (!HvARRAY(hv)) {
750 	/* Not sure if we can get here.  I think the only case of oentry being
751 	   NULL is for %ENV with dynamic env fetch.  But that should disappear
752 	   with magic in the previous code.  */
753 	char *array;
754 	Newxz(array,
755 	     PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
756 	     char);
757 	HvARRAY(hv) = (HE**)array;
758     }
759 
760     oentry = &(HvARRAY(hv))[hash & (I32) xhv->xhv_max];
761 
762     entry = new_HE();
763     /* share_hek_flags will do the free for us.  This might be considered
764        bad API design.  */
765     if (HvSHAREKEYS(hv))
766 	HeKEY_hek(entry) = share_hek_flags(key, klen, hash, flags);
767     else if (hv == PL_strtab) {
768 	/* PL_strtab is usually the only hash without HvSHAREKEYS, so putting
769 	   this test here is cheap  */
770 	if (flags & HVhek_FREEKEY)
771 	    Safefree(key);
772 	Perl_croak(aTHX_ S_strtab_error,
773 		   action & HV_FETCH_LVALUE ? "fetch" : "store");
774     }
775     else                                       /* gotta do the real thing */
776 	HeKEY_hek(entry) = save_hek_flags(key, klen, hash, flags);
777     HeVAL(entry) = val;
778     HeNEXT(entry) = *oentry;
779     *oentry = entry;
780 
781     if (val == &PL_sv_placeholder)
782 	HvPLACEHOLDERS(hv)++;
783     if (masked_flags & HVhek_ENABLEHVKFLAGS)
784 	HvHASKFLAGS_on(hv);
785 
786     {
787 	const HE *counter = HeNEXT(entry);
788 
789 	xhv->xhv_keys++; /* HvTOTALKEYS(hv)++ */
790 	if (!counter) {				/* initial entry? */
791 	    xhv->xhv_fill++; /* HvFILL(hv)++ */
792 	} else if (xhv->xhv_keys > (IV)xhv->xhv_max) {
793 	    hsplit(hv);
794 	} else if(!HvREHASH(hv)) {
795 	    U32 n_links = 1;
796 
797 	    while ((counter = HeNEXT(counter)))
798 		n_links++;
799 
800 	    if (n_links > HV_MAX_LENGTH_BEFORE_SPLIT) {
801 		/* Use only the old HvKEYS(hv) > HvMAX(hv) condition to limit
802 		   bucket splits on a rehashed hash, as we're not going to
803 		   split it again, and if someone is lucky (evil) enough to
804 		   get all the keys in one list they could exhaust our memory
805 		   as we repeatedly double the number of buckets on every
806 		   entry. Linear search feels a less worse thing to do.  */
807 		hsplit(hv);
808 	    }
809 	}
810     }
811 
812     if (return_svp) {
813 	return entry ? (void *) &HeVAL(entry) : NULL;
814     }
815     return (void *) entry;
816 }
817 
818 STATIC void
819 S_hv_magic_check(HV *hv, bool *needs_copy, bool *needs_store)
820 {
821     const MAGIC *mg = SvMAGIC(hv);
822     *needs_copy = FALSE;
823     *needs_store = TRUE;
824     while (mg) {
825 	if (isUPPER(mg->mg_type)) {
826 	    *needs_copy = TRUE;
827 	    if (mg->mg_type == PERL_MAGIC_tied) {
828 		*needs_store = FALSE;
829 		return; /* We've set all there is to set. */
830 	    }
831 	}
832 	mg = mg->mg_moremagic;
833     }
834 }
835 
836 /*
837 =for apidoc hv_scalar
838 
839 Evaluates the hash in scalar context and returns the result. Handles magic when the hash is tied.
840 
841 =cut
842 */
843 
844 SV *
845 Perl_hv_scalar(pTHX_ HV *hv)
846 {
847     SV *sv;
848 
849     if (SvRMAGICAL(hv)) {
850 	MAGIC * const mg = mg_find((SV*)hv, PERL_MAGIC_tied);
851 	if (mg)
852 	    return magic_scalarpack(hv, mg);
853     }
854 
855     sv = sv_newmortal();
856     if (HvFILL((HV*)hv))
857         Perl_sv_setpvf(aTHX_ sv, "%ld/%ld",
858                 (long)HvFILL(hv), (long)HvMAX(hv) + 1);
859     else
860         sv_setiv(sv, 0);
861 
862     return sv;
863 }
864 
865 /*
866 =for apidoc hv_delete
867 
868 Deletes a key/value pair in the hash.  The value SV is removed from the
869 hash and returned to the caller.  The C<klen> is the length of the key.
870 The C<flags> value will normally be zero; if set to G_DISCARD then NULL
871 will be returned.
872 
873 =for apidoc hv_delete_ent
874 
875 Deletes a key/value pair in the hash.  The value SV is removed from the
876 hash and returned to the caller.  The C<flags> value will normally be zero;
877 if set to G_DISCARD then NULL will be returned.  C<hash> can be a valid
878 precomputed hash value, or 0 to ask for it to be computed.
879 
880 =cut
881 */
882 
883 STATIC SV *
884 S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
885 		   int k_flags, I32 d_flags, U32 hash)
886 {
887     dVAR;
888     register XPVHV* xhv;
889     register HE *entry;
890     register HE **oentry;
891     HE *const *first_entry;
892     bool is_utf8 = (k_flags & HVhek_UTF8) ? TRUE : FALSE;
893     int masked_flags;
894 
895     if (SvRMAGICAL(hv)) {
896 	bool needs_copy;
897 	bool needs_store;
898 	hv_magic_check (hv, &needs_copy, &needs_store);
899 
900 	if (needs_copy) {
901 	    SV *sv;
902 	    entry = (HE *) hv_common(hv, keysv, key, klen,
903 				     k_flags & ~HVhek_FREEKEY,
904 				     HV_FETCH_LVALUE|HV_DISABLE_UVAR_XKEY,
905 				     NULL, hash);
906 	    sv = entry ? HeVAL(entry) : NULL;
907 	    if (sv) {
908 		if (SvMAGICAL(sv)) {
909 		    mg_clear(sv);
910 		}
911 		if (!needs_store) {
912 		    if (mg_find(sv, PERL_MAGIC_tiedelem)) {
913 			/* No longer an element */
914 			sv_unmagic(sv, PERL_MAGIC_tiedelem);
915 			return sv;
916 		    }
917 		    return NULL;		/* element cannot be deleted */
918 		}
919 #ifdef ENV_IS_CASELESS
920 		else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
921 		    /* XXX This code isn't UTF8 clean.  */
922 		    keysv = sv_2mortal(newSVpvn(key,klen));
923 		    if (k_flags & HVhek_FREEKEY) {
924 			Safefree(key);
925 		    }
926 		    key = strupr(SvPVX(keysv));
927 		    is_utf8 = 0;
928 		    k_flags = 0;
929 		    hash = 0;
930 		}
931 #endif
932 	    }
933 	}
934     }
935     xhv = (XPVHV*)SvANY(hv);
936     if (!HvARRAY(hv))
937 	return NULL;
938 
939     if (is_utf8) {
940 	const char * const keysave = key;
941 	key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
942 
943         if (is_utf8)
944             k_flags |= HVhek_UTF8;
945 	else
946             k_flags &= ~HVhek_UTF8;
947         if (key != keysave) {
948 	    if (k_flags & HVhek_FREEKEY) {
949 		/* This shouldn't happen if our caller does what we expect,
950 		   but strictly the API allows it.  */
951 		Safefree(keysave);
952 	    }
953 	    k_flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
954 	}
955         HvHASKFLAGS_on((SV*)hv);
956     }
957 
958     if (HvREHASH(hv)) {
959 	PERL_HASH_INTERNAL(hash, key, klen);
960     } else if (!hash) {
961         if (keysv && (SvIsCOW_shared_hash(keysv))) {
962             hash = SvSHARED_HASH(keysv);
963         } else {
964             PERL_HASH(hash, key, klen);
965         }
966     }
967 
968     masked_flags = (k_flags & HVhek_MASK);
969 
970     first_entry = oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)];
971     entry = *oentry;
972     for (; entry; oentry = &HeNEXT(entry), entry = *oentry) {
973 	SV *sv;
974 	if (HeHASH(entry) != hash)		/* strings can't be equal */
975 	    continue;
976 	if (HeKLEN(entry) != (I32)klen)
977 	    continue;
978 	if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))	/* is this it? */
979 	    continue;
980 	if ((HeKFLAGS(entry) ^ masked_flags) & HVhek_UTF8)
981 	    continue;
982 
983 	if (hv == PL_strtab) {
984 	    if (k_flags & HVhek_FREEKEY)
985 		Safefree(key);
986 	    Perl_croak(aTHX_ S_strtab_error, "delete");
987 	}
988 
989 	/* if placeholder is here, it's already been deleted.... */
990 	if (HeVAL(entry) == &PL_sv_placeholder) {
991 	    if (k_flags & HVhek_FREEKEY)
992 		Safefree(key);
993 	    return NULL;
994 	}
995 	if (SvREADONLY(hv) && HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
996 	    hv_notallowed(k_flags, key, klen,
997 			    "Attempt to delete readonly key '%"SVf"' from"
998 			    " a restricted hash");
999 	}
1000         if (k_flags & HVhek_FREEKEY)
1001             Safefree(key);
1002 
1003 	if (d_flags & G_DISCARD)
1004 	    sv = NULL;
1005 	else {
1006 	    sv = sv_2mortal(HeVAL(entry));
1007 	    HeVAL(entry) = &PL_sv_placeholder;
1008 	}
1009 
1010 	/*
1011 	 * If a restricted hash, rather than really deleting the entry, put
1012 	 * a placeholder there. This marks the key as being "approved", so
1013 	 * we can still access via not-really-existing key without raising
1014 	 * an error.
1015 	 */
1016 	if (SvREADONLY(hv)) {
1017 	    SvREFCNT_dec(HeVAL(entry));
1018 	    HeVAL(entry) = &PL_sv_placeholder;
1019 	    /* We'll be saving this slot, so the number of allocated keys
1020 	     * doesn't go down, but the number placeholders goes up */
1021 	    HvPLACEHOLDERS(hv)++;
1022 	} else {
1023 	    *oentry = HeNEXT(entry);
1024 	    if(!*first_entry) {
1025 		xhv->xhv_fill--; /* HvFILL(hv)-- */
1026 	    }
1027 	    if (SvOOK(hv) && entry == HvAUX(hv)->xhv_eiter /* HvEITER(hv) */)
1028 		HvLAZYDEL_on(hv);
1029 	    else
1030 		hv_free_ent(hv, entry);
1031 	    xhv->xhv_keys--; /* HvTOTALKEYS(hv)-- */
1032 	    if (xhv->xhv_keys == 0)
1033 	        HvHASKFLAGS_off(hv);
1034 	}
1035 	return sv;
1036     }
1037     if (SvREADONLY(hv)) {
1038 	hv_notallowed(k_flags, key, klen,
1039 			"Attempt to delete disallowed key '%"SVf"' from"
1040 			" a restricted hash");
1041     }
1042 
1043     if (k_flags & HVhek_FREEKEY)
1044 	Safefree(key);
1045     return NULL;
1046 }
1047 
1048 STATIC void
1049 S_hsplit(pTHX_ HV *hv)
1050 {
1051     dVAR;
1052     register XPVHV* const xhv = (XPVHV*)SvANY(hv);
1053     const I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
1054     register I32 newsize = oldsize * 2;
1055     register I32 i;
1056     char *a = (char*) HvARRAY(hv);
1057     register HE **aep;
1058     register HE **oentry;
1059     int longest_chain = 0;
1060     int was_shared;
1061 
1062     /*PerlIO_printf(PerlIO_stderr(), "hsplit called for %p which had %d\n",
1063       (void*)hv, (int) oldsize);*/
1064 
1065     if (HvPLACEHOLDERS_get(hv) && !SvREADONLY(hv)) {
1066       /* Can make this clear any placeholders first for non-restricted hashes,
1067 	 even though Storable rebuilds restricted hashes by putting in all the
1068 	 placeholders (first) before turning on the readonly flag, because
1069 	 Storable always pre-splits the hash.  */
1070       hv_clear_placeholders(hv);
1071     }
1072 
1073     PL_nomemok = TRUE;
1074 #if defined(STRANGE_MALLOC) || defined(MYMALLOC)
1075     Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize)
1076 	  + (SvOOK(hv) ? sizeof(struct xpvhv_aux) : 0), char);
1077     if (!a) {
1078       PL_nomemok = FALSE;
1079       return;
1080     }
1081     if (SvOOK(hv)) {
1082 	Copy(&a[oldsize * sizeof(HE*)], &a[newsize * sizeof(HE*)], 1, struct xpvhv_aux);
1083     }
1084 #else
1085     Newx(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize)
1086 	+ (SvOOK(hv) ? sizeof(struct xpvhv_aux) : 0), char);
1087     if (!a) {
1088       PL_nomemok = FALSE;
1089       return;
1090     }
1091     Copy(HvARRAY(hv), a, oldsize * sizeof(HE*), char);
1092     if (SvOOK(hv)) {
1093 	Copy(HvAUX(hv), &a[newsize * sizeof(HE*)], 1, struct xpvhv_aux);
1094     }
1095     if (oldsize >= 64) {
1096 	offer_nice_chunk(HvARRAY(hv),
1097 			 PERL_HV_ARRAY_ALLOC_BYTES(oldsize)
1098 			 + (SvOOK(hv) ? sizeof(struct xpvhv_aux) : 0));
1099     }
1100     else
1101 	Safefree(HvARRAY(hv));
1102 #endif
1103 
1104     PL_nomemok = FALSE;
1105     Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char);	/* zero 2nd half*/
1106     xhv->xhv_max = --newsize;	/* HvMAX(hv) = --newsize */
1107     HvARRAY(hv) = (HE**) a;
1108     aep = (HE**)a;
1109 
1110     for (i=0; i<oldsize; i++,aep++) {
1111 	int left_length = 0;
1112 	int right_length = 0;
1113 	register HE *entry;
1114 	register HE **bep;
1115 
1116 	if (!*aep)				/* non-existent */
1117 	    continue;
1118 	bep = aep+oldsize;
1119 	for (oentry = aep, entry = *aep; entry; entry = *oentry) {
1120 	    if ((HeHASH(entry) & newsize) != (U32)i) {
1121 		*oentry = HeNEXT(entry);
1122 		HeNEXT(entry) = *bep;
1123 		if (!*bep)
1124 		    xhv->xhv_fill++; /* HvFILL(hv)++ */
1125 		*bep = entry;
1126 		right_length++;
1127 		continue;
1128 	    }
1129 	    else {
1130 		oentry = &HeNEXT(entry);
1131 		left_length++;
1132 	    }
1133 	}
1134 	if (!*aep)				/* everything moved */
1135 	    xhv->xhv_fill--; /* HvFILL(hv)-- */
1136 	/* I think we don't actually need to keep track of the longest length,
1137 	   merely flag if anything is too long. But for the moment while
1138 	   developing this code I'll track it.  */
1139 	if (left_length > longest_chain)
1140 	    longest_chain = left_length;
1141 	if (right_length > longest_chain)
1142 	    longest_chain = right_length;
1143     }
1144 
1145 
1146     /* Pick your policy for "hashing isn't working" here:  */
1147     if (longest_chain <= HV_MAX_LENGTH_BEFORE_SPLIT /* split worked?  */
1148 	|| HvREHASH(hv)) {
1149 	return;
1150     }
1151 
1152     if (hv == PL_strtab) {
1153 	/* Urg. Someone is doing something nasty to the string table.
1154 	   Can't win.  */
1155 	return;
1156     }
1157 
1158     /* Awooga. Awooga. Pathological data.  */
1159     /*PerlIO_printf(PerlIO_stderr(), "%p %d of %d with %d/%d buckets\n", (void*)hv,
1160       longest_chain, HvTOTALKEYS(hv), HvFILL(hv),  1+HvMAX(hv));*/
1161 
1162     ++newsize;
1163     Newxz(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize)
1164 	 + (SvOOK(hv) ? sizeof(struct xpvhv_aux) : 0), char);
1165     if (SvOOK(hv)) {
1166 	Copy(HvAUX(hv), &a[newsize * sizeof(HE*)], 1, struct xpvhv_aux);
1167     }
1168 
1169     was_shared = HvSHAREKEYS(hv);
1170 
1171     xhv->xhv_fill = 0;
1172     HvSHAREKEYS_off(hv);
1173     HvREHASH_on(hv);
1174 
1175     aep = HvARRAY(hv);
1176 
1177     for (i=0; i<newsize; i++,aep++) {
1178 	register HE *entry = *aep;
1179 	while (entry) {
1180 	    /* We're going to trash this HE's next pointer when we chain it
1181 	       into the new hash below, so store where we go next.  */
1182 	    HE * const next = HeNEXT(entry);
1183 	    UV hash;
1184 	    HE **bep;
1185 
1186 	    /* Rehash it */
1187 	    PERL_HASH_INTERNAL(hash, HeKEY(entry), HeKLEN(entry));
1188 
1189 	    if (was_shared) {
1190 		/* Unshare it.  */
1191 		HEK * const new_hek
1192 		    = save_hek_flags(HeKEY(entry), HeKLEN(entry),
1193 				     hash, HeKFLAGS(entry));
1194 		unshare_hek (HeKEY_hek(entry));
1195 		HeKEY_hek(entry) = new_hek;
1196 	    } else {
1197 		/* Not shared, so simply write the new hash in. */
1198 		HeHASH(entry) = hash;
1199 	    }
1200 	    /*PerlIO_printf(PerlIO_stderr(), "%d ", HeKFLAGS(entry));*/
1201 	    HEK_REHASH_on(HeKEY_hek(entry));
1202 	    /*PerlIO_printf(PerlIO_stderr(), "%d\n", HeKFLAGS(entry));*/
1203 
1204 	    /* Copy oentry to the correct new chain.  */
1205 	    bep = ((HE**)a) + (hash & (I32) xhv->xhv_max);
1206 	    if (!*bep)
1207 		    xhv->xhv_fill++; /* HvFILL(hv)++ */
1208 	    HeNEXT(entry) = *bep;
1209 	    *bep = entry;
1210 
1211 	    entry = next;
1212 	}
1213     }
1214     Safefree (HvARRAY(hv));
1215     HvARRAY(hv) = (HE **)a;
1216 }
1217 
1218 void
1219 Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
1220 {
1221     dVAR;
1222     register XPVHV* xhv = (XPVHV*)SvANY(hv);
1223     const I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
1224     register I32 newsize;
1225     register I32 i;
1226     register char *a;
1227     register HE **aep;
1228     register HE *entry;
1229     register HE **oentry;
1230 
1231     newsize = (I32) newmax;			/* possible truncation here */
1232     if (newsize != newmax || newmax <= oldsize)
1233 	return;
1234     while ((newsize & (1 + ~newsize)) != newsize) {
1235 	newsize &= ~(newsize & (1 + ~newsize));	/* get proper power of 2 */
1236     }
1237     if (newsize < newmax)
1238 	newsize *= 2;
1239     if (newsize < newmax)
1240 	return;					/* overflow detection */
1241 
1242     a = (char *) HvARRAY(hv);
1243     if (a) {
1244 	PL_nomemok = TRUE;
1245 #if defined(STRANGE_MALLOC) || defined(MYMALLOC)
1246 	Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize)
1247 	      + (SvOOK(hv) ? sizeof(struct xpvhv_aux) : 0), char);
1248 	if (!a) {
1249 	  PL_nomemok = FALSE;
1250 	  return;
1251 	}
1252 	if (SvOOK(hv)) {
1253 	    Copy(&a[oldsize * sizeof(HE*)], &a[newsize * sizeof(HE*)], 1, struct xpvhv_aux);
1254 	}
1255 #else
1256 	Newx(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize)
1257 	    + (SvOOK(hv) ? sizeof(struct xpvhv_aux) : 0), char);
1258 	if (!a) {
1259 	  PL_nomemok = FALSE;
1260 	  return;
1261 	}
1262 	Copy(HvARRAY(hv), a, oldsize * sizeof(HE*), char);
1263 	if (SvOOK(hv)) {
1264 	    Copy(HvAUX(hv), &a[newsize * sizeof(HE*)], 1, struct xpvhv_aux);
1265 	}
1266 	if (oldsize >= 64) {
1267 	    offer_nice_chunk(HvARRAY(hv),
1268 			     PERL_HV_ARRAY_ALLOC_BYTES(oldsize)
1269 			     + (SvOOK(hv) ? sizeof(struct xpvhv_aux) : 0));
1270 	}
1271 	else
1272 	    Safefree(HvARRAY(hv));
1273 #endif
1274 	PL_nomemok = FALSE;
1275 	Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
1276     }
1277     else {
1278 	Newxz(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1279     }
1280     xhv->xhv_max = --newsize; 	/* HvMAX(hv) = --newsize */
1281     HvARRAY(hv) = (HE **) a;
1282     if (!xhv->xhv_fill /* !HvFILL(hv) */)	/* skip rest if no entries */
1283 	return;
1284 
1285     aep = (HE**)a;
1286     for (i=0; i<oldsize; i++,aep++) {
1287 	if (!*aep)				/* non-existent */
1288 	    continue;
1289 	for (oentry = aep, entry = *aep; entry; entry = *oentry) {
1290 	    register I32 j = (HeHASH(entry) & newsize);
1291 
1292 	    if (j != i) {
1293 		j -= i;
1294 		*oentry = HeNEXT(entry);
1295 		if (!(HeNEXT(entry) = aep[j]))
1296 		    xhv->xhv_fill++; /* HvFILL(hv)++ */
1297 		aep[j] = entry;
1298 		continue;
1299 	    }
1300 	    else
1301 		oentry = &HeNEXT(entry);
1302 	}
1303 	if (!*aep)				/* everything moved */
1304 	    xhv->xhv_fill--; /* HvFILL(hv)-- */
1305     }
1306 }
1307 
1308 /*
1309 =for apidoc newHV
1310 
1311 Creates a new HV.  The reference count is set to 1.
1312 
1313 =cut
1314 */
1315 
1316 HV *
1317 Perl_newHV(pTHX)
1318 {
1319     register XPVHV* xhv;
1320     HV * const hv = (HV*)newSV_type(SVt_PVHV);
1321     xhv = (XPVHV*)SvANY(hv);
1322     assert(!SvOK(hv));
1323 #ifndef NODEFAULT_SHAREKEYS
1324     HvSHAREKEYS_on(hv);         /* key-sharing on by default */
1325 #endif
1326 
1327     xhv->xhv_max    = 7;	/* HvMAX(hv) = 7 (start with 8 buckets) */
1328     xhv->xhv_fill   = 0;	/* HvFILL(hv) = 0 */
1329     return hv;
1330 }
1331 
1332 HV *
1333 Perl_newHVhv(pTHX_ HV *ohv)
1334 {
1335     HV * const hv = newHV();
1336     STRLEN hv_max, hv_fill;
1337 
1338     if (!ohv || (hv_fill = HvFILL(ohv)) == 0)
1339 	return hv;
1340     hv_max = HvMAX(ohv);
1341 
1342     if (!SvMAGICAL((SV *)ohv)) {
1343 	/* It's an ordinary hash, so copy it fast. AMS 20010804 */
1344 	STRLEN i;
1345 	const bool shared = !!HvSHAREKEYS(ohv);
1346 	HE **ents, ** const oents = (HE **)HvARRAY(ohv);
1347 	char *a;
1348 	Newx(a, PERL_HV_ARRAY_ALLOC_BYTES(hv_max+1), char);
1349 	ents = (HE**)a;
1350 
1351 	/* In each bucket... */
1352 	for (i = 0; i <= hv_max; i++) {
1353 	    HE *prev = NULL;
1354 	    HE *oent = oents[i];
1355 
1356 	    if (!oent) {
1357 		ents[i] = NULL;
1358 		continue;
1359 	    }
1360 
1361 	    /* Copy the linked list of entries. */
1362 	    for (; oent; oent = HeNEXT(oent)) {
1363 		const U32 hash   = HeHASH(oent);
1364 		const char * const key = HeKEY(oent);
1365 		const STRLEN len = HeKLEN(oent);
1366 		const int flags  = HeKFLAGS(oent);
1367 		HE * const ent   = new_HE();
1368 
1369 		HeVAL(ent)     = newSVsv(HeVAL(oent));
1370 		HeKEY_hek(ent)
1371                     = shared ? share_hek_flags(key, len, hash, flags)
1372                              :  save_hek_flags(key, len, hash, flags);
1373 		if (prev)
1374 		    HeNEXT(prev) = ent;
1375 		else
1376 		    ents[i] = ent;
1377 		prev = ent;
1378 		HeNEXT(ent) = NULL;
1379 	    }
1380 	}
1381 
1382 	HvMAX(hv)   = hv_max;
1383 	HvFILL(hv)  = hv_fill;
1384 	HvTOTALKEYS(hv)  = HvTOTALKEYS(ohv);
1385 	HvARRAY(hv) = ents;
1386     } /* not magical */
1387     else {
1388 	/* Iterate over ohv, copying keys and values one at a time. */
1389 	HE *entry;
1390 	const I32 riter = HvRITER_get(ohv);
1391 	HE * const eiter = HvEITER_get(ohv);
1392 
1393 	/* Can we use fewer buckets? (hv_max is always 2^n-1) */
1394 	while (hv_max && hv_max + 1 >= hv_fill * 2)
1395 	    hv_max = hv_max / 2;
1396 	HvMAX(hv) = hv_max;
1397 
1398 	hv_iterinit(ohv);
1399 	while ((entry = hv_iternext_flags(ohv, 0))) {
1400 	    (void)hv_store_flags(hv, HeKEY(entry), HeKLEN(entry),
1401 			         newSVsv(HeVAL(entry)), HeHASH(entry),
1402 			         HeKFLAGS(entry));
1403 	}
1404 	HvRITER_set(ohv, riter);
1405 	HvEITER_set(ohv, eiter);
1406     }
1407 
1408     return hv;
1409 }
1410 
1411 /* A rather specialised version of newHVhv for copying %^H, ensuring all the
1412    magic stays on it.  */
1413 HV *
1414 Perl_hv_copy_hints_hv(pTHX_ HV *const ohv)
1415 {
1416     HV * const hv = newHV();
1417     STRLEN hv_fill;
1418 
1419     if (ohv && (hv_fill = HvFILL(ohv))) {
1420 	STRLEN hv_max = HvMAX(ohv);
1421 	HE *entry;
1422 	const I32 riter = HvRITER_get(ohv);
1423 	HE * const eiter = HvEITER_get(ohv);
1424 
1425 	while (hv_max && hv_max + 1 >= hv_fill * 2)
1426 	    hv_max = hv_max / 2;
1427 	HvMAX(hv) = hv_max;
1428 
1429 	hv_iterinit(ohv);
1430 	while ((entry = hv_iternext_flags(ohv, 0))) {
1431 	    SV *const sv = newSVsv(HeVAL(entry));
1432 	    sv_magic(sv, NULL, PERL_MAGIC_hintselem,
1433 		     (char *)newSVhek (HeKEY_hek(entry)), HEf_SVKEY);
1434 	    (void)hv_store_flags(hv, HeKEY(entry), HeKLEN(entry),
1435 				 sv, HeHASH(entry), HeKFLAGS(entry));
1436 	}
1437 	HvRITER_set(ohv, riter);
1438 	HvEITER_set(ohv, eiter);
1439     }
1440     hv_magic(hv, NULL, PERL_MAGIC_hints);
1441     return hv;
1442 }
1443 
1444 void
1445 Perl_hv_free_ent(pTHX_ HV *hv, register HE *entry)
1446 {
1447     dVAR;
1448     SV *val;
1449 
1450     if (!entry)
1451 	return;
1452     val = HeVAL(entry);
1453     if (val && isGV(val) && isGV_with_GP(val) && GvCVu(val) && HvNAME_get(hv))
1454         mro_method_changed_in(hv);	/* deletion of method from stash */
1455     SvREFCNT_dec(val);
1456     if (HeKLEN(entry) == HEf_SVKEY) {
1457 	SvREFCNT_dec(HeKEY_sv(entry));
1458 	Safefree(HeKEY_hek(entry));
1459     }
1460     else if (HvSHAREKEYS(hv))
1461 	unshare_hek(HeKEY_hek(entry));
1462     else
1463 	Safefree(HeKEY_hek(entry));
1464     del_HE(entry);
1465 }
1466 
1467 void
1468 Perl_hv_delayfree_ent(pTHX_ HV *hv, register HE *entry)
1469 {
1470     dVAR;
1471     if (!entry)
1472 	return;
1473     /* SvREFCNT_inc to counter the SvREFCNT_dec in hv_free_ent  */
1474     sv_2mortal(SvREFCNT_inc(HeVAL(entry)));	/* free between statements */
1475     if (HeKLEN(entry) == HEf_SVKEY) {
1476 	sv_2mortal(SvREFCNT_inc(HeKEY_sv(entry)));
1477     }
1478     hv_free_ent(hv, entry);
1479 }
1480 
1481 /*
1482 =for apidoc hv_clear
1483 
1484 Clears a hash, making it empty.
1485 
1486 =cut
1487 */
1488 
1489 void
1490 Perl_hv_clear(pTHX_ HV *hv)
1491 {
1492     dVAR;
1493     register XPVHV* xhv;
1494     if (!hv)
1495 	return;
1496 
1497     DEBUG_A(Perl_hv_assert(aTHX_ hv));
1498 
1499     xhv = (XPVHV*)SvANY(hv);
1500 
1501     if (SvREADONLY(hv) && HvARRAY(hv) != NULL) {
1502 	/* restricted hash: convert all keys to placeholders */
1503 	STRLEN i;
1504 	for (i = 0; i <= xhv->xhv_max; i++) {
1505 	    HE *entry = (HvARRAY(hv))[i];
1506 	    for (; entry; entry = HeNEXT(entry)) {
1507 		/* not already placeholder */
1508 		if (HeVAL(entry) != &PL_sv_placeholder) {
1509 		    if (HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
1510 			SV* const keysv = hv_iterkeysv(entry);
1511 			Perl_croak(aTHX_
1512 				   "Attempt to delete readonly key '%"SVf"' from a restricted hash",
1513 				   (void*)keysv);
1514 		    }
1515 		    SvREFCNT_dec(HeVAL(entry));
1516 		    HeVAL(entry) = &PL_sv_placeholder;
1517 		    HvPLACEHOLDERS(hv)++;
1518 		}
1519 	    }
1520 	}
1521 	goto reset;
1522     }
1523 
1524     hfreeentries(hv);
1525     HvPLACEHOLDERS_set(hv, 0);
1526     if (HvARRAY(hv))
1527 	Zero(HvARRAY(hv), xhv->xhv_max+1 /* HvMAX(hv)+1 */, HE*);
1528 
1529     if (SvRMAGICAL(hv))
1530 	mg_clear((SV*)hv);
1531 
1532     HvHASKFLAGS_off(hv);
1533     HvREHASH_off(hv);
1534     reset:
1535     if (SvOOK(hv)) {
1536         if(HvNAME_get(hv))
1537             mro_isa_changed_in(hv);
1538 	HvEITER_set(hv, NULL);
1539     }
1540 }
1541 
1542 /*
1543 =for apidoc hv_clear_placeholders
1544 
1545 Clears any placeholders from a hash.  If a restricted hash has any of its keys
1546 marked as readonly and the key is subsequently deleted, the key is not actually
1547 deleted but is marked by assigning it a value of &PL_sv_placeholder.  This tags
1548 it so it will be ignored by future operations such as iterating over the hash,
1549 but will still allow the hash to have a value reassigned to the key at some
1550 future point.  This function clears any such placeholder keys from the hash.
1551 See Hash::Util::lock_keys() for an example of its use.
1552 
1553 =cut
1554 */
1555 
1556 void
1557 Perl_hv_clear_placeholders(pTHX_ HV *hv)
1558 {
1559     dVAR;
1560     const U32 items = (U32)HvPLACEHOLDERS_get(hv);
1561 
1562     if (items)
1563 	clear_placeholders(hv, items);
1564 }
1565 
1566 static void
1567 S_clear_placeholders(pTHX_ HV *hv, U32 items)
1568 {
1569     dVAR;
1570     I32 i;
1571 
1572     if (items == 0)
1573 	return;
1574 
1575     i = HvMAX(hv);
1576     do {
1577 	/* Loop down the linked list heads  */
1578 	bool first = TRUE;
1579 	HE **oentry = &(HvARRAY(hv))[i];
1580 	HE *entry;
1581 
1582 	while ((entry = *oentry)) {
1583 	    if (HeVAL(entry) == &PL_sv_placeholder) {
1584 		*oentry = HeNEXT(entry);
1585 		if (first && !*oentry)
1586 		    HvFILL(hv)--; /* This linked list is now empty.  */
1587 		if (entry == HvEITER_get(hv))
1588 		    HvLAZYDEL_on(hv);
1589 		else
1590 		    hv_free_ent(hv, entry);
1591 
1592 		if (--items == 0) {
1593 		    /* Finished.  */
1594 		    HvTOTALKEYS(hv) -= (IV)HvPLACEHOLDERS_get(hv);
1595 		    if (HvKEYS(hv) == 0)
1596 			HvHASKFLAGS_off(hv);
1597 		    HvPLACEHOLDERS_set(hv, 0);
1598 		    return;
1599 		}
1600 	    } else {
1601 		oentry = &HeNEXT(entry);
1602 		first = FALSE;
1603 	    }
1604 	}
1605     } while (--i >= 0);
1606     /* You can't get here, hence assertion should always fail.  */
1607     assert (items == 0);
1608     assert (0);
1609 }
1610 
1611 STATIC void
1612 S_hfreeentries(pTHX_ HV *hv)
1613 {
1614     /* This is the array that we're going to restore  */
1615     HE **const orig_array = HvARRAY(hv);
1616     HEK *name;
1617     int attempts = 100;
1618 
1619     if (!orig_array)
1620 	return;
1621 
1622     if (SvOOK(hv)) {
1623 	/* If the hash is actually a symbol table with a name, look after the
1624 	   name.  */
1625 	struct xpvhv_aux *iter = HvAUX(hv);
1626 
1627 	name = iter->xhv_name;
1628 	iter->xhv_name = NULL;
1629     } else {
1630 	name = NULL;
1631     }
1632 
1633     /* orig_array remains unchanged throughout the loop. If after freeing all
1634        the entries it turns out that one of the little blighters has triggered
1635        an action that has caused HvARRAY to be re-allocated, then we set
1636        array to the new HvARRAY, and try again.  */
1637 
1638     while (1) {
1639 	/* This is the one we're going to try to empty.  First time round
1640 	   it's the original array.  (Hopefully there will only be 1 time
1641 	   round) */
1642 	HE ** const array = HvARRAY(hv);
1643 	I32 i = HvMAX(hv);
1644 
1645 	/* Because we have taken xhv_name out, the only allocated pointer
1646 	   in the aux structure that might exist is the backreference array.
1647 	*/
1648 
1649 	if (SvOOK(hv)) {
1650 	    HE *entry;
1651             struct mro_meta *meta;
1652 	    struct xpvhv_aux *iter = HvAUX(hv);
1653 	    /* If there are weak references to this HV, we need to avoid
1654 	       freeing them up here.  In particular we need to keep the AV
1655 	       visible as what we're deleting might well have weak references
1656 	       back to this HV, so the for loop below may well trigger
1657 	       the removal of backreferences from this array.  */
1658 
1659 	    if (iter->xhv_backreferences) {
1660 		/* So donate them to regular backref magic to keep them safe.
1661 		   The sv_magic will increase the reference count of the AV,
1662 		   so we need to drop it first. */
1663 		SvREFCNT_dec(iter->xhv_backreferences);
1664 		if (AvFILLp(iter->xhv_backreferences) == -1) {
1665 		    /* Turns out that the array is empty. Just free it.  */
1666 		    SvREFCNT_dec(iter->xhv_backreferences);
1667 
1668 		} else {
1669 		    sv_magic((SV*)hv, (SV*)iter->xhv_backreferences,
1670 			     PERL_MAGIC_backref, NULL, 0);
1671 		}
1672 		iter->xhv_backreferences = NULL;
1673 	    }
1674 
1675 	    entry = iter->xhv_eiter; /* HvEITER(hv) */
1676 	    if (entry && HvLAZYDEL(hv)) {	/* was deleted earlier? */
1677 		HvLAZYDEL_off(hv);
1678 		hv_free_ent(hv, entry);
1679 	    }
1680 	    iter->xhv_riter = -1; 	/* HvRITER(hv) = -1 */
1681 	    iter->xhv_eiter = NULL;	/* HvEITER(hv) = NULL */
1682 
1683             if((meta = iter->xhv_mro_meta)) {
1684                 if(meta->mro_linear_dfs) SvREFCNT_dec(meta->mro_linear_dfs);
1685                 if(meta->mro_linear_c3)  SvREFCNT_dec(meta->mro_linear_c3);
1686                 if(meta->mro_nextmethod) SvREFCNT_dec(meta->mro_nextmethod);
1687                 Safefree(meta);
1688                 iter->xhv_mro_meta = NULL;
1689             }
1690 
1691 	    /* There are now no allocated pointers in the aux structure.  */
1692 
1693 	    SvFLAGS(hv) &= ~SVf_OOK; /* Goodbye, aux structure.  */
1694 	    /* What aux structure?  */
1695 	}
1696 
1697 	/* make everyone else think the array is empty, so that the destructors
1698 	 * called for freed entries can't recusively mess with us */
1699 	HvARRAY(hv) = NULL;
1700 	HvFILL(hv) = 0;
1701 	((XPVHV*) SvANY(hv))->xhv_keys = 0;
1702 
1703 
1704 	do {
1705 	    /* Loop down the linked list heads  */
1706 	    HE *entry = array[i];
1707 
1708 	    while (entry) {
1709 		register HE * const oentry = entry;
1710 		entry = HeNEXT(entry);
1711 		hv_free_ent(hv, oentry);
1712 	    }
1713 	} while (--i >= 0);
1714 
1715 	/* As there are no allocated pointers in the aux structure, it's now
1716 	   safe to free the array we just cleaned up, if it's not the one we're
1717 	   going to put back.  */
1718 	if (array != orig_array) {
1719 	    Safefree(array);
1720 	}
1721 
1722 	if (!HvARRAY(hv)) {
1723 	    /* Good. No-one added anything this time round.  */
1724 	    break;
1725 	}
1726 
1727 	if (SvOOK(hv)) {
1728 	    /* Someone attempted to iterate or set the hash name while we had
1729 	       the array set to 0.  We'll catch backferences on the next time
1730 	       round the while loop.  */
1731 	    assert(HvARRAY(hv));
1732 
1733 	    if (HvAUX(hv)->xhv_name) {
1734 		unshare_hek_or_pvn(HvAUX(hv)->xhv_name, 0, 0, 0);
1735 	    }
1736 	}
1737 
1738 	if (--attempts == 0) {
1739 	    Perl_die(aTHX_ "panic: hfreeentries failed to free hash - something is repeatedly re-creating entries");
1740 	}
1741     }
1742 
1743     HvARRAY(hv) = orig_array;
1744 
1745     /* If the hash was actually a symbol table, put the name back.  */
1746     if (name) {
1747 	/* We have restored the original array.  If name is non-NULL, then
1748 	   the original array had an aux structure at the end. So this is
1749 	   valid:  */
1750 	SvFLAGS(hv) |= SVf_OOK;
1751 	HvAUX(hv)->xhv_name = name;
1752     }
1753 }
1754 
1755 /*
1756 =for apidoc hv_undef
1757 
1758 Undefines the hash.
1759 
1760 =cut
1761 */
1762 
1763 void
1764 Perl_hv_undef(pTHX_ HV *hv)
1765 {
1766     dVAR;
1767     register XPVHV* xhv;
1768     const char *name;
1769 
1770     if (!hv)
1771 	return;
1772     DEBUG_A(Perl_hv_assert(aTHX_ hv));
1773     xhv = (XPVHV*)SvANY(hv);
1774 
1775     if ((name = HvNAME_get(hv)) && !PL_dirty)
1776         mro_isa_changed_in(hv);
1777 
1778     hfreeentries(hv);
1779     if (name) {
1780         if (PL_stashcache)
1781 	    (void)hv_delete(PL_stashcache, name, HvNAMELEN_get(hv), G_DISCARD);
1782 	hv_name_set(hv, NULL, 0, 0);
1783     }
1784     SvFLAGS(hv) &= ~SVf_OOK;
1785     Safefree(HvARRAY(hv));
1786     xhv->xhv_max   = 7;	/* HvMAX(hv) = 7 (it's a normal hash) */
1787     HvARRAY(hv) = 0;
1788     HvPLACEHOLDERS_set(hv, 0);
1789 
1790     if (SvRMAGICAL(hv))
1791 	mg_clear((SV*)hv);
1792 }
1793 
1794 static struct xpvhv_aux*
1795 S_hv_auxinit(HV *hv) {
1796     struct xpvhv_aux *iter;
1797     char *array;
1798 
1799     if (!HvARRAY(hv)) {
1800 	Newxz(array, PERL_HV_ARRAY_ALLOC_BYTES(HvMAX(hv) + 1)
1801 	    + sizeof(struct xpvhv_aux), char);
1802     } else {
1803 	array = (char *) HvARRAY(hv);
1804 	Renew(array, PERL_HV_ARRAY_ALLOC_BYTES(HvMAX(hv) + 1)
1805 	      + sizeof(struct xpvhv_aux), char);
1806     }
1807     HvARRAY(hv) = (HE**) array;
1808     /* SvOOK_on(hv) attacks the IV flags.  */
1809     SvFLAGS(hv) |= SVf_OOK;
1810     iter = HvAUX(hv);
1811 
1812     iter->xhv_riter = -1; 	/* HvRITER(hv) = -1 */
1813     iter->xhv_eiter = NULL;	/* HvEITER(hv) = NULL */
1814     iter->xhv_name = 0;
1815     iter->xhv_backreferences = 0;
1816     iter->xhv_mro_meta = NULL;
1817     return iter;
1818 }
1819 
1820 /*
1821 =for apidoc hv_iterinit
1822 
1823 Prepares a starting point to traverse a hash table.  Returns the number of
1824 keys in the hash (i.e. the same as C<HvKEYS(tb)>).  The return value is
1825 currently only meaningful for hashes without tie magic.
1826 
1827 NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
1828 hash buckets that happen to be in use.  If you still need that esoteric
1829 value, you can get it through the macro C<HvFILL(tb)>.
1830 
1831 
1832 =cut
1833 */
1834 
1835 I32
1836 Perl_hv_iterinit(pTHX_ HV *hv)
1837 {
1838     if (!hv)
1839 	Perl_croak(aTHX_ "Bad hash");
1840 
1841     if (SvOOK(hv)) {
1842 	struct xpvhv_aux * const iter = HvAUX(hv);
1843 	HE * const entry = iter->xhv_eiter; /* HvEITER(hv) */
1844 	if (entry && HvLAZYDEL(hv)) {	/* was deleted earlier? */
1845 	    HvLAZYDEL_off(hv);
1846 	    hv_free_ent(hv, entry);
1847 	}
1848 	iter->xhv_riter = -1; 	/* HvRITER(hv) = -1 */
1849 	iter->xhv_eiter = NULL; /* HvEITER(hv) = NULL */
1850     } else {
1851 	hv_auxinit(hv);
1852     }
1853 
1854     /* used to be xhv->xhv_fill before 5.004_65 */
1855     return HvTOTALKEYS(hv);
1856 }
1857 
1858 I32 *
1859 Perl_hv_riter_p(pTHX_ HV *hv) {
1860     struct xpvhv_aux *iter;
1861 
1862     if (!hv)
1863 	Perl_croak(aTHX_ "Bad hash");
1864 
1865     iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
1866     return &(iter->xhv_riter);
1867 }
1868 
1869 HE **
1870 Perl_hv_eiter_p(pTHX_ HV *hv) {
1871     struct xpvhv_aux *iter;
1872 
1873     if (!hv)
1874 	Perl_croak(aTHX_ "Bad hash");
1875 
1876     iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
1877     return &(iter->xhv_eiter);
1878 }
1879 
1880 void
1881 Perl_hv_riter_set(pTHX_ HV *hv, I32 riter) {
1882     struct xpvhv_aux *iter;
1883 
1884     if (!hv)
1885 	Perl_croak(aTHX_ "Bad hash");
1886 
1887     if (SvOOK(hv)) {
1888 	iter = HvAUX(hv);
1889     } else {
1890 	if (riter == -1)
1891 	    return;
1892 
1893 	iter = hv_auxinit(hv);
1894     }
1895     iter->xhv_riter = riter;
1896 }
1897 
1898 void
1899 Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter) {
1900     struct xpvhv_aux *iter;
1901 
1902     if (!hv)
1903 	Perl_croak(aTHX_ "Bad hash");
1904 
1905     if (SvOOK(hv)) {
1906 	iter = HvAUX(hv);
1907     } else {
1908 	/* 0 is the default so don't go malloc()ing a new structure just to
1909 	   hold 0.  */
1910 	if (!eiter)
1911 	    return;
1912 
1913 	iter = hv_auxinit(hv);
1914     }
1915     iter->xhv_eiter = eiter;
1916 }
1917 
1918 void
1919 Perl_hv_name_set(pTHX_ HV *hv, const char *name, U32 len, U32 flags)
1920 {
1921     dVAR;
1922     struct xpvhv_aux *iter;
1923     U32 hash;
1924 
1925     PERL_UNUSED_ARG(flags);
1926 
1927     if (len > I32_MAX)
1928 	Perl_croak(aTHX_ "panic: hv name too long (%"UVuf")", (UV) len);
1929 
1930     if (SvOOK(hv)) {
1931 	iter = HvAUX(hv);
1932 	if (iter->xhv_name) {
1933 	    unshare_hek_or_pvn(iter->xhv_name, 0, 0, 0);
1934 	}
1935     } else {
1936 	if (name == 0)
1937 	    return;
1938 
1939 	iter = hv_auxinit(hv);
1940     }
1941     PERL_HASH(hash, name, len);
1942     iter->xhv_name = name ? share_hek(name, len, hash) : NULL;
1943 }
1944 
1945 AV **
1946 Perl_hv_backreferences_p(pTHX_ HV *hv) {
1947     struct xpvhv_aux * const iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
1948     PERL_UNUSED_CONTEXT;
1949     return &(iter->xhv_backreferences);
1950 }
1951 
1952 void
1953 Perl_hv_kill_backrefs(pTHX_ HV *hv) {
1954     AV *av;
1955 
1956     if (!SvOOK(hv))
1957 	return;
1958 
1959     av = HvAUX(hv)->xhv_backreferences;
1960 
1961     if (av) {
1962 	HvAUX(hv)->xhv_backreferences = 0;
1963 	Perl_sv_kill_backrefs(aTHX_ (SV*) hv, av);
1964     }
1965 }
1966 
1967 /*
1968 hv_iternext is implemented as a macro in hv.h
1969 
1970 =for apidoc hv_iternext
1971 
1972 Returns entries from a hash iterator.  See C<hv_iterinit>.
1973 
1974 You may call C<hv_delete> or C<hv_delete_ent> on the hash entry that the
1975 iterator currently points to, without losing your place or invalidating your
1976 iterator.  Note that in this case the current entry is deleted from the hash
1977 with your iterator holding the last reference to it.  Your iterator is flagged
1978 to free the entry on the next call to C<hv_iternext>, so you must not discard
1979 your iterator immediately else the entry will leak - call C<hv_iternext> to
1980 trigger the resource deallocation.
1981 
1982 =for apidoc hv_iternext_flags
1983 
1984 Returns entries from a hash iterator.  See C<hv_iterinit> and C<hv_iternext>.
1985 The C<flags> value will normally be zero; if HV_ITERNEXT_WANTPLACEHOLDERS is
1986 set the placeholders keys (for restricted hashes) will be returned in addition
1987 to normal keys. By default placeholders are automatically skipped over.
1988 Currently a placeholder is implemented with a value that is
1989 C<&Perl_sv_placeholder>. Note that the implementation of placeholders and
1990 restricted hashes may change, and the implementation currently is
1991 insufficiently abstracted for any change to be tidy.
1992 
1993 =cut
1994 */
1995 
1996 HE *
1997 Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags)
1998 {
1999     dVAR;
2000     register XPVHV* xhv;
2001     register HE *entry;
2002     HE *oldentry;
2003     MAGIC* mg;
2004     struct xpvhv_aux *iter;
2005 
2006     if (!hv)
2007 	Perl_croak(aTHX_ "Bad hash");
2008 
2009     xhv = (XPVHV*)SvANY(hv);
2010 
2011     if (!SvOOK(hv)) {
2012 	/* Too many things (well, pp_each at least) merrily assume that you can
2013 	   call iv_iternext without calling hv_iterinit, so we'll have to deal
2014 	   with it.  */
2015 	hv_iterinit(hv);
2016     }
2017     iter = HvAUX(hv);
2018 
2019     oldentry = entry = iter->xhv_eiter; /* HvEITER(hv) */
2020     if (SvMAGICAL(hv) && SvRMAGICAL(hv)) {
2021 	if ( ( mg = mg_find((SV*)hv, PERL_MAGIC_tied) ) ) {
2022             SV * const key = sv_newmortal();
2023             if (entry) {
2024                 sv_setsv(key, HeSVKEY_force(entry));
2025                 SvREFCNT_dec(HeSVKEY(entry));       /* get rid of previous key */
2026             }
2027             else {
2028                 char *k;
2029                 HEK *hek;
2030 
2031                 /* one HE per MAGICAL hash */
2032                 iter->xhv_eiter = entry = new_HE(); /* HvEITER(hv) = new_HE() */
2033                 Zero(entry, 1, HE);
2034                 Newxz(k, HEK_BASESIZE + sizeof(SV*), char);
2035                 hek = (HEK*)k;
2036                 HeKEY_hek(entry) = hek;
2037                 HeKLEN(entry) = HEf_SVKEY;
2038             }
2039             magic_nextpack((SV*) hv,mg,key);
2040             if (SvOK(key)) {
2041                 /* force key to stay around until next time */
2042                 HeSVKEY_set(entry, SvREFCNT_inc_simple_NN(key));
2043                 return entry;               /* beware, hent_val is not set */
2044             }
2045             if (HeVAL(entry))
2046                 SvREFCNT_dec(HeVAL(entry));
2047             Safefree(HeKEY_hek(entry));
2048             del_HE(entry);
2049             iter->xhv_eiter = NULL; /* HvEITER(hv) = NULL */
2050             return NULL;
2051         }
2052     }
2053 #if defined(DYNAMIC_ENV_FETCH) && !defined(__riscos__)  /* set up %ENV for iteration */
2054     if (!entry && SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
2055 	prime_env_iter();
2056 #ifdef VMS
2057 	/* The prime_env_iter() on VMS just loaded up new hash values
2058 	 * so the iteration count needs to be reset back to the beginning
2059 	 */
2060 	hv_iterinit(hv);
2061 	iter = HvAUX(hv);
2062 	oldentry = entry = iter->xhv_eiter; /* HvEITER(hv) */
2063 #endif
2064     }
2065 #endif
2066 
2067     /* hv_iterint now ensures this.  */
2068     assert (HvARRAY(hv));
2069 
2070     /* At start of hash, entry is NULL.  */
2071     if (entry)
2072     {
2073 	entry = HeNEXT(entry);
2074         if (!(flags & HV_ITERNEXT_WANTPLACEHOLDERS)) {
2075             /*
2076              * Skip past any placeholders -- don't want to include them in
2077              * any iteration.
2078              */
2079             while (entry && HeVAL(entry) == &PL_sv_placeholder) {
2080                 entry = HeNEXT(entry);
2081             }
2082 	}
2083     }
2084     while (!entry) {
2085 	/* OK. Come to the end of the current list.  Grab the next one.  */
2086 
2087 	iter->xhv_riter++; /* HvRITER(hv)++ */
2088 	if (iter->xhv_riter > (I32)xhv->xhv_max /* HvRITER(hv) > HvMAX(hv) */) {
2089 	    /* There is no next one.  End of the hash.  */
2090 	    iter->xhv_riter = -1; /* HvRITER(hv) = -1 */
2091 	    break;
2092 	}
2093 	entry = (HvARRAY(hv))[iter->xhv_riter];
2094 
2095         if (!(flags & HV_ITERNEXT_WANTPLACEHOLDERS)) {
2096             /* If we have an entry, but it's a placeholder, don't count it.
2097 	       Try the next.  */
2098 	    while (entry && HeVAL(entry) == &PL_sv_placeholder)
2099 		entry = HeNEXT(entry);
2100 	}
2101 	/* Will loop again if this linked list starts NULL
2102 	   (for HV_ITERNEXT_WANTPLACEHOLDERS)
2103 	   or if we run through it and find only placeholders.  */
2104     }
2105 
2106     if (oldentry && HvLAZYDEL(hv)) {		/* was deleted earlier? */
2107 	HvLAZYDEL_off(hv);
2108 	hv_free_ent(hv, oldentry);
2109     }
2110 
2111     /*if (HvREHASH(hv) && entry && !HeKREHASH(entry))
2112       PerlIO_printf(PerlIO_stderr(), "Awooga %p %p\n", (void*)hv, (void*)entry);*/
2113 
2114     iter->xhv_eiter = entry; /* HvEITER(hv) = entry */
2115     return entry;
2116 }
2117 
2118 /*
2119 =for apidoc hv_iterkey
2120 
2121 Returns the key from the current position of the hash iterator.  See
2122 C<hv_iterinit>.
2123 
2124 =cut
2125 */
2126 
2127 char *
2128 Perl_hv_iterkey(pTHX_ register HE *entry, I32 *retlen)
2129 {
2130     if (HeKLEN(entry) == HEf_SVKEY) {
2131 	STRLEN len;
2132 	char * const p = SvPV(HeKEY_sv(entry), len);
2133 	*retlen = len;
2134 	return p;
2135     }
2136     else {
2137 	*retlen = HeKLEN(entry);
2138 	return HeKEY(entry);
2139     }
2140 }
2141 
2142 /* unlike hv_iterval(), this always returns a mortal copy of the key */
2143 /*
2144 =for apidoc hv_iterkeysv
2145 
2146 Returns the key as an C<SV*> from the current position of the hash
2147 iterator.  The return value will always be a mortal copy of the key.  Also
2148 see C<hv_iterinit>.
2149 
2150 =cut
2151 */
2152 
2153 SV *
2154 Perl_hv_iterkeysv(pTHX_ register HE *entry)
2155 {
2156     return sv_2mortal(newSVhek(HeKEY_hek(entry)));
2157 }
2158 
2159 /*
2160 =for apidoc hv_iterval
2161 
2162 Returns the value from the current position of the hash iterator.  See
2163 C<hv_iterkey>.
2164 
2165 =cut
2166 */
2167 
2168 SV *
2169 Perl_hv_iterval(pTHX_ HV *hv, register HE *entry)
2170 {
2171     if (SvRMAGICAL(hv)) {
2172 	if (mg_find((SV*)hv, PERL_MAGIC_tied)) {
2173 	    SV* const sv = sv_newmortal();
2174 	    if (HeKLEN(entry) == HEf_SVKEY)
2175 		mg_copy((SV*)hv, sv, (char*)HeKEY_sv(entry), HEf_SVKEY);
2176 	    else
2177 		mg_copy((SV*)hv, sv, HeKEY(entry), HeKLEN(entry));
2178 	    return sv;
2179 	}
2180     }
2181     return HeVAL(entry);
2182 }
2183 
2184 /*
2185 =for apidoc hv_iternextsv
2186 
2187 Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
2188 operation.
2189 
2190 =cut
2191 */
2192 
2193 SV *
2194 Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
2195 {
2196     HE * const he = hv_iternext_flags(hv, 0);
2197 
2198     if (!he)
2199 	return NULL;
2200     *key = hv_iterkey(he, retlen);
2201     return hv_iterval(hv, he);
2202 }
2203 
2204 /*
2205 
2206 Now a macro in hv.h
2207 
2208 =for apidoc hv_magic
2209 
2210 Adds magic to a hash.  See C<sv_magic>.
2211 
2212 =cut
2213 */
2214 
2215 /* possibly free a shared string if no one has access to it
2216  * len and hash must both be valid for str.
2217  */
2218 void
2219 Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
2220 {
2221     unshare_hek_or_pvn (NULL, str, len, hash);
2222 }
2223 
2224 
2225 void
2226 Perl_unshare_hek(pTHX_ HEK *hek)
2227 {
2228     assert(hek);
2229     unshare_hek_or_pvn(hek, NULL, 0, 0);
2230 }
2231 
2232 /* possibly free a shared string if no one has access to it
2233    hek if non-NULL takes priority over the other 3, else str, len and hash
2234    are used.  If so, len and hash must both be valid for str.
2235  */
2236 STATIC void
2237 S_unshare_hek_or_pvn(pTHX_ const HEK *hek, const char *str, I32 len, U32 hash)
2238 {
2239     dVAR;
2240     register XPVHV* xhv;
2241     HE *entry;
2242     register HE **oentry;
2243     HE **first;
2244     bool is_utf8 = FALSE;
2245     int k_flags = 0;
2246     const char * const save = str;
2247     struct shared_he *he = NULL;
2248 
2249     if (hek) {
2250 	/* Find the shared he which is just before us in memory.  */
2251 	he = (struct shared_he *)(((char *)hek)
2252 				  - STRUCT_OFFSET(struct shared_he,
2253 						  shared_he_hek));
2254 
2255 	/* Assert that the caller passed us a genuine (or at least consistent)
2256 	   shared hek  */
2257 	assert (he->shared_he_he.hent_hek == hek);
2258 
2259 	LOCK_STRTAB_MUTEX;
2260 	if (he->shared_he_he.he_valu.hent_refcount - 1) {
2261 	    --he->shared_he_he.he_valu.hent_refcount;
2262 	    UNLOCK_STRTAB_MUTEX;
2263 	    return;
2264 	}
2265 	UNLOCK_STRTAB_MUTEX;
2266 
2267         hash = HEK_HASH(hek);
2268     } else if (len < 0) {
2269         STRLEN tmplen = -len;
2270         is_utf8 = TRUE;
2271         /* See the note in hv_fetch(). --jhi */
2272         str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
2273         len = tmplen;
2274         if (is_utf8)
2275             k_flags = HVhek_UTF8;
2276         if (str != save)
2277             k_flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
2278     }
2279 
2280     /* what follows was the moral equivalent of:
2281     if ((Svp = hv_fetch(PL_strtab, tmpsv, FALSE, hash))) {
2282 	if (--*Svp == NULL)
2283 	    hv_delete(PL_strtab, str, len, G_DISCARD, hash);
2284     } */
2285     xhv = (XPVHV*)SvANY(PL_strtab);
2286     /* assert(xhv_array != 0) */
2287     LOCK_STRTAB_MUTEX;
2288     first = oentry = &(HvARRAY(PL_strtab))[hash & (I32) HvMAX(PL_strtab)];
2289     if (he) {
2290 	const HE *const he_he = &(he->shared_he_he);
2291         for (entry = *oentry; entry; oentry = &HeNEXT(entry), entry = *oentry) {
2292             if (entry == he_he)
2293                 break;
2294         }
2295     } else {
2296         const int flags_masked = k_flags & HVhek_MASK;
2297         for (entry = *oentry; entry; oentry = &HeNEXT(entry), entry = *oentry) {
2298             if (HeHASH(entry) != hash)		/* strings can't be equal */
2299                 continue;
2300             if (HeKLEN(entry) != len)
2301                 continue;
2302             if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len))	/* is this it? */
2303                 continue;
2304             if (HeKFLAGS(entry) != flags_masked)
2305                 continue;
2306             break;
2307         }
2308     }
2309 
2310     if (entry) {
2311         if (--entry->he_valu.hent_refcount == 0) {
2312             *oentry = HeNEXT(entry);
2313             if (!*first) {
2314 		/* There are now no entries in our slot.  */
2315                 xhv->xhv_fill--; /* HvFILL(hv)-- */
2316 	    }
2317             Safefree(entry);
2318             xhv->xhv_keys--; /* HvTOTALKEYS(hv)-- */
2319         }
2320     }
2321 
2322     UNLOCK_STRTAB_MUTEX;
2323     if (!entry && ckWARN_d(WARN_INTERNAL))
2324 	Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
2325                     "Attempt to free non-existent shared string '%s'%s"
2326                     pTHX__FORMAT,
2327                     hek ? HEK_KEY(hek) : str,
2328                     ((k_flags & HVhek_UTF8) ? " (utf8)" : "") pTHX__VALUE);
2329     if (k_flags & HVhek_FREEKEY)
2330 	Safefree(str);
2331 }
2332 
2333 /* get a (constant) string ptr from the global string table
2334  * string will get added if it is not already there.
2335  * len and hash must both be valid for str.
2336  */
2337 HEK *
2338 Perl_share_hek(pTHX_ const char *str, I32 len, register U32 hash)
2339 {
2340     bool is_utf8 = FALSE;
2341     int flags = 0;
2342     const char * const save = str;
2343 
2344     if (len < 0) {
2345       STRLEN tmplen = -len;
2346       is_utf8 = TRUE;
2347       /* See the note in hv_fetch(). --jhi */
2348       str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
2349       len = tmplen;
2350       /* If we were able to downgrade here, then than means that we were passed
2351          in a key which only had chars 0-255, but was utf8 encoded.  */
2352       if (is_utf8)
2353           flags = HVhek_UTF8;
2354       /* If we found we were able to downgrade the string to bytes, then
2355          we should flag that it needs upgrading on keys or each.  Also flag
2356          that we need share_hek_flags to free the string.  */
2357       if (str != save)
2358           flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
2359     }
2360 
2361     return share_hek_flags (str, len, hash, flags);
2362 }
2363 
2364 STATIC HEK *
2365 S_share_hek_flags(pTHX_ const char *str, I32 len, register U32 hash, int flags)
2366 {
2367     dVAR;
2368     register HE *entry;
2369     const int flags_masked = flags & HVhek_MASK;
2370     const U32 hindex = hash & (I32) HvMAX(PL_strtab);
2371 
2372     /* what follows is the moral equivalent of:
2373 
2374     if (!(Svp = hv_fetch(PL_strtab, str, len, FALSE)))
2375 	hv_store(PL_strtab, str, len, NULL, hash);
2376 
2377 	Can't rehash the shared string table, so not sure if it's worth
2378 	counting the number of entries in the linked list
2379     */
2380     register XPVHV * const xhv = (XPVHV*)SvANY(PL_strtab);
2381     /* assert(xhv_array != 0) */
2382     LOCK_STRTAB_MUTEX;
2383     entry = (HvARRAY(PL_strtab))[hindex];
2384     for (;entry; entry = HeNEXT(entry)) {
2385 	if (HeHASH(entry) != hash)		/* strings can't be equal */
2386 	    continue;
2387 	if (HeKLEN(entry) != len)
2388 	    continue;
2389 	if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len))	/* is this it? */
2390 	    continue;
2391 	if (HeKFLAGS(entry) != flags_masked)
2392 	    continue;
2393 	break;
2394     }
2395 
2396     if (!entry) {
2397 	/* What used to be head of the list.
2398 	   If this is NULL, then we're the first entry for this slot, which
2399 	   means we need to increate fill.  */
2400 	struct shared_he *new_entry;
2401 	HEK *hek;
2402 	char *k;
2403 	HE **const head = &HvARRAY(PL_strtab)[hindex];
2404 	HE *const next = *head;
2405 
2406 	/* We don't actually store a HE from the arena and a regular HEK.
2407 	   Instead we allocate one chunk of memory big enough for both,
2408 	   and put the HEK straight after the HE. This way we can find the
2409 	   HEK directly from the HE.
2410 	*/
2411 
2412 	Newx(k, STRUCT_OFFSET(struct shared_he,
2413 				shared_he_hek.hek_key[0]) + len + 2, char);
2414 	new_entry = (struct shared_he *)k;
2415 	entry = &(new_entry->shared_he_he);
2416 	hek = &(new_entry->shared_he_hek);
2417 
2418 	Copy(str, HEK_KEY(hek), len, char);
2419 	HEK_KEY(hek)[len] = 0;
2420 	HEK_LEN(hek) = len;
2421 	HEK_HASH(hek) = hash;
2422 	HEK_FLAGS(hek) = (unsigned char)flags_masked;
2423 
2424 	/* Still "point" to the HEK, so that other code need not know what
2425 	   we're up to.  */
2426 	HeKEY_hek(entry) = hek;
2427 	entry->he_valu.hent_refcount = 0;
2428 	HeNEXT(entry) = next;
2429 	*head = entry;
2430 
2431 	xhv->xhv_keys++; /* HvTOTALKEYS(hv)++ */
2432 	if (!next) {			/* initial entry? */
2433 	    xhv->xhv_fill++; /* HvFILL(hv)++ */
2434 	} else if (xhv->xhv_keys > (IV)xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */) {
2435 		hsplit(PL_strtab);
2436 	}
2437     }
2438 
2439     ++entry->he_valu.hent_refcount;
2440     UNLOCK_STRTAB_MUTEX;
2441 
2442     if (flags & HVhek_FREEKEY)
2443 	Safefree(str);
2444 
2445     return HeKEY_hek(entry);
2446 }
2447 
2448 I32 *
2449 Perl_hv_placeholders_p(pTHX_ HV *hv)
2450 {
2451     dVAR;
2452     MAGIC *mg = mg_find((SV*)hv, PERL_MAGIC_rhash);
2453 
2454     if (!mg) {
2455 	mg = sv_magicext((SV*)hv, 0, PERL_MAGIC_rhash, 0, 0, 0);
2456 
2457 	if (!mg) {
2458 	    Perl_die(aTHX_ "panic: hv_placeholders_p");
2459 	}
2460     }
2461     return &(mg->mg_len);
2462 }
2463 
2464 
2465 I32
2466 Perl_hv_placeholders_get(pTHX_ HV *hv)
2467 {
2468     dVAR;
2469     MAGIC * const mg = mg_find((SV*)hv, PERL_MAGIC_rhash);
2470 
2471     return mg ? mg->mg_len : 0;
2472 }
2473 
2474 void
2475 Perl_hv_placeholders_set(pTHX_ HV *hv, I32 ph)
2476 {
2477     dVAR;
2478     MAGIC * const mg = mg_find((SV*)hv, PERL_MAGIC_rhash);
2479 
2480     if (mg) {
2481 	mg->mg_len = ph;
2482     } else if (ph) {
2483 	if (!sv_magicext((SV*)hv, 0, PERL_MAGIC_rhash, 0, 0, ph))
2484 	    Perl_die(aTHX_ "panic: hv_placeholders_set");
2485     }
2486     /* else we don't need to add magic to record 0 placeholders.  */
2487 }
2488 
2489 STATIC SV *
2490 S_refcounted_he_value(pTHX_ const struct refcounted_he *he)
2491 {
2492     dVAR;
2493     SV *value;
2494     switch(he->refcounted_he_data[0] & HVrhek_typemask) {
2495     case HVrhek_undef:
2496 	value = newSV(0);
2497 	break;
2498     case HVrhek_delete:
2499 	value = &PL_sv_placeholder;
2500 	break;
2501     case HVrhek_IV:
2502 	value = newSViv(he->refcounted_he_val.refcounted_he_u_iv);
2503 	break;
2504     case HVrhek_UV:
2505 	value = newSVuv(he->refcounted_he_val.refcounted_he_u_uv);
2506 	break;
2507     case HVrhek_PV:
2508     case HVrhek_PV_UTF8:
2509 	/* Create a string SV that directly points to the bytes in our
2510 	   structure.  */
2511 	value = newSV_type(SVt_PV);
2512 	SvPV_set(value, (char *) he->refcounted_he_data + 1);
2513 	SvCUR_set(value, he->refcounted_he_val.refcounted_he_u_len);
2514 	/* This stops anything trying to free it  */
2515 	SvLEN_set(value, 0);
2516 	SvPOK_on(value);
2517 	SvREADONLY_on(value);
2518 	if ((he->refcounted_he_data[0] & HVrhek_typemask) == HVrhek_PV_UTF8)
2519 	    SvUTF8_on(value);
2520 	break;
2521     default:
2522 	Perl_croak(aTHX_ "panic: refcounted_he_value bad flags %x",
2523 		   he->refcounted_he_data[0]);
2524     }
2525     return value;
2526 }
2527 
2528 /*
2529 =for apidoc refcounted_he_chain_2hv
2530 
2531 Generates and returns a C<HV *> by walking up the tree starting at the passed
2532 in C<struct refcounted_he *>.
2533 
2534 =cut
2535 */
2536 HV *
2537 Perl_refcounted_he_chain_2hv(pTHX_ const struct refcounted_he *chain)
2538 {
2539     dVAR;
2540     HV *hv = newHV();
2541     U32 placeholders = 0;
2542     /* We could chase the chain once to get an idea of the number of keys,
2543        and call ksplit.  But for now we'll make a potentially inefficient
2544        hash with only 8 entries in its array.  */
2545     const U32 max = HvMAX(hv);
2546 
2547     if (!HvARRAY(hv)) {
2548 	char *array;
2549 	Newxz(array, PERL_HV_ARRAY_ALLOC_BYTES(max + 1), char);
2550 	HvARRAY(hv) = (HE**)array;
2551     }
2552 
2553     while (chain) {
2554 #ifdef USE_ITHREADS
2555 	U32 hash = chain->refcounted_he_hash;
2556 #else
2557 	U32 hash = HEK_HASH(chain->refcounted_he_hek);
2558 #endif
2559 	HE **oentry = &((HvARRAY(hv))[hash & max]);
2560 	HE *entry = *oentry;
2561 	SV *value;
2562 
2563 	for (; entry; entry = HeNEXT(entry)) {
2564 	    if (HeHASH(entry) == hash) {
2565 		/* We might have a duplicate key here.  If so, entry is older
2566 		   than the key we've already put in the hash, so if they are
2567 		   the same, skip adding entry.  */
2568 #ifdef USE_ITHREADS
2569 		const STRLEN klen = HeKLEN(entry);
2570 		const char *const key = HeKEY(entry);
2571 		if (klen == chain->refcounted_he_keylen
2572 		    && (!!HeKUTF8(entry)
2573 			== !!(chain->refcounted_he_data[0] & HVhek_UTF8))
2574 		    && memEQ(key, REF_HE_KEY(chain), klen))
2575 		    goto next_please;
2576 #else
2577 		if (HeKEY_hek(entry) == chain->refcounted_he_hek)
2578 		    goto next_please;
2579 		if (HeKLEN(entry) == HEK_LEN(chain->refcounted_he_hek)
2580 		    && HeKUTF8(entry) == HEK_UTF8(chain->refcounted_he_hek)
2581 		    && memEQ(HeKEY(entry), HEK_KEY(chain->refcounted_he_hek),
2582 			     HeKLEN(entry)))
2583 		    goto next_please;
2584 #endif
2585 	    }
2586 	}
2587 	assert (!entry);
2588 	entry = new_HE();
2589 
2590 #ifdef USE_ITHREADS
2591 	HeKEY_hek(entry)
2592 	    = share_hek_flags(REF_HE_KEY(chain),
2593 			      chain->refcounted_he_keylen,
2594 			      chain->refcounted_he_hash,
2595 			      (chain->refcounted_he_data[0]
2596 			       & (HVhek_UTF8|HVhek_WASUTF8)));
2597 #else
2598 	HeKEY_hek(entry) = share_hek_hek(chain->refcounted_he_hek);
2599 #endif
2600 	value = refcounted_he_value(chain);
2601 	if (value == &PL_sv_placeholder)
2602 	    placeholders++;
2603 	HeVAL(entry) = value;
2604 
2605 	/* Link it into the chain.  */
2606 	HeNEXT(entry) = *oentry;
2607 	if (!HeNEXT(entry)) {
2608 	    /* initial entry.   */
2609 	    HvFILL(hv)++;
2610 	}
2611 	*oentry = entry;
2612 
2613 	HvTOTALKEYS(hv)++;
2614 
2615     next_please:
2616 	chain = chain->refcounted_he_next;
2617     }
2618 
2619     if (placeholders) {
2620 	clear_placeholders(hv, placeholders);
2621 	HvTOTALKEYS(hv) -= placeholders;
2622     }
2623 
2624     /* We could check in the loop to see if we encounter any keys with key
2625        flags, but it's probably not worth it, as this per-hash flag is only
2626        really meant as an optimisation for things like Storable.  */
2627     HvHASKFLAGS_on(hv);
2628     DEBUG_A(Perl_hv_assert(aTHX_ hv));
2629 
2630     return hv;
2631 }
2632 
2633 SV *
2634 Perl_refcounted_he_fetch(pTHX_ const struct refcounted_he *chain, SV *keysv,
2635 			 const char *key, STRLEN klen, int flags, U32 hash)
2636 {
2637     dVAR;
2638     /* Just to be awkward, if you're using this interface the UTF-8-or-not-ness
2639        of your key has to exactly match that which is stored.  */
2640     SV *value = &PL_sv_placeholder;
2641     bool is_utf8;
2642 
2643     if (keysv) {
2644 	if (flags & HVhek_FREEKEY)
2645 	    Safefree(key);
2646 	key = SvPV_const(keysv, klen);
2647 	flags = 0;
2648 	is_utf8 = (SvUTF8(keysv) != 0);
2649     } else {
2650 	is_utf8 = ((flags & HVhek_UTF8) ? TRUE : FALSE);
2651     }
2652 
2653     if (!hash) {
2654 	if (keysv && (SvIsCOW_shared_hash(keysv))) {
2655             hash = SvSHARED_HASH(keysv);
2656         } else {
2657             PERL_HASH(hash, key, klen);
2658         }
2659     }
2660 
2661     for (; chain; chain = chain->refcounted_he_next) {
2662 #ifdef USE_ITHREADS
2663 	if (hash != chain->refcounted_he_hash)
2664 	    continue;
2665 	if (klen != chain->refcounted_he_keylen)
2666 	    continue;
2667 	if (memNE(REF_HE_KEY(chain),key,klen))
2668 	    continue;
2669 	if (!!is_utf8 != !!(chain->refcounted_he_data[0] & HVhek_UTF8))
2670 	    continue;
2671 #else
2672 	if (hash != HEK_HASH(chain->refcounted_he_hek))
2673 	    continue;
2674 	if (klen != (STRLEN)HEK_LEN(chain->refcounted_he_hek))
2675 	    continue;
2676 	if (memNE(HEK_KEY(chain->refcounted_he_hek),key,klen))
2677 	    continue;
2678 	if (!!is_utf8 != !!HEK_UTF8(chain->refcounted_he_hek))
2679 	    continue;
2680 #endif
2681 
2682 	value = sv_2mortal(refcounted_he_value(chain));
2683 	break;
2684     }
2685 
2686     if (flags & HVhek_FREEKEY)
2687 	Safefree(key);
2688 
2689     return value;
2690 }
2691 
2692 /*
2693 =for apidoc refcounted_he_new
2694 
2695 Creates a new C<struct refcounted_he>. As S<key> is copied, and value is
2696 stored in a compact form, all references remain the property of the caller.
2697 The C<struct refcounted_he> is returned with a reference count of 1.
2698 
2699 =cut
2700 */
2701 
2702 struct refcounted_he *
2703 Perl_refcounted_he_new(pTHX_ struct refcounted_he *const parent,
2704 		       SV *const key, SV *const value) {
2705     dVAR;
2706     struct refcounted_he *he;
2707     STRLEN key_len;
2708     const char *key_p = SvPV_const(key, key_len);
2709     STRLEN value_len = 0;
2710     const char *value_p = NULL;
2711     char value_type;
2712     char flags;
2713     STRLEN key_offset;
2714     U32 hash;
2715     bool is_utf8 = SvUTF8(key) ? TRUE : FALSE;
2716 
2717     if (SvPOK(value)) {
2718 	value_type = HVrhek_PV;
2719     } else if (SvIOK(value)) {
2720 	value_type = HVrhek_IV;
2721     } else if (value == &PL_sv_placeholder) {
2722 	value_type = HVrhek_delete;
2723     } else if (!SvOK(value)) {
2724 	value_type = HVrhek_undef;
2725     } else {
2726 	value_type = HVrhek_PV;
2727     }
2728 
2729     if (value_type == HVrhek_PV) {
2730 	value_p = SvPV_const(value, value_len);
2731 	key_offset = value_len + 2;
2732     } else {
2733 	value_len = 0;
2734 	key_offset = 1;
2735     }
2736 
2737 #ifdef USE_ITHREADS
2738     he = (struct refcounted_he*)
2739 	PerlMemShared_malloc(sizeof(struct refcounted_he) - 1
2740 			     + key_len
2741 			     + key_offset);
2742 #else
2743     he = (struct refcounted_he*)
2744 	PerlMemShared_malloc(sizeof(struct refcounted_he) - 1
2745 			     + key_offset);
2746 #endif
2747 
2748 
2749     he->refcounted_he_next = parent;
2750 
2751     if (value_type == HVrhek_PV) {
2752 	Copy(value_p, he->refcounted_he_data + 1, value_len + 1, char);
2753 	he->refcounted_he_val.refcounted_he_u_len = value_len;
2754 	/* Do it this way so that the SvUTF8() test is after the SvPV, in case
2755 	   the value is overloaded, and doesn't yet have the UTF-8flag set.  */
2756 	if (SvUTF8(value))
2757 	    value_type = HVrhek_PV_UTF8;
2758     } else if (value_type == HVrhek_IV) {
2759 	if (SvUOK(value)) {
2760 	    he->refcounted_he_val.refcounted_he_u_uv = SvUVX(value);
2761 	    value_type = HVrhek_UV;
2762 	} else {
2763 	    he->refcounted_he_val.refcounted_he_u_iv = SvIVX(value);
2764 	}
2765     }
2766     flags = value_type;
2767 
2768     if (is_utf8) {
2769 	/* Hash keys are always stored normalised to (yes) ISO-8859-1.
2770 	   As we're going to be building hash keys from this value in future,
2771 	   normalise it now.  */
2772 	key_p = (char*)bytes_from_utf8((const U8*)key_p, &key_len, &is_utf8);
2773 	flags |= is_utf8 ? HVhek_UTF8 : HVhek_WASUTF8;
2774     }
2775     PERL_HASH(hash, key_p, key_len);
2776 
2777 #ifdef USE_ITHREADS
2778     he->refcounted_he_hash = hash;
2779     he->refcounted_he_keylen = key_len;
2780     Copy(key_p, he->refcounted_he_data + key_offset, key_len, char);
2781 #else
2782     he->refcounted_he_hek = share_hek_flags(key_p, key_len, hash, flags);
2783 #endif
2784 
2785     if (flags & HVhek_WASUTF8) {
2786 	/* If it was downgraded from UTF-8, then the pointer returned from
2787 	   bytes_from_utf8 is an allocated pointer that we must free.  */
2788 	Safefree(key_p);
2789     }
2790 
2791     he->refcounted_he_data[0] = flags;
2792     he->refcounted_he_refcnt = 1;
2793 
2794     return he;
2795 }
2796 
2797 /*
2798 =for apidoc refcounted_he_free
2799 
2800 Decrements the reference count of the passed in C<struct refcounted_he *>
2801 by one. If the reference count reaches zero the structure's memory is freed,
2802 and C<refcounted_he_free> iterates onto the parent node.
2803 
2804 =cut
2805 */
2806 
2807 void
2808 Perl_refcounted_he_free(pTHX_ struct refcounted_he *he) {
2809     dVAR;
2810     PERL_UNUSED_CONTEXT;
2811 
2812     while (he) {
2813 	struct refcounted_he *copy;
2814 	U32 new_count;
2815 
2816 	HINTS_REFCNT_LOCK;
2817 	new_count = --he->refcounted_he_refcnt;
2818 	HINTS_REFCNT_UNLOCK;
2819 
2820 	if (new_count) {
2821 	    return;
2822 	}
2823 
2824 #ifndef USE_ITHREADS
2825 	unshare_hek_or_pvn (he->refcounted_he_hek, 0, 0, 0);
2826 #endif
2827 	copy = he;
2828 	he = he->refcounted_he_next;
2829 	PerlMemShared_free(copy);
2830     }
2831 }
2832 
2833 /*
2834 =for apidoc hv_assert
2835 
2836 Check that a hash is in an internally consistent state.
2837 
2838 =cut
2839 */
2840 
2841 #ifdef DEBUGGING
2842 
2843 void
2844 Perl_hv_assert(pTHX_ HV *hv)
2845 {
2846     dVAR;
2847     HE* entry;
2848     int withflags = 0;
2849     int placeholders = 0;
2850     int real = 0;
2851     int bad = 0;
2852     const I32 riter = HvRITER_get(hv);
2853     HE *eiter = HvEITER_get(hv);
2854 
2855     (void)hv_iterinit(hv);
2856 
2857     while ((entry = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))) {
2858 	/* sanity check the values */
2859 	if (HeVAL(entry) == &PL_sv_placeholder)
2860 	    placeholders++;
2861 	else
2862 	    real++;
2863 	/* sanity check the keys */
2864 	if (HeSVKEY(entry)) {
2865 	    NOOP;   /* Don't know what to check on SV keys.  */
2866 	} else if (HeKUTF8(entry)) {
2867 	    withflags++;
2868 	    if (HeKWASUTF8(entry)) {
2869 		PerlIO_printf(Perl_debug_log,
2870 			    "hash key has both WASUTF8 and UTF8: '%.*s'\n",
2871 			    (int) HeKLEN(entry),  HeKEY(entry));
2872 		bad = 1;
2873 	    }
2874 	} else if (HeKWASUTF8(entry))
2875 	    withflags++;
2876     }
2877     if (!SvTIED_mg((SV*)hv, PERL_MAGIC_tied)) {
2878 	static const char bad_count[] = "Count %d %s(s), but hash reports %d\n";
2879 	const int nhashkeys = HvUSEDKEYS(hv);
2880 	const int nhashplaceholders = HvPLACEHOLDERS_get(hv);
2881 
2882 	if (nhashkeys != real) {
2883 	    PerlIO_printf(Perl_debug_log, bad_count, real, "keys", nhashkeys );
2884 	    bad = 1;
2885 	}
2886 	if (nhashplaceholders != placeholders) {
2887 	    PerlIO_printf(Perl_debug_log, bad_count, placeholders, "placeholder", nhashplaceholders );
2888 	    bad = 1;
2889 	}
2890     }
2891     if (withflags && ! HvHASKFLAGS(hv)) {
2892 	PerlIO_printf(Perl_debug_log,
2893 		    "Hash has HASKFLAGS off but I count %d key(s) with flags\n",
2894 		    withflags);
2895 	bad = 1;
2896     }
2897     if (bad) {
2898 	sv_dump((SV *)hv);
2899     }
2900     HvRITER_set(hv, riter);		/* Restore hash iterator state */
2901     HvEITER_set(hv, eiter);
2902 }
2903 
2904 #endif
2905 
2906 /*
2907  * Local variables:
2908  * c-indentation-style: bsd
2909  * c-basic-offset: 4
2910  * indent-tabs-mode: t
2911  * End:
2912  *
2913  * ex: set ts=8 sts=4 sw=4 noet:
2914  */
2915