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