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