This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate win32/perlhost.h from maintenance branch.
[perl5.git] / hv.c
CommitLineData
a0d0e21e 1/* hv.c
79072805 2 *
bc89e66f 3 * Copyright (c) 1991-2001, Larry Wall
79072805
LW
4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
a0d0e21e
LW
8 */
9
10/*
11 * "I sit beside the fire and think of all that I have seen." --Bilbo
79072805
LW
12 */
13
14#include "EXTERN.h"
864dbfa3 15#define PERL_IN_HV_C
79072805
LW
16#include "perl.h"
17
76e3520e 18STATIC HE*
cea2e8a9 19S_new_he(pTHX)
4633a7c4
LW
20{
21 HE* he;
333f433b
DG
22 LOCK_SV_MUTEX;
23 if (!PL_he_root)
24 more_he();
25 he = PL_he_root;
26 PL_he_root = HeNEXT(he);
27 UNLOCK_SV_MUTEX;
28 return he;
4633a7c4
LW
29}
30
76e3520e 31STATIC void
cea2e8a9 32S_del_he(pTHX_ HE *p)
4633a7c4 33{
333f433b 34 LOCK_SV_MUTEX;
3280af22
NIS
35 HeNEXT(p) = (HE*)PL_he_root;
36 PL_he_root = p;
333f433b 37 UNLOCK_SV_MUTEX;
4633a7c4
LW
38}
39
333f433b 40STATIC void
cea2e8a9 41S_more_he(pTHX)
4633a7c4
LW
42{
43 register HE* he;
44 register HE* heend;
612f20c3
GS
45 XPV *ptr;
46 New(54, ptr, 1008/sizeof(XPV), XPV);
47 ptr->xpv_pv = (char*)PL_he_arenaroot;
48 PL_he_arenaroot = ptr;
49
50 he = (HE*)ptr;
4633a7c4 51 heend = &he[1008 / sizeof(HE) - 1];
612f20c3 52 PL_he_root = ++he;
4633a7c4 53 while (he < heend) {
fde52b5c 54 HeNEXT(he) = (HE*)(he + 1);
4633a7c4
LW
55 he++;
56 }
fde52b5c 57 HeNEXT(he) = 0;
4633a7c4
LW
58}
59
d33b2eba
GS
60#ifdef PURIFY
61
62#define new_HE() (HE*)safemalloc(sizeof(HE))
63#define del_HE(p) safefree((char*)p)
64
65#else
66
67#define new_HE() new_he()
68#define del_HE(p) del_he(p)
69
70#endif
71
76e3520e 72STATIC HEK *
cea2e8a9 73S_save_hek(pTHX_ const char *str, I32 len, U32 hash)
bbce6d69 74{
75 char *k;
76 register HEK *hek;
da58a35d
JH
77 bool is_utf8 = FALSE;
78
79 if (len < 0) {
80 len = -len;
81 is_utf8 = TRUE;
82 }
1c846c1f 83
ff68c719 84 New(54, k, HEK_BASESIZE + len + 1, char);
bbce6d69 85 hek = (HEK*)k;
ff68c719 86 Copy(str, HEK_KEY(hek), len, char);
ff68c719 87 HEK_LEN(hek) = len;
88 HEK_HASH(hek) = hash;
da58a35d 89 HEK_UTF8(hek) = (char)is_utf8;
bbce6d69 90 return hek;
91}
92
93void
864dbfa3 94Perl_unshare_hek(pTHX_ HEK *hek)
bbce6d69 95{
c3654f1a
IH
96 unsharepvn(HEK_KEY(hek),HEK_UTF8(hek)?-HEK_LEN(hek):HEK_LEN(hek),
97 HEK_HASH(hek));
bbce6d69 98}
99
d18c6117
GS
100#if defined(USE_ITHREADS)
101HE *
d2d73c3e 102Perl_he_dup(pTHX_ HE *e, bool shared, clone_params* param)
d18c6117
GS
103{
104 HE *ret;
105
106 if (!e)
107 return Nullhe;
7766f137
GS
108 /* look for it in the table first */
109 ret = (HE*)ptr_table_fetch(PL_ptr_table, e);
110 if (ret)
111 return ret;
112
113 /* create anew and remember what it is */
d33b2eba 114 ret = new_HE();
7766f137
GS
115 ptr_table_store(PL_ptr_table, e, ret);
116
d2d73c3e 117 HeNEXT(ret) = he_dup(HeNEXT(e),shared, param);
d18c6117 118 if (HeKLEN(e) == HEf_SVKEY)
d2d73c3e 119 HeKEY_sv(ret) = SvREFCNT_inc(sv_dup(HeKEY_sv(e), param));
d18c6117 120 else if (shared)
c3654f1a 121 HeKEY_hek(ret) = share_hek(HeKEY(e), HeKLEN_UTF8(e), HeHASH(e));
d18c6117 122 else
c3654f1a 123 HeKEY_hek(ret) = save_hek(HeKEY(e), HeKLEN_UTF8(e), HeHASH(e));
d2d73c3e 124 HeVAL(ret) = SvREFCNT_inc(sv_dup(HeVAL(e), param));
d18c6117
GS
125 return ret;
126}
127#endif /* USE_ITHREADS */
128
fde52b5c 129/* (klen == HEf_SVKEY) is special for MAGICAL hv entries, meaning key slot
130 * contains an SV* */
131
954c1994
GS
132/*
133=for apidoc hv_fetch
134
135Returns the SV which corresponds to the specified key in the hash. The
136C<klen> is the length of the key. If C<lval> is set then the fetch will be
137part of a store. Check that the return value is non-null before
1c846c1f 138dereferencing it to a C<SV*>.
954c1994 139
96f1132b 140See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
954c1994
GS
141information on how to use this function on tied hashes.
142
143=cut
144*/
145
79072805 146SV**
da58a35d 147Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen, I32 lval)
79072805 148{
cbec9347 149 register XPVHV* xhv;
fde52b5c 150 register U32 hash;
79072805 151 register HE *entry;
79072805 152 SV *sv;
da58a35d 153 bool is_utf8 = FALSE;
f9a63242 154 const char *keysave = key;
79072805
LW
155
156 if (!hv)
157 return 0;
463ee0b2 158
da58a35d
JH
159 if (klen < 0) {
160 klen = -klen;
161 is_utf8 = TRUE;
162 }
163
8990e307 164 if (SvRMAGICAL(hv)) {
14befaf4 165 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
8990e307 166 sv = sv_newmortal();
463ee0b2 167 mg_copy((SV*)hv, sv, key, klen);
3280af22
NIS
168 PL_hv_fetch_sv = sv;
169 return &PL_hv_fetch_sv;
463ee0b2 170 }
902173a3 171#ifdef ENV_IS_CASELESS
14befaf4 172 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
e7152ba2
GS
173 U32 i;
174 for (i = 0; i < klen; ++i)
175 if (isLOWER(key[i])) {
79cb57f6 176 char *nkey = strupr(SvPVX(sv_2mortal(newSVpvn(key,klen))));
e7152ba2
GS
177 SV **ret = hv_fetch(hv, nkey, klen, 0);
178 if (!ret && lval)
179 ret = hv_store(hv, key, klen, NEWSV(61,0), 0);
180 return ret;
181 }
902173a3
GS
182 }
183#endif
463ee0b2
LW
184 }
185
cbec9347
JH
186 /* We use xhv->xhv_foo fields directly instead of HvFOO(hv) to
187 avoid unnecessary pointer dereferencing. */
188 xhv = (XPVHV*)SvANY(hv);
189 if (!xhv->xhv_array /* !HvARRAY(hv) */) {
1c846c1f 190 if (lval
a0d0e21e 191#ifdef DYNAMIC_ENV_FETCH /* if it's an %ENV lookup, we may get it on the fly */
cbec9347 192 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
a0d0e21e
LW
193#endif
194 )
cbec9347
JH
195 Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
196 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
197 char);
79072805
LW
198 else
199 return 0;
200 }
201
77caf834 202 if (is_utf8) {
75a54232
JH
203 STRLEN tmplen = klen;
204 /* Just casting the &klen to (STRLEN) won't work well
205 * if STRLEN and I32 are of different widths. --jhi */
206 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
207 klen = tmplen;
208 }
f9a63242 209
fde52b5c 210 PERL_HASH(hash, key, klen);
79072805 211
cbec9347
JH
212 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
213 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 214 for (; entry; entry = HeNEXT(entry)) {
215 if (HeHASH(entry) != hash) /* strings can't be equal */
79072805 216 continue;
fde52b5c 217 if (HeKLEN(entry) != klen)
79072805 218 continue;
1c846c1f 219 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
79072805 220 continue;
c3654f1a
IH
221 if (HeKUTF8(entry) != (char)is_utf8)
222 continue;
f9a63242
JH
223 if (key != keysave)
224 Safefree(key);
fde52b5c 225 return &HeVAL(entry);
79072805 226 }
a0d0e21e 227#ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
cbec9347 228 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
a6c40364
GS
229 unsigned long len;
230 char *env = PerlEnv_ENVgetenv_len(key,&len);
231 if (env) {
232 sv = newSVpvn(env,len);
233 SvTAINTED_on(sv);
f9a63242
JH
234 if (key != keysave)
235 Safefree(key);
a6c40364
GS
236 return hv_store(hv,key,klen,sv,hash);
237 }
a0d0e21e
LW
238 }
239#endif
79072805
LW
240 if (lval) { /* gonna assign to this, so it better be there */
241 sv = NEWSV(61,0);
f9a63242
JH
242 if (key != keysave) { /* must be is_utf8 == 0 */
243 SV **ret = hv_store(hv,key,klen,sv,hash);
244 Safefree(key);
245 return ret;
246 }
247 else
248 return hv_store(hv,key,is_utf8?-klen:klen,sv,hash);
79072805 249 }
f9a63242
JH
250 if (key != keysave)
251 Safefree(key);
79072805
LW
252 return 0;
253}
254
fde52b5c 255/* returns a HE * structure with the all fields set */
256/* note that hent_val will be a mortal sv for MAGICAL hashes */
954c1994
GS
257/*
258=for apidoc hv_fetch_ent
259
260Returns the hash entry which corresponds to the specified key in the hash.
261C<hash> must be a valid precomputed hash number for the given C<key>, or 0
262if you want the function to compute it. IF C<lval> is set then the fetch
263will be part of a store. Make sure the return value is non-null before
264accessing it. The return value when C<tb> is a tied hash is a pointer to a
265static location, so be sure to make a copy of the structure if you need to
1c846c1f 266store it somewhere.
954c1994 267
96f1132b 268See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
954c1994
GS
269information on how to use this function on tied hashes.
270
271=cut
272*/
273
fde52b5c 274HE *
864dbfa3 275Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash)
fde52b5c 276{
cbec9347 277 register XPVHV* xhv;
fde52b5c 278 register char *key;
279 STRLEN klen;
280 register HE *entry;
281 SV *sv;
da58a35d 282 bool is_utf8;
f9a63242 283 char *keysave;
fde52b5c 284
285 if (!hv)
286 return 0;
287
902173a3 288 if (SvRMAGICAL(hv)) {
14befaf4 289 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
902173a3
GS
290 sv = sv_newmortal();
291 keysv = sv_2mortal(newSVsv(keysv));
292 mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
3280af22 293 if (!HeKEY_hek(&PL_hv_fetch_ent_mh)) {
902173a3
GS
294 char *k;
295 New(54, k, HEK_BASESIZE + sizeof(SV*), char);
3280af22 296 HeKEY_hek(&PL_hv_fetch_ent_mh) = (HEK*)k;
902173a3 297 }
3280af22
NIS
298 HeSVKEY_set(&PL_hv_fetch_ent_mh, keysv);
299 HeVAL(&PL_hv_fetch_ent_mh) = sv;
300 return &PL_hv_fetch_ent_mh;
1cf368ac 301 }
902173a3 302#ifdef ENV_IS_CASELESS
14befaf4 303 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
e7152ba2 304 U32 i;
902173a3 305 key = SvPV(keysv, klen);
e7152ba2
GS
306 for (i = 0; i < klen; ++i)
307 if (isLOWER(key[i])) {
79cb57f6 308 SV *nkeysv = sv_2mortal(newSVpvn(key,klen));
e7152ba2
GS
309 (void)strupr(SvPVX(nkeysv));
310 entry = hv_fetch_ent(hv, nkeysv, 0, 0);
311 if (!entry && lval)
312 entry = hv_store_ent(hv, keysv, NEWSV(61,0), hash);
313 return entry;
314 }
902173a3
GS
315 }
316#endif
fde52b5c 317 }
318
cbec9347
JH
319 xhv = (XPVHV*)SvANY(hv);
320 if (!xhv->xhv_array /* !HvARRAY(hv) */) {
1c846c1f 321 if (lval
fde52b5c 322#ifdef DYNAMIC_ENV_FETCH /* if it's an %ENV lookup, we may get it on the fly */
cbec9347 323 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
fde52b5c 324#endif
325 )
cbec9347
JH
326 Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
327 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
328 char);
fde52b5c 329 else
330 return 0;
331 }
332
f9a63242 333 keysave = key = SvPV(keysv, klen);
da58a35d 334 is_utf8 = (SvUTF8(keysv)!=0);
1c846c1f 335
77caf834 336 if (is_utf8)
f9a63242
JH
337 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
338
effa1e2d 339 if (!hash)
340 PERL_HASH(hash, key, klen);
341
cbec9347
JH
342 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
343 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 344 for (; entry; entry = HeNEXT(entry)) {
345 if (HeHASH(entry) != hash) /* strings can't be equal */
346 continue;
347 if (HeKLEN(entry) != klen)
348 continue;
1c846c1f 349 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
fde52b5c 350 continue;
c3654f1a
IH
351 if (HeKUTF8(entry) != (char)is_utf8)
352 continue;
f9a63242
JH
353 if (key != keysave)
354 Safefree(key);
fde52b5c 355 return entry;
356 }
357#ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
cbec9347 358 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
a6c40364
GS
359 unsigned long len;
360 char *env = PerlEnv_ENVgetenv_len(key,&len);
361 if (env) {
362 sv = newSVpvn(env,len);
363 SvTAINTED_on(sv);
364 return hv_store_ent(hv,keysv,sv,hash);
365 }
fde52b5c 366 }
367#endif
f9a63242
JH
368 if (key != keysave)
369 Safefree(key);
fde52b5c 370 if (lval) { /* gonna assign to this, so it better be there */
371 sv = NEWSV(61,0);
e7152ba2 372 return hv_store_ent(hv,keysv,sv,hash);
fde52b5c 373 }
374 return 0;
375}
376
864dbfa3 377STATIC void
cea2e8a9 378S_hv_magic_check(pTHX_ HV *hv, bool *needs_copy, bool *needs_store)
d0066dc7
OT
379{
380 MAGIC *mg = SvMAGIC(hv);
381 *needs_copy = FALSE;
382 *needs_store = TRUE;
383 while (mg) {
384 if (isUPPER(mg->mg_type)) {
385 *needs_copy = TRUE;
386 switch (mg->mg_type) {
14befaf4
DM
387 case PERL_MAGIC_tied:
388 case PERL_MAGIC_sig:
d0066dc7 389 *needs_store = FALSE;
d0066dc7
OT
390 }
391 }
392 mg = mg->mg_moremagic;
393 }
394}
395
954c1994
GS
396/*
397=for apidoc hv_store
398
399Stores an SV in a hash. The hash key is specified as C<key> and C<klen> is
400the length of the key. The C<hash> parameter is the precomputed hash
401value; if it is zero then Perl will compute it. The return value will be
402NULL if the operation failed or if the value did not need to be actually
403stored within the hash (as in the case of tied hashes). Otherwise it can
404be dereferenced to get the original C<SV*>. Note that the caller is
405responsible for suitably incrementing the reference count of C<val> before
1c846c1f 406the call, and decrementing it if the function returned NULL.
954c1994 407
96f1132b 408See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
954c1994
GS
409information on how to use this function on tied hashes.
410
411=cut
412*/
413
79072805 414SV**
da58a35d 415Perl_hv_store(pTHX_ HV *hv, const char *key, I32 klen, SV *val, register U32 hash)
79072805 416{
cbec9347 417 register XPVHV* xhv;
79072805
LW
418 register I32 i;
419 register HE *entry;
420 register HE **oentry;
da58a35d 421 bool is_utf8 = FALSE;
f9a63242 422 const char *keysave = key;
79072805
LW
423
424 if (!hv)
425 return 0;
426
da58a35d
JH
427 if (klen < 0) {
428 klen = -klen;
429 is_utf8 = TRUE;
430 }
431
cbec9347 432 xhv = (XPVHV*)SvANY(hv);
463ee0b2 433 if (SvMAGICAL(hv)) {
d0066dc7
OT
434 bool needs_copy;
435 bool needs_store;
436 hv_magic_check (hv, &needs_copy, &needs_store);
437 if (needs_copy) {
438 mg_copy((SV*)hv, val, key, klen);
cbec9347 439 if (!xhv->xhv_array /* !HvARRAY */ && !needs_store)
d0066dc7 440 return 0;
902173a3 441#ifdef ENV_IS_CASELESS
14befaf4 442 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
d220deaf 443 key = savepvn(key,klen);
25716404 444 key = (const char*)strupr((char*)key);
902173a3
GS
445 hash = 0;
446 }
447#endif
d0066dc7 448 }
463ee0b2 449 }
77caf834 450 if (is_utf8) {
75a54232
JH
451 STRLEN tmplen = klen;
452 /* See the note in hv_fetch(). --jhi */
453 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
454 klen = tmplen;
455 }
f9a63242 456
fde52b5c 457 if (!hash)
458 PERL_HASH(hash, key, klen);
459
cbec9347
JH
460 if (!xhv->xhv_array /* !HvARRAY(hv) */)
461 Newz(505, xhv->xhv_array /* HvARRAY(hv) */,
462 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
463 char);
fde52b5c 464
cbec9347
JH
465 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
466 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 467 i = 1;
468
469 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
470 if (HeHASH(entry) != hash) /* strings can't be equal */
471 continue;
472 if (HeKLEN(entry) != klen)
473 continue;
1c846c1f 474 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
fde52b5c 475 continue;
c3654f1a
IH
476 if (HeKUTF8(entry) != (char)is_utf8)
477 continue;
fde52b5c 478 SvREFCNT_dec(HeVAL(entry));
479 HeVAL(entry) = val;
f9a63242
JH
480 if (key != keysave)
481 Safefree(key);
fde52b5c 482 return &HeVAL(entry);
483 }
484
d33b2eba 485 entry = new_HE();
fde52b5c 486 if (HvSHAREKEYS(hv))
c3654f1a 487 HeKEY_hek(entry) = share_hek(key, is_utf8?-klen:klen, hash);
fde52b5c 488 else /* gotta do the real thing */
c3654f1a 489 HeKEY_hek(entry) = save_hek(key, is_utf8?-klen:klen, hash);
f9a63242
JH
490 if (key != keysave)
491 Safefree(key);
fde52b5c 492 HeVAL(entry) = val;
fde52b5c 493 HeNEXT(entry) = *oentry;
494 *oentry = entry;
495
cbec9347 496 xhv->xhv_keys++; /* HvKEYS(hv)++ */
fde52b5c 497 if (i) { /* initial entry? */
cbec9347
JH
498 xhv->xhv_fill++; /* HvFILL(hv)++ */
499 if (xhv->xhv_keys > xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */)
fde52b5c 500 hsplit(hv);
79072805
LW
501 }
502
fde52b5c 503 return &HeVAL(entry);
504}
505
954c1994
GS
506/*
507=for apidoc hv_store_ent
508
509Stores C<val> in a hash. The hash key is specified as C<key>. The C<hash>
510parameter is the precomputed hash value; if it is zero then Perl will
511compute it. The return value is the new hash entry so created. It will be
512NULL if the operation failed or if the value did not need to be actually
513stored within the hash (as in the case of tied hashes). Otherwise the
87324b0f 514contents of the return value can be accessed using the C<He?> macros
954c1994
GS
515described here. Note that the caller is responsible for suitably
516incrementing the reference count of C<val> before the call, and
1c846c1f 517decrementing it if the function returned NULL.
954c1994 518
96f1132b 519See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
954c1994
GS
520information on how to use this function on tied hashes.
521
522=cut
523*/
524
fde52b5c 525HE *
864dbfa3 526Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, register U32 hash)
fde52b5c 527{
cbec9347 528 register XPVHV* xhv;
fde52b5c 529 register char *key;
530 STRLEN klen;
531 register I32 i;
532 register HE *entry;
533 register HE **oentry;
da58a35d 534 bool is_utf8;
f9a63242 535 char *keysave;
fde52b5c 536
537 if (!hv)
538 return 0;
539
cbec9347 540 xhv = (XPVHV*)SvANY(hv);
fde52b5c 541 if (SvMAGICAL(hv)) {
d0066dc7
OT
542 bool needs_copy;
543 bool needs_store;
544 hv_magic_check (hv, &needs_copy, &needs_store);
545 if (needs_copy) {
3280af22
NIS
546 bool save_taint = PL_tainted;
547 if (PL_tainting)
548 PL_tainted = SvTAINTED(keysv);
d0066dc7
OT
549 keysv = sv_2mortal(newSVsv(keysv));
550 mg_copy((SV*)hv, val, (char*)keysv, HEf_SVKEY);
551 TAINT_IF(save_taint);
cbec9347 552 if (!xhv->xhv_array /* !HvARRAY(hv) */ && !needs_store)
d0066dc7 553 return Nullhe;
902173a3 554#ifdef ENV_IS_CASELESS
14befaf4 555 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
902173a3 556 key = SvPV(keysv, klen);
79cb57f6 557 keysv = sv_2mortal(newSVpvn(key,klen));
902173a3
GS
558 (void)strupr(SvPVX(keysv));
559 hash = 0;
560 }
561#endif
562 }
fde52b5c 563 }
564
f9a63242 565 keysave = key = SvPV(keysv, klen);
da58a35d 566 is_utf8 = (SvUTF8(keysv) != 0);
902173a3 567
77caf834 568 if (is_utf8)
f9a63242
JH
569 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
570
fde52b5c 571 if (!hash)
572 PERL_HASH(hash, key, klen);
573
cbec9347
JH
574 if (!xhv->xhv_array /* !HvARRAY(hv) */)
575 Newz(505, xhv->xhv_array /* HvARRAY(hv) */,
576 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
577 char);
79072805 578
cbec9347
JH
579 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
580 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
79072805
LW
581 i = 1;
582
fde52b5c 583 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
584 if (HeHASH(entry) != hash) /* strings can't be equal */
79072805 585 continue;
fde52b5c 586 if (HeKLEN(entry) != klen)
79072805 587 continue;
1c846c1f 588 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
79072805 589 continue;
c3654f1a
IH
590 if (HeKUTF8(entry) != (char)is_utf8)
591 continue;
fde52b5c 592 SvREFCNT_dec(HeVAL(entry));
593 HeVAL(entry) = val;
f9a63242
JH
594 if (key != keysave)
595 Safefree(key);
fde52b5c 596 return entry;
79072805 597 }
79072805 598
d33b2eba 599 entry = new_HE();
fde52b5c 600 if (HvSHAREKEYS(hv))
25716404 601 HeKEY_hek(entry) = share_hek(key, is_utf8?-(I32)klen:klen, hash);
fde52b5c 602 else /* gotta do the real thing */
25716404 603 HeKEY_hek(entry) = save_hek(key, is_utf8?-(I32)klen:klen, hash);
f9a63242
JH
604 if (key != keysave)
605 Safefree(key);
fde52b5c 606 HeVAL(entry) = val;
fde52b5c 607 HeNEXT(entry) = *oentry;
79072805
LW
608 *oentry = entry;
609
cbec9347 610 xhv->xhv_keys++; /* HvKEYS(hv)++ */
79072805 611 if (i) { /* initial entry? */
cbec9347
JH
612 xhv->xhv_fill++; /* HvFILL(hv)++ */
613 if (xhv->xhv_keys > xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */)
79072805
LW
614 hsplit(hv);
615 }
79072805 616
fde52b5c 617 return entry;
79072805
LW
618}
619
954c1994
GS
620/*
621=for apidoc hv_delete
622
623Deletes a key/value pair in the hash. The value SV is removed from the
1c846c1f 624hash and returned to the caller. The C<klen> is the length of the key.
954c1994
GS
625The C<flags> value will normally be zero; if set to G_DISCARD then NULL
626will be returned.
627
628=cut
629*/
630
79072805 631SV *
da58a35d 632Perl_hv_delete(pTHX_ HV *hv, const char *key, I32 klen, I32 flags)
79072805 633{
cbec9347 634 register XPVHV* xhv;
79072805 635 register I32 i;
fde52b5c 636 register U32 hash;
79072805
LW
637 register HE *entry;
638 register HE **oentry;
67a38de0 639 SV **svp;
79072805 640 SV *sv;
da58a35d 641 bool is_utf8 = FALSE;
f9a63242 642 const char *keysave = key;
79072805
LW
643
644 if (!hv)
645 return Nullsv;
da58a35d
JH
646 if (klen < 0) {
647 klen = -klen;
648 is_utf8 = TRUE;
649 }
8990e307 650 if (SvRMAGICAL(hv)) {
0a0bb7c7
OT
651 bool needs_copy;
652 bool needs_store;
653 hv_magic_check (hv, &needs_copy, &needs_store);
654
67a38de0
NIS
655 if (needs_copy && (svp = hv_fetch(hv, key, klen, TRUE))) {
656 sv = *svp;
0a0bb7c7
OT
657 mg_clear(sv);
658 if (!needs_store) {
14befaf4
DM
659 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
660 /* No longer an element */
661 sv_unmagic(sv, PERL_MAGIC_tiedelem);
0a0bb7c7
OT
662 return sv;
663 }
664 return Nullsv; /* element cannot be deleted */
665 }
902173a3 666#ifdef ENV_IS_CASELESS
14befaf4 667 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
79cb57f6 668 sv = sv_2mortal(newSVpvn(key,klen));
2fd1c6b8
GS
669 key = strupr(SvPVX(sv));
670 }
902173a3 671#endif
2fd1c6b8 672 }
463ee0b2 673 }
cbec9347
JH
674 xhv = (XPVHV*)SvANY(hv);
675 if (!xhv->xhv_array /* !HvARRAY(hv) */)
79072805 676 return Nullsv;
fde52b5c 677
77caf834 678 if (is_utf8) {
75a54232
JH
679 STRLEN tmplen = klen;
680 /* See the note in hv_fetch(). --jhi */
681 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
682 klen = tmplen;
683 }
f9a63242 684
fde52b5c 685 PERL_HASH(hash, key, klen);
79072805 686
cbec9347
JH
687 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
688 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
79072805
LW
689 entry = *oentry;
690 i = 1;
fde52b5c 691 for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
692 if (HeHASH(entry) != hash) /* strings can't be equal */
79072805 693 continue;
fde52b5c 694 if (HeKLEN(entry) != klen)
79072805 695 continue;
1c846c1f 696 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
79072805 697 continue;
c3654f1a
IH
698 if (HeKUTF8(entry) != (char)is_utf8)
699 continue;
f9a63242
JH
700 if (key != keysave)
701 Safefree(key);
fde52b5c 702 *oentry = HeNEXT(entry);
79072805 703 if (i && !*oentry)
cbec9347 704 xhv->xhv_fill--; /* HvFILL(hv)-- */
748a9306
LW
705 if (flags & G_DISCARD)
706 sv = Nullsv;
94f7643d 707 else {
79d01fbf 708 sv = sv_2mortal(HeVAL(entry));
94f7643d
GS
709 HeVAL(entry) = &PL_sv_undef;
710 }
cbec9347 711 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
72940dca 712 HvLAZYDEL_on(hv);
a0d0e21e 713 else
68dc0745 714 hv_free_ent(hv, entry);
cbec9347 715 xhv->xhv_keys--; /* HvKEYS(hv)-- */
fde52b5c 716 return sv;
717 }
f9a63242
JH
718 if (key != keysave)
719 Safefree(key);
fde52b5c 720 return Nullsv;
721}
722
954c1994
GS
723/*
724=for apidoc hv_delete_ent
725
726Deletes a key/value pair in the hash. The value SV is removed from the
727hash and returned to the caller. The C<flags> value will normally be zero;
728if set to G_DISCARD then NULL will be returned. C<hash> can be a valid
729precomputed hash value, or 0 to ask for it to be computed.
730
731=cut
732*/
733
fde52b5c 734SV *
864dbfa3 735Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
fde52b5c 736{
cbec9347 737 register XPVHV* xhv;
fde52b5c 738 register I32 i;
739 register char *key;
740 STRLEN klen;
741 register HE *entry;
742 register HE **oentry;
743 SV *sv;
da58a35d 744 bool is_utf8;
f9a63242 745 char *keysave;
1c846c1f 746
fde52b5c 747 if (!hv)
748 return Nullsv;
749 if (SvRMAGICAL(hv)) {
0a0bb7c7
OT
750 bool needs_copy;
751 bool needs_store;
752 hv_magic_check (hv, &needs_copy, &needs_store);
753
67a38de0 754 if (needs_copy && (entry = hv_fetch_ent(hv, keysv, TRUE, hash))) {
0a0bb7c7
OT
755 sv = HeVAL(entry);
756 mg_clear(sv);
757 if (!needs_store) {
14befaf4
DM
758 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
759 /* No longer an element */
760 sv_unmagic(sv, PERL_MAGIC_tiedelem);
0a0bb7c7
OT
761 return sv;
762 }
763 return Nullsv; /* element cannot be deleted */
764 }
902173a3 765#ifdef ENV_IS_CASELESS
14befaf4 766 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
2fd1c6b8 767 key = SvPV(keysv, klen);
79cb57f6 768 keysv = sv_2mortal(newSVpvn(key,klen));
2fd1c6b8 769 (void)strupr(SvPVX(keysv));
1c846c1f 770 hash = 0;
2fd1c6b8 771 }
902173a3 772#endif
2fd1c6b8 773 }
fde52b5c 774 }
cbec9347
JH
775 xhv = (XPVHV*)SvANY(hv);
776 if (!xhv->xhv_array /* !HvARRAY(hv) */)
fde52b5c 777 return Nullsv;
778
f9a63242 779 keysave = key = SvPV(keysv, klen);
da58a35d 780 is_utf8 = (SvUTF8(keysv) != 0);
1c846c1f 781
77caf834 782 if (is_utf8)
f9a63242
JH
783 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
784
fde52b5c 785 if (!hash)
786 PERL_HASH(hash, key, klen);
787
cbec9347
JH
788 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
789 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 790 entry = *oentry;
791 i = 1;
792 for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
793 if (HeHASH(entry) != hash) /* strings can't be equal */
794 continue;
795 if (HeKLEN(entry) != klen)
796 continue;
1c846c1f 797 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
fde52b5c 798 continue;
c3654f1a
IH
799 if (HeKUTF8(entry) != (char)is_utf8)
800 continue;
f9a63242
JH
801 if (key != keysave)
802 Safefree(key);
fde52b5c 803 *oentry = HeNEXT(entry);
804 if (i && !*oentry)
cbec9347 805 xhv->xhv_fill--; /* HvFILL(hv)-- */
fde52b5c 806 if (flags & G_DISCARD)
807 sv = Nullsv;
94f7643d 808 else {
79d01fbf 809 sv = sv_2mortal(HeVAL(entry));
94f7643d
GS
810 HeVAL(entry) = &PL_sv_undef;
811 }
cbec9347 812 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
72940dca 813 HvLAZYDEL_on(hv);
fde52b5c 814 else
68dc0745 815 hv_free_ent(hv, entry);
cbec9347 816 xhv->xhv_keys--; /* HvKEYS(hv)-- */
79072805
LW
817 return sv;
818 }
f9a63242
JH
819 if (key != keysave)
820 Safefree(key);
79072805 821 return Nullsv;
79072805
LW
822}
823
954c1994
GS
824/*
825=for apidoc hv_exists
826
827Returns a boolean indicating whether the specified hash key exists. The
828C<klen> is the length of the key.
829
830=cut
831*/
832
a0d0e21e 833bool
da58a35d 834Perl_hv_exists(pTHX_ HV *hv, const char *key, I32 klen)
a0d0e21e 835{
cbec9347 836 register XPVHV* xhv;
fde52b5c 837 register U32 hash;
a0d0e21e
LW
838 register HE *entry;
839 SV *sv;
da58a35d 840 bool is_utf8 = FALSE;
f9a63242 841 const char *keysave = key;
a0d0e21e
LW
842
843 if (!hv)
844 return 0;
845
da58a35d
JH
846 if (klen < 0) {
847 klen = -klen;
848 is_utf8 = TRUE;
849 }
850
a0d0e21e 851 if (SvRMAGICAL(hv)) {
14befaf4 852 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
a0d0e21e 853 sv = sv_newmortal();
1c846c1f 854 mg_copy((SV*)hv, sv, key, klen);
14befaf4 855 magic_existspack(sv, mg_find(sv, PERL_MAGIC_tiedelem));
a0d0e21e
LW
856 return SvTRUE(sv);
857 }
902173a3 858#ifdef ENV_IS_CASELESS
14befaf4 859 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
79cb57f6 860 sv = sv_2mortal(newSVpvn(key,klen));
902173a3
GS
861 key = strupr(SvPVX(sv));
862 }
863#endif
a0d0e21e
LW
864 }
865
cbec9347 866 xhv = (XPVHV*)SvANY(hv);
f675dbe5 867#ifndef DYNAMIC_ENV_FETCH
cbec9347 868 if (!xhv->xhv_array /* !HvARRAY(hv) */)
1c846c1f 869 return 0;
f675dbe5 870#endif
a0d0e21e 871
77caf834 872 if (is_utf8) {
75a54232
JH
873 STRLEN tmplen = klen;
874 /* See the note in hv_fetch(). --jhi */
875 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
876 klen = tmplen;
877 }
f9a63242 878
fde52b5c 879 PERL_HASH(hash, key, klen);
a0d0e21e 880
f675dbe5 881#ifdef DYNAMIC_ENV_FETCH
cbec9347 882 if (!xhv->xhv_array /* !HvARRAY(hv) */) entry = Null(HE*);
f675dbe5
CB
883 else
884#endif
cbec9347
JH
885 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
886 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 887 for (; entry; entry = HeNEXT(entry)) {
888 if (HeHASH(entry) != hash) /* strings can't be equal */
a0d0e21e 889 continue;
fde52b5c 890 if (HeKLEN(entry) != klen)
a0d0e21e 891 continue;
1c846c1f 892 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
fde52b5c 893 continue;
c3654f1a
IH
894 if (HeKUTF8(entry) != (char)is_utf8)
895 continue;
f9a63242
JH
896 if (key != keysave)
897 Safefree(key);
fde52b5c 898 return TRUE;
899 }
f675dbe5 900#ifdef DYNAMIC_ENV_FETCH /* is it out there? */
cbec9347 901 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
a6c40364
GS
902 unsigned long len;
903 char *env = PerlEnv_ENVgetenv_len(key,&len);
904 if (env) {
905 sv = newSVpvn(env,len);
906 SvTAINTED_on(sv);
907 (void)hv_store(hv,key,klen,sv,hash);
908 return TRUE;
909 }
f675dbe5
CB
910 }
911#endif
f9a63242
JH
912 if (key != keysave)
913 Safefree(key);
fde52b5c 914 return FALSE;
915}
916
917
954c1994
GS
918/*
919=for apidoc hv_exists_ent
920
921Returns a boolean indicating whether the specified hash key exists. C<hash>
922can be a valid precomputed hash value, or 0 to ask for it to be
923computed.
924
925=cut
926*/
927
fde52b5c 928bool
864dbfa3 929Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
fde52b5c 930{
cbec9347 931 register XPVHV* xhv;
fde52b5c 932 register char *key;
933 STRLEN klen;
934 register HE *entry;
935 SV *sv;
c3654f1a 936 bool is_utf8;
f9a63242 937 char *keysave;
fde52b5c 938
939 if (!hv)
940 return 0;
941
942 if (SvRMAGICAL(hv)) {
14befaf4 943 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
62815d3c 944 SV* svret = sv_newmortal();
fde52b5c 945 sv = sv_newmortal();
effa1e2d 946 keysv = sv_2mortal(newSVsv(keysv));
1c846c1f 947 mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
14befaf4 948 magic_existspack(svret, mg_find(sv, PERL_MAGIC_tiedelem));
62815d3c 949 return SvTRUE(svret);
fde52b5c 950 }
902173a3 951#ifdef ENV_IS_CASELESS
14befaf4 952 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
902173a3 953 key = SvPV(keysv, klen);
79cb57f6 954 keysv = sv_2mortal(newSVpvn(key,klen));
902173a3 955 (void)strupr(SvPVX(keysv));
1c846c1f 956 hash = 0;
902173a3
GS
957 }
958#endif
fde52b5c 959 }
960
cbec9347 961 xhv = (XPVHV*)SvANY(hv);
f675dbe5 962#ifndef DYNAMIC_ENV_FETCH
cbec9347 963 if (!xhv->xhv_array /* !HvARRAY(hv) */)
1c846c1f 964 return 0;
f675dbe5 965#endif
fde52b5c 966
f9a63242 967 keysave = key = SvPV(keysv, klen);
c3654f1a 968 is_utf8 = (SvUTF8(keysv) != 0);
77caf834 969 if (is_utf8)
f9a63242 970 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
fde52b5c 971 if (!hash)
972 PERL_HASH(hash, key, klen);
973
f675dbe5 974#ifdef DYNAMIC_ENV_FETCH
cbec9347 975 if (!xhv->xhv_array /* !HvARRAY(hv) */) entry = Null(HE*);
f675dbe5
CB
976 else
977#endif
cbec9347
JH
978 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
979 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 980 for (; entry; entry = HeNEXT(entry)) {
981 if (HeHASH(entry) != hash) /* strings can't be equal */
982 continue;
983 if (HeKLEN(entry) != klen)
984 continue;
1c846c1f 985 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
a0d0e21e 986 continue;
c3654f1a
IH
987 if (HeKUTF8(entry) != (char)is_utf8)
988 continue;
f9a63242
JH
989 if (key != keysave)
990 Safefree(key);
a0d0e21e
LW
991 return TRUE;
992 }
f675dbe5 993#ifdef DYNAMIC_ENV_FETCH /* is it out there? */
cbec9347 994 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
a6c40364
GS
995 unsigned long len;
996 char *env = PerlEnv_ENVgetenv_len(key,&len);
997 if (env) {
998 sv = newSVpvn(env,len);
999 SvTAINTED_on(sv);
1000 (void)hv_store_ent(hv,keysv,sv,hash);
1001 return TRUE;
1002 }
f675dbe5
CB
1003 }
1004#endif
f9a63242
JH
1005 if (key != keysave)
1006 Safefree(key);
a0d0e21e
LW
1007 return FALSE;
1008}
1009
76e3520e 1010STATIC void
cea2e8a9 1011S_hsplit(pTHX_ HV *hv)
79072805 1012{
cbec9347
JH
1013 register XPVHV* xhv = (XPVHV*)SvANY(hv);
1014 I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
79072805
LW
1015 register I32 newsize = oldsize * 2;
1016 register I32 i;
cbec9347 1017 register char *a = xhv->xhv_array; /* HvARRAY(hv) */
72311751
GS
1018 register HE **aep;
1019 register HE **bep;
79072805
LW
1020 register HE *entry;
1021 register HE **oentry;
1022
3280af22 1023 PL_nomemok = TRUE;
8d6dde3e 1024#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
d18c6117 1025 Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
422a93e5 1026 if (!a) {
4a33f861 1027 PL_nomemok = FALSE;
422a93e5
GA
1028 return;
1029 }
4633a7c4 1030#else
d18c6117 1031 New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
422a93e5 1032 if (!a) {
3280af22 1033 PL_nomemok = FALSE;
422a93e5
GA
1034 return;
1035 }
cbec9347 1036 Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
fba3b22e 1037 if (oldsize >= 64) {
cbec9347
JH
1038 offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
1039 PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
4633a7c4
LW
1040 }
1041 else
cbec9347 1042 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
4633a7c4
LW
1043#endif
1044
3280af22 1045 PL_nomemok = FALSE;
72311751 1046 Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
cbec9347
JH
1047 xhv->xhv_max = --newsize; /* HvMAX(hv) = --newsize */
1048 xhv->xhv_array = a; /* HvARRAY(hv) = a */
72311751 1049 aep = (HE**)a;
79072805 1050
72311751
GS
1051 for (i=0; i<oldsize; i++,aep++) {
1052 if (!*aep) /* non-existent */
79072805 1053 continue;
72311751
GS
1054 bep = aep+oldsize;
1055 for (oentry = aep, entry = *aep; entry; entry = *oentry) {
fde52b5c 1056 if ((HeHASH(entry) & newsize) != i) {
1057 *oentry = HeNEXT(entry);
72311751
GS
1058 HeNEXT(entry) = *bep;
1059 if (!*bep)
cbec9347 1060 xhv->xhv_fill++; /* HvFILL(hv)++ */
72311751 1061 *bep = entry;
79072805
LW
1062 continue;
1063 }
1064 else
fde52b5c 1065 oentry = &HeNEXT(entry);
79072805 1066 }
72311751 1067 if (!*aep) /* everything moved */
cbec9347 1068 xhv->xhv_fill--; /* HvFILL(hv)-- */
79072805
LW
1069 }
1070}
1071
72940dca 1072void
864dbfa3 1073Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
72940dca 1074{
cbec9347
JH
1075 register XPVHV* xhv = (XPVHV*)SvANY(hv);
1076 I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
72940dca 1077 register I32 newsize;
1078 register I32 i;
1079 register I32 j;
72311751
GS
1080 register char *a;
1081 register HE **aep;
72940dca 1082 register HE *entry;
1083 register HE **oentry;
1084
1085 newsize = (I32) newmax; /* possible truncation here */
1086 if (newsize != newmax || newmax <= oldsize)
1087 return;
1088 while ((newsize & (1 + ~newsize)) != newsize) {
1089 newsize &= ~(newsize & (1 + ~newsize)); /* get proper power of 2 */
1090 }
1091 if (newsize < newmax)
1092 newsize *= 2;
1093 if (newsize < newmax)
1094 return; /* overflow detection */
1095
cbec9347 1096 a = xhv->xhv_array; /* HvARRAY(hv) */
72940dca 1097 if (a) {
3280af22 1098 PL_nomemok = TRUE;
8d6dde3e 1099#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
d18c6117 1100 Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
422a93e5 1101 if (!a) {
4a33f861 1102 PL_nomemok = FALSE;
422a93e5
GA
1103 return;
1104 }
72940dca 1105#else
d18c6117 1106 New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
422a93e5 1107 if (!a) {
3280af22 1108 PL_nomemok = FALSE;
422a93e5
GA
1109 return;
1110 }
cbec9347 1111 Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
fba3b22e 1112 if (oldsize >= 64) {
cbec9347
JH
1113 offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
1114 PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
72940dca 1115 }
1116 else
cbec9347 1117 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
72940dca 1118#endif
3280af22 1119 PL_nomemok = FALSE;
72311751 1120 Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
72940dca 1121 }
1122 else {
d18c6117 1123 Newz(0, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
72940dca 1124 }
cbec9347
JH
1125 xhv->xhv_max = --newsize; /* HvMAX(hv) = --newsize */
1126 xhv->xhv_array = a; /* HvARRAY(hv) = a */
1127 if (!xhv->xhv_fill /* !HvFILL(hv) */) /* skip rest if no entries */
72940dca 1128 return;
1129
72311751
GS
1130 aep = (HE**)a;
1131 for (i=0; i<oldsize; i++,aep++) {
1132 if (!*aep) /* non-existent */
72940dca 1133 continue;
72311751 1134 for (oentry = aep, entry = *aep; entry; entry = *oentry) {
72940dca 1135 if ((j = (HeHASH(entry) & newsize)) != i) {
1136 j -= i;
1137 *oentry = HeNEXT(entry);
72311751 1138 if (!(HeNEXT(entry) = aep[j]))
cbec9347 1139 xhv->xhv_fill++; /* HvFILL(hv)++ */
72311751 1140 aep[j] = entry;
72940dca 1141 continue;
1142 }
1143 else
1144 oentry = &HeNEXT(entry);
1145 }
72311751 1146 if (!*aep) /* everything moved */
cbec9347 1147 xhv->xhv_fill--; /* HvFILL(hv)-- */
72940dca 1148 }
1149}
1150
954c1994
GS
1151/*
1152=for apidoc newHV
1153
1154Creates a new HV. The reference count is set to 1.
1155
1156=cut
1157*/
1158
79072805 1159HV *
864dbfa3 1160Perl_newHV(pTHX)
79072805
LW
1161{
1162 register HV *hv;
cbec9347 1163 register XPVHV* xhv;
79072805 1164
a0d0e21e
LW
1165 hv = (HV*)NEWSV(502,0);
1166 sv_upgrade((SV *)hv, SVt_PVHV);
cbec9347 1167 xhv = (XPVHV*)SvANY(hv);
79072805
LW
1168 SvPOK_off(hv);
1169 SvNOK_off(hv);
1c846c1f 1170#ifndef NODEFAULT_SHAREKEYS
fde52b5c 1171 HvSHAREKEYS_on(hv); /* key-sharing on by default */
1c846c1f 1172#endif
cbec9347
JH
1173 xhv->xhv_max = 7; /* HvMAX(hv) = 7 (start with 8 buckets) */
1174 xhv->xhv_fill = 0; /* HvFILL(hv) = 0 */
1175 xhv->xhv_pmroot = 0; /* HvPMROOT(hv) = 0 */
79072805
LW
1176 (void)hv_iterinit(hv); /* so each() will start off right */
1177 return hv;
1178}
1179
b3ac6de7 1180HV *
864dbfa3 1181Perl_newHVhv(pTHX_ HV *ohv)
b3ac6de7
IZ
1182{
1183 register HV *hv;
b3ac6de7
IZ
1184 STRLEN hv_max = ohv ? HvMAX(ohv) : 0;
1185 STRLEN hv_fill = ohv ? HvFILL(ohv) : 0;
1186
1187 hv = newHV();
1188 while (hv_max && hv_max + 1 >= hv_fill * 2)
1189 hv_max = hv_max / 2; /* Is always 2^n-1 */
4a76a316 1190 HvMAX(hv) = hv_max;
b3ac6de7
IZ
1191 if (!hv_fill)
1192 return hv;
1193
1194#if 0
14befaf4 1195 if (! SvTIED_mg((SV*)ohv, PERL_MAGIC_tied)) {
b3ac6de7 1196 /* Quick way ???*/
1c846c1f
NIS
1197 }
1198 else
b3ac6de7
IZ
1199#endif
1200 {
1201 HE *entry;
1202 I32 hv_riter = HvRITER(ohv); /* current root of iterator */
1203 HE *hv_eiter = HvEITER(ohv); /* current entry of iterator */
1204
1205 /* Slow way */
4a76a316 1206 hv_iterinit(ohv);
155aba94 1207 while ((entry = hv_iternext(ohv))) {
c3654f1a 1208 hv_store(hv, HeKEY(entry), HeKLEN_UTF8(entry),
00122d59 1209 newSVsv(HeVAL(entry)), HeHASH(entry));
b3ac6de7
IZ
1210 }
1211 HvRITER(ohv) = hv_riter;
1212 HvEITER(ohv) = hv_eiter;
1213 }
1c846c1f 1214
b3ac6de7
IZ
1215 return hv;
1216}
1217
79072805 1218void
864dbfa3 1219Perl_hv_free_ent(pTHX_ HV *hv, register HE *entry)
79072805 1220{
16bdeea2
GS
1221 SV *val;
1222
68dc0745 1223 if (!entry)
79072805 1224 return;
16bdeea2 1225 val = HeVAL(entry);
257c9e5b 1226 if (val && isGV(val) && GvCVu(val) && HvNAME(hv))
3280af22 1227 PL_sub_generation++; /* may be deletion of method from stash */
16bdeea2 1228 SvREFCNT_dec(val);
68dc0745 1229 if (HeKLEN(entry) == HEf_SVKEY) {
1230 SvREFCNT_dec(HeKEY_sv(entry));
1231 Safefree(HeKEY_hek(entry));
44a8e56a 1232 }
1233 else if (HvSHAREKEYS(hv))
68dc0745 1234 unshare_hek(HeKEY_hek(entry));
fde52b5c 1235 else
68dc0745 1236 Safefree(HeKEY_hek(entry));
d33b2eba 1237 del_HE(entry);
79072805
LW
1238}
1239
1240void
864dbfa3 1241Perl_hv_delayfree_ent(pTHX_ HV *hv, register HE *entry)
79072805 1242{
68dc0745 1243 if (!entry)
79072805 1244 return;
68dc0745 1245 if (isGV(HeVAL(entry)) && GvCVu(HeVAL(entry)) && HvNAME(hv))
3280af22 1246 PL_sub_generation++; /* may be deletion of method from stash */
68dc0745 1247 sv_2mortal(HeVAL(entry)); /* free between statements */
1248 if (HeKLEN(entry) == HEf_SVKEY) {
1249 sv_2mortal(HeKEY_sv(entry));
1250 Safefree(HeKEY_hek(entry));
44a8e56a 1251 }
1252 else if (HvSHAREKEYS(hv))
68dc0745 1253 unshare_hek(HeKEY_hek(entry));
fde52b5c 1254 else
68dc0745 1255 Safefree(HeKEY_hek(entry));
d33b2eba 1256 del_HE(entry);
79072805
LW
1257}
1258
954c1994
GS
1259/*
1260=for apidoc hv_clear
1261
1262Clears a hash, making it empty.
1263
1264=cut
1265*/
1266
79072805 1267void
864dbfa3 1268Perl_hv_clear(pTHX_ HV *hv)
79072805 1269{
cbec9347 1270 register XPVHV* xhv;
79072805
LW
1271 if (!hv)
1272 return;
cbec9347 1273 xhv = (XPVHV*)SvANY(hv);
463ee0b2 1274 hfreeentries(hv);
cbec9347
JH
1275 xhv->xhv_fill = 0; /* HvFILL(hv) = 0 */
1276 xhv->xhv_keys = 0; /* HvKEYS(hv) = 0 */
1277 if (xhv->xhv_array /* HvARRAY(hv) */)
1278 (void)memzero(xhv->xhv_array /* HvARRAY(hv) */,
1279 (xhv->xhv_max+1 /* HvMAX(hv)+1 */) * sizeof(HE*));
a0d0e21e
LW
1280
1281 if (SvRMAGICAL(hv))
1c846c1f 1282 mg_clear((SV*)hv);
79072805
LW
1283}
1284
76e3520e 1285STATIC void
cea2e8a9 1286S_hfreeentries(pTHX_ HV *hv)
79072805 1287{
a0d0e21e 1288 register HE **array;
68dc0745 1289 register HE *entry;
1290 register HE *oentry = Null(HE*);
a0d0e21e
LW
1291 I32 riter;
1292 I32 max;
79072805
LW
1293
1294 if (!hv)
1295 return;
a0d0e21e 1296 if (!HvARRAY(hv))
79072805 1297 return;
a0d0e21e
LW
1298
1299 riter = 0;
1300 max = HvMAX(hv);
1301 array = HvARRAY(hv);
68dc0745 1302 entry = array[0];
a0d0e21e 1303 for (;;) {
68dc0745 1304 if (entry) {
1305 oentry = entry;
1306 entry = HeNEXT(entry);
1307 hv_free_ent(hv, oentry);
a0d0e21e 1308 }
68dc0745 1309 if (!entry) {
a0d0e21e
LW
1310 if (++riter > max)
1311 break;
68dc0745 1312 entry = array[riter];
1c846c1f 1313 }
79072805 1314 }
a0d0e21e 1315 (void)hv_iterinit(hv);
79072805
LW
1316}
1317
954c1994
GS
1318/*
1319=for apidoc hv_undef
1320
1321Undefines the hash.
1322
1323=cut
1324*/
1325
79072805 1326void
864dbfa3 1327Perl_hv_undef(pTHX_ HV *hv)
79072805 1328{
cbec9347 1329 register XPVHV* xhv;
79072805
LW
1330 if (!hv)
1331 return;
cbec9347 1332 xhv = (XPVHV*)SvANY(hv);
463ee0b2 1333 hfreeentries(hv);
cbec9347 1334 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
85e6fe83
LW
1335 if (HvNAME(hv)) {
1336 Safefree(HvNAME(hv));
1337 HvNAME(hv) = 0;
1338 }
cbec9347
JH
1339 xhv->xhv_max = 7; /* HvMAX(hv) = 7 (it's a normal hash) */
1340 xhv->xhv_array = 0; /* HvARRAY(hv) = 0 */
1341 xhv->xhv_fill = 0; /* HvFILL(hv) = 0 */
1342 xhv->xhv_keys = 0; /* HvKEYS(hv) = 0 */
a0d0e21e
LW
1343
1344 if (SvRMAGICAL(hv))
1c846c1f 1345 mg_clear((SV*)hv);
79072805
LW
1346}
1347
954c1994
GS
1348/*
1349=for apidoc hv_iterinit
1350
1351Prepares a starting point to traverse a hash table. Returns the number of
1352keys in the hash (i.e. the same as C<HvKEYS(tb)>). The return value is
1c846c1f 1353currently only meaningful for hashes without tie magic.
954c1994
GS
1354
1355NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
1356hash buckets that happen to be in use. If you still need that esoteric
1357value, you can get it through the macro C<HvFILL(tb)>.
1358
1359=cut
1360*/
1361
79072805 1362I32
864dbfa3 1363Perl_hv_iterinit(pTHX_ HV *hv)
79072805 1364{
cbec9347 1365 register XPVHV* xhv;
aa689395 1366 HE *entry;
1367
1368 if (!hv)
cea2e8a9 1369 Perl_croak(aTHX_ "Bad hash");
cbec9347
JH
1370 xhv = (XPVHV*)SvANY(hv);
1371 entry = xhv->xhv_eiter; /* HvEITER(hv) */
72940dca 1372 if (entry && HvLAZYDEL(hv)) { /* was deleted earlier? */
1373 HvLAZYDEL_off(hv);
68dc0745 1374 hv_free_ent(hv, entry);
72940dca 1375 }
cbec9347
JH
1376 xhv->xhv_riter = -1; /* HvRITER(hv) = -1 */
1377 xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
1378 /* used to be xhv->xhv_fill before 5.004_65 */
1379 return xhv->xhv_keys; /* HvKEYS(hv) */
79072805
LW
1380}
1381
954c1994
GS
1382/*
1383=for apidoc hv_iternext
1384
1385Returns entries from a hash iterator. See C<hv_iterinit>.
1386
1387=cut
1388*/
1389
79072805 1390HE *
864dbfa3 1391Perl_hv_iternext(pTHX_ HV *hv)
79072805 1392{
cbec9347 1393 register XPVHV* xhv;
79072805 1394 register HE *entry;
a0d0e21e 1395 HE *oldentry;
463ee0b2 1396 MAGIC* mg;
79072805
LW
1397
1398 if (!hv)
cea2e8a9 1399 Perl_croak(aTHX_ "Bad hash");
cbec9347
JH
1400 xhv = (XPVHV*)SvANY(hv);
1401 oldentry = entry = xhv->xhv_eiter; /* HvEITER(hv) */
463ee0b2 1402
14befaf4 1403 if ((mg = SvTIED_mg((SV*)hv, PERL_MAGIC_tied))) {
8990e307 1404 SV *key = sv_newmortal();
cd1469e6 1405 if (entry) {
fde52b5c 1406 sv_setsv(key, HeSVKEY_force(entry));
cd1469e6 1407 SvREFCNT_dec(HeSVKEY(entry)); /* get rid of previous key */
1408 }
a0d0e21e 1409 else {
ff68c719 1410 char *k;
bbce6d69 1411 HEK *hek;
ff68c719 1412
cbec9347
JH
1413 /* one HE per MAGICAL hash */
1414 xhv->xhv_eiter = entry = new_HE(); /* HvEITER(hv) = new_HE() */
4633a7c4 1415 Zero(entry, 1, HE);
ff68c719 1416 Newz(54, k, HEK_BASESIZE + sizeof(SV*), char);
1417 hek = (HEK*)k;
1418 HeKEY_hek(entry) = hek;
fde52b5c 1419 HeKLEN(entry) = HEf_SVKEY;
a0d0e21e
LW
1420 }
1421 magic_nextpack((SV*) hv,mg,key);
463ee0b2 1422 if (SvOK(key)) {
cd1469e6 1423 /* force key to stay around until next time */
bbce6d69 1424 HeSVKEY_set(entry, SvREFCNT_inc(key));
1425 return entry; /* beware, hent_val is not set */
463ee0b2 1426 }
fde52b5c 1427 if (HeVAL(entry))
1428 SvREFCNT_dec(HeVAL(entry));
ff68c719 1429 Safefree(HeKEY_hek(entry));
d33b2eba 1430 del_HE(entry);
cbec9347 1431 xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
463ee0b2 1432 return Null(HE*);
79072805 1433 }
f675dbe5 1434#ifdef DYNAMIC_ENV_FETCH /* set up %ENV for iteration */
cbec9347 1435 if (!entry && SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
f675dbe5
CB
1436 prime_env_iter();
1437#endif
463ee0b2 1438
cbec9347
JH
1439 if (!xhv->xhv_array /* !HvARRAY(hv) */)
1440 Newz(506, xhv->xhv_array /* HvARRAY(hv) */,
1441 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
1442 char);
fde52b5c 1443 if (entry)
1444 entry = HeNEXT(entry);
1445 while (!entry) {
cbec9347
JH
1446 xhv->xhv_riter++; /* HvRITER(hv)++ */
1447 if (xhv->xhv_riter > xhv->xhv_max /* HvRITER(hv) > HvMAX(hv) */) {
1448 xhv->xhv_riter = -1; /* HvRITER(hv) = -1 */
fde52b5c 1449 break;
79072805 1450 }
cbec9347
JH
1451 /* entry = (HvARRAY(hv))[HvRITER(hv)]; */
1452 entry = ((HE**)xhv->xhv_array)[xhv->xhv_riter];
fde52b5c 1453 }
79072805 1454
72940dca 1455 if (oldentry && HvLAZYDEL(hv)) { /* was deleted earlier? */
1456 HvLAZYDEL_off(hv);
68dc0745 1457 hv_free_ent(hv, oldentry);
72940dca 1458 }
a0d0e21e 1459
cbec9347 1460 xhv->xhv_eiter = entry; /* HvEITER(hv) = entry */
79072805
LW
1461 return entry;
1462}
1463
954c1994
GS
1464/*
1465=for apidoc hv_iterkey
1466
1467Returns the key from the current position of the hash iterator. See
1468C<hv_iterinit>.
1469
1470=cut
1471*/
1472
79072805 1473char *
864dbfa3 1474Perl_hv_iterkey(pTHX_ register HE *entry, I32 *retlen)
79072805 1475{
fde52b5c 1476 if (HeKLEN(entry) == HEf_SVKEY) {
fb73857a 1477 STRLEN len;
1478 char *p = SvPV(HeKEY_sv(entry), len);
1479 *retlen = len;
1480 return p;
fde52b5c 1481 }
1482 else {
1483 *retlen = HeKLEN(entry);
1484 return HeKEY(entry);
1485 }
1486}
1487
1488/* unlike hv_iterval(), this always returns a mortal copy of the key */
954c1994
GS
1489/*
1490=for apidoc hv_iterkeysv
1491
1492Returns the key as an C<SV*> from the current position of the hash
1493iterator. The return value will always be a mortal copy of the key. Also
1494see C<hv_iterinit>.
1495
1496=cut
1497*/
1498
fde52b5c 1499SV *
864dbfa3 1500Perl_hv_iterkeysv(pTHX_ register HE *entry)
fde52b5c 1501{
1502 if (HeKLEN(entry) == HEf_SVKEY)
bbce6d69 1503 return sv_mortalcopy(HeKEY_sv(entry));
c3654f1a
IH
1504 else
1505 return sv_2mortal(newSVpvn_share((HeKLEN(entry) ? HeKEY(entry) : ""),
1506 HeKLEN_UTF8(entry), HeHASH(entry)));
79072805
LW
1507}
1508
954c1994
GS
1509/*
1510=for apidoc hv_iterval
1511
1512Returns the value from the current position of the hash iterator. See
1513C<hv_iterkey>.
1514
1515=cut
1516*/
1517
79072805 1518SV *
864dbfa3 1519Perl_hv_iterval(pTHX_ HV *hv, register HE *entry)
79072805 1520{
8990e307 1521 if (SvRMAGICAL(hv)) {
14befaf4 1522 if (mg_find((SV*)hv, PERL_MAGIC_tied)) {
8990e307 1523 SV* sv = sv_newmortal();
bbce6d69 1524 if (HeKLEN(entry) == HEf_SVKEY)
1525 mg_copy((SV*)hv, sv, (char*)HeKEY_sv(entry), HEf_SVKEY);
1526 else mg_copy((SV*)hv, sv, HeKEY(entry), HeKLEN(entry));
463ee0b2
LW
1527 return sv;
1528 }
79072805 1529 }
fde52b5c 1530 return HeVAL(entry);
79072805
LW
1531}
1532
954c1994
GS
1533/*
1534=for apidoc hv_iternextsv
1535
1536Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
1537operation.
1538
1539=cut
1540*/
1541
a0d0e21e 1542SV *
864dbfa3 1543Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
a0d0e21e
LW
1544{
1545 HE *he;
1546 if ( (he = hv_iternext(hv)) == NULL)
1547 return NULL;
1548 *key = hv_iterkey(he, retlen);
1549 return hv_iterval(hv, he);
1550}
1551
954c1994
GS
1552/*
1553=for apidoc hv_magic
1554
1555Adds magic to a hash. See C<sv_magic>.
1556
1557=cut
1558*/
1559
79072805 1560void
864dbfa3 1561Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how)
79072805 1562{
a0d0e21e 1563 sv_magic((SV*)hv, (SV*)gv, how, Nullch, 0);
79072805 1564}
fde52b5c 1565
bbce6d69 1566char*
864dbfa3 1567Perl_sharepvn(pTHX_ const char *sv, I32 len, U32 hash)
bbce6d69 1568{
ff68c719 1569 return HEK_KEY(share_hek(sv, len, hash));
bbce6d69 1570}
1571
1572/* possibly free a shared string if no one has access to it
fde52b5c 1573 * len and hash must both be valid for str.
1574 */
bbce6d69 1575void
864dbfa3 1576Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
fde52b5c 1577{
cbec9347 1578 register XPVHV* xhv;
fde52b5c 1579 register HE *entry;
1580 register HE **oentry;
1581 register I32 i = 1;
1582 I32 found = 0;
c3654f1a 1583 bool is_utf8 = FALSE;
f9a63242 1584 const char *save = str;
c3654f1a
IH
1585
1586 if (len < 0) {
77caf834 1587 STRLEN tmplen = -len;
c3654f1a 1588 is_utf8 = TRUE;
77caf834
JH
1589 /* See the note in hv_fetch(). --jhi */
1590 str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
1591 len = tmplen;
c3654f1a 1592 }
1c846c1f 1593
fde52b5c 1594 /* what follows is the moral equivalent of:
6b88bc9c 1595 if ((Svp = hv_fetch(PL_strtab, tmpsv, FALSE, hash))) {
bbce6d69 1596 if (--*Svp == Nullsv)
6b88bc9c 1597 hv_delete(PL_strtab, str, len, G_DISCARD, hash);
bbce6d69 1598 } */
cbec9347 1599 xhv = (XPVHV*)SvANY(PL_strtab);
fde52b5c 1600 /* assert(xhv_array != 0) */
5f08fbcd 1601 LOCK_STRTAB_MUTEX;
cbec9347
JH
1602 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1603 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
bbce6d69 1604 for (entry = *oentry; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
fde52b5c 1605 if (HeHASH(entry) != hash) /* strings can't be equal */
1606 continue;
1607 if (HeKLEN(entry) != len)
1608 continue;
1c846c1f 1609 if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
fde52b5c 1610 continue;
c3654f1a
IH
1611 if (HeKUTF8(entry) != (char)is_utf8)
1612 continue;
fde52b5c 1613 found = 1;
bbce6d69 1614 if (--HeVAL(entry) == Nullsv) {
1615 *oentry = HeNEXT(entry);
1616 if (i && !*oentry)
cbec9347 1617 xhv->xhv_fill--; /* HvFILL(hv)-- */
ff68c719 1618 Safefree(HeKEY_hek(entry));
d33b2eba 1619 del_HE(entry);
cbec9347 1620 xhv->xhv_keys--; /* HvKEYS(hv)-- */
fde52b5c 1621 }
bbce6d69 1622 break;
fde52b5c 1623 }
333f433b 1624 UNLOCK_STRTAB_MUTEX;
f9a63242
JH
1625 if (str != save)
1626 Safefree(str);
411caa50
JH
1627 if (!found && ckWARN_d(WARN_INTERNAL))
1628 Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free non-existent shared string '%s'",str);
fde52b5c 1629}
1630
bbce6d69 1631/* get a (constant) string ptr from the global string table
1632 * string will get added if it is not already there.
fde52b5c 1633 * len and hash must both be valid for str.
1634 */
bbce6d69 1635HEK *
864dbfa3 1636Perl_share_hek(pTHX_ const char *str, I32 len, register U32 hash)
fde52b5c 1637{
cbec9347 1638 register XPVHV* xhv;
fde52b5c 1639 register HE *entry;
1640 register HE **oentry;
1641 register I32 i = 1;
1642 I32 found = 0;
da58a35d 1643 bool is_utf8 = FALSE;
f9a63242 1644 const char *save = str;
da58a35d
JH
1645
1646 if (len < 0) {
77caf834 1647 STRLEN tmplen = -len;
da58a35d 1648 is_utf8 = TRUE;
77caf834
JH
1649 /* See the note in hv_fetch(). --jhi */
1650 str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
1651 len = tmplen;
da58a35d 1652 }
bbce6d69 1653
fde52b5c 1654 /* what follows is the moral equivalent of:
1c846c1f 1655
6b88bc9c
GS
1656 if (!(Svp = hv_fetch(PL_strtab, str, len, FALSE)))
1657 hv_store(PL_strtab, str, len, Nullsv, hash);
bbce6d69 1658 */
cbec9347 1659 xhv = (XPVHV*)SvANY(PL_strtab);
fde52b5c 1660 /* assert(xhv_array != 0) */
5f08fbcd 1661 LOCK_STRTAB_MUTEX;
cbec9347
JH
1662 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1663 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
bbce6d69 1664 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
fde52b5c 1665 if (HeHASH(entry) != hash) /* strings can't be equal */
1666 continue;
1667 if (HeKLEN(entry) != len)
1668 continue;
1c846c1f 1669 if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
fde52b5c 1670 continue;
c3654f1a
IH
1671 if (HeKUTF8(entry) != (char)is_utf8)
1672 continue;
fde52b5c 1673 found = 1;
fde52b5c 1674 break;
1675 }
bbce6d69 1676 if (!found) {
d33b2eba 1677 entry = new_HE();
c3654f1a 1678 HeKEY_hek(entry) = save_hek(str, is_utf8?-len:len, hash);
bbce6d69 1679 HeVAL(entry) = Nullsv;
1680 HeNEXT(entry) = *oentry;
1681 *oentry = entry;
cbec9347 1682 xhv->xhv_keys++; /* HvKEYS(hv)++ */
bbce6d69 1683 if (i) { /* initial entry? */
cbec9347
JH
1684 xhv->xhv_fill++; /* HvFILL(hv)++ */
1685 if (xhv->xhv_keys > xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */)
1686 hsplit(PL_strtab);
bbce6d69 1687 }
1688 }
1689
1690 ++HeVAL(entry); /* use value slot as REFCNT */
5f08fbcd 1691 UNLOCK_STRTAB_MUTEX;
f9a63242
JH
1692 if (str != save)
1693 Safefree(str);
ff68c719 1694 return HeKEY_hek(entry);
fde52b5c 1695}