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