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