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