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