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