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