This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[DOCPATCH] hv_store and hv_store_ent
[perl5.git] / hv.c
... / ...
CommitLineData
1/* hv.c
2 *
3 * Copyright (c) 1991-2002, Larry Wall
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 *
8 */
9
10/*
11 * "I sit beside the fire and think of all that I have seen." --Bilbo
12 */
13
14/*
15=head1 Hash Manipulation Functions
16*/
17
18#include "EXTERN.h"
19#define PERL_IN_HV_C
20#include "perl.h"
21
22STATIC HE*
23S_new_he(pTHX)
24{
25 HE* he;
26 LOCK_SV_MUTEX;
27 if (!PL_he_root)
28 more_he();
29 he = PL_he_root;
30 PL_he_root = HeNEXT(he);
31 UNLOCK_SV_MUTEX;
32 return he;
33}
34
35STATIC void
36S_del_he(pTHX_ HE *p)
37{
38 LOCK_SV_MUTEX;
39 HeNEXT(p) = (HE*)PL_he_root;
40 PL_he_root = p;
41 UNLOCK_SV_MUTEX;
42}
43
44STATIC void
45S_more_he(pTHX)
46{
47 register HE* he;
48 register HE* heend;
49 XPV *ptr;
50 New(54, ptr, 1008/sizeof(XPV), XPV);
51 ptr->xpv_pv = (char*)PL_he_arenaroot;
52 PL_he_arenaroot = ptr;
53
54 he = (HE*)ptr;
55 heend = &he[1008 / sizeof(HE) - 1];
56 PL_he_root = ++he;
57 while (he < heend) {
58 HeNEXT(he) = (HE*)(he + 1);
59 he++;
60 }
61 HeNEXT(he) = 0;
62}
63
64#ifdef PURIFY
65
66#define new_HE() (HE*)safemalloc(sizeof(HE))
67#define del_HE(p) safefree((char*)p)
68
69#else
70
71#define new_HE() new_he()
72#define del_HE(p) del_he(p)
73
74#endif
75
76STATIC HEK *
77S_save_hek_flags(pTHX_ const char *str, I32 len, U32 hash, int flags)
78{
79 char *k;
80 register HEK *hek;
81
82 New(54, k, HEK_BASESIZE + len + 2, char);
83 hek = (HEK*)k;
84 Copy(str, HEK_KEY(hek), len, char);
85 HEK_KEY(hek)[len] = 0;
86 HEK_LEN(hek) = len;
87 HEK_HASH(hek) = hash;
88 HEK_FLAGS(hek) = (unsigned char)flags;
89 return hek;
90}
91
92#if defined(USE_ITHREADS)
93HE *
94Perl_he_dup(pTHX_ HE *e, bool shared, CLONE_PARAMS* param)
95{
96 HE *ret;
97
98 if (!e)
99 return Nullhe;
100 /* look for it in the table first */
101 ret = (HE*)ptr_table_fetch(PL_ptr_table, e);
102 if (ret)
103 return ret;
104
105 /* create anew and remember what it is */
106 ret = new_HE();
107 ptr_table_store(PL_ptr_table, e, ret);
108
109 HeNEXT(ret) = he_dup(HeNEXT(e),shared, param);
110 if (HeKLEN(e) == HEf_SVKEY)
111 HeKEY_sv(ret) = SvREFCNT_inc(sv_dup(HeKEY_sv(e), param));
112 else if (shared)
113 HeKEY_hek(ret) = share_hek_flags(HeKEY(e), HeKLEN(e), HeHASH(e),
114 HeKFLAGS(e));
115 else
116 HeKEY_hek(ret) = save_hek_flags(HeKEY(e), HeKLEN(e), HeHASH(e),
117 HeKFLAGS(e));
118 HeVAL(ret) = SvREFCNT_inc(sv_dup(HeVAL(e), param));
119 return ret;
120}
121#endif /* USE_ITHREADS */
122
123static void
124S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen,
125 const char *msg)
126{
127 SV *sv = sv_newmortal(), *esv = sv_newmortal();
128 if (!(flags & HVhek_FREEKEY)) {
129 sv_setpvn(sv, key, klen);
130 }
131 else {
132 /* Need to free saved eventually assign to mortal SV */
133 SV *sv = sv_newmortal();
134 sv_usepvn(sv, (char *) key, klen);
135 }
136 if (flags & HVhek_UTF8) {
137 SvUTF8_on(sv);
138 }
139 Perl_sv_setpvf(aTHX_ esv, "Attempt to %s a restricted hash", msg);
140 Perl_croak(aTHX_ SvPVX(esv), sv);
141}
142
143/* (klen == HEf_SVKEY) is special for MAGICAL hv entries, meaning key slot
144 * contains an SV* */
145
146/*
147=for apidoc hv_fetch
148
149Returns the SV which corresponds to the specified key in the hash. The
150C<klen> is the length of the key. If C<lval> is set then the fetch will be
151part of a store. Check that the return value is non-null before
152dereferencing it to an C<SV*>.
153
154See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
155information on how to use this function on tied hashes.
156
157=cut
158*/
159
160
161SV**
162Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen, I32 lval)
163{
164 bool is_utf8 = FALSE;
165 const char *keysave = key;
166 int flags = 0;
167
168 if (klen < 0) {
169 klen = -klen;
170 is_utf8 = TRUE;
171 }
172
173 if (is_utf8) {
174 STRLEN tmplen = klen;
175 /* Just casting the &klen to (STRLEN) won't work well
176 * if STRLEN and I32 are of different widths. --jhi */
177 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
178 klen = tmplen;
179 /* If we were able to downgrade here, then than means that we were
180 passed in a key which only had chars 0-255, but was utf8 encoded. */
181 if (is_utf8)
182 flags = HVhek_UTF8;
183 /* If we found we were able to downgrade the string to bytes, then
184 we should flag that it needs upgrading on keys or each. */
185 if (key != keysave)
186 flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
187 }
188
189 return hv_fetch_flags (hv, key, klen, lval, flags);
190}
191
192STATIC SV**
193S_hv_fetch_flags(pTHX_ HV *hv, const char *key, I32 klen, I32 lval, int flags)
194{
195 register XPVHV* xhv;
196 register U32 hash;
197 register HE *entry;
198 SV *sv;
199
200 if (!hv)
201 return 0;
202
203 if (SvRMAGICAL(hv)) {
204 /* All this clause seems to be utf8 unaware.
205 By moving the utf8 stuff out to hv_fetch_flags I need to ensure
206 key doesn't leak. I've not tried solving the utf8-ness.
207 NWC.
208 */
209 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
210 sv = sv_newmortal();
211 mg_copy((SV*)hv, sv, key, klen);
212 if (flags & HVhek_FREEKEY)
213 Safefree(key);
214 PL_hv_fetch_sv = sv;
215 return &PL_hv_fetch_sv;
216 }
217#ifdef ENV_IS_CASELESS
218 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
219 I32 i;
220 for (i = 0; i < klen; ++i)
221 if (isLOWER(key[i])) {
222 char *nkey = strupr(SvPVX(sv_2mortal(newSVpvn(key,klen))));
223 SV **ret = hv_fetch(hv, nkey, klen, 0);
224 if (!ret && lval) {
225 ret = hv_store_flags(hv, key, klen, NEWSV(61,0), 0,
226 flags);
227 } else if (flags & HVhek_FREEKEY)
228 Safefree(key);
229 return ret;
230 }
231 }
232#endif
233 }
234
235 /* We use xhv->xhv_foo fields directly instead of HvFOO(hv) to
236 avoid unnecessary pointer dereferencing. */
237 xhv = (XPVHV*)SvANY(hv);
238 if (!xhv->xhv_array /* !HvARRAY(hv) */) {
239 if (lval
240#ifdef DYNAMIC_ENV_FETCH /* if it's an %ENV lookup, we may get it on the fly */
241 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
242#endif
243 )
244 Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
245 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
246 char);
247 else {
248 if (flags & HVhek_FREEKEY)
249 Safefree(key);
250 return 0;
251 }
252 }
253
254 PERL_HASH(hash, key, klen);
255
256 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
257 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
258 for (; entry; entry = HeNEXT(entry)) {
259 if (HeHASH(entry) != hash) /* strings can't be equal */
260 continue;
261 if (HeKLEN(entry) != (I32)klen)
262 continue;
263 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
264 continue;
265 /* flags is 0 if not utf8. need HeKFLAGS(entry) also 0.
266 flags is 1 if utf8. need HeKFLAGS(entry) also 1.
267 xor is true if bits differ, in which case this isn't a match. */
268 if ((HeKFLAGS(entry) ^ flags) & HVhek_UTF8)
269 continue;
270 if (lval && HeKFLAGS(entry) != flags) {
271 /* We match if HVhek_UTF8 bit in our flags and hash key's match.
272 But if entry was set previously with HVhek_WASUTF8 and key now
273 doesn't (or vice versa) then we should change the key's flag,
274 as this is assignment. */
275 if (HvSHAREKEYS(hv)) {
276 /* Need to swap the key we have for a key with the flags we
277 need. As keys are shared we can't just write to the flag,
278 so we share the new one, unshare the old one. */
279 int flags_nofree = flags & ~HVhek_FREEKEY;
280 HEK *new_hek = share_hek_flags(key, klen, hash, flags_nofree);
281 unshare_hek (HeKEY_hek(entry));
282 HeKEY_hek(entry) = new_hek;
283 }
284 else
285 HeKFLAGS(entry) = flags;
286 }
287 if (flags & HVhek_FREEKEY)
288 Safefree(key);
289 /* if we find a placeholder, we pretend we haven't found anything */
290 if (HeVAL(entry) == &PL_sv_undef)
291 break;
292 return &HeVAL(entry);
293
294 }
295#ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
296 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
297 unsigned long len;
298 char *env = PerlEnv_ENVgetenv_len(key,&len);
299 if (env) {
300 sv = newSVpvn(env,len);
301 SvTAINTED_on(sv);
302 if (flags & HVhek_FREEKEY)
303 Safefree(key);
304 return hv_store(hv,key,klen,sv,hash);
305 }
306 }
307#endif
308 if (!entry && SvREADONLY(hv)) {
309 S_hv_notallowed(aTHX_ flags, key, klen,
310 "access disallowed key '%"SVf"' in"
311 );
312 }
313 if (lval) { /* gonna assign to this, so it better be there */
314 sv = NEWSV(61,0);
315 return hv_store_flags(hv,key,klen,sv,hash,flags);
316 }
317 if (flags & HVhek_FREEKEY)
318 Safefree(key);
319 return 0;
320}
321
322/* returns an HE * structure with the all fields set */
323/* note that hent_val will be a mortal sv for MAGICAL hashes */
324/*
325=for apidoc hv_fetch_ent
326
327Returns the hash entry which corresponds to the specified key in the hash.
328C<hash> must be a valid precomputed hash number for the given C<key>, or 0
329if you want the function to compute it. IF C<lval> is set then the fetch
330will be part of a store. Make sure the return value is non-null before
331accessing it. The return value when C<tb> is a tied hash is a pointer to a
332static location, so be sure to make a copy of the structure if you need to
333store it somewhere.
334
335See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
336information on how to use this function on tied hashes.
337
338=cut
339*/
340
341HE *
342Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash)
343{
344 register XPVHV* xhv;
345 register char *key;
346 STRLEN klen;
347 register HE *entry;
348 SV *sv;
349 bool is_utf8;
350 int flags = 0;
351 char *keysave;
352
353 if (!hv)
354 return 0;
355
356 if (SvRMAGICAL(hv)) {
357 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
358 sv = sv_newmortal();
359 keysv = sv_2mortal(newSVsv(keysv));
360 mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
361 if (!HeKEY_hek(&PL_hv_fetch_ent_mh)) {
362 char *k;
363 New(54, k, HEK_BASESIZE + sizeof(SV*), char);
364 HeKEY_hek(&PL_hv_fetch_ent_mh) = (HEK*)k;
365 }
366 HeSVKEY_set(&PL_hv_fetch_ent_mh, keysv);
367 HeVAL(&PL_hv_fetch_ent_mh) = sv;
368 return &PL_hv_fetch_ent_mh;
369 }
370#ifdef ENV_IS_CASELESS
371 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
372 U32 i;
373 key = SvPV(keysv, klen);
374 for (i = 0; i < klen; ++i)
375 if (isLOWER(key[i])) {
376 SV *nkeysv = sv_2mortal(newSVpvn(key,klen));
377 (void)strupr(SvPVX(nkeysv));
378 entry = hv_fetch_ent(hv, nkeysv, 0, 0);
379 if (!entry && lval)
380 entry = hv_store_ent(hv, keysv, NEWSV(61,0), hash);
381 return entry;
382 }
383 }
384#endif
385 }
386
387 xhv = (XPVHV*)SvANY(hv);
388 if (!xhv->xhv_array /* !HvARRAY(hv) */) {
389 if (lval
390#ifdef DYNAMIC_ENV_FETCH /* if it's an %ENV lookup, we may get it on the fly */
391 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
392#endif
393 )
394 Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
395 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
396 char);
397 else
398 return 0;
399 }
400
401 keysave = key = SvPV(keysv, klen);
402 is_utf8 = (SvUTF8(keysv)!=0);
403
404 if (is_utf8) {
405 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
406 if (is_utf8)
407 flags = HVhek_UTF8;
408 if (key != keysave)
409 flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
410 }
411
412 if (!hash) {
413 if SvIsCOW_shared_hash(keysv) {
414 hash = SvUVX(keysv);
415 } else {
416 PERL_HASH(hash, key, klen);
417 }
418 }
419
420 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
421 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
422 for (; entry; entry = HeNEXT(entry)) {
423 if (HeHASH(entry) != hash) /* strings can't be equal */
424 continue;
425 if (HeKLEN(entry) != (I32)klen)
426 continue;
427 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
428 continue;
429 if ((HeKFLAGS(entry) ^ flags) & HVhek_UTF8)
430 continue;
431 if (lval && HeKFLAGS(entry) != flags) {
432 /* We match if HVhek_UTF8 bit in our flags and hash key's match.
433 But if entry was set previously with HVhek_WASUTF8 and key now
434 doesn't (or vice versa) then we should change the key's flag,
435 as this is assignment. */
436 if (HvSHAREKEYS(hv)) {
437 /* Need to swap the key we have for a key with the flags we
438 need. As keys are shared we can't just write to the flag,
439 so we share the new one, unshare the old one. */
440 int flags_nofree = flags & ~HVhek_FREEKEY;
441 HEK *new_hek = share_hek_flags(key, klen, hash, flags_nofree);
442 unshare_hek (HeKEY_hek(entry));
443 HeKEY_hek(entry) = new_hek;
444 }
445 else
446 HeKFLAGS(entry) = flags;
447 }
448 if (key != keysave)
449 Safefree(key);
450 /* if we find a placeholder, we pretend we haven't found anything */
451 if (HeVAL(entry) == &PL_sv_undef)
452 break;
453 return entry;
454 }
455#ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
456 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
457 unsigned long len;
458 char *env = PerlEnv_ENVgetenv_len(key,&len);
459 if (env) {
460 sv = newSVpvn(env,len);
461 SvTAINTED_on(sv);
462 return hv_store_ent(hv,keysv,sv,hash);
463 }
464 }
465#endif
466 if (!entry && SvREADONLY(hv)) {
467 S_hv_notallowed(aTHX_ flags, key, klen,
468 "access disallowed key '%"SVf"' in"
469 );
470 }
471 if (flags & HVhek_FREEKEY)
472 Safefree(key);
473 if (lval) { /* gonna assign to this, so it better be there */
474 sv = NEWSV(61,0);
475 return hv_store_ent(hv,keysv,sv,hash);
476 }
477 return 0;
478}
479
480STATIC void
481S_hv_magic_check(pTHX_ HV *hv, bool *needs_copy, bool *needs_store)
482{
483 MAGIC *mg = SvMAGIC(hv);
484 *needs_copy = FALSE;
485 *needs_store = TRUE;
486 while (mg) {
487 if (isUPPER(mg->mg_type)) {
488 *needs_copy = TRUE;
489 switch (mg->mg_type) {
490 case PERL_MAGIC_tied:
491 case PERL_MAGIC_sig:
492 *needs_store = FALSE;
493 }
494 }
495 mg = mg->mg_moremagic;
496 }
497}
498
499/*
500=for apidoc hv_store
501
502Stores an SV in a hash. The hash key is specified as C<key> and C<klen> is
503the length of the key. The C<hash> parameter is the precomputed hash
504value; if it is zero then Perl will compute it. The return value will be
505NULL if the operation failed or if the value did not need to be actually
506stored within the hash (as in the case of tied hashes). Otherwise it can
507be dereferenced to get the original C<SV*>. Note that the caller is
508responsible for suitably incrementing the reference count of C<val> before
509the call, and decrementing it if the function returned NULL. Effectively
510a successful hv_store takes ownership of one reference to C<val>. This is
511usually what you want; a newly created SV has a reference count of one, so
512if all your code does is create SVs then store them in a hash, hv_store
513will own the only reference to the new SV, and your code doesn't need to do
514anything further to tidy up. hv_store is not implemented as a call to
515hv_store_ent, and does not create a temporary SV for the key, so if your
516key data is not already in SV form then use hv_store in preference to
517hv_store_ent.
518
519See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
520information on how to use this function on tied hashes.
521
522=cut
523*/
524
525SV**
526Perl_hv_store(pTHX_ HV *hv, const char *key, I32 klen, SV *val, U32 hash)
527{
528 bool is_utf8 = FALSE;
529 const char *keysave = key;
530 int flags = 0;
531
532 if (klen < 0) {
533 klen = -klen;
534 is_utf8 = TRUE;
535 }
536
537 if (is_utf8) {
538 STRLEN tmplen = klen;
539 /* Just casting the &klen to (STRLEN) won't work well
540 * if STRLEN and I32 are of different widths. --jhi */
541 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
542 klen = tmplen;
543 /* If we were able to downgrade here, then than means that we were
544 passed in a key which only had chars 0-255, but was utf8 encoded. */
545 if (is_utf8)
546 flags = HVhek_UTF8;
547 /* If we found we were able to downgrade the string to bytes, then
548 we should flag that it needs upgrading on keys or each. */
549 if (key != keysave)
550 flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
551 }
552
553 return hv_store_flags (hv, key, klen, val, hash, flags);
554}
555
556SV**
557Perl_hv_store_flags(pTHX_ HV *hv, const char *key, I32 klen, SV *val,
558 register U32 hash, int flags)
559{
560 register XPVHV* xhv;
561 register I32 i;
562 register HE *entry;
563 register HE **oentry;
564
565 if (!hv)
566 return 0;
567
568 xhv = (XPVHV*)SvANY(hv);
569 if (SvMAGICAL(hv)) {
570 bool needs_copy;
571 bool needs_store;
572 hv_magic_check (hv, &needs_copy, &needs_store);
573 if (needs_copy) {
574 mg_copy((SV*)hv, val, key, klen);
575 if (!xhv->xhv_array /* !HvARRAY */ && !needs_store) {
576 if (flags & HVhek_FREEKEY)
577 Safefree(key);
578 return 0;
579 }
580#ifdef ENV_IS_CASELESS
581 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
582 key = savepvn(key,klen);
583 key = (const char*)strupr((char*)key);
584 hash = 0;
585 }
586#endif
587 }
588 }
589
590 if (flags)
591 HvHASKFLAGS_on((SV*)hv);
592
593 if (!hash)
594 PERL_HASH(hash, key, klen);
595
596 if (!xhv->xhv_array /* !HvARRAY(hv) */)
597 Newz(505, xhv->xhv_array /* HvARRAY(hv) */,
598 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
599 char);
600
601 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
602 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
603 i = 1;
604
605 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
606 if (HeHASH(entry) != hash) /* strings can't be equal */
607 continue;
608 if (HeKLEN(entry) != (I32)klen)
609 continue;
610 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
611 continue;
612 if ((HeKFLAGS(entry) ^ flags) & HVhek_UTF8)
613 continue;
614 if (HeVAL(entry) == &PL_sv_undef)
615 xhv->xhv_placeholders--; /* yes, can store into placeholder slot */
616 else
617 SvREFCNT_dec(HeVAL(entry));
618 if (flags & HVhek_PLACEHOLD) {
619 /* We have been requested to insert a placeholder. Currently
620 only Storable is allowed to do this. */
621 xhv->xhv_placeholders++;
622 HeVAL(entry) = &PL_sv_undef;
623 } else
624 HeVAL(entry) = val;
625
626 if (HeKFLAGS(entry) != flags) {
627 /* We match if HVhek_UTF8 bit in our flags and hash key's match.
628 But if entry was set previously with HVhek_WASUTF8 and key now
629 doesn't (or vice versa) then we should change the key's flag,
630 as this is assignment. */
631 if (HvSHAREKEYS(hv)) {
632 /* Need to swap the key we have for a key with the flags we
633 need. As keys are shared we can't just write to the flag,
634 so we share the new one, unshare the old one. */
635 int flags_nofree = flags & ~HVhek_FREEKEY;
636 HEK *new_hek = share_hek_flags(key, klen, hash, flags_nofree);
637 unshare_hek (HeKEY_hek(entry));
638 HeKEY_hek(entry) = new_hek;
639 }
640 else
641 HeKFLAGS(entry) = flags;
642 }
643 if (flags & HVhek_FREEKEY)
644 Safefree(key);
645 return &HeVAL(entry);
646 }
647
648 if (SvREADONLY(hv)) {
649 S_hv_notallowed(aTHX_ flags, key, klen,
650 "access disallowed key '%"SVf"' to"
651 );
652 }
653
654 entry = new_HE();
655 /* share_hek_flags will do the free for us. This might be considered
656 bad API design. */
657 if (HvSHAREKEYS(hv))
658 HeKEY_hek(entry) = share_hek_flags(key, klen, hash, flags);
659 else /* gotta do the real thing */
660 HeKEY_hek(entry) = save_hek_flags(key, klen, hash, flags);
661 if (flags & HVhek_PLACEHOLD) {
662 /* We have been requested to insert a placeholder. Currently
663 only Storable is allowed to do this. */
664 xhv->xhv_placeholders++;
665 HeVAL(entry) = &PL_sv_undef;
666 } else
667 HeVAL(entry) = val;
668 HeNEXT(entry) = *oentry;
669 *oentry = entry;
670
671 xhv->xhv_keys++; /* HvKEYS(hv)++ */
672 if (i) { /* initial entry? */
673 xhv->xhv_fill++; /* HvFILL(hv)++ */
674 if (xhv->xhv_keys > (IV)xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */)
675 hsplit(hv);
676 }
677
678 return &HeVAL(entry);
679}
680
681/*
682=for apidoc hv_store_ent
683
684Stores C<val> in a hash. The hash key is specified as C<key>. The C<hash>
685parameter is the precomputed hash value; if it is zero then Perl will
686compute it. The return value is the new hash entry so created. It will be
687NULL if the operation failed or if the value did not need to be actually
688stored within the hash (as in the case of tied hashes). Otherwise the
689contents of the return value can be accessed using the C<He?> macros
690described here. Note that the caller is responsible for suitably
691incrementing the reference count of C<val> before the call, and
692decrementing it if the function returned NULL. Effectively a successful
693hv_store_ent takes ownership of one reference to C<val>. This is
694usually what you want; a newly created SV has a reference count of one, so
695if all your code does is create SVs then store them in a hash, hv_store
696will own the only reference to the new SV, and your code doesn't need to do
697anything further to tidy up. Note that hv_store_ent only reads the C<key>;
698unlike C<val> it does not take ownership of it, so maintaining the correct
699reference count on C<key> is entirely the caller's responsibility. hv_store
700is not implemented as a call to hv_store_ent, and does not create a temporary
701SV for the key, so if your key data is not already in SV form then use
702hv_store in preference to hv_store_ent.
703
704See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
705information on how to use this function on tied hashes.
706
707=cut
708*/
709
710HE *
711Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, U32 hash)
712{
713 XPVHV* xhv;
714 char *key;
715 STRLEN klen;
716 I32 i;
717 HE *entry;
718 HE **oentry;
719 bool is_utf8;
720 int flags = 0;
721 char *keysave;
722
723 if (!hv)
724 return 0;
725
726 xhv = (XPVHV*)SvANY(hv);
727 if (SvMAGICAL(hv)) {
728 bool needs_copy;
729 bool needs_store;
730 hv_magic_check (hv, &needs_copy, &needs_store);
731 if (needs_copy) {
732 bool save_taint = PL_tainted;
733 if (PL_tainting)
734 PL_tainted = SvTAINTED(keysv);
735 keysv = sv_2mortal(newSVsv(keysv));
736 mg_copy((SV*)hv, val, (char*)keysv, HEf_SVKEY);
737 TAINT_IF(save_taint);
738 if (!xhv->xhv_array /* !HvARRAY(hv) */ && !needs_store)
739 return Nullhe;
740#ifdef ENV_IS_CASELESS
741 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
742 key = SvPV(keysv, klen);
743 keysv = sv_2mortal(newSVpvn(key,klen));
744 (void)strupr(SvPVX(keysv));
745 hash = 0;
746 }
747#endif
748 }
749 }
750
751 keysave = key = SvPV(keysv, klen);
752 is_utf8 = (SvUTF8(keysv) != 0);
753
754 if (is_utf8) {
755 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
756 if (is_utf8)
757 flags = HVhek_UTF8;
758 if (key != keysave)
759 flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
760 HvHASKFLAGS_on((SV*)hv);
761 }
762
763 if (!hash) {
764 if SvIsCOW_shared_hash(keysv) {
765 hash = SvUVX(keysv);
766 } else {
767 PERL_HASH(hash, key, klen);
768 }
769 }
770
771 if (!xhv->xhv_array /* !HvARRAY(hv) */)
772 Newz(505, xhv->xhv_array /* HvARRAY(hv) */,
773 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
774 char);
775
776 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
777 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
778 i = 1;
779 entry = *oentry;
780 for (; entry; i=0, entry = HeNEXT(entry)) {
781 if (HeHASH(entry) != hash) /* strings can't be equal */
782 continue;
783 if (HeKLEN(entry) != (I32)klen)
784 continue;
785 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
786 continue;
787 if ((HeKFLAGS(entry) ^ flags) & HVhek_UTF8)
788 continue;
789 if (HeVAL(entry) == &PL_sv_undef)
790 xhv->xhv_placeholders--; /* yes, can store into placeholder slot */
791 else
792 SvREFCNT_dec(HeVAL(entry));
793 HeVAL(entry) = val;
794 if (HeKFLAGS(entry) != flags) {
795 /* We match if HVhek_UTF8 bit in our flags and hash key's match.
796 But if entry was set previously with HVhek_WASUTF8 and key now
797 doesn't (or vice versa) then we should change the key's flag,
798 as this is assignment. */
799 if (HvSHAREKEYS(hv)) {
800 /* Need to swap the key we have for a key with the flags we
801 need. As keys are shared we can't just write to the flag,
802 so we share the new one, unshare the old one. */
803 int flags_nofree = flags & ~HVhek_FREEKEY;
804 HEK *new_hek = share_hek_flags(key, klen, hash, flags_nofree);
805 unshare_hek (HeKEY_hek(entry));
806 HeKEY_hek(entry) = new_hek;
807 }
808 else
809 HeKFLAGS(entry) = flags;
810 }
811 if (flags & HVhek_FREEKEY)
812 Safefree(key);
813 return entry;
814 }
815
816 if (SvREADONLY(hv)) {
817 S_hv_notallowed(aTHX_ flags, key, klen,
818 "access disallowed key '%"SVf"' to"
819 );
820 }
821
822 entry = new_HE();
823 /* share_hek_flags will do the free for us. This might be considered
824 bad API design. */
825 if (HvSHAREKEYS(hv))
826 HeKEY_hek(entry) = share_hek_flags(key, klen, hash, flags);
827 else /* gotta do the real thing */
828 HeKEY_hek(entry) = save_hek_flags(key, klen, hash, flags);
829 HeVAL(entry) = val;
830 HeNEXT(entry) = *oentry;
831 *oentry = entry;
832
833 xhv->xhv_keys++; /* HvKEYS(hv)++ */
834 if (i) { /* initial entry? */
835 xhv->xhv_fill++; /* HvFILL(hv)++ */
836 if (xhv->xhv_keys > (IV)xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */)
837 hsplit(hv);
838 }
839
840 return entry;
841}
842
843/*
844=for apidoc hv_delete
845
846Deletes a key/value pair in the hash. The value SV is removed from the
847hash and returned to the caller. The C<klen> is the length of the key.
848The C<flags> value will normally be zero; if set to G_DISCARD then NULL
849will be returned.
850
851=cut
852*/
853
854SV *
855Perl_hv_delete(pTHX_ HV *hv, const char *key, I32 klen, I32 flags)
856{
857 register XPVHV* xhv;
858 register I32 i;
859 register U32 hash;
860 register HE *entry;
861 register HE **oentry;
862 SV **svp;
863 SV *sv;
864 bool is_utf8 = FALSE;
865 int k_flags = 0;
866 const char *keysave = key;
867
868 if (!hv)
869 return Nullsv;
870 if (klen < 0) {
871 klen = -klen;
872 is_utf8 = TRUE;
873 }
874 if (SvRMAGICAL(hv)) {
875 bool needs_copy;
876 bool needs_store;
877 hv_magic_check (hv, &needs_copy, &needs_store);
878
879 if (needs_copy && (svp = hv_fetch(hv, key, klen, TRUE))) {
880 sv = *svp;
881 mg_clear(sv);
882 if (!needs_store) {
883 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
884 /* No longer an element */
885 sv_unmagic(sv, PERL_MAGIC_tiedelem);
886 return sv;
887 }
888 return Nullsv; /* element cannot be deleted */
889 }
890#ifdef ENV_IS_CASELESS
891 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
892 sv = sv_2mortal(newSVpvn(key,klen));
893 key = strupr(SvPVX(sv));
894 }
895#endif
896 }
897 }
898 xhv = (XPVHV*)SvANY(hv);
899 if (!xhv->xhv_array /* !HvARRAY(hv) */)
900 return Nullsv;
901
902 if (is_utf8) {
903 STRLEN tmplen = klen;
904 /* See the note in hv_fetch(). --jhi */
905 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
906 klen = tmplen;
907 if (is_utf8)
908 k_flags = HVhek_UTF8;
909 if (key != keysave)
910 k_flags |= HVhek_FREEKEY;
911 }
912
913 PERL_HASH(hash, key, klen);
914
915 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
916 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
917 entry = *oentry;
918 i = 1;
919 for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
920 if (HeHASH(entry) != hash) /* strings can't be equal */
921 continue;
922 if (HeKLEN(entry) != (I32)klen)
923 continue;
924 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
925 continue;
926 if ((HeKFLAGS(entry) ^ k_flags) & HVhek_UTF8)
927 continue;
928 if (k_flags & HVhek_FREEKEY)
929 Safefree(key);
930 /* if placeholder is here, it's already been deleted.... */
931 if (HeVAL(entry) == &PL_sv_undef)
932 {
933 if (SvREADONLY(hv))
934 return Nullsv; /* if still SvREADONLY, leave it deleted. */
935 else {
936 /* okay, really delete the placeholder... */
937 *oentry = HeNEXT(entry);
938 if (i && !*oentry)
939 xhv->xhv_fill--; /* HvFILL(hv)-- */
940 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
941 HvLAZYDEL_on(hv);
942 else
943 hv_free_ent(hv, entry);
944 xhv->xhv_keys--; /* HvKEYS(hv)-- */
945 if (xhv->xhv_keys == 0)
946 HvHASKFLAGS_off(hv);
947 xhv->xhv_placeholders--;
948 return Nullsv;
949 }
950 }
951 else if (SvREADONLY(hv) && HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
952 S_hv_notallowed(aTHX_ k_flags, key, klen,
953 "delete readonly key '%"SVf"' from"
954 );
955 }
956
957 if (flags & G_DISCARD)
958 sv = Nullsv;
959 else {
960 sv = sv_2mortal(HeVAL(entry));
961 HeVAL(entry) = &PL_sv_undef;
962 }
963
964 /*
965 * If a restricted hash, rather than really deleting the entry, put
966 * a placeholder there. This marks the key as being "approved", so
967 * we can still access via not-really-existing key without raising
968 * an error.
969 */
970 if (SvREADONLY(hv)) {
971 HeVAL(entry) = &PL_sv_undef;
972 /* We'll be saving this slot, so the number of allocated keys
973 * doesn't go down, but the number placeholders goes up */
974 xhv->xhv_placeholders++; /* HvPLACEHOLDERS(hv)++ */
975 } else {
976 *oentry = HeNEXT(entry);
977 if (i && !*oentry)
978 xhv->xhv_fill--; /* HvFILL(hv)-- */
979 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
980 HvLAZYDEL_on(hv);
981 else
982 hv_free_ent(hv, entry);
983 xhv->xhv_keys--; /* HvKEYS(hv)-- */
984 if (xhv->xhv_keys == 0)
985 HvHASKFLAGS_off(hv);
986 }
987 return sv;
988 }
989 if (SvREADONLY(hv)) {
990 S_hv_notallowed(aTHX_ k_flags, key, klen,
991 "access disallowed key '%"SVf"' from"
992 );
993 }
994
995 if (k_flags & HVhek_FREEKEY)
996 Safefree(key);
997 return Nullsv;
998}
999
1000/*
1001=for apidoc hv_delete_ent
1002
1003Deletes a key/value pair in the hash. The value SV is removed from the
1004hash and returned to the caller. The C<flags> value will normally be zero;
1005if set to G_DISCARD then NULL will be returned. C<hash> can be a valid
1006precomputed hash value, or 0 to ask for it to be computed.
1007
1008=cut
1009*/
1010
1011SV *
1012Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
1013{
1014 register XPVHV* xhv;
1015 register I32 i;
1016 register char *key;
1017 STRLEN klen;
1018 register HE *entry;
1019 register HE **oentry;
1020 SV *sv;
1021 bool is_utf8;
1022 int k_flags = 0;
1023 char *keysave;
1024
1025 if (!hv)
1026 return Nullsv;
1027 if (SvRMAGICAL(hv)) {
1028 bool needs_copy;
1029 bool needs_store;
1030 hv_magic_check (hv, &needs_copy, &needs_store);
1031
1032 if (needs_copy && (entry = hv_fetch_ent(hv, keysv, TRUE, hash))) {
1033 sv = HeVAL(entry);
1034 mg_clear(sv);
1035 if (!needs_store) {
1036 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
1037 /* No longer an element */
1038 sv_unmagic(sv, PERL_MAGIC_tiedelem);
1039 return sv;
1040 }
1041 return Nullsv; /* element cannot be deleted */
1042 }
1043#ifdef ENV_IS_CASELESS
1044 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
1045 key = SvPV(keysv, klen);
1046 keysv = sv_2mortal(newSVpvn(key,klen));
1047 (void)strupr(SvPVX(keysv));
1048 hash = 0;
1049 }
1050#endif
1051 }
1052 }
1053 xhv = (XPVHV*)SvANY(hv);
1054 if (!xhv->xhv_array /* !HvARRAY(hv) */)
1055 return Nullsv;
1056
1057 keysave = key = SvPV(keysv, klen);
1058 is_utf8 = (SvUTF8(keysv) != 0);
1059
1060 if (is_utf8) {
1061 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
1062 if (is_utf8)
1063 k_flags = HVhek_UTF8;
1064 if (key != keysave)
1065 k_flags |= HVhek_FREEKEY;
1066 }
1067
1068 if (!hash)
1069 PERL_HASH(hash, key, klen);
1070
1071 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1072 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
1073 entry = *oentry;
1074 i = 1;
1075 for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
1076 if (HeHASH(entry) != hash) /* strings can't be equal */
1077 continue;
1078 if (HeKLEN(entry) != (I32)klen)
1079 continue;
1080 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
1081 continue;
1082 if ((HeKFLAGS(entry) ^ k_flags) & HVhek_UTF8)
1083 continue;
1084 if (k_flags & HVhek_FREEKEY)
1085 Safefree(key);
1086
1087 /* if placeholder is here, it's already been deleted.... */
1088 if (HeVAL(entry) == &PL_sv_undef)
1089 {
1090 if (SvREADONLY(hv))
1091 return Nullsv; /* if still SvREADONLY, leave it deleted. */
1092
1093 /* okay, really delete the placeholder. */
1094 *oentry = HeNEXT(entry);
1095 if (i && !*oentry)
1096 xhv->xhv_fill--; /* HvFILL(hv)-- */
1097 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
1098 HvLAZYDEL_on(hv);
1099 else
1100 hv_free_ent(hv, entry);
1101 xhv->xhv_keys--; /* HvKEYS(hv)-- */
1102 if (xhv->xhv_keys == 0)
1103 HvHASKFLAGS_off(hv);
1104 xhv->xhv_placeholders--;
1105 return Nullsv;
1106 }
1107 else if (SvREADONLY(hv) && HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
1108 S_hv_notallowed(aTHX_ k_flags, key, klen,
1109 "delete readonly key '%"SVf"' from"
1110 );
1111 }
1112
1113 if (flags & G_DISCARD)
1114 sv = Nullsv;
1115 else {
1116 sv = sv_2mortal(HeVAL(entry));
1117 HeVAL(entry) = &PL_sv_undef;
1118 }
1119
1120 /*
1121 * If a restricted hash, rather than really deleting the entry, put
1122 * a placeholder there. This marks the key as being "approved", so
1123 * we can still access via not-really-existing key without raising
1124 * an error.
1125 */
1126 if (SvREADONLY(hv)) {
1127 HeVAL(entry) = &PL_sv_undef;
1128 /* We'll be saving this slot, so the number of allocated keys
1129 * doesn't go down, but the number placeholders goes up */
1130 xhv->xhv_placeholders++; /* HvPLACEHOLDERS(hv)++ */
1131 } else {
1132 *oentry = HeNEXT(entry);
1133 if (i && !*oentry)
1134 xhv->xhv_fill--; /* HvFILL(hv)-- */
1135 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
1136 HvLAZYDEL_on(hv);
1137 else
1138 hv_free_ent(hv, entry);
1139 xhv->xhv_keys--; /* HvKEYS(hv)-- */
1140 if (xhv->xhv_keys == 0)
1141 HvHASKFLAGS_off(hv);
1142 }
1143 return sv;
1144 }
1145 if (SvREADONLY(hv)) {
1146 S_hv_notallowed(aTHX_ k_flags, key, klen,
1147 "delete disallowed key '%"SVf"' from"
1148 );
1149 }
1150
1151 if (k_flags & HVhek_FREEKEY)
1152 Safefree(key);
1153 return Nullsv;
1154}
1155
1156/*
1157=for apidoc hv_exists
1158
1159Returns a boolean indicating whether the specified hash key exists. The
1160C<klen> is the length of the key.
1161
1162=cut
1163*/
1164
1165bool
1166Perl_hv_exists(pTHX_ HV *hv, const char *key, I32 klen)
1167{
1168 register XPVHV* xhv;
1169 register U32 hash;
1170 register HE *entry;
1171 SV *sv;
1172 bool is_utf8 = FALSE;
1173 const char *keysave = key;
1174 int k_flags = 0;
1175
1176 if (!hv)
1177 return 0;
1178
1179 if (klen < 0) {
1180 klen = -klen;
1181 is_utf8 = TRUE;
1182 }
1183
1184 if (SvRMAGICAL(hv)) {
1185 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
1186 sv = sv_newmortal();
1187 mg_copy((SV*)hv, sv, key, klen);
1188 magic_existspack(sv, mg_find(sv, PERL_MAGIC_tiedelem));
1189 return (bool)SvTRUE(sv);
1190 }
1191#ifdef ENV_IS_CASELESS
1192 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
1193 sv = sv_2mortal(newSVpvn(key,klen));
1194 key = strupr(SvPVX(sv));
1195 }
1196#endif
1197 }
1198
1199 xhv = (XPVHV*)SvANY(hv);
1200#ifndef DYNAMIC_ENV_FETCH
1201 if (!xhv->xhv_array /* !HvARRAY(hv) */)
1202 return 0;
1203#endif
1204
1205 if (is_utf8) {
1206 STRLEN tmplen = klen;
1207 /* See the note in hv_fetch(). --jhi */
1208 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
1209 klen = tmplen;
1210 if (is_utf8)
1211 k_flags = HVhek_UTF8;
1212 if (key != keysave)
1213 k_flags |= HVhek_FREEKEY;
1214 }
1215
1216 PERL_HASH(hash, key, klen);
1217
1218#ifdef DYNAMIC_ENV_FETCH
1219 if (!xhv->xhv_array /* !HvARRAY(hv) */) entry = Null(HE*);
1220 else
1221#endif
1222 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1223 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
1224 for (; entry; entry = HeNEXT(entry)) {
1225 if (HeHASH(entry) != hash) /* strings can't be equal */
1226 continue;
1227 if (HeKLEN(entry) != klen)
1228 continue;
1229 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
1230 continue;
1231 if ((HeKFLAGS(entry) ^ k_flags) & HVhek_UTF8)
1232 continue;
1233 if (k_flags & HVhek_FREEKEY)
1234 Safefree(key);
1235 /* If we find the key, but the value is a placeholder, return false. */
1236 if (HeVAL(entry) == &PL_sv_undef)
1237 return FALSE;
1238
1239 return TRUE;
1240 }
1241#ifdef DYNAMIC_ENV_FETCH /* is it out there? */
1242 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
1243 unsigned long len;
1244 char *env = PerlEnv_ENVgetenv_len(key,&len);
1245 if (env) {
1246 sv = newSVpvn(env,len);
1247 SvTAINTED_on(sv);
1248 (void)hv_store(hv,key,klen,sv,hash);
1249 if (k_flags & HVhek_FREEKEY)
1250 Safefree(key);
1251 return TRUE;
1252 }
1253 }
1254#endif
1255 if (k_flags & HVhek_FREEKEY)
1256 Safefree(key);
1257 return FALSE;
1258}
1259
1260
1261/*
1262=for apidoc hv_exists_ent
1263
1264Returns a boolean indicating whether the specified hash key exists. C<hash>
1265can be a valid precomputed hash value, or 0 to ask for it to be
1266computed.
1267
1268=cut
1269*/
1270
1271bool
1272Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
1273{
1274 register XPVHV* xhv;
1275 register char *key;
1276 STRLEN klen;
1277 register HE *entry;
1278 SV *sv;
1279 bool is_utf8;
1280 char *keysave;
1281 int k_flags = 0;
1282
1283 if (!hv)
1284 return 0;
1285
1286 if (SvRMAGICAL(hv)) {
1287 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
1288 SV* svret = sv_newmortal();
1289 sv = sv_newmortal();
1290 keysv = sv_2mortal(newSVsv(keysv));
1291 mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
1292 magic_existspack(svret, mg_find(sv, PERL_MAGIC_tiedelem));
1293 return (bool)SvTRUE(svret);
1294 }
1295#ifdef ENV_IS_CASELESS
1296 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
1297 key = SvPV(keysv, klen);
1298 keysv = sv_2mortal(newSVpvn(key,klen));
1299 (void)strupr(SvPVX(keysv));
1300 hash = 0;
1301 }
1302#endif
1303 }
1304
1305 xhv = (XPVHV*)SvANY(hv);
1306#ifndef DYNAMIC_ENV_FETCH
1307 if (!xhv->xhv_array /* !HvARRAY(hv) */)
1308 return 0;
1309#endif
1310
1311 keysave = key = SvPV(keysv, klen);
1312 is_utf8 = (SvUTF8(keysv) != 0);
1313 if (is_utf8) {
1314 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
1315 if (is_utf8)
1316 k_flags = HVhek_UTF8;
1317 if (key != keysave)
1318 k_flags |= HVhek_FREEKEY;
1319 }
1320 if (!hash)
1321 PERL_HASH(hash, key, klen);
1322
1323#ifdef DYNAMIC_ENV_FETCH
1324 if (!xhv->xhv_array /* !HvARRAY(hv) */) entry = Null(HE*);
1325 else
1326#endif
1327 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1328 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
1329 for (; entry; entry = HeNEXT(entry)) {
1330 if (HeHASH(entry) != hash) /* strings can't be equal */
1331 continue;
1332 if (HeKLEN(entry) != (I32)klen)
1333 continue;
1334 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
1335 continue;
1336 if ((HeKFLAGS(entry) ^ k_flags) & HVhek_UTF8)
1337 continue;
1338 if (k_flags & HVhek_FREEKEY)
1339 Safefree(key);
1340 /* If we find the key, but the value is a placeholder, return false. */
1341 if (HeVAL(entry) == &PL_sv_undef)
1342 return FALSE;
1343 return TRUE;
1344 }
1345#ifdef DYNAMIC_ENV_FETCH /* is it out there? */
1346 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
1347 unsigned long len;
1348 char *env = PerlEnv_ENVgetenv_len(key,&len);
1349 if (env) {
1350 sv = newSVpvn(env,len);
1351 SvTAINTED_on(sv);
1352 (void)hv_store_ent(hv,keysv,sv,hash);
1353 if (k_flags & HVhek_FREEKEY)
1354 Safefree(key);
1355 return TRUE;
1356 }
1357 }
1358#endif
1359 if (k_flags & HVhek_FREEKEY)
1360 Safefree(key);
1361 return FALSE;
1362}
1363
1364STATIC void
1365S_hsplit(pTHX_ HV *hv)
1366{
1367 register XPVHV* xhv = (XPVHV*)SvANY(hv);
1368 I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
1369 register I32 newsize = oldsize * 2;
1370 register I32 i;
1371 register char *a = xhv->xhv_array; /* HvARRAY(hv) */
1372 register HE **aep;
1373 register HE **bep;
1374 register HE *entry;
1375 register HE **oentry;
1376
1377 PL_nomemok = TRUE;
1378#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
1379 Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1380 if (!a) {
1381 PL_nomemok = FALSE;
1382 return;
1383 }
1384#else
1385 New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1386 if (!a) {
1387 PL_nomemok = FALSE;
1388 return;
1389 }
1390 Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
1391 if (oldsize >= 64) {
1392 offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
1393 PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
1394 }
1395 else
1396 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
1397#endif
1398
1399 PL_nomemok = FALSE;
1400 Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
1401 xhv->xhv_max = --newsize; /* HvMAX(hv) = --newsize */
1402 xhv->xhv_array = a; /* HvARRAY(hv) = a */
1403 aep = (HE**)a;
1404
1405 for (i=0; i<oldsize; i++,aep++) {
1406 if (!*aep) /* non-existent */
1407 continue;
1408 bep = aep+oldsize;
1409 for (oentry = aep, entry = *aep; entry; entry = *oentry) {
1410 if ((HeHASH(entry) & newsize) != (U32)i) {
1411 *oentry = HeNEXT(entry);
1412 HeNEXT(entry) = *bep;
1413 if (!*bep)
1414 xhv->xhv_fill++; /* HvFILL(hv)++ */
1415 *bep = entry;
1416 continue;
1417 }
1418 else
1419 oentry = &HeNEXT(entry);
1420 }
1421 if (!*aep) /* everything moved */
1422 xhv->xhv_fill--; /* HvFILL(hv)-- */
1423 }
1424}
1425
1426void
1427Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
1428{
1429 register XPVHV* xhv = (XPVHV*)SvANY(hv);
1430 I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
1431 register I32 newsize;
1432 register I32 i;
1433 register I32 j;
1434 register char *a;
1435 register HE **aep;
1436 register HE *entry;
1437 register HE **oentry;
1438
1439 newsize = (I32) newmax; /* possible truncation here */
1440 if (newsize != newmax || newmax <= oldsize)
1441 return;
1442 while ((newsize & (1 + ~newsize)) != newsize) {
1443 newsize &= ~(newsize & (1 + ~newsize)); /* get proper power of 2 */
1444 }
1445 if (newsize < newmax)
1446 newsize *= 2;
1447 if (newsize < newmax)
1448 return; /* overflow detection */
1449
1450 a = xhv->xhv_array; /* HvARRAY(hv) */
1451 if (a) {
1452 PL_nomemok = TRUE;
1453#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
1454 Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1455 if (!a) {
1456 PL_nomemok = FALSE;
1457 return;
1458 }
1459#else
1460 New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1461 if (!a) {
1462 PL_nomemok = FALSE;
1463 return;
1464 }
1465 Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
1466 if (oldsize >= 64) {
1467 offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
1468 PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
1469 }
1470 else
1471 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
1472#endif
1473 PL_nomemok = FALSE;
1474 Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
1475 }
1476 else {
1477 Newz(0, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1478 }
1479 xhv->xhv_max = --newsize; /* HvMAX(hv) = --newsize */
1480 xhv->xhv_array = a; /* HvARRAY(hv) = a */
1481 if (!xhv->xhv_fill /* !HvFILL(hv) */) /* skip rest if no entries */
1482 return;
1483
1484 aep = (HE**)a;
1485 for (i=0; i<oldsize; i++,aep++) {
1486 if (!*aep) /* non-existent */
1487 continue;
1488 for (oentry = aep, entry = *aep; entry; entry = *oentry) {
1489 if ((j = (HeHASH(entry) & newsize)) != i) {
1490 j -= i;
1491 *oentry = HeNEXT(entry);
1492 if (!(HeNEXT(entry) = aep[j]))
1493 xhv->xhv_fill++; /* HvFILL(hv)++ */
1494 aep[j] = entry;
1495 continue;
1496 }
1497 else
1498 oentry = &HeNEXT(entry);
1499 }
1500 if (!*aep) /* everything moved */
1501 xhv->xhv_fill--; /* HvFILL(hv)-- */
1502 }
1503}
1504
1505/*
1506=for apidoc newHV
1507
1508Creates a new HV. The reference count is set to 1.
1509
1510=cut
1511*/
1512
1513HV *
1514Perl_newHV(pTHX)
1515{
1516 register HV *hv;
1517 register XPVHV* xhv;
1518
1519 hv = (HV*)NEWSV(502,0);
1520 sv_upgrade((SV *)hv, SVt_PVHV);
1521 xhv = (XPVHV*)SvANY(hv);
1522 SvPOK_off(hv);
1523 SvNOK_off(hv);
1524#ifndef NODEFAULT_SHAREKEYS
1525 HvSHAREKEYS_on(hv); /* key-sharing on by default */
1526#endif
1527 xhv->xhv_max = 7; /* HvMAX(hv) = 7 (start with 8 buckets) */
1528 xhv->xhv_fill = 0; /* HvFILL(hv) = 0 */
1529 xhv->xhv_pmroot = 0; /* HvPMROOT(hv) = 0 */
1530 (void)hv_iterinit(hv); /* so each() will start off right */
1531 return hv;
1532}
1533
1534HV *
1535Perl_newHVhv(pTHX_ HV *ohv)
1536{
1537 HV *hv = newHV();
1538 STRLEN hv_max, hv_fill;
1539
1540 if (!ohv || (hv_fill = HvFILL(ohv)) == 0)
1541 return hv;
1542 hv_max = HvMAX(ohv);
1543
1544 if (!SvMAGICAL((SV *)ohv)) {
1545 /* It's an ordinary hash, so copy it fast. AMS 20010804 */
1546 STRLEN i;
1547 bool shared = !!HvSHAREKEYS(ohv);
1548 HE **ents, **oents = (HE **)HvARRAY(ohv);
1549 char *a;
1550 New(0, a, PERL_HV_ARRAY_ALLOC_BYTES(hv_max+1), char);
1551 ents = (HE**)a;
1552
1553 /* In each bucket... */
1554 for (i = 0; i <= hv_max; i++) {
1555 HE *prev = NULL, *ent = NULL, *oent = oents[i];
1556
1557 if (!oent) {
1558 ents[i] = NULL;
1559 continue;
1560 }
1561
1562 /* Copy the linked list of entries. */
1563 for (oent = oents[i]; oent; oent = HeNEXT(oent)) {
1564 U32 hash = HeHASH(oent);
1565 char *key = HeKEY(oent);
1566 STRLEN len = HeKLEN(oent);
1567 int flags = HeKFLAGS(oent);
1568
1569 ent = new_HE();
1570 HeVAL(ent) = newSVsv(HeVAL(oent));
1571 HeKEY_hek(ent)
1572 = shared ? share_hek_flags(key, len, hash, flags)
1573 : save_hek_flags(key, len, hash, flags);
1574 if (prev)
1575 HeNEXT(prev) = ent;
1576 else
1577 ents[i] = ent;
1578 prev = ent;
1579 HeNEXT(ent) = NULL;
1580 }
1581 }
1582
1583 HvMAX(hv) = hv_max;
1584 HvFILL(hv) = hv_fill;
1585 HvTOTALKEYS(hv) = HvTOTALKEYS(ohv);
1586 HvARRAY(hv) = ents;
1587 }
1588 else {
1589 /* Iterate over ohv, copying keys and values one at a time. */
1590 HE *entry;
1591 I32 riter = HvRITER(ohv);
1592 HE *eiter = HvEITER(ohv);
1593
1594 /* Can we use fewer buckets? (hv_max is always 2^n-1) */
1595 while (hv_max && hv_max + 1 >= hv_fill * 2)
1596 hv_max = hv_max / 2;
1597 HvMAX(hv) = hv_max;
1598
1599 hv_iterinit(ohv);
1600 while ((entry = hv_iternext_flags(ohv, 0))) {
1601 hv_store_flags(hv, HeKEY(entry), HeKLEN(entry),
1602 newSVsv(HeVAL(entry)), HeHASH(entry),
1603 HeKFLAGS(entry));
1604 }
1605 HvRITER(ohv) = riter;
1606 HvEITER(ohv) = eiter;
1607 }
1608
1609 return hv;
1610}
1611
1612void
1613Perl_hv_free_ent(pTHX_ HV *hv, register HE *entry)
1614{
1615 SV *val;
1616
1617 if (!entry)
1618 return;
1619 val = HeVAL(entry);
1620 if (val && isGV(val) && GvCVu(val) && HvNAME(hv))
1621 PL_sub_generation++; /* may be deletion of method from stash */
1622 SvREFCNT_dec(val);
1623 if (HeKLEN(entry) == HEf_SVKEY) {
1624 SvREFCNT_dec(HeKEY_sv(entry));
1625 Safefree(HeKEY_hek(entry));
1626 }
1627 else if (HvSHAREKEYS(hv))
1628 unshare_hek(HeKEY_hek(entry));
1629 else
1630 Safefree(HeKEY_hek(entry));
1631 del_HE(entry);
1632}
1633
1634void
1635Perl_hv_delayfree_ent(pTHX_ HV *hv, register HE *entry)
1636{
1637 if (!entry)
1638 return;
1639 if (isGV(HeVAL(entry)) && GvCVu(HeVAL(entry)) && HvNAME(hv))
1640 PL_sub_generation++; /* may be deletion of method from stash */
1641 sv_2mortal(HeVAL(entry)); /* free between statements */
1642 if (HeKLEN(entry) == HEf_SVKEY) {
1643 sv_2mortal(HeKEY_sv(entry));
1644 Safefree(HeKEY_hek(entry));
1645 }
1646 else if (HvSHAREKEYS(hv))
1647 unshare_hek(HeKEY_hek(entry));
1648 else
1649 Safefree(HeKEY_hek(entry));
1650 del_HE(entry);
1651}
1652
1653/*
1654=for apidoc hv_clear
1655
1656Clears a hash, making it empty.
1657
1658=cut
1659*/
1660
1661void
1662Perl_hv_clear(pTHX_ HV *hv)
1663{
1664 register XPVHV* xhv;
1665 if (!hv)
1666 return;
1667
1668 if(SvREADONLY(hv)) {
1669 Perl_croak(aTHX_ "Attempt to clear a restricted hash");
1670 }
1671
1672 xhv = (XPVHV*)SvANY(hv);
1673 hfreeentries(hv);
1674 xhv->xhv_fill = 0; /* HvFILL(hv) = 0 */
1675 xhv->xhv_keys = 0; /* HvKEYS(hv) = 0 */
1676 xhv->xhv_placeholders = 0; /* HvPLACEHOLDERS(hv) = 0 */
1677 if (xhv->xhv_array /* HvARRAY(hv) */)
1678 (void)memzero(xhv->xhv_array /* HvARRAY(hv) */,
1679 (xhv->xhv_max+1 /* HvMAX(hv)+1 */) * sizeof(HE*));
1680
1681 if (SvRMAGICAL(hv))
1682 mg_clear((SV*)hv);
1683
1684 HvHASKFLAGS_off(hv);
1685}
1686
1687STATIC void
1688S_hfreeentries(pTHX_ HV *hv)
1689{
1690 register HE **array;
1691 register HE *entry;
1692 register HE *oentry = Null(HE*);
1693 I32 riter;
1694 I32 max;
1695
1696 if (!hv)
1697 return;
1698 if (!HvARRAY(hv))
1699 return;
1700
1701 riter = 0;
1702 max = HvMAX(hv);
1703 array = HvARRAY(hv);
1704 entry = array[0];
1705 for (;;) {
1706 if (entry) {
1707 oentry = entry;
1708 entry = HeNEXT(entry);
1709 hv_free_ent(hv, oentry);
1710 }
1711 if (!entry) {
1712 if (++riter > max)
1713 break;
1714 entry = array[riter];
1715 }
1716 }
1717 (void)hv_iterinit(hv);
1718}
1719
1720/*
1721=for apidoc hv_undef
1722
1723Undefines the hash.
1724
1725=cut
1726*/
1727
1728void
1729Perl_hv_undef(pTHX_ HV *hv)
1730{
1731 register XPVHV* xhv;
1732 if (!hv)
1733 return;
1734 xhv = (XPVHV*)SvANY(hv);
1735 hfreeentries(hv);
1736 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
1737 if (HvNAME(hv)) {
1738 Safefree(HvNAME(hv));
1739 HvNAME(hv) = 0;
1740 }
1741 xhv->xhv_max = 7; /* HvMAX(hv) = 7 (it's a normal hash) */
1742 xhv->xhv_array = 0; /* HvARRAY(hv) = 0 */
1743 xhv->xhv_fill = 0; /* HvFILL(hv) = 0 */
1744 xhv->xhv_keys = 0; /* HvKEYS(hv) = 0 */
1745 xhv->xhv_placeholders = 0; /* HvPLACEHOLDERS(hv) = 0 */
1746
1747 if (SvRMAGICAL(hv))
1748 mg_clear((SV*)hv);
1749}
1750
1751/*
1752=for apidoc hv_iterinit
1753
1754Prepares a starting point to traverse a hash table. Returns the number of
1755keys in the hash (i.e. the same as C<HvKEYS(tb)>). The return value is
1756currently only meaningful for hashes without tie magic.
1757
1758NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
1759hash buckets that happen to be in use. If you still need that esoteric
1760value, you can get it through the macro C<HvFILL(tb)>.
1761
1762
1763=cut
1764*/
1765
1766I32
1767Perl_hv_iterinit(pTHX_ HV *hv)
1768{
1769 register XPVHV* xhv;
1770 HE *entry;
1771
1772 if (!hv)
1773 Perl_croak(aTHX_ "Bad hash");
1774 xhv = (XPVHV*)SvANY(hv);
1775 entry = xhv->xhv_eiter; /* HvEITER(hv) */
1776 if (entry && HvLAZYDEL(hv)) { /* was deleted earlier? */
1777 HvLAZYDEL_off(hv);
1778 hv_free_ent(hv, entry);
1779 }
1780 xhv->xhv_riter = -1; /* HvRITER(hv) = -1 */
1781 xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
1782 /* used to be xhv->xhv_fill before 5.004_65 */
1783 return XHvTOTALKEYS(xhv);
1784}
1785/*
1786=for apidoc hv_iternext
1787
1788Returns entries from a hash iterator. See C<hv_iterinit>.
1789
1790You may call C<hv_delete> or C<hv_delete_ent> on the hash entry that the
1791iterator currently points to, without losing your place or invalidating your
1792iterator. Note that in this case the current entry is deleted from the hash
1793with your iterator holding the last reference to it. Your iterator is flagged
1794to free the entry on the next call to C<hv_iternext>, so you must not discard
1795your iterator immediately else the entry will leak - call C<hv_iternext> to
1796trigger the resource deallocation.
1797
1798=cut
1799*/
1800
1801HE *
1802Perl_hv_iternext(pTHX_ HV *hv)
1803{
1804 return hv_iternext_flags(hv, 0);
1805}
1806
1807/*
1808=for apidoc hv_iternext_flags
1809
1810Returns entries from a hash iterator. See C<hv_iterinit> and C<hv_iternext>.
1811The C<flags> value will normally be zero; if HV_ITERNEXT_WANTPLACEHOLDERS is
1812set the placeholders keys (for restricted hashes) will be returned in addition
1813to normal keys. By default placeholders are automatically skipped over.
1814Currently a placeholder is implemented with a value that is literally
1815<&Perl_sv_undef> (a regular C<undef> value is a normal read-write SV for which
1816C<!SvOK> is false). Note that the implementation of placeholders and
1817restricted hashes may change, and the implementation currently is
1818insufficiently abstracted for any change to be tidy.
1819
1820=cut
1821*/
1822
1823HE *
1824Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags)
1825{
1826 register XPVHV* xhv;
1827 register HE *entry;
1828 HE *oldentry;
1829 MAGIC* mg;
1830
1831 if (!hv)
1832 Perl_croak(aTHX_ "Bad hash");
1833 xhv = (XPVHV*)SvANY(hv);
1834 oldentry = entry = xhv->xhv_eiter; /* HvEITER(hv) */
1835
1836 if ((mg = SvTIED_mg((SV*)hv, PERL_MAGIC_tied))) {
1837 SV *key = sv_newmortal();
1838 if (entry) {
1839 sv_setsv(key, HeSVKEY_force(entry));
1840 SvREFCNT_dec(HeSVKEY(entry)); /* get rid of previous key */
1841 }
1842 else {
1843 char *k;
1844 HEK *hek;
1845
1846 /* one HE per MAGICAL hash */
1847 xhv->xhv_eiter = entry = new_HE(); /* HvEITER(hv) = new_HE() */
1848 Zero(entry, 1, HE);
1849 Newz(54, k, HEK_BASESIZE + sizeof(SV*), char);
1850 hek = (HEK*)k;
1851 HeKEY_hek(entry) = hek;
1852 HeKLEN(entry) = HEf_SVKEY;
1853 }
1854 magic_nextpack((SV*) hv,mg,key);
1855 if (SvOK(key)) {
1856 /* force key to stay around until next time */
1857 HeSVKEY_set(entry, SvREFCNT_inc(key));
1858 return entry; /* beware, hent_val is not set */
1859 }
1860 if (HeVAL(entry))
1861 SvREFCNT_dec(HeVAL(entry));
1862 Safefree(HeKEY_hek(entry));
1863 del_HE(entry);
1864 xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
1865 return Null(HE*);
1866 }
1867#ifdef DYNAMIC_ENV_FETCH /* set up %ENV for iteration */
1868 if (!entry && SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
1869 prime_env_iter();
1870#endif
1871
1872 if (!xhv->xhv_array /* !HvARRAY(hv) */)
1873 Newz(506, xhv->xhv_array /* HvARRAY(hv) */,
1874 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
1875 char);
1876 /* At start of hash, entry is NULL. */
1877 if (entry)
1878 {
1879 entry = HeNEXT(entry);
1880 if (!(flags & HV_ITERNEXT_WANTPLACEHOLDERS)) {
1881 /*
1882 * Skip past any placeholders -- don't want to include them in
1883 * any iteration.
1884 */
1885 while (entry && HeVAL(entry) == &PL_sv_undef) {
1886 entry = HeNEXT(entry);
1887 }
1888 }
1889 }
1890 while (!entry) {
1891 /* OK. Come to the end of the current list. Grab the next one. */
1892
1893 xhv->xhv_riter++; /* HvRITER(hv)++ */
1894 if (xhv->xhv_riter > (I32)xhv->xhv_max /* HvRITER(hv) > HvMAX(hv) */) {
1895 /* There is no next one. End of the hash. */
1896 xhv->xhv_riter = -1; /* HvRITER(hv) = -1 */
1897 break;
1898 }
1899 /* entry = (HvARRAY(hv))[HvRITER(hv)]; */
1900 entry = ((HE**)xhv->xhv_array)[xhv->xhv_riter];
1901
1902 if (!(flags & HV_ITERNEXT_WANTPLACEHOLDERS)) {
1903 /* If we have an entry, but it's a placeholder, don't count it.
1904 Try the next. */
1905 while (entry && HeVAL(entry) == &PL_sv_undef)
1906 entry = HeNEXT(entry);
1907 }
1908 /* Will loop again if this linked list starts NULL
1909 (for HV_ITERNEXT_WANTPLACEHOLDERS)
1910 or if we run through it and find only placeholders. */
1911 }
1912
1913 if (oldentry && HvLAZYDEL(hv)) { /* was deleted earlier? */
1914 HvLAZYDEL_off(hv);
1915 hv_free_ent(hv, oldentry);
1916 }
1917
1918 xhv->xhv_eiter = entry; /* HvEITER(hv) = entry */
1919 return entry;
1920}
1921
1922/*
1923=for apidoc hv_iterkey
1924
1925Returns the key from the current position of the hash iterator. See
1926C<hv_iterinit>.
1927
1928=cut
1929*/
1930
1931char *
1932Perl_hv_iterkey(pTHX_ register HE *entry, I32 *retlen)
1933{
1934 if (HeKLEN(entry) == HEf_SVKEY) {
1935 STRLEN len;
1936 char *p = SvPV(HeKEY_sv(entry), len);
1937 *retlen = len;
1938 return p;
1939 }
1940 else {
1941 *retlen = HeKLEN(entry);
1942 return HeKEY(entry);
1943 }
1944}
1945
1946/* unlike hv_iterval(), this always returns a mortal copy of the key */
1947/*
1948=for apidoc hv_iterkeysv
1949
1950Returns the key as an C<SV*> from the current position of the hash
1951iterator. The return value will always be a mortal copy of the key. Also
1952see C<hv_iterinit>.
1953
1954=cut
1955*/
1956
1957SV *
1958Perl_hv_iterkeysv(pTHX_ register HE *entry)
1959{
1960 if (HeKLEN(entry) != HEf_SVKEY) {
1961 HEK *hek = HeKEY_hek(entry);
1962 int flags = HEK_FLAGS(hek);
1963 SV *sv;
1964
1965 if (flags & HVhek_WASUTF8) {
1966 /* Trouble :-)
1967 Andreas would like keys he put in as utf8 to come back as utf8
1968 */
1969 STRLEN utf8_len = HEK_LEN(hek);
1970 U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
1971
1972 sv = newSVpvn ((char*)as_utf8, utf8_len);
1973 SvUTF8_on (sv);
1974 Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
1975 } else {
1976 sv = newSVpvn_share(HEK_KEY(hek),
1977 (HEK_UTF8(hek) ? -HEK_LEN(hek) : HEK_LEN(hek)),
1978 HEK_HASH(hek));
1979 }
1980 return sv_2mortal(sv);
1981 }
1982 return sv_mortalcopy(HeKEY_sv(entry));
1983}
1984
1985/*
1986=for apidoc hv_iterval
1987
1988Returns the value from the current position of the hash iterator. See
1989C<hv_iterkey>.
1990
1991=cut
1992*/
1993
1994SV *
1995Perl_hv_iterval(pTHX_ HV *hv, register HE *entry)
1996{
1997 if (SvRMAGICAL(hv)) {
1998 if (mg_find((SV*)hv, PERL_MAGIC_tied)) {
1999 SV* sv = sv_newmortal();
2000 if (HeKLEN(entry) == HEf_SVKEY)
2001 mg_copy((SV*)hv, sv, (char*)HeKEY_sv(entry), HEf_SVKEY);
2002 else mg_copy((SV*)hv, sv, HeKEY(entry), HeKLEN(entry));
2003 return sv;
2004 }
2005 }
2006 return HeVAL(entry);
2007}
2008
2009/*
2010=for apidoc hv_iternextsv
2011
2012Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
2013operation.
2014
2015=cut
2016*/
2017
2018SV *
2019Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
2020{
2021 HE *he;
2022 if ( (he = hv_iternext_flags(hv, 0)) == NULL)
2023 return NULL;
2024 *key = hv_iterkey(he, retlen);
2025 return hv_iterval(hv, he);
2026}
2027
2028/*
2029=for apidoc hv_magic
2030
2031Adds magic to a hash. See C<sv_magic>.
2032
2033=cut
2034*/
2035
2036void
2037Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how)
2038{
2039 sv_magic((SV*)hv, (SV*)gv, how, Nullch, 0);
2040}
2041
2042#if 0 /* use the macro from hv.h instead */
2043
2044char*
2045Perl_sharepvn(pTHX_ const char *sv, I32 len, U32 hash)
2046{
2047 return HEK_KEY(share_hek(sv, len, hash));
2048}
2049
2050#endif
2051
2052/* possibly free a shared string if no one has access to it
2053 * len and hash must both be valid for str.
2054 */
2055void
2056Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
2057{
2058 unshare_hek_or_pvn (NULL, str, len, hash);
2059}
2060
2061
2062void
2063Perl_unshare_hek(pTHX_ HEK *hek)
2064{
2065 unshare_hek_or_pvn(hek, NULL, 0, 0);
2066}
2067
2068/* possibly free a shared string if no one has access to it
2069 hek if non-NULL takes priority over the other 3, else str, len and hash
2070 are used. If so, len and hash must both be valid for str.
2071 */
2072STATIC void
2073S_unshare_hek_or_pvn(pTHX_ HEK *hek, const char *str, I32 len, U32 hash)
2074{
2075 register XPVHV* xhv;
2076 register HE *entry;
2077 register HE **oentry;
2078 register I32 i = 1;
2079 I32 found = 0;
2080 bool is_utf8 = FALSE;
2081 int k_flags = 0;
2082 const char *save = str;
2083
2084 if (hek) {
2085 hash = HEK_HASH(hek);
2086 } else if (len < 0) {
2087 STRLEN tmplen = -len;
2088 is_utf8 = TRUE;
2089 /* See the note in hv_fetch(). --jhi */
2090 str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
2091 len = tmplen;
2092 if (is_utf8)
2093 k_flags = HVhek_UTF8;
2094 if (str != save)
2095 k_flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
2096 }
2097
2098 /* what follows is the moral equivalent of:
2099 if ((Svp = hv_fetch(PL_strtab, tmpsv, FALSE, hash))) {
2100 if (--*Svp == Nullsv)
2101 hv_delete(PL_strtab, str, len, G_DISCARD, hash);
2102 } */
2103 xhv = (XPVHV*)SvANY(PL_strtab);
2104 /* assert(xhv_array != 0) */
2105 LOCK_STRTAB_MUTEX;
2106 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
2107 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
2108 if (hek) {
2109 for (entry = *oentry; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
2110 if (HeKEY_hek(entry) != hek)
2111 continue;
2112 found = 1;
2113 break;
2114 }
2115 } else {
2116 int flags_masked = k_flags & HVhek_MASK;
2117 for (entry = *oentry; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
2118 if (HeHASH(entry) != hash) /* strings can't be equal */
2119 continue;
2120 if (HeKLEN(entry) != len)
2121 continue;
2122 if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
2123 continue;
2124 if (HeKFLAGS(entry) != flags_masked)
2125 continue;
2126 found = 1;
2127 break;
2128 }
2129 }
2130
2131 if (found) {
2132 if (--HeVAL(entry) == Nullsv) {
2133 *oentry = HeNEXT(entry);
2134 if (i && !*oentry)
2135 xhv->xhv_fill--; /* HvFILL(hv)-- */
2136 Safefree(HeKEY_hek(entry));
2137 del_HE(entry);
2138 xhv->xhv_keys--; /* HvKEYS(hv)-- */
2139 }
2140 }
2141
2142 UNLOCK_STRTAB_MUTEX;
2143 if (!found && ckWARN_d(WARN_INTERNAL))
2144 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
2145 "Attempt to free non-existent shared string '%s'%s",
2146 hek ? HEK_KEY(hek) : str,
2147 (k_flags & HVhek_UTF8) ? " (utf8)" : "");
2148 if (k_flags & HVhek_FREEKEY)
2149 Safefree(str);
2150}
2151
2152/* get a (constant) string ptr from the global string table
2153 * string will get added if it is not already there.
2154 * len and hash must both be valid for str.
2155 */
2156HEK *
2157Perl_share_hek(pTHX_ const char *str, I32 len, register U32 hash)
2158{
2159 bool is_utf8 = FALSE;
2160 int flags = 0;
2161 const char *save = str;
2162
2163 if (len < 0) {
2164 STRLEN tmplen = -len;
2165 is_utf8 = TRUE;
2166 /* See the note in hv_fetch(). --jhi */
2167 str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
2168 len = tmplen;
2169 /* If we were able to downgrade here, then than means that we were passed
2170 in a key which only had chars 0-255, but was utf8 encoded. */
2171 if (is_utf8)
2172 flags = HVhek_UTF8;
2173 /* If we found we were able to downgrade the string to bytes, then
2174 we should flag that it needs upgrading on keys or each. Also flag
2175 that we need share_hek_flags to free the string. */
2176 if (str != save)
2177 flags |= HVhek_WASUTF8 | HVhek_FREEKEY;
2178 }
2179
2180 return share_hek_flags (str, len, hash, flags);
2181}
2182
2183STATIC HEK *
2184S_share_hek_flags(pTHX_ const char *str, I32 len, register U32 hash, int flags)
2185{
2186 register XPVHV* xhv;
2187 register HE *entry;
2188 register HE **oentry;
2189 register I32 i = 1;
2190 I32 found = 0;
2191 int flags_masked = flags & HVhek_MASK;
2192
2193 /* what follows is the moral equivalent of:
2194
2195 if (!(Svp = hv_fetch(PL_strtab, str, len, FALSE)))
2196 hv_store(PL_strtab, str, len, Nullsv, hash);
2197 */
2198 xhv = (XPVHV*)SvANY(PL_strtab);
2199 /* assert(xhv_array != 0) */
2200 LOCK_STRTAB_MUTEX;
2201 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
2202 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
2203 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
2204 if (HeHASH(entry) != hash) /* strings can't be equal */
2205 continue;
2206 if (HeKLEN(entry) != len)
2207 continue;
2208 if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
2209 continue;
2210 if (HeKFLAGS(entry) != flags_masked)
2211 continue;
2212 found = 1;
2213 break;
2214 }
2215 if (!found) {
2216 entry = new_HE();
2217 HeKEY_hek(entry) = save_hek_flags(str, len, hash, flags);
2218 HeVAL(entry) = Nullsv;
2219 HeNEXT(entry) = *oentry;
2220 *oentry = entry;
2221 xhv->xhv_keys++; /* HvKEYS(hv)++ */
2222 if (i) { /* initial entry? */
2223 xhv->xhv_fill++; /* HvFILL(hv)++ */
2224 if (xhv->xhv_keys > (IV)xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */)
2225 hsplit(PL_strtab);
2226 }
2227 }
2228
2229 ++HeVAL(entry); /* use value slot as REFCNT */
2230 UNLOCK_STRTAB_MUTEX;
2231
2232 if (flags & HVhek_FREEKEY)
2233 Safefree(str);
2234
2235 return HeKEY_hek(entry);
2236}