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