newHV doesn't need to turn off POK or NOK, as they will default to not
[p5sagit/p5-mst-13.2.git] / hv.c
1 /*    hv.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  * "I sit beside the fire and think of all that I have seen."  --Bilbo
13  */
14
15 /* 
16 =head1 Hash Manipulation Functions
17
18 A HV structure represents a Perl hash. It consists mainly of an array
19 of pointers, each of which points to a linked list of HE structures. The
20 array is indexed by the hash function of the key, so each linked list
21 represents all the hash entries with the same hash value. Each HE contains
22 a pointer to the actual value, plus a pointer to a HEK structure which
23 holds the key and hash value.
24
25 =cut
26
27 */
28
29 #include "EXTERN.h"
30 #define PERL_IN_HV_C
31 #define PERL_HASH_INTERNAL_ACCESS
32 #include "perl.h"
33
34 #define HV_MAX_LENGTH_BEFORE_SPLIT 14
35
36 static const char S_strtab_error[]
37     = "Cannot modify shared string table in hv_%s";
38
39 STATIC void
40 S_more_he(pTHX)
41 {
42     dVAR;
43     HE* he;
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(0);
1401
1402     sv_upgrade((SV *)hv, SVt_PVHV);
1403     xhv = (XPVHV*)SvANY(hv);
1404     assert(!SvOK(hv));
1405 #ifndef NODEFAULT_SHAREKEYS
1406     HvSHAREKEYS_on(hv);         /* key-sharing on by default */
1407 #endif
1408
1409     xhv->xhv_max    = 7;        /* HvMAX(hv) = 7 (start with 8 buckets) */
1410     xhv->xhv_fill   = 0;        /* HvFILL(hv) = 0 */
1411     return hv;
1412 }
1413
1414 HV *
1415 Perl_newHVhv(pTHX_ HV *ohv)
1416 {
1417     HV * const hv = newHV();
1418     STRLEN hv_max, hv_fill;
1419
1420     if (!ohv || (hv_fill = HvFILL(ohv)) == 0)
1421         return hv;
1422     hv_max = HvMAX(ohv);
1423
1424     if (!SvMAGICAL((SV *)ohv)) {
1425         /* It's an ordinary hash, so copy it fast. AMS 20010804 */
1426         STRLEN i;
1427         const bool shared = !!HvSHAREKEYS(ohv);
1428         HE **ents, ** const oents = (HE **)HvARRAY(ohv);
1429         char *a;
1430         Newx(a, PERL_HV_ARRAY_ALLOC_BYTES(hv_max+1), char);
1431         ents = (HE**)a;
1432
1433         /* In each bucket... */
1434         for (i = 0; i <= hv_max; i++) {
1435             HE *prev = NULL;
1436             HE *oent = oents[i];
1437
1438             if (!oent) {
1439                 ents[i] = NULL;
1440                 continue;
1441             }
1442
1443             /* Copy the linked list of entries. */
1444             for (; oent; oent = HeNEXT(oent)) {
1445                 const U32 hash   = HeHASH(oent);
1446                 const char * const key = HeKEY(oent);
1447                 const STRLEN len = HeKLEN(oent);
1448                 const int flags  = HeKFLAGS(oent);
1449                 HE * const ent   = new_HE();
1450
1451                 HeVAL(ent)     = newSVsv(HeVAL(oent));
1452                 HeKEY_hek(ent)
1453                     = shared ? share_hek_flags(key, len, hash, flags)
1454                              :  save_hek_flags(key, len, hash, flags);
1455                 if (prev)
1456                     HeNEXT(prev) = ent;
1457                 else
1458                     ents[i] = ent;
1459                 prev = ent;
1460                 HeNEXT(ent) = NULL;
1461             }
1462         }
1463
1464         HvMAX(hv)   = hv_max;
1465         HvFILL(hv)  = hv_fill;
1466         HvTOTALKEYS(hv)  = HvTOTALKEYS(ohv);
1467         HvARRAY(hv) = ents;
1468     } /* not magical */
1469     else {
1470         /* Iterate over ohv, copying keys and values one at a time. */
1471         HE *entry;
1472         const I32 riter = HvRITER_get(ohv);
1473         HE * const eiter = HvEITER_get(ohv);
1474
1475         /* Can we use fewer buckets? (hv_max is always 2^n-1) */
1476         while (hv_max && hv_max + 1 >= hv_fill * 2)
1477             hv_max = hv_max / 2;
1478         HvMAX(hv) = hv_max;
1479
1480         hv_iterinit(ohv);
1481         while ((entry = hv_iternext_flags(ohv, 0))) {
1482             hv_store_flags(hv, HeKEY(entry), HeKLEN(entry),
1483                            newSVsv(HeVAL(entry)), HeHASH(entry),
1484                            HeKFLAGS(entry));
1485         }
1486         HvRITER_set(ohv, riter);
1487         HvEITER_set(ohv, eiter);
1488     }
1489
1490     return hv;
1491 }
1492
1493 /* A rather specialised version of newHVhv for copying %^H, ensuring all the
1494    magic stays on it.  */
1495 HV *
1496 Perl_hv_copy_hints_hv(pTHX_ HV *const ohv)
1497 {
1498     HV * const hv = newHV();
1499     STRLEN hv_fill;
1500
1501     if (ohv && (hv_fill = HvFILL(ohv))) {
1502         STRLEN hv_max = HvMAX(ohv);
1503         HE *entry;
1504         const I32 riter = HvRITER_get(ohv);
1505         HE * const eiter = HvEITER_get(ohv);
1506
1507         while (hv_max && hv_max + 1 >= hv_fill * 2)
1508             hv_max = hv_max / 2;
1509         HvMAX(hv) = hv_max;
1510
1511         hv_iterinit(ohv);
1512         while ((entry = hv_iternext_flags(ohv, 0))) {
1513             SV *const sv = newSVsv(HeVAL(entry));
1514             sv_magic(sv, NULL, PERL_MAGIC_hintselem,
1515                      (char *)newSVhek (HeKEY_hek(entry)), HEf_SVKEY);
1516             hv_store_flags(hv, HeKEY(entry), HeKLEN(entry),
1517                            sv, HeHASH(entry), HeKFLAGS(entry));
1518         }
1519         HvRITER_set(ohv, riter);
1520         HvEITER_set(ohv, eiter);
1521     }
1522     hv_magic(hv, NULL, PERL_MAGIC_hints);
1523     return hv;
1524 }
1525
1526 void
1527 Perl_hv_free_ent(pTHX_ HV *hv, register HE *entry)
1528 {
1529     dVAR;
1530     SV *val;
1531
1532     if (!entry)
1533         return;
1534     val = HeVAL(entry);
1535     if (val && isGV(val) && GvCVu(val) && HvNAME_get(hv))
1536         PL_sub_generation++;    /* may be deletion of method from stash */
1537     SvREFCNT_dec(val);
1538     if (HeKLEN(entry) == HEf_SVKEY) {
1539         SvREFCNT_dec(HeKEY_sv(entry));
1540         Safefree(HeKEY_hek(entry));
1541     }
1542     else if (HvSHAREKEYS(hv))
1543         unshare_hek(HeKEY_hek(entry));
1544     else
1545         Safefree(HeKEY_hek(entry));
1546     del_HE(entry);
1547 }
1548
1549 void
1550 Perl_hv_delayfree_ent(pTHX_ HV *hv, register HE *entry)
1551 {
1552     dVAR;
1553     if (!entry)
1554         return;
1555     /* SvREFCNT_inc to counter the SvREFCNT_dec in hv_free_ent  */
1556     sv_2mortal(SvREFCNT_inc(HeVAL(entry)));     /* free between statements */
1557     if (HeKLEN(entry) == HEf_SVKEY) {
1558         sv_2mortal(SvREFCNT_inc(HeKEY_sv(entry)));
1559     }
1560     hv_free_ent(hv, entry);
1561 }
1562
1563 /*
1564 =for apidoc hv_clear
1565
1566 Clears a hash, making it empty.
1567
1568 =cut
1569 */
1570
1571 void
1572 Perl_hv_clear(pTHX_ HV *hv)
1573 {
1574     dVAR;
1575     register XPVHV* xhv;
1576     if (!hv)
1577         return;
1578
1579     DEBUG_A(Perl_hv_assert(aTHX_ hv));
1580
1581     xhv = (XPVHV*)SvANY(hv);
1582
1583     if (SvREADONLY(hv) && HvARRAY(hv) != NULL) {
1584         /* restricted hash: convert all keys to placeholders */
1585         STRLEN i;
1586         for (i = 0; i <= xhv->xhv_max; i++) {
1587             HE *entry = (HvARRAY(hv))[i];
1588             for (; entry; entry = HeNEXT(entry)) {
1589                 /* not already placeholder */
1590                 if (HeVAL(entry) != &PL_sv_placeholder) {
1591                     if (HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
1592                         SV* const keysv = hv_iterkeysv(entry);
1593                         Perl_croak(aTHX_
1594                                    "Attempt to delete readonly key '%"SVf"' from a restricted hash",
1595                                    (void*)keysv);
1596                     }
1597                     SvREFCNT_dec(HeVAL(entry));
1598                     HeVAL(entry) = &PL_sv_placeholder;
1599                     HvPLACEHOLDERS(hv)++;
1600                 }
1601             }
1602         }
1603         goto reset;
1604     }
1605
1606     hfreeentries(hv);
1607     HvPLACEHOLDERS_set(hv, 0);
1608     if (HvARRAY(hv))
1609         Zero(HvARRAY(hv), xhv->xhv_max+1 /* HvMAX(hv)+1 */, HE*);
1610
1611     if (SvRMAGICAL(hv))
1612         mg_clear((SV*)hv);
1613
1614     HvHASKFLAGS_off(hv);
1615     HvREHASH_off(hv);
1616     reset:
1617     if (SvOOK(hv)) {
1618         HvEITER_set(hv, NULL);
1619     }
1620 }
1621
1622 /*
1623 =for apidoc hv_clear_placeholders
1624
1625 Clears any placeholders from a hash.  If a restricted hash has any of its keys
1626 marked as readonly and the key is subsequently deleted, the key is not actually
1627 deleted but is marked by assigning it a value of &PL_sv_placeholder.  This tags
1628 it so it will be ignored by future operations such as iterating over the hash,
1629 but will still allow the hash to have a value reassigned to the key at some
1630 future point.  This function clears any such placeholder keys from the hash.
1631 See Hash::Util::lock_keys() for an example of its use.
1632
1633 =cut
1634 */
1635
1636 void
1637 Perl_hv_clear_placeholders(pTHX_ HV *hv)
1638 {
1639     dVAR;
1640     const U32 items = (U32)HvPLACEHOLDERS_get(hv);
1641
1642     if (items)
1643         clear_placeholders(hv, items);
1644 }
1645
1646 static void
1647 S_clear_placeholders(pTHX_ HV *hv, U32 items)
1648 {
1649     dVAR;
1650     I32 i;
1651
1652     if (items == 0)
1653         return;
1654
1655     i = HvMAX(hv);
1656     do {
1657         /* Loop down the linked list heads  */
1658         bool first = TRUE;
1659         HE **oentry = &(HvARRAY(hv))[i];
1660         HE *entry;
1661
1662         while ((entry = *oentry)) {
1663             if (HeVAL(entry) == &PL_sv_placeholder) {
1664                 *oentry = HeNEXT(entry);
1665                 if (first && !*oentry)
1666                     HvFILL(hv)--; /* This linked list is now empty.  */
1667                 if (entry == HvEITER_get(hv))
1668                     HvLAZYDEL_on(hv);
1669                 else
1670                     hv_free_ent(hv, entry);
1671
1672                 if (--items == 0) {
1673                     /* Finished.  */
1674                     HvTOTALKEYS(hv) -= (IV)HvPLACEHOLDERS_get(hv);
1675                     if (HvKEYS(hv) == 0)
1676                         HvHASKFLAGS_off(hv);
1677                     HvPLACEHOLDERS_set(hv, 0);
1678                     return;
1679                 }
1680             } else {
1681                 oentry = &HeNEXT(entry);
1682                 first = FALSE;
1683             }
1684         }
1685     } while (--i >= 0);
1686     /* You can't get here, hence assertion should always fail.  */
1687     assert (items == 0);
1688     assert (0);
1689 }
1690
1691 STATIC void
1692 S_hfreeentries(pTHX_ HV *hv)
1693 {
1694     /* This is the array that we're going to restore  */
1695     HE **const orig_array = HvARRAY(hv);
1696     HEK *name;
1697     int attempts = 100;
1698
1699     if (!orig_array)
1700         return;
1701
1702     if (SvOOK(hv)) {
1703         /* If the hash is actually a symbol table with a name, look after the
1704            name.  */
1705         struct xpvhv_aux *iter = HvAUX(hv);
1706
1707         name = iter->xhv_name;
1708         iter->xhv_name = NULL;
1709     } else {
1710         name = NULL;
1711     }
1712
1713     /* orig_array remains unchanged throughout the loop. If after freeing all
1714        the entries it turns out that one of the little blighters has triggered
1715        an action that has caused HvARRAY to be re-allocated, then we set
1716        array to the new HvARRAY, and try again.  */
1717
1718     while (1) {
1719         /* This is the one we're going to try to empty.  First time round
1720            it's the original array.  (Hopefully there will only be 1 time
1721            round) */
1722         HE ** const array = HvARRAY(hv);
1723         I32 i = HvMAX(hv);
1724
1725         /* Because we have taken xhv_name out, the only allocated pointer
1726            in the aux structure that might exist is the backreference array.
1727         */
1728
1729         if (SvOOK(hv)) {
1730             HE *entry;
1731             struct xpvhv_aux *iter = HvAUX(hv);
1732             /* If there are weak references to this HV, we need to avoid
1733                freeing them up here.  In particular we need to keep the AV
1734                visible as what we're deleting might well have weak references
1735                back to this HV, so the for loop below may well trigger
1736                the removal of backreferences from this array.  */
1737
1738             if (iter->xhv_backreferences) {
1739                 /* So donate them to regular backref magic to keep them safe.
1740                    The sv_magic will increase the reference count of the AV,
1741                    so we need to drop it first. */
1742                 SvREFCNT_dec(iter->xhv_backreferences);
1743                 if (AvFILLp(iter->xhv_backreferences) == -1) {
1744                     /* Turns out that the array is empty. Just free it.  */
1745                     SvREFCNT_dec(iter->xhv_backreferences);
1746
1747                 } else {
1748                     sv_magic((SV*)hv, (SV*)iter->xhv_backreferences,
1749                              PERL_MAGIC_backref, NULL, 0);
1750                 }
1751                 iter->xhv_backreferences = NULL;
1752             }
1753
1754             entry = iter->xhv_eiter; /* HvEITER(hv) */
1755             if (entry && HvLAZYDEL(hv)) {       /* was deleted earlier? */
1756                 HvLAZYDEL_off(hv);
1757                 hv_free_ent(hv, entry);
1758             }
1759             iter->xhv_riter = -1;       /* HvRITER(hv) = -1 */
1760             iter->xhv_eiter = NULL;     /* HvEITER(hv) = NULL */
1761
1762             /* There are now no allocated pointers in the aux structure.  */
1763
1764             SvFLAGS(hv) &= ~SVf_OOK; /* Goodbye, aux structure.  */
1765             /* What aux structure?  */
1766         }
1767
1768         /* make everyone else think the array is empty, so that the destructors
1769          * called for freed entries can't recusively mess with us */
1770         HvARRAY(hv) = NULL;
1771         HvFILL(hv) = 0;
1772         ((XPVHV*) SvANY(hv))->xhv_keys = 0;
1773
1774
1775         do {
1776             /* Loop down the linked list heads  */
1777             HE *entry = array[i];
1778
1779             while (entry) {
1780                 register HE * const oentry = entry;
1781                 entry = HeNEXT(entry);
1782                 hv_free_ent(hv, oentry);
1783             }
1784         } while (--i >= 0);
1785
1786         /* As there are no allocated pointers in the aux structure, it's now
1787            safe to free the array we just cleaned up, if it's not the one we're
1788            going to put back.  */
1789         if (array != orig_array) {
1790             Safefree(array);
1791         }
1792
1793         if (!HvARRAY(hv)) {
1794             /* Good. No-one added anything this time round.  */
1795             break;
1796         }
1797
1798         if (SvOOK(hv)) {
1799             /* Someone attempted to iterate or set the hash name while we had
1800                the array set to 0.  We'll catch backferences on the next time
1801                round the while loop.  */
1802             assert(HvARRAY(hv));
1803
1804             if (HvAUX(hv)->xhv_name) {
1805                 unshare_hek_or_pvn(HvAUX(hv)->xhv_name, 0, 0, 0);
1806             }
1807         }
1808
1809         if (--attempts == 0) {
1810             Perl_die(aTHX_ "panic: hfreeentries failed to free hash - something is repeatedly re-creating entries");
1811         }
1812     }
1813         
1814     HvARRAY(hv) = orig_array;
1815
1816     /* If the hash was actually a symbol table, put the name back.  */
1817     if (name) {
1818         /* We have restored the original array.  If name is non-NULL, then
1819            the original array had an aux structure at the end. So this is
1820            valid:  */
1821         SvFLAGS(hv) |= SVf_OOK;
1822         HvAUX(hv)->xhv_name = name;
1823     }
1824 }
1825
1826 /*
1827 =for apidoc hv_undef
1828
1829 Undefines the hash.
1830
1831 =cut
1832 */
1833
1834 void
1835 Perl_hv_undef(pTHX_ HV *hv)
1836 {
1837     dVAR;
1838     register XPVHV* xhv;
1839     const char *name;
1840
1841     if (!hv)
1842         return;
1843     DEBUG_A(Perl_hv_assert(aTHX_ hv));
1844     xhv = (XPVHV*)SvANY(hv);
1845     hfreeentries(hv);
1846     if ((name = HvNAME_get(hv))) {
1847         if(PL_stashcache)
1848             hv_delete(PL_stashcache, name, HvNAMELEN_get(hv), G_DISCARD);
1849         hv_name_set(hv, NULL, 0, 0);
1850     }
1851     SvFLAGS(hv) &= ~SVf_OOK;
1852     Safefree(HvARRAY(hv));
1853     xhv->xhv_max   = 7; /* HvMAX(hv) = 7 (it's a normal hash) */
1854     HvARRAY(hv) = 0;
1855     HvPLACEHOLDERS_set(hv, 0);
1856
1857     if (SvRMAGICAL(hv))
1858         mg_clear((SV*)hv);
1859 }
1860
1861 static struct xpvhv_aux*
1862 S_hv_auxinit(HV *hv) {
1863     struct xpvhv_aux *iter;
1864     char *array;
1865
1866     if (!HvARRAY(hv)) {
1867         Newxz(array, PERL_HV_ARRAY_ALLOC_BYTES(HvMAX(hv) + 1)
1868             + sizeof(struct xpvhv_aux), char);
1869     } else {
1870         array = (char *) HvARRAY(hv);
1871         Renew(array, PERL_HV_ARRAY_ALLOC_BYTES(HvMAX(hv) + 1)
1872               + sizeof(struct xpvhv_aux), char);
1873     }
1874     HvARRAY(hv) = (HE**) array;
1875     /* SvOOK_on(hv) attacks the IV flags.  */
1876     SvFLAGS(hv) |= SVf_OOK;
1877     iter = HvAUX(hv);
1878
1879     iter->xhv_riter = -1;       /* HvRITER(hv) = -1 */
1880     iter->xhv_eiter = NULL;     /* HvEITER(hv) = NULL */
1881     iter->xhv_name = 0;
1882     iter->xhv_backreferences = 0;
1883     return iter;
1884 }
1885
1886 /*
1887 =for apidoc hv_iterinit
1888
1889 Prepares a starting point to traverse a hash table.  Returns the number of
1890 keys in the hash (i.e. the same as C<HvKEYS(tb)>).  The return value is
1891 currently only meaningful for hashes without tie magic.
1892
1893 NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
1894 hash buckets that happen to be in use.  If you still need that esoteric
1895 value, you can get it through the macro C<HvFILL(tb)>.
1896
1897
1898 =cut
1899 */
1900
1901 I32
1902 Perl_hv_iterinit(pTHX_ HV *hv)
1903 {
1904     if (!hv)
1905         Perl_croak(aTHX_ "Bad hash");
1906
1907     if (SvOOK(hv)) {
1908         struct xpvhv_aux * const iter = HvAUX(hv);
1909         HE * const entry = iter->xhv_eiter; /* HvEITER(hv) */
1910         if (entry && HvLAZYDEL(hv)) {   /* was deleted earlier? */
1911             HvLAZYDEL_off(hv);
1912             hv_free_ent(hv, entry);
1913         }
1914         iter->xhv_riter = -1;   /* HvRITER(hv) = -1 */
1915         iter->xhv_eiter = NULL; /* HvEITER(hv) = NULL */
1916     } else {
1917         hv_auxinit(hv);
1918     }
1919
1920     /* used to be xhv->xhv_fill before 5.004_65 */
1921     return HvTOTALKEYS(hv);
1922 }
1923
1924 I32 *
1925 Perl_hv_riter_p(pTHX_ HV *hv) {
1926     struct xpvhv_aux *iter;
1927
1928     if (!hv)
1929         Perl_croak(aTHX_ "Bad hash");
1930
1931     iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
1932     return &(iter->xhv_riter);
1933 }
1934
1935 HE **
1936 Perl_hv_eiter_p(pTHX_ HV *hv) {
1937     struct xpvhv_aux *iter;
1938
1939     if (!hv)
1940         Perl_croak(aTHX_ "Bad hash");
1941
1942     iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
1943     return &(iter->xhv_eiter);
1944 }
1945
1946 void
1947 Perl_hv_riter_set(pTHX_ HV *hv, I32 riter) {
1948     struct xpvhv_aux *iter;
1949
1950     if (!hv)
1951         Perl_croak(aTHX_ "Bad hash");
1952
1953     if (SvOOK(hv)) {
1954         iter = HvAUX(hv);
1955     } else {
1956         if (riter == -1)
1957             return;
1958
1959         iter = hv_auxinit(hv);
1960     }
1961     iter->xhv_riter = riter;
1962 }
1963
1964 void
1965 Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter) {
1966     struct xpvhv_aux *iter;
1967
1968     if (!hv)
1969         Perl_croak(aTHX_ "Bad hash");
1970
1971     if (SvOOK(hv)) {
1972         iter = HvAUX(hv);
1973     } else {
1974         /* 0 is the default so don't go malloc()ing a new structure just to
1975            hold 0.  */
1976         if (!eiter)
1977             return;
1978
1979         iter = hv_auxinit(hv);
1980     }
1981     iter->xhv_eiter = eiter;
1982 }
1983
1984 void
1985 Perl_hv_name_set(pTHX_ HV *hv, const char *name, U32 len, U32 flags)
1986 {
1987     dVAR;
1988     struct xpvhv_aux *iter;
1989     U32 hash;
1990
1991     PERL_UNUSED_ARG(flags);
1992
1993     if (len > I32_MAX)
1994         Perl_croak(aTHX_ "panic: hv name too long (%"UVuf")", (UV) len);
1995
1996     if (SvOOK(hv)) {
1997         iter = HvAUX(hv);
1998         if (iter->xhv_name) {
1999             unshare_hek_or_pvn(iter->xhv_name, 0, 0, 0);
2000         }
2001     } else {
2002         if (name == 0)
2003             return;
2004
2005         iter = hv_auxinit(hv);
2006     }
2007     PERL_HASH(hash, name, len);
2008     iter->xhv_name = name ? share_hek(name, len, hash) : 0;
2009 }
2010
2011 AV **
2012 Perl_hv_backreferences_p(pTHX_ HV *hv) {
2013     struct xpvhv_aux * const iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv);
2014     PERL_UNUSED_CONTEXT;
2015     return &(iter->xhv_backreferences);
2016 }
2017
2018 void
2019 Perl_hv_kill_backrefs(pTHX_ HV *hv) {
2020     AV *av;
2021
2022     if (!SvOOK(hv))
2023         return;
2024
2025     av = HvAUX(hv)->xhv_backreferences;
2026
2027     if (av) {
2028         HvAUX(hv)->xhv_backreferences = 0;
2029         Perl_sv_kill_backrefs(aTHX_ (SV*) hv, av);
2030     }
2031 }
2032
2033 /*
2034 hv_iternext is implemented as a macro in hv.h
2035
2036 =for apidoc hv_iternext
2037
2038 Returns entries from a hash iterator.  See C<hv_iterinit>.
2039
2040 You may call C<hv_delete> or C<hv_delete_ent> on the hash entry that the
2041 iterator currently points to, without losing your place or invalidating your
2042 iterator.  Note that in this case the current entry is deleted from the hash
2043 with your iterator holding the last reference to it.  Your iterator is flagged
2044 to free the entry on the next call to C<hv_iternext>, so you must not discard
2045 your iterator immediately else the entry will leak - call C<hv_iternext> to
2046 trigger the resource deallocation.
2047
2048 =for apidoc hv_iternext_flags
2049
2050 Returns entries from a hash iterator.  See C<hv_iterinit> and C<hv_iternext>.
2051 The C<flags> value will normally be zero; if HV_ITERNEXT_WANTPLACEHOLDERS is
2052 set the placeholders keys (for restricted hashes) will be returned in addition
2053 to normal keys. By default placeholders are automatically skipped over.
2054 Currently a placeholder is implemented with a value that is
2055 C<&Perl_sv_placeholder>. Note that the implementation of placeholders and
2056 restricted hashes may change, and the implementation currently is
2057 insufficiently abstracted for any change to be tidy.
2058
2059 =cut
2060 */
2061
2062 HE *
2063 Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags)
2064 {
2065     dVAR;
2066     register XPVHV* xhv;
2067     register HE *entry;
2068     HE *oldentry;
2069     MAGIC* mg;
2070     struct xpvhv_aux *iter;
2071
2072     if (!hv)
2073         Perl_croak(aTHX_ "Bad hash");
2074
2075     xhv = (XPVHV*)SvANY(hv);
2076
2077     if (!SvOOK(hv)) {
2078         /* Too many things (well, pp_each at least) merrily assume that you can
2079            call iv_iternext without calling hv_iterinit, so we'll have to deal
2080            with it.  */
2081         hv_iterinit(hv);
2082     }
2083     iter = HvAUX(hv);
2084
2085     oldentry = entry = iter->xhv_eiter; /* HvEITER(hv) */
2086     if (SvMAGICAL(hv) && SvRMAGICAL(hv)) {
2087         if ( ( mg = mg_find((SV*)hv, PERL_MAGIC_tied) ) ) {
2088             SV * const key = sv_newmortal();
2089             if (entry) {
2090                 sv_setsv(key, HeSVKEY_force(entry));
2091                 SvREFCNT_dec(HeSVKEY(entry));       /* get rid of previous key */
2092             }
2093             else {
2094                 char *k;
2095                 HEK *hek;
2096
2097                 /* one HE per MAGICAL hash */
2098                 iter->xhv_eiter = entry = new_HE(); /* HvEITER(hv) = new_HE() */
2099                 Zero(entry, 1, HE);
2100                 Newxz(k, HEK_BASESIZE + sizeof(SV*), char);
2101                 hek = (HEK*)k;
2102                 HeKEY_hek(entry) = hek;
2103                 HeKLEN(entry) = HEf_SVKEY;
2104             }
2105             magic_nextpack((SV*) hv,mg,key);
2106             if (SvOK(key)) {
2107                 /* force key to stay around until next time */
2108                 HeSVKEY_set(entry, SvREFCNT_inc_simple_NN(key));
2109                 return entry;               /* beware, hent_val is not set */
2110             }
2111             if (HeVAL(entry))
2112                 SvREFCNT_dec(HeVAL(entry));
2113             Safefree(HeKEY_hek(entry));
2114             del_HE(entry);
2115             iter->xhv_eiter = NULL; /* HvEITER(hv) = NULL */
2116             return NULL;
2117         }
2118     }
2119 #if defined(DYNAMIC_ENV_FETCH) && !defined(__riscos__)  /* set up %ENV for iteration */
2120     if (!entry && SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
2121         prime_env_iter();
2122 #ifdef VMS
2123         /* The prime_env_iter() on VMS just loaded up new hash values
2124          * so the iteration count needs to be reset back to the beginning
2125          */
2126         hv_iterinit(hv);
2127         iter = HvAUX(hv);
2128         oldentry = entry = iter->xhv_eiter; /* HvEITER(hv) */
2129 #endif
2130     }
2131 #endif
2132
2133     /* hv_iterint now ensures this.  */
2134     assert (HvARRAY(hv));
2135
2136     /* At start of hash, entry is NULL.  */
2137     if (entry)
2138     {
2139         entry = HeNEXT(entry);
2140         if (!(flags & HV_ITERNEXT_WANTPLACEHOLDERS)) {
2141             /*
2142              * Skip past any placeholders -- don't want to include them in
2143              * any iteration.
2144              */
2145             while (entry && HeVAL(entry) == &PL_sv_placeholder) {
2146                 entry = HeNEXT(entry);
2147             }
2148         }
2149     }
2150     while (!entry) {
2151         /* OK. Come to the end of the current list.  Grab the next one.  */
2152
2153         iter->xhv_riter++; /* HvRITER(hv)++ */
2154         if (iter->xhv_riter > (I32)xhv->xhv_max /* HvRITER(hv) > HvMAX(hv) */) {
2155             /* There is no next one.  End of the hash.  */
2156             iter->xhv_riter = -1; /* HvRITER(hv) = -1 */
2157             break;
2158         }
2159         entry = (HvARRAY(hv))[iter->xhv_riter];
2160
2161         if (!(flags & HV_ITERNEXT_WANTPLACEHOLDERS)) {
2162             /* If we have an entry, but it's a placeholder, don't count it.
2163                Try the next.  */
2164             while (entry && HeVAL(entry) == &PL_sv_placeholder)
2165                 entry = HeNEXT(entry);
2166         }
2167         /* Will loop again if this linked list starts NULL
2168            (for HV_ITERNEXT_WANTPLACEHOLDERS)
2169            or if we run through it and find only placeholders.  */
2170     }
2171
2172     if (oldentry && HvLAZYDEL(hv)) {            /* was deleted earlier? */
2173         HvLAZYDEL_off(hv);
2174         hv_free_ent(hv, oldentry);
2175     }
2176
2177     /*if (HvREHASH(hv) && entry && !HeKREHASH(entry))
2178       PerlIO_printf(PerlIO_stderr(), "Awooga %p %p\n", (void*)hv, (void*)entry);*/
2179
2180     iter->xhv_eiter = entry; /* HvEITER(hv) = entry */
2181     return entry;
2182 }
2183
2184 /*
2185 =for apidoc hv_iterkey
2186
2187 Returns the key from the current position of the hash iterator.  See
2188 C<hv_iterinit>.
2189
2190 =cut
2191 */
2192
2193 char *
2194 Perl_hv_iterkey(pTHX_ register HE *entry, I32 *retlen)
2195 {
2196     if (HeKLEN(entry) == HEf_SVKEY) {
2197         STRLEN len;
2198         char * const p = SvPV(HeKEY_sv(entry), len);
2199         *retlen = len;
2200         return p;
2201     }
2202     else {
2203         *retlen = HeKLEN(entry);
2204         return HeKEY(entry);
2205     }
2206 }
2207
2208 /* unlike hv_iterval(), this always returns a mortal copy of the key */
2209 /*
2210 =for apidoc hv_iterkeysv
2211
2212 Returns the key as an C<SV*> from the current position of the hash
2213 iterator.  The return value will always be a mortal copy of the key.  Also
2214 see C<hv_iterinit>.
2215
2216 =cut
2217 */
2218
2219 SV *
2220 Perl_hv_iterkeysv(pTHX_ register HE *entry)
2221 {
2222     return sv_2mortal(newSVhek(HeKEY_hek(entry)));
2223 }
2224
2225 /*
2226 =for apidoc hv_iterval
2227
2228 Returns the value from the current position of the hash iterator.  See
2229 C<hv_iterkey>.
2230
2231 =cut
2232 */
2233
2234 SV *
2235 Perl_hv_iterval(pTHX_ HV *hv, register HE *entry)
2236 {
2237     if (SvRMAGICAL(hv)) {
2238         if (mg_find((SV*)hv, PERL_MAGIC_tied)) {
2239             SV* const sv = sv_newmortal();
2240             if (HeKLEN(entry) == HEf_SVKEY)
2241                 mg_copy((SV*)hv, sv, (char*)HeKEY_sv(entry), HEf_SVKEY);
2242             else
2243                 mg_copy((SV*)hv, sv, HeKEY(entry), HeKLEN(entry));
2244             return sv;
2245         }
2246     }
2247     return HeVAL(entry);
2248 }
2249
2250 /*
2251 =for apidoc hv_iternextsv
2252
2253 Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
2254 operation.
2255
2256 =cut
2257 */
2258
2259 SV *
2260 Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
2261 {
2262     HE * const he = hv_iternext_flags(hv, 0);
2263
2264     if (!he)
2265         return NULL;
2266     *key = hv_iterkey(he, retlen);
2267     return hv_iterval(hv, he);
2268 }
2269
2270 /*
2271
2272 Now a macro in hv.h
2273
2274 =for apidoc hv_magic
2275
2276 Adds magic to a hash.  See C<sv_magic>.
2277
2278 =cut
2279 */
2280
2281 /* possibly free a shared string if no one has access to it
2282  * len and hash must both be valid for str.
2283  */
2284 void
2285 Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
2286 {
2287     unshare_hek_or_pvn (NULL, str, len, hash);
2288 }
2289
2290
2291 void
2292 Perl_unshare_hek(pTHX_ HEK *hek)
2293 {
2294     unshare_hek_or_pvn(hek, NULL, 0, 0);
2295 }
2296
2297 /* possibly free a shared string if no one has access to it
2298    hek if non-NULL takes priority over the other 3, else str, len and hash
2299    are used.  If so, len and hash must both be valid for str.
2300  */
2301 STATIC void
2302 S_unshare_hek_or_pvn(pTHX_ const HEK *hek, const char *str, I32 len, U32 hash)
2303 {
2304     dVAR;
2305     register XPVHV* xhv;
2306     HE *entry;
2307     register HE **oentry;
2308     HE **first;
2309     bool is_utf8 = FALSE;
2310     int k_flags = 0;
2311     const char * const save = str;
2312     struct shared_he *he = NULL;
2313
2314     if (hek) {
2315         /* Find the shared he which is just before us in memory.  */
2316         he = (struct shared_he *)(((char *)hek)
2317                                   - STRUCT_OFFSET(struct shared_he,
2318                                                   shared_he_hek));
2319
2320         /* Assert that the caller passed us a genuine (or at least consistent)
2321            shared hek  */
2322         assert (he->shared_he_he.hent_hek == hek);
2323
2324         LOCK_STRTAB_MUTEX;
2325         if (he->shared_he_he.he_valu.hent_refcount - 1) {
2326             --he->shared_he_he.he_valu.hent_refcount;
2327             UNLOCK_STRTAB_MUTEX;
2328             return;
2329         }
2330         UNLOCK_STRTAB_MUTEX;
2331
2332         hash = HEK_HASH(hek);
2333     } else if (len < 0) {
2334         STRLEN tmplen = -len;
2335         is_utf8 = TRUE;
2336         /* See the note in hv_fetch(). --jhi */
2337         str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
2338         len = tmplen;
2339         if (is_utf8)
2340             k_flags = HVhek_UTF8;
2341         if (str != save)
2342             k_flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
2343     }
2344
2345     /* what follows was the moral equivalent of:
2346     if ((Svp = hv_fetch(PL_strtab, tmpsv, FALSE, hash))) {
2347         if (--*Svp == NULL)
2348             hv_delete(PL_strtab, str, len, G_DISCARD, hash);
2349     } */
2350     xhv = (XPVHV*)SvANY(PL_strtab);
2351     /* assert(xhv_array != 0) */
2352     LOCK_STRTAB_MUTEX;
2353     first = oentry = &(HvARRAY(PL_strtab))[hash & (I32) HvMAX(PL_strtab)];
2354     if (he) {
2355         const HE *const he_he = &(he->shared_he_he);
2356         for (entry = *oentry; entry; oentry = &HeNEXT(entry), entry = *oentry) {
2357             if (entry == he_he)
2358                 break;
2359         }
2360     } else {
2361         const int flags_masked = k_flags & HVhek_MASK;
2362         for (entry = *oentry; entry; oentry = &HeNEXT(entry), entry = *oentry) {
2363             if (HeHASH(entry) != hash)          /* strings can't be equal */
2364                 continue;
2365             if (HeKLEN(entry) != len)
2366                 continue;
2367             if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len))     /* is this it? */
2368                 continue;
2369             if (HeKFLAGS(entry) != flags_masked)
2370                 continue;
2371             break;
2372         }
2373     }
2374
2375     if (entry) {
2376         if (--entry->he_valu.hent_refcount == 0) {
2377             *oentry = HeNEXT(entry);
2378             if (!*first) {
2379                 /* There are now no entries in our slot.  */
2380                 xhv->xhv_fill--; /* HvFILL(hv)-- */
2381             }
2382             Safefree(entry);
2383             xhv->xhv_keys--; /* HvTOTALKEYS(hv)-- */
2384         }
2385     }
2386
2387     UNLOCK_STRTAB_MUTEX;
2388     if (!entry && ckWARN_d(WARN_INTERNAL))
2389         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
2390                     "Attempt to free non-existent shared string '%s'%s"
2391                     pTHX__FORMAT,
2392                     hek ? HEK_KEY(hek) : str,
2393                     ((k_flags & HVhek_UTF8) ? " (utf8)" : "") pTHX__VALUE);
2394     if (k_flags & HVhek_FREEKEY)
2395         Safefree(str);
2396 }
2397
2398 /* get a (constant) string ptr from the global string table
2399  * string will get added if it is not already there.
2400  * len and hash must both be valid for str.
2401  */
2402 HEK *
2403 Perl_share_hek(pTHX_ const char *str, I32 len, register U32 hash)
2404 {
2405     bool is_utf8 = FALSE;
2406     int flags = 0;
2407     const char * const save = str;
2408
2409     if (len < 0) {
2410       STRLEN tmplen = -len;
2411       is_utf8 = TRUE;
2412       /* See the note in hv_fetch(). --jhi */
2413       str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
2414       len = tmplen;
2415       /* If we were able to downgrade here, then than means that we were passed
2416          in a key which only had chars 0-255, but was utf8 encoded.  */
2417       if (is_utf8)
2418           flags = HVhek_UTF8;
2419       /* If we found we were able to downgrade the string to bytes, then
2420          we should flag that it needs upgrading on keys or each.  Also flag
2421          that we need share_hek_flags to free the string.  */
2422       if (str != save)
2423           flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
2424     }
2425
2426     return share_hek_flags (str, len, hash, flags);
2427 }
2428
2429 STATIC HEK *
2430 S_share_hek_flags(pTHX_ const char *str, I32 len, register U32 hash, int flags)
2431 {
2432     dVAR;
2433     register HE *entry;
2434     const int flags_masked = flags & HVhek_MASK;
2435     const U32 hindex = hash & (I32) HvMAX(PL_strtab);
2436
2437     /* what follows is the moral equivalent of:
2438
2439     if (!(Svp = hv_fetch(PL_strtab, str, len, FALSE)))
2440         hv_store(PL_strtab, str, len, NULL, hash);
2441
2442         Can't rehash the shared string table, so not sure if it's worth
2443         counting the number of entries in the linked list
2444     */
2445     register XPVHV * const xhv = (XPVHV*)SvANY(PL_strtab);
2446     /* assert(xhv_array != 0) */
2447     LOCK_STRTAB_MUTEX;
2448     entry = (HvARRAY(PL_strtab))[hindex];
2449     for (;entry; entry = HeNEXT(entry)) {
2450         if (HeHASH(entry) != hash)              /* strings can't be equal */
2451             continue;
2452         if (HeKLEN(entry) != len)
2453             continue;
2454         if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
2455             continue;
2456         if (HeKFLAGS(entry) != flags_masked)
2457             continue;
2458         break;
2459     }
2460
2461     if (!entry) {
2462         /* What used to be head of the list.
2463            If this is NULL, then we're the first entry for this slot, which
2464            means we need to increate fill.  */
2465         struct shared_he *new_entry;
2466         HEK *hek;
2467         char *k;
2468         HE **const head = &HvARRAY(PL_strtab)[hindex];
2469         HE *const next = *head;
2470
2471         /* We don't actually store a HE from the arena and a regular HEK.
2472            Instead we allocate one chunk of memory big enough for both,
2473            and put the HEK straight after the HE. This way we can find the
2474            HEK directly from the HE.
2475         */
2476
2477         Newx(k, STRUCT_OFFSET(struct shared_he,
2478                                 shared_he_hek.hek_key[0]) + len + 2, char);
2479         new_entry = (struct shared_he *)k;
2480         entry = &(new_entry->shared_he_he);
2481         hek = &(new_entry->shared_he_hek);
2482
2483         Copy(str, HEK_KEY(hek), len, char);
2484         HEK_KEY(hek)[len] = 0;
2485         HEK_LEN(hek) = len;
2486         HEK_HASH(hek) = hash;
2487         HEK_FLAGS(hek) = (unsigned char)flags_masked;
2488
2489         /* Still "point" to the HEK, so that other code need not know what
2490            we're up to.  */
2491         HeKEY_hek(entry) = hek;
2492         entry->he_valu.hent_refcount = 0;
2493         HeNEXT(entry) = next;
2494         *head = entry;
2495
2496         xhv->xhv_keys++; /* HvTOTALKEYS(hv)++ */
2497         if (!next) {                    /* initial entry? */
2498             xhv->xhv_fill++; /* HvFILL(hv)++ */
2499         } else if (xhv->xhv_keys > (IV)xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */) {
2500                 hsplit(PL_strtab);
2501         }
2502     }
2503
2504     ++entry->he_valu.hent_refcount;
2505     UNLOCK_STRTAB_MUTEX;
2506
2507     if (flags & HVhek_FREEKEY)
2508         Safefree(str);
2509
2510     return HeKEY_hek(entry);
2511 }
2512
2513 STATIC SV *
2514 S_hv_magic_uvar_xkey(pTHX_ HV* hv, SV* keysv, int action)
2515 {
2516     MAGIC* mg;
2517     if ((mg = mg_find((SV*)hv, PERL_MAGIC_uvar))) {
2518         struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2519         if (uf->uf_set == NULL) {
2520             SV* obj = mg->mg_obj;
2521             mg->mg_obj = keysv;         /* pass key */
2522             uf->uf_index = action;      /* pass action */
2523             magic_getuvar((SV*)hv, mg);
2524             keysv = mg->mg_obj;         /* may have changed */
2525             mg->mg_obj = obj;
2526         }
2527     }
2528     return keysv;
2529 }
2530
2531 I32 *
2532 Perl_hv_placeholders_p(pTHX_ HV *hv)
2533 {
2534     dVAR;
2535     MAGIC *mg = mg_find((SV*)hv, PERL_MAGIC_rhash);
2536
2537     if (!mg) {
2538         mg = sv_magicext((SV*)hv, 0, PERL_MAGIC_rhash, 0, 0, 0);
2539
2540         if (!mg) {
2541             Perl_die(aTHX_ "panic: hv_placeholders_p");
2542         }
2543     }
2544     return &(mg->mg_len);
2545 }
2546
2547
2548 I32
2549 Perl_hv_placeholders_get(pTHX_ HV *hv)
2550 {
2551     dVAR;
2552     MAGIC * const mg = mg_find((SV*)hv, PERL_MAGIC_rhash);
2553
2554     return mg ? mg->mg_len : 0;
2555 }
2556
2557 void
2558 Perl_hv_placeholders_set(pTHX_ HV *hv, I32 ph)
2559 {
2560     dVAR;
2561     MAGIC * const mg = mg_find((SV*)hv, PERL_MAGIC_rhash);
2562
2563     if (mg) {
2564         mg->mg_len = ph;
2565     } else if (ph) {
2566         if (!sv_magicext((SV*)hv, 0, PERL_MAGIC_rhash, 0, 0, ph))
2567             Perl_die(aTHX_ "panic: hv_placeholders_set");
2568     }
2569     /* else we don't need to add magic to record 0 placeholders.  */
2570 }
2571
2572 STATIC SV *
2573 S_refcounted_he_value(pTHX_ const struct refcounted_he *he)
2574 {
2575     dVAR;
2576     SV *value;
2577     switch(he->refcounted_he_data[0] & HVrhek_typemask) {
2578     case HVrhek_undef:
2579         value = newSV(0);
2580         break;
2581     case HVrhek_delete:
2582         value = &PL_sv_placeholder;
2583         break;
2584     case HVrhek_IV:
2585         value = (he->refcounted_he_data[0] & HVrhek_UV)
2586             ? newSVuv(he->refcounted_he_val.refcounted_he_u_iv)
2587             : newSViv(he->refcounted_he_val.refcounted_he_u_uv);
2588         break;
2589     case HVrhek_PV:
2590         /* Create a string SV that directly points to the bytes in our
2591            structure.  */
2592         value = newSV(0);
2593         sv_upgrade(value, SVt_PV);
2594         SvPV_set(value, (char *) he->refcounted_he_data + 1);
2595         SvCUR_set(value, he->refcounted_he_val.refcounted_he_u_len);
2596         /* This stops anything trying to free it  */
2597         SvLEN_set(value, 0);
2598         SvPOK_on(value);
2599         SvREADONLY_on(value);
2600         if (he->refcounted_he_data[0] & HVrhek_UTF8)
2601             SvUTF8_on(value);
2602         break;
2603     default:
2604         Perl_croak(aTHX_ "panic: refcounted_he_value bad flags %x",
2605                    he->refcounted_he_data[0]);
2606     }
2607     return value;
2608 }
2609
2610 #ifdef USE_ITHREADS
2611 /* A big expression to find the key offset */
2612 #define REF_HE_KEY(chain) \
2613         ((((chain->refcounted_he_data[0] & HVrhek_typemask) == HVrhek_PV) \
2614             ? chain->refcounted_he_val.refcounted_he_u_len + 1 : 0)       \
2615          + 1 + chain->refcounted_he_data)
2616 #endif
2617
2618 /*
2619 =for apidoc refcounted_he_chain_2hv
2620
2621 Generates an returns a C<HV *> by walking up the tree starting at the passed
2622 in C<struct refcounted_he *>.
2623
2624 =cut
2625 */
2626 HV *
2627 Perl_refcounted_he_chain_2hv(pTHX_ const struct refcounted_he *chain)
2628 {
2629     dVAR;
2630     HV *hv = newHV();
2631     U32 placeholders = 0;
2632     /* We could chase the chain once to get an idea of the number of keys,
2633        and call ksplit.  But for now we'll make a potentially inefficient
2634        hash with only 8 entries in its array.  */
2635     const U32 max = HvMAX(hv);
2636
2637     if (!HvARRAY(hv)) {
2638         char *array;
2639         Newxz(array, PERL_HV_ARRAY_ALLOC_BYTES(max + 1), char);
2640         HvARRAY(hv) = (HE**)array;
2641     }
2642
2643     while (chain) {
2644 #ifdef USE_ITHREADS
2645         U32 hash = chain->refcounted_he_hash;
2646 #else
2647         U32 hash = HEK_HASH(chain->refcounted_he_hek);
2648 #endif
2649         HE **oentry = &((HvARRAY(hv))[hash & max]);
2650         HE *entry = *oentry;
2651         SV *value;
2652
2653         for (; entry; entry = HeNEXT(entry)) {
2654             if (HeHASH(entry) == hash) {
2655                 /* We might have a duplicate key here.  If so, entry is older
2656                    than the key we've already put in the hash, so if they are
2657                    the same, skip adding entry.  */
2658 #ifdef USE_ITHREADS
2659                 const STRLEN klen = HeKLEN(entry);
2660                 const char *const key = HeKEY(entry);
2661                 if (klen == chain->refcounted_he_keylen
2662                     && (!!HeKUTF8(entry)
2663                         == !!(chain->refcounted_he_data[0] & HVhek_UTF8))
2664                     && memEQ(key, REF_HE_KEY(chain), klen))
2665                     goto next_please;
2666 #else
2667                 if (HeKEY_hek(entry) == chain->refcounted_he_hek)
2668                     goto next_please;
2669                 if (HeKLEN(entry) == HEK_LEN(chain->refcounted_he_hek)
2670                     && HeKUTF8(entry) == HEK_UTF8(chain->refcounted_he_hek)
2671                     && memEQ(HeKEY(entry), HEK_KEY(chain->refcounted_he_hek),
2672                              HeKLEN(entry)))
2673                     goto next_please;
2674 #endif
2675             }
2676         }
2677         assert (!entry);
2678         entry = new_HE();
2679
2680 #ifdef USE_ITHREADS
2681         HeKEY_hek(entry)
2682             = share_hek_flags(REF_HE_KEY(chain),
2683                               chain->refcounted_he_keylen,
2684                               chain->refcounted_he_hash,
2685                               (chain->refcounted_he_data[0]
2686                                & (HVhek_UTF8|HVhek_WASUTF8)));
2687 #else
2688         HeKEY_hek(entry) = share_hek_hek(chain->refcounted_he_hek);
2689 #endif
2690         value = refcounted_he_value(chain);
2691         if (value == &PL_sv_placeholder)
2692             placeholders++;
2693         HeVAL(entry) = value;
2694
2695         /* Link it into the chain.  */
2696         HeNEXT(entry) = *oentry;
2697         if (!HeNEXT(entry)) {
2698             /* initial entry.   */
2699             HvFILL(hv)++;
2700         }
2701         *oentry = entry;
2702
2703         HvTOTALKEYS(hv)++;
2704
2705     next_please:
2706         chain = chain->refcounted_he_next;
2707     }
2708
2709     if (placeholders) {
2710         clear_placeholders(hv, placeholders);
2711         HvTOTALKEYS(hv) -= placeholders;
2712     }
2713
2714     /* We could check in the loop to see if we encounter any keys with key
2715        flags, but it's probably not worth it, as this per-hash flag is only
2716        really meant as an optimisation for things like Storable.  */
2717     HvHASKFLAGS_on(hv);
2718     DEBUG_A(Perl_hv_assert(aTHX_ hv));
2719
2720     return hv;
2721 }
2722
2723 SV *
2724 Perl_refcounted_he_fetch(pTHX_ const struct refcounted_he *chain, SV *keysv,
2725                          const char *key, STRLEN klen, int flags, U32 hash)
2726 {
2727     dVAR;
2728     /* Just to be awkward, if you're using this interface the UTF-8-or-not-ness
2729        of your key has to exactly match that which is stored.  */
2730     SV *value = &PL_sv_placeholder;
2731     bool is_utf8;
2732
2733     if (keysv) {
2734         if (flags & HVhek_FREEKEY)
2735             Safefree(key);
2736         key = SvPV_const(keysv, klen);
2737         flags = 0;
2738         is_utf8 = (SvUTF8(keysv) != 0);
2739     } else {
2740         is_utf8 = ((flags & HVhek_UTF8) ? TRUE : FALSE);
2741     }
2742
2743     if (!hash) {
2744         if (keysv && (SvIsCOW_shared_hash(keysv))) {
2745             hash = SvSHARED_HASH(keysv);
2746         } else {
2747             PERL_HASH(hash, key, klen);
2748         }
2749     }
2750
2751     for (; chain; chain = chain->refcounted_he_next) {
2752 #ifdef USE_ITHREADS
2753         if (hash != chain->refcounted_he_hash)
2754             continue;
2755         if (klen != chain->refcounted_he_keylen)
2756             continue;
2757         if (memNE(REF_HE_KEY(chain),key,klen))
2758             continue;
2759         if (!!is_utf8 != !!(chain->refcounted_he_data[0] & HVhek_UTF8))
2760             continue;
2761 #else
2762         if (hash != HEK_HASH(chain->refcounted_he_hek))
2763             continue;
2764         if (klen != (STRLEN)HEK_LEN(chain->refcounted_he_hek))
2765             continue;
2766         if (memNE(HEK_KEY(chain->refcounted_he_hek),key,klen))
2767             continue;
2768         if (!!is_utf8 != !!HEK_UTF8(chain->refcounted_he_hek))
2769             continue;
2770 #endif
2771
2772         value = sv_2mortal(refcounted_he_value(chain));
2773         break;
2774     }
2775
2776     if (flags & HVhek_FREEKEY)
2777         Safefree(key);
2778
2779     return value;
2780 }
2781
2782 /*
2783 =for apidoc refcounted_he_new
2784
2785 Creates a new C<struct refcounted_he>. As S<key> is copied, and value is
2786 stored in a compact form, all references remain the property of the caller.
2787 The C<struct refcounted_he> is returned with a reference count of 1.
2788
2789 =cut
2790 */
2791
2792 struct refcounted_he *
2793 Perl_refcounted_he_new(pTHX_ struct refcounted_he *const parent,
2794                        SV *const key, SV *const value) {
2795     dVAR;
2796     struct refcounted_he *he;
2797     STRLEN key_len;
2798     const char *key_p = SvPV_const(key, key_len);
2799     STRLEN value_len = 0;
2800     const char *value_p = NULL;
2801     char value_type;
2802     char flags;
2803     STRLEN key_offset;
2804     U32 hash;
2805     bool is_utf8 = SvUTF8(key) ? TRUE : FALSE;
2806
2807     if (SvPOK(value)) {
2808         value_type = HVrhek_PV;
2809     } else if (SvIOK(value)) {
2810         value_type = HVrhek_IV;
2811     } else if (value == &PL_sv_placeholder) {
2812         value_type = HVrhek_delete;
2813     } else if (!SvOK(value)) {
2814         value_type = HVrhek_undef;
2815     } else {
2816         value_type = HVrhek_PV;
2817     }
2818
2819     if (value_type == HVrhek_PV) {
2820         value_p = SvPV_const(value, value_len);
2821         key_offset = value_len + 2;
2822     } else {
2823         value_len = 0;
2824         key_offset = 1;
2825     }
2826     flags = value_type;
2827
2828 #ifdef USE_ITHREADS
2829     he = (struct refcounted_he*)
2830         PerlMemShared_malloc(sizeof(struct refcounted_he) - 1
2831                              + key_len
2832                              + key_offset);
2833 #else
2834     he = (struct refcounted_he*)
2835         PerlMemShared_malloc(sizeof(struct refcounted_he) - 1
2836                              + key_offset);
2837 #endif
2838
2839
2840     he->refcounted_he_next = parent;
2841
2842     if (value_type == HVrhek_PV) {
2843         Copy(value_p, he->refcounted_he_data + 1, value_len + 1, char);
2844         he->refcounted_he_val.refcounted_he_u_len = value_len;
2845         if (SvUTF8(value)) {
2846             flags |= HVrhek_UTF8;
2847         }
2848     } else if (value_type == HVrhek_IV) {
2849         if (SvUOK(value)) {
2850             he->refcounted_he_val.refcounted_he_u_uv = SvUVX(value);
2851             flags |= HVrhek_UV;
2852         } else {
2853             he->refcounted_he_val.refcounted_he_u_iv = SvIVX(value);
2854         }
2855     }
2856
2857     if (is_utf8) {
2858         /* Hash keys are always stored normalised to (yes) ISO-8859-1.
2859            As we're going to be building hash keys from this value in future,
2860            normalise it now.  */
2861         key_p = (char*)bytes_from_utf8((const U8*)key_p, &key_len, &is_utf8);
2862         flags |= is_utf8 ? HVhek_UTF8 : HVhek_WASUTF8;
2863     }
2864     PERL_HASH(hash, key_p, key_len);
2865
2866 #ifdef USE_ITHREADS
2867     he->refcounted_he_hash = hash;
2868     he->refcounted_he_keylen = key_len;
2869     Copy(key_p, he->refcounted_he_data + key_offset, key_len, char);
2870 #else
2871     he->refcounted_he_hek = share_hek_flags(key_p, key_len, hash, flags);
2872 #endif
2873
2874     if (flags & HVhek_WASUTF8) {
2875         /* If it was downgraded from UTF-8, then the pointer returned from
2876            bytes_from_utf8 is an allocated pointer that we must free.  */
2877         Safefree(key_p);
2878     }
2879
2880     he->refcounted_he_data[0] = flags;
2881     he->refcounted_he_refcnt = 1;
2882
2883     return he;
2884 }
2885
2886 /*
2887 =for apidoc refcounted_he_free
2888
2889 Decrements the reference count of the passed in C<struct refcounted_he *>
2890 by one. If the reference count reaches zero the structure's memory is freed,
2891 and C<refcounted_he_free> iterates onto the parent node.
2892
2893 =cut
2894 */
2895
2896 void
2897 Perl_refcounted_he_free(pTHX_ struct refcounted_he *he) {
2898     dVAR;
2899     PERL_UNUSED_CONTEXT;
2900
2901     while (he) {
2902         struct refcounted_he *copy;
2903         U32 new_count;
2904
2905         HINTS_REFCNT_LOCK;
2906         new_count = --he->refcounted_he_refcnt;
2907         HINTS_REFCNT_UNLOCK;
2908         
2909         if (new_count) {
2910             return;
2911         }
2912
2913 #ifndef USE_ITHREADS
2914         unshare_hek_or_pvn (he->refcounted_he_hek, 0, 0, 0);
2915 #endif
2916         copy = he;
2917         he = he->refcounted_he_next;
2918         PerlMemShared_free(copy);
2919     }
2920 }
2921
2922 /*
2923 =for apidoc hv_assert
2924
2925 Check that a hash is in an internally consistent state.
2926
2927 =cut
2928 */
2929
2930 #ifdef DEBUGGING
2931
2932 void
2933 Perl_hv_assert(pTHX_ HV *hv)
2934 {
2935     dVAR;
2936     HE* entry;
2937     int withflags = 0;
2938     int placeholders = 0;
2939     int real = 0;
2940     int bad = 0;
2941     const I32 riter = HvRITER_get(hv);
2942     HE *eiter = HvEITER_get(hv);
2943
2944     (void)hv_iterinit(hv);
2945
2946     while ((entry = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))) {
2947         /* sanity check the values */
2948         if (HeVAL(entry) == &PL_sv_placeholder)
2949             placeholders++;
2950         else
2951             real++;
2952         /* sanity check the keys */
2953         if (HeSVKEY(entry)) {
2954             NOOP;   /* Don't know what to check on SV keys.  */
2955         } else if (HeKUTF8(entry)) {
2956             withflags++;
2957             if (HeKWASUTF8(entry)) {
2958                 PerlIO_printf(Perl_debug_log,
2959                             "hash key has both WASUTF8 and UTF8: '%.*s'\n",
2960                             (int) HeKLEN(entry),  HeKEY(entry));
2961                 bad = 1;
2962             }
2963         } else if (HeKWASUTF8(entry))
2964             withflags++;
2965     }
2966     if (!SvTIED_mg((SV*)hv, PERL_MAGIC_tied)) {
2967         static const char bad_count[] = "Count %d %s(s), but hash reports %d\n";
2968         const int nhashkeys = HvUSEDKEYS(hv);
2969         const int nhashplaceholders = HvPLACEHOLDERS_get(hv);
2970
2971         if (nhashkeys != real) {
2972             PerlIO_printf(Perl_debug_log, bad_count, real, "keys", nhashkeys );
2973             bad = 1;
2974         }
2975         if (nhashplaceholders != placeholders) {
2976             PerlIO_printf(Perl_debug_log, bad_count, placeholders, "placeholder", nhashplaceholders );
2977             bad = 1;
2978         }
2979     }
2980     if (withflags && ! HvHASKFLAGS(hv)) {
2981         PerlIO_printf(Perl_debug_log,
2982                     "Hash has HASKFLAGS off but I count %d key(s) with flags\n",
2983                     withflags);
2984         bad = 1;
2985     }
2986     if (bad) {
2987         sv_dump((SV *)hv);
2988     }
2989     HvRITER_set(hv, riter);             /* Restore hash iterator state */
2990     HvEITER_set(hv, eiter);
2991 }
2992
2993 #endif
2994
2995 /*
2996  * Local variables:
2997  * c-indentation-style: bsd
2998  * c-basic-offset: 4
2999  * indent-tabs-mode: t
3000  * End:
3001  *
3002  * ex: set ts=8 sts=4 sw=4 noet:
3003  */