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