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